Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия Последняя версия Следующая версия справа и слева | ||
msx:basic_dialogue_programming_language:108 [2023-02-14 22:30] GreyWolf [1.8.3. Создание новых операторов] |
msx:basic_dialogue_programming_language:108 [2023-02-15 20:46] GreyWolf |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
[<>] | [<>] | ||
~~TOC wide~~ | ~~TOC wide~~ | ||
- | |||
- | [[msx:basic_dialogue_programming_language:108_old|]] | ||
FIXME | FIXME | ||
Строка 12: | Строка 10: | ||
<WRAP half column> \\ </WRAP> | <WRAP half column> \\ </WRAP> | ||
<WRAP half column><WRAP justify> | <WRAP half column><WRAP justify> | ||
- | \\ Удачное аппаратное и программное решение определили | + | Удачное аппаратное и программное решение определили |
\\ популярность MSX–компьютеров в нашей стране. Однако | \\ популярность MSX–компьютеров в нашей стране. Однако | ||
\\ широкие возможности MSX практически не описаны в | \\ широкие возможности MSX практически не описаны в | ||
Строка 22: | Строка 20: | ||
В подготовке этого материала принимали непосредственное участие: | В подготовке этого материала принимали непосредственное участие: | ||
- | \\ В.С.Лашук (Владимирский государственный педагогический институт), | + | \\ В.С.Лашук (Владимирский государственный педагогический институт), |
\\ Ю.В.Юзифович (учащийся 8–го класса, г.Куйбышев). | \\ Ю.В.Юзифович (учащийся 8–го класса, г.Куйбышев). | ||
- | </code> | ||
- | |||
{{anchor:n1081}} | {{anchor:n1081}} | ||
===== 1.8.1 Подробная карта памяти ===== | ===== 1.8.1 Подробная карта памяти ===== | ||
- | <code> | ||
- | Самый простой способ заново сложить дорожную | ||
- | карту - это сложить ее по-другому. | ||
- | Из дорожных правил Джоунса | ||
- | Каждый, кому приходится работать с большим объемом информации, неизбеж- | + | <WRAP group 99%> |
- | но сталкивается с проблемой нехватки памяти. Обычно считается, что объем | + | <WRAP half column> \\ </WRAP> |
- | доступной для пользователя памяти на MSX-компьютерах (RAM) составляет все- | + | <WRAP half column><WRAP justify> |
- | го 32 Кбайта. Однако оказывается, что действительный объем RAM гораздо | + | Самый простой способ заново сложить дорожную |
- | больше: 64 Кбайта на компьютерах серии MSX-1 и 134 Кбайта на компьютерах | + | \\ карту — это сложить ее по–другому. |
- | серии MSX-2 ! | + | <WRAP rightalign> |
+ | —//Из дорожных правил Джоунса// | ||
+ | </WRAP></WRAP> | ||
+ | </WRAP></WRAP> | ||
- | Вся память хранится в особых устройствах, называемых с л о т а м и | + | Каждый, кому приходится работать с большим объемом информации, неизбежно сталкивается с проблемой нехватки памяти. Обычно считается, что объем доступной для пользователя памяти на MSX–компьютерах (RAM) составляет всего 32 Кбайта. Однако оказывается, что действительный объем RAM гораздо больше: 64 Кбайта на компьютерах серии MSX-1 и 134 Кбайта на компьютерах |
- | ("slot"-"позиция","поле","участок"). На схеме изображена слотовая к а р - | + | серии MSX-2 ! |
- | т а памяти компьютера серии MSX-1 (ROM локальной сети располагается в | + | |
- | слоте 3-1 по адресам 4000h÷53FFh): | + | Вся память хранится в особых устройствах, называемых //слотами// ("slot"—"позиция", "поле", "участок"). На схеме изображена слотовая //карта// памяти компьютера серии MSX-1 (ROM локальной сети располагается в слоте 3-1 по адресам 4000h÷53FFh): |
+ | <code> | ||
┌──────┬───────┬───────┬───────┬───────────────────────────────────────┐ | ┌──────┬───────┬───────┬───────┬───────────────────────────────────────┐ | ||
│ │ │ │ │ С л о т 3 │ | │ │ │ │ │ С л о т 3 │ | ||
Строка 71: | Строка 67: | ||
│ FFFFh│ │ │ │ │ │ ласть) │ │ | │ FFFFh│ │ │ │ │ │ ласть) │ │ | ||
└──────┴───────┴───────┴───────┴─────────┴─────────┴─────────┴─────────┘ | └──────┴───────┴───────┴───────┴─────────┴─────────┴─────────┴─────────┘ | ||
- | Итак, в MSX-компьютерах имеется ч е т ы р е слота. В свою очередь,к | + | </code> |
- | каждому слоту можно подключить расширитель, который содержит до ч е т ы- | + | Итак, в MSX–компьютерах имеется //четыре// слота. В свою очередь, к каждому слоту можно подключить расширитель, который содержит до //четырех// новых (//вторичных//) слотов. Обозначение "слот 3-1" подразумевает, что мы рассматриваем "подключение" к первичному слоту с номером 3 вторичного слота с номером 1. |
- | р е х новых (в т о р и ч н ы х) слотов. Обозначение "слот 3-1" подразуме- | + | |
- | вает, что мы рассматриваем "подключение" к первичному слоту с номером 3 | + | Каждый слот имеет свою //метку (указатель)//. Указатель слота — это двоичное число, биты которого имеют следующий смысл: |
- | вторичного слота с номером 1. | + | <code> |
- | Каждый слот имеет свою м е т к у ( у к а з а т е л ь). Указатель сло- | + | |
- | та - это двоичное число, биты которого имеют следующий смысл: | + | |
┌───┬───┬───┬───┬───┬───┬───┬───┐ | ┌───┬───┬───┬───┬───┬───┬───┬───┐ | ||
│ ∗ │ 0 │ 0 │ 0 │ ∗ │ ∗ │ ∗ │ ∗ │ | │ ∗ │ 0 │ 0 │ 0 │ ∗ │ ∗ │ ∗ │ ∗ │ | ||
Строка 85: | Строка 79: | ||
├── 0, если вторичный слот отсутствует или его номер равен нулю; | ├── 0, если вторичный слот отсутствует или его номер равен нулю; | ||
└── 1 - можно использовать в любом случае. | └── 1 - можно использовать в любом случае. | ||
+ | </code> | ||
Например, для слота 3-2 указатель будет таким: | Например, для слота 3-2 указатель будет таким: | ||
- | &b 1 0 0 0 1 0 1 1 | + | <code> |
- | ▲ ─▲─ ─▲─ | + | &b 1 0 0 0 1 0 1 1 |
- | │ │ │ | + | ▲ ─▲─ ─▲─ |
- | не 0 2 3 | + | │ │ │ |
- | Напомним Вам, что для вызова подпрограммы, написанной в машинных кодах | + | не 0 2 3 |
- | и расположенной в некотором слоте, применяется команда ассемблера: | + | </code> |
- | ┌─────────────────────────────────────────────────┐ | + | Напомним Вам, что для вызова подпрограммы, написанной в машинных кодах и расположенной в некотором слоте, применяется команда ассемблера: |
- | │ RST 30h [Указатель слота/Адрес подпрограммы] │ | + | <code> |
- | └─────────────────────────────────────────────────┘ | + | RST 30h [Указатель слота/Адрес подпрограммы] |
- | На языке MSX-BASIC эту команду можно "моделировать" следующим способом: | + | </code> |
- | 10 CLEAR 200,&HF300:DEFUSR=&HF300 | + | |
- | 20 INPUT"Номер первичного слота";N1 | + | На языке [[msx:basic:|]] эту команду можно "моделировать" следующим способом: |
- | 30 INPUT"Номер вторичного слота";N2 | + | {{anchor:e1081-01}} \\ {{.examples:1081-01.bas|}} \\ [[+tab|wmsxbpge>1081-01.bas]] |
- | 40 POKE &HF300,&HF7 ' F7 - код команды RST 30h | + | <code> |
- | 50 POKE &HF301,&H80+N2*4+N1 ' Указатель слота | + | 10 CLEAR 200,&HF300:DEFUSR=&HF300 |
- | 60 INPUT"Адрес ячейки";AD% | + | 20 INPUT"Номер первичного слота";N1 |
- | 70 POKE &HF302,PEEK(VARPTR(AD%)):POKE &HF303,PEEK(VARPTR(AD%)+1) | + | 30 INPUT"Номер вторичного слота";N2 |
- | 80 POKE &HF304,&HC9: A=USR(A) 'Код команды RET и запуск программы | + | 40 POKE &HF300,&HF7 ' F7 - код команды RST 30h |
- | Покажем расположение памяти в слотах для компьютеров серии MSX-2: | + | 50 POKE &HF301,&H80+N2*4+N1 ' Указатель слота |
- | α) у ч и т е л ь с к и й компьютер | + | 60 INPUT"Адрес ячейки";AD% |
+ | 70 POKE &HF302,PEEK(VARPTR(AD%)):POKE &HF303,PEEK(VARPTR(AD%)+1) | ||
+ | 80 POKE &HF304,&HC9: A=USR(A) 'Код команды RET и запуск программы | ||
+ | </code> | ||
+ | |||
+ | Покажем расположение памяти в слотах для компьютеров серии MSX-2: | ||
+ | * <WRAP>α) //учительский// компьютер <code> | ||
Слот 0 Слот 1 Слот 2 Слот 3-0 Слот 3-1 Слот 3-2 Слот 3-3 | Слот 0 Слот 1 Слот 2 Слот 3-0 Слот 3-1 Слот 3-2 Слот 3-3 | ||
0000h┌───────┐┌────────┐┌────────┐┌───────┐┌────────┐┌───────┐ | 0000h┌───────┐┌────────┐┌────────┐┌───────┐┌────────┐┌───────┐ | ||
Строка 133: | Строка 134: | ||
│ ││ ││ ││ ││ ││ area ││ │ | │ ││ ││ ││ ││ ││ area ││ │ | ||
FFFFh└───────┘└────────┘└────────┘└───────┘└────────┘├───────┤└────────┘ | FFFFh└───────┘└────────┘└────────┘└───────┘└────────┘├───────┤└────────┘ | ||
- | ┌────────────────────────────────────────────┐ │ RAM │ | + | │ RAM │ |
- | │ Записав в соответствующий порт номер пере- │ │(16 Кб)│ | + | │(16 Кб)│ |
- | │ ключаемой страницы можно установить эту │ ├───────┤ | + | ├───────┤ |
- | │ страницу для д о с т у п а , например: │ │ RAM │ | + | │ RAM │ |
- | │ &hFB ──────▶ порт с адресом &hFC │ │(16 Кб)│ | + | │(16 Кб)│ |
- | │ &hFA ──────▶ порт с адресом &hFD │ ├───────┤ | + | ├───────┤ |
- | │ &hF9 ──────▶ порт с адресом &hFE │ │ RAM │ | + | │ RAM │ |
- | │ &hF8 ──────▶ порт с адресом &hFF │ │(16 Кб)│ | + | │(16 Кб)│ |
- | │ В отключаемых страницах данные сохраняются!│ ├───────┤ | + | ├───────┤ |
- | └────────────────────────────────────────────┘ │ RAM │ | + | │ RAM │ |
- | Л о г и ч е с к и е с т р а н и ц ы │(16 Кб)│ | + | │(16 Кб)│ |
- | ┌───────────────────────────────────┐ └───────┘ | + | └───────┘ |
+ | </code> | ||
+ | |||
+ | Записав в соответствующий порт номер переключаемой страницы можно установить эту страницу для //доступа//, например: | ||
+ | |&hFB|──────▶|порт с адресом &hFC| | ||
+ | |&hFA|──────▶|порт с адресом &hFD| | ||
+ | |&hF9|──────▶|порт с адресом &hFE| | ||
+ | |&hF8|──────▶|порт с адресом &hFF| | ||
+ | В отключаемых страницах данные сохраняются! | ||
+ | |||
+ | <code> | ||
+ | Л о г и ч е с к и е с т р а н и ц ы | ||
+ | ┌───────────────────────────────────┐ | ||
3 2 1 0 ◀── Номера логических страниц слота 3-2 | 3 2 1 0 ◀── Номера логических страниц слота 3-2 | ||
&hFF &hFE &hFD &hFC ◀── Адрес порта, отвечающего за | &hFF &hFE &hFD &hFC ◀── Адрес порта, отвечающего за | ||
Строка 158: | Строка 171: | ||
└───────────────────────────────────────────────────────────────────────┘ | └───────────────────────────────────────────────────────────────────────┘ | ||
Ф и з и ч е с к и е с т р а н и ц ы с л о т а 3-2 и их н о м е р а | Ф и з и ч е с к и е с т р а н и ц ы с л о т а 3-2 и их н о м е р а | ||
+ | </code> | ||
- | β) у ч е н и ч е с к и й компьютер | + | </WRAP> |
+ | * <WRAP> β) //ученический// компьютер <code> | ||
Слот 0 Слот 1 Слот 2 Слот 3-0 Слот 3-1 Слот 3-2 Слот 3-3 | Слот 0 Слот 1 Слот 2 Слот 3-0 Слот 3-1 Слот 3-2 Слот 3-3 | ||
0000h┌───────┐┌────────┐┌────────┐┌───────┐┌────────┐┌───────┐ | 0000h┌───────┐┌────────┐┌────────┐┌───────┐┌────────┐┌───────┐ | ||
Строка 190: | Строка 205: | ||
│ RAM │ | │ RAM │ | ||
│(16 Кб)│ | │(16 Кб)│ | ||
- | ┌────────────────────────────────────────────┐ ├───────┤ | + | ├───────┤ |
- | │ Нумерация физических и логических страниц │ │ RAM │ | + | │ RAM │ |
- | │ слота 3-2, а также адреса соответствующих │ │(16 Кб)│ | + | │(16 Кб)│ |
- | │ портов в ученическом компьютере аналогич- │ ├───────┤ | + | ├───────┤ |
- | │ ны учительскому компьютеру. │ │ RAM │ | + | │ RAM │ |
- | └────────────────────────────────────────────┘ │(16 Кб)│ | + | │(16 Кб)│ |
├───────┤ | ├───────┤ | ||
│ RAM │ | │ RAM │ | ||
│(16 Кб)│ | │(16 Кб)│ | ||
└───────┘ | └───────┘ | ||
- | Таким образом, непосредственным сложением нетрудно получить, что общий | ||
- | объем памяти MSX-компьютеров составляет: | ||
- | ┌───────────────────────┬────────────┬───────────┐ | ||
- | │ К о м п ь ю т е р │ ROM │ RAM │ | ||
- | ├───────────────────────┼────────────┼───────────┤ | ||
- | │ MSX-1 (без дисководов)│ 37 Кбайтов│ 64 Кбайта│ | ||
- | ├───────────────────────┼────────────┼───────────┤ | ||
- | │ MSX-2 (ученический) │ 92 Кбайта │ 134 Кбайта│ | ||
- | ├───────────────────────┼────────────┼───────────┤ | ||
- | │ MSX-2 (учительский) │ 156 Кбайтов│ 134 Кбайта│ | ||
- | └───────────────────────┴────────────┴───────────┘ | ||
- | В слоте 0 располагаются подпрограммы BIOS, используемые как в компьюте- | ||
- | рах серии MSX-1, так и в компьютерах серии MSX-2. Дополнительные подпрог- | ||
- | раммы BIOS ("расширенный BIOS"),которые используются только в компьютерах | ||
- | серии MSX-2, располагаются: | ||
- | для учительского компьютера - в слоте 3-1, | ||
- | для ученического компьютера - в слоте 3-0. | ||
</code> | </code> | ||
+ | <WRAP round box> | ||
+ | Нумерация физических и логических страниц слота 3-2, а также адреса соответствующих портов в ученическом компьютере аналогичны учительскому компьютеру. | ||
+ | </WRAP> | ||
+ | </WRAP> | ||
+ | |||
+ | |||
+ | Таким образом, непосредственным сложением нетрудно получить, что общий объем памяти MSX–компьютеров составляет: | ||
+ | ^ //Компьютер// ^ ROM ^ RAM ^ | ||
+ | |MSX-1 (без дисководов)| 37 Кбайтов | 64 Кбайта | | ||
+ | |MSX-2 (ученический)| 92 Кбайта | 134 Кбайта | | ||
+ | |MSX-2 (учительский)| 156 Кбайтов | 134 Кбайта | | ||
+ | |||
+ | В слоте 0 располагаются подпрограммы BIOS, используемые как в компьютерах серии MSX-1, так и в компьютерах серии MSX-2. Дополнительные подпрограммы BIOS ("расширенный BIOS"),которые используются только в компьютерах серии MSX-2, располагаются: | ||
+ | * для учительского компьютера - в слоте 3-1, | ||
+ | * для ученического компьютера - в слоте 3-0. | ||
+ | |||
{{anchor:n1082}} | {{anchor:n1082}} | ||
===== 1.8.2 Работа со слотами ===== | ===== 1.8.2 Работа со слотами ===== | ||
- | <code> | ||
- | - Боюсь, что эти подробности утомительны, | ||
- | но вам не разобраться в ситуации, если | ||
- | вы не будете в курсе моих затруднений. | ||
- | А.Конан Дойль. Скандал в Богемии | ||
- | Все адресное пространство MSX-компьютера разобъем на ч е т ы р е т.н. | + | <WRAP group 99%> |
- | л о г и ч е с к и е страницы (объемом по 16 Kбайтов каждая). | + | <WRAP half column> \\ </WRAP> |
- | Пронумеруем их следующим образом: | + | <WRAP half column><WRAP justify> |
- | ┌───────────────────┬─────────┬─────────────┬─────────────┬─────────────┐ | + | — Боюсь, что эти подробности утомительны, |
- | │ Адреса │ 0÷3FFFh │ 4000h÷7FFFh │ 8000h÷BFFFh │ C000h÷FFFFh │ | + | \\ но вам не разобраться в ситуации, если |
- | ├───────────────────┼─────────┼─────────────┼─────────────┼─────────────┤ | + | \\ вы не будете в курсе моих затруднений. |
- | │Логическая страница│ 0 │ 1 │ 2 │ 3 │ | + | <WRAP rightalign> |
- | └───────────────────┴─────────┴─────────────┴─────────────┴─────────────┘ | + | —//А.Конан Дойль. Скандал в Богемии// |
- | Заметим, что каждый слот также можно разбить на участки объемом по | + | </WRAP></WRAP> |
- | 16 Кбайтов каждый, которые мы будем называть ф и з и ч е с к и м и стра- | + | </WRAP></WRAP> |
- | ницами памяти. Прежде чем начать работу с физической страницей памяти, ее | + | |
- | необходимо п о д к л ю ч и т ь к некоторой логической странице адресно- | + | |
- | го пространства, для чего выполнить следующие операции: | + | |
- | α) указать компьютеру н о м е р подключаемой логической страницы(тем | + | |
- | самым мы присвоим физической странице некоторый начальный адрес). Заметим, | + | |
- | что при включении компьютера некоторым физическим страницам памяти началь- | + | |
- | ный адрес присваивается автоматически; | + | |
- | β) указать н о м е р а первичного и вторичного слотов, которым при- | + | |
- | надлежит выбранная физическая страница памяти. | + | |
- | Номера первичных слотов записываются в порт ввода-вывода с адресом A8h, | + | |
- | а номера вторичных слотов - в ячейку FFFFh рабочей области (слот 3-2). | + | |
- | Порт ввода-вывода A8h: (номера п е р в и ч н ы х слотов) | + | Все адресное пространство MSX—компьютера разобьем на //четыре// т.н. //логические// страницы (объемом по 16 Kбайтов каждая). |
+ | |||
+ | Пронумеруем их следующим образом: | ||
+ | ^ Адреса | 0÷3FFFh | 4000h÷7FFFh | 8000h÷BFFFh | C000h÷FFFFh | | ||
+ | ^ Логическая страница | 0 | 1 | 2 | 3 | | ||
+ | |||
+ | Заметим, что каждый слот также можно разбить на участки объемом по 16 Кбайтов каждый, которые мы будем называть //физическими// страницами памяти. Прежде чем начать работу с физической страницей памяти, ее необходимо //подключить// к некоторой логической странице адресного пространства, для чего выполнить следующие операции: | ||
+ | * α) указать компьютеру //номер// подключаемой логической страницы(тем самым мы присвоим физической странице некоторый начальный адрес). Заметим, что при включении компьютера некоторым физическим страницам памяти начальный адрес присваивается автоматически; | ||
+ | * β) указать //номера// первичного и вторичного слотов, которым принадлежит выбранная физическая страница памяти. | ||
+ | |||
+ | Номера первичных слотов записываются в порт ввода–вывода с адресом A8h, а номера вторичных слотов — в ячейку FFFFh рабочей области (слот 3-2). | ||
+ | |||
+ | Порт ввода–вывода A8h: (номера //первичных// слотов) | ||
+ | <code> | ||
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ | ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ | ||
Старший ─▶│ ∗ │ ∗ │ ∗ │ ∗ │ ∗ │ ∗ │ ∗ │ ∗ │◀─ Младший | Старший ─▶│ ∗ │ ∗ │ ∗ │ ∗ │ ∗ │ ∗ │ ∗ │ ∗ │◀─ Младший | ||
Строка 255: | Строка 266: | ||
─────▲───── ─────▲───── ─────▲───── ─────▲───── | ─────▲───── ─────▲───── ─────▲───── ─────▲───── | ||
│ │ │ └───────┐ | │ │ │ └───────┐ | ||
- | Номер слота, из которого Номер слота Номер слота Номер слота | + | Номер слота, из которого Номер слота Номер слота Номер слота |
- | процессор берет информа- для логичес- для логичес- для логичес- | + | процессор берет информа- для логичес- для логичес- для логичес- |
- | цию при обращении к ло- кой страницы кой страницы кой страницы | + | цию при обращении к ло- кой страницы кой страницы кой страницы |
- | гической странице 3 с номером 2 с номером 1 с номером 0 | + | гической странице 3 с номером 2 с номером 1 с номером 0 |
+ | </code> | ||
- | Ячейка памяти FFFFh: (номера в т о р и ч н ы х слотов) | + | Ячейка памяти FFFFh: (номера //вторичных// слотов) |
+ | <code> | ||
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ | ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ | ||
Старший ─▶│ ∗ │ ∗ │ ∗ │ ∗ │ ∗ │ ∗ │ ∗ │ ∗ │◀─ Младший | Старший ─▶│ ∗ │ ∗ │ ∗ │ ∗ │ ∗ │ ∗ │ ∗ │ ∗ │◀─ Младший | ||
Строка 270: | Строка 283: | ||
цию при обращении к ло- кой страницы кой страницы кой страницы | цию при обращении к ло- кой страницы кой страницы кой страницы | ||
гической странице 3 с номером 2 с номером 1 с номером 0 | гической странице 3 с номером 2 с номером 1 с номером 0 | ||
- | Например, если содержимое порта A8h равно &B11001001 , а | + | </code> |
- | содержимое ячейки FFFFh равно &B01101100 , | + | |
- | то в этом случае: | + | |
- | логическая страница 3 рассматривается как участок памяти из слота 3-1, | + | |
- | логическая страница 2 рассматривается как участок памяти из слота 0-2, | + | |
- | логическая страница 1 рассматривается как участок памяти из слота 2-3, а | + | |
- | логическая страница 0 рассматривается как участок памяти из слота 1-0. | + | |
- | Теперь ясно, что подпрограмма подключения памяти к адресному пространс- | + | Например, если содержимое порта A8h равно &B11001001, а содержимое ячейки FFFFh равно &B01101100 , то в этом случае: |
- | тву выглядит следующим образом: | + | * логическая страница 3 рассматривается как участок памяти из слота 3-1, |
- | DI ; Запретить прерывания при работе с портами ввода-вывода | + | * логическая страница 2 рассматривается как участок памяти из слота 0-2, |
- | LD A, Номера первичных слотов | + | * логическая страница 1 рассматривается как участок памяти из слота 2-3, а |
- | OUT (A8h),A | + | * логическая страница 0 рассматривается как участок памяти из слота 1-0. |
- | LD A, Номера вторичных слотов | + | |
- | LD (FFFFh),A | + | Теперь ясно, что подпрограмма подключения памяти к адресному пространству выглядит следующим образом: |
- | EI ; Разрешить системные прерывания | + | <code> |
- | RET | + | DI ; Запретить прерывания при работе с портами ввода–вывода |
- | \/i | + | LD A, Номера первичных слотов |
- | Внимание! При чтении числа из ячейки FFFFh оно | + | OUT (A8h),A |
- | выводится в и н в е р т и р о в а н н о м виде. | + | LD A, Номера вторичных слотов |
- | \/i- | + | LD (FFFFh),A |
- | П р и м е р 1. 10 POKE &HFFFF, &B01101100 | + | EI ; Разрешить системные прерывания |
- | ────────────── 20 PRINT BIN$(PEEK(&HFFFF)) | + | RET |
- | run | + | </code> |
- | 10010011 | + | <WRAP center round important 60%> |
- | Ok | + | Внимание! При чтении числа из ячейки FFFFh оно выводится в //инвертированном// виде. |
- | Теперь для того, чтобы узнать, какие вторичные слоты подключены к ад- | + | |
- | ресному пространству, необходимо инвертировать полученный результат (заме- | + | </WRAP> |
- | нить нули - единицами, а единицы - нулями). | + | |
- | ┌─────────────────────────────────────────────────────────────────────┐ | + | |
- | │ Отметим, что при включении компьютера в логические страницы 0 и 1 │ | + | {{anchor:e1082-01}} __//Пример 1//__. \\ {{.examples:1082-01.bas|}} \\ [[+tab|wmsxbpge>1082-01.bas]] |
- | │ "помещаются" физические страницы памяти из слота 0, а в логические │ | + | <code> |
- | │ страницы 2 и 3 "помещаются" физические страницы памяти из слота 3-2.│ | + | 10 POKE &HFFFF, &B01101100 |
- | │ Содержимое порта ввода-вывода с адресом A8h при этом становится рав-│ | + | 20 PRINT BIN$(PEEK(&HFFFF)) |
- | │ ным &B11110000, а истинное содержимое ячейки памяти FFFFh становит-│ | + | run |
- | │ ся равным &B10100000 (не забудьте про инвертирование!) │ | + | 10010011 |
- | └─────────────────────────────────────────────────────────────────────┘ | + | Ok |
- | Если до выключения компьютера на странице 1 слота 3-2 создать идентифи- | + | </code> |
- | катор ROM и разместить на данной странице Вашу подпрограмму, то она будет | + | |
- | "стартовать" при включении компьютера, т.к.первое обращение идет к этой | + | |
- | странице. | + | Теперь для того, чтобы узнать, какие вторичные слоты подключены к адресному пространству, необходимо инвертировать полученный результат (заменить нули — единицами, а единицы — нулями). |
- | П р и м е р 2. А теперь небольшой фрагмент на макроассемблере... | + | |
- | ───────────── | + | <WRAP center round info 60%> |
+ | Отметим, что при включении компьютера в логические страницы 0 и 1 "помещаются" физические страницы памяти из слота 0, а в логические страницы 2 и 3 "помещаются" физические страницы памяти из слота 3-2. | ||
+ | |||
+ | Содержимое порта ввода-вывода с адресом A8h при этом становится равным &B11110000, а истинное содержимое ячейки памяти FFFFh становится равным &B10100000 (не забудьте про инвертирование!) | ||
+ | </WRAP> | ||
+ | |||
+ | Если до выключения компьютера на странице 1 слота 3-2 создать идентификатор ROM и разместить на данной странице Вашу подпрограмму, то она будет "стартовать" при включении компьютера, т.к. первое обращение идет к этой странице. | ||
+ | |||
+ | |||
+ | {{anchor:e1082-02}} __//Пример 2//__. А теперь небольшой фрагмент на макроассемблере...\\ {{.examples:1082-02.asm|}} | ||
+ | <code> | ||
DEFB 0FEH ; Программа запускается с адреса &H9000 | DEFB 0FEH ; Программа запускается с адреса &H9000 | ||
DEFW START,KONEC+END-NACH,START | DEFW START,KONEC+END-NACH,START | ||
Строка 323: | Строка 340: | ||
CONSOL EQU 00A2H ; Вывод символа на консоль. | CONSOL EQU 00A2H ; Вывод символа на консоль. | ||
- | START: LD HL,PROM ; Адрес старта реставрируемой подпрограммы | + | START: LD HL,PROM ; Адрес старта реставрируемой подпрограммы |
PUSH HL ; Сохранили в стеке и при встрече RET | PUSH HL ; Сохранили в стеке и при встрече RET | ||
DI ; переходим на этот адрес. | DI ; переходим на этот адрес. | ||
Строка 331: | Строка 348: | ||
OUT (0A8H),A ; 2 страница (8000H-C000H)-СЛОТB 3-2 | OUT (0A8H),A ; 2 страница (8000H-C000H)-СЛОТB 3-2 | ||
LD HL,KONEC+1 ; 3 страница (C000H-FFFFH)-СЛОТB 3-2 | LD HL,KONEC+1 ; 3 страница (C000H-FFFFH)-СЛОТB 3-2 | ||
- | LD DE,NACH ; Пересылка подпрограммы на начало | + | LD DE,NACH ; Пересылка подпрограммы на начало |
LD BC,END-NACH; первой страницы слота 3-2 | LD BC,END-NACH; первой страницы слота 3-2 | ||
LDIR ; | LDIR ; | ||
Строка 371: | Строка 388: | ||
NOP | NOP | ||
END: NOP | END: NOP | ||
- | \/i | + | </code> |
- | В н и м а н и е ! | + | |
- | 1. Логическая страница с номером 3 ни при каких условиях не должна под- | + | |
- | вергаться изменениям, так как в ней расположены подпрограммы-ловушки и об- | + | |
- | ласть системных переменных. Нарушение этого условия приведет к отказу сис- | + | |
- | темы от дальнейшего выполнения программы и ее сбросу. | + | |
- | 2. Если для физической страницы Вы используете начальный адрес 8000h, | + | |
- | то прежде чем подключать ее к адресному пространству, позаботьтесь о пере- | + | |
- | мещении программы на MSX-BASIC и стека в "безопасное" место, каковым явля- | + | |
- | ется логическая страница с номером 3. Для этого выполните программу: | + | |
- | 10 POKE &HF676,1:POKE &HF677,&HC0:POKE &HC000,0:NEW | + | |
- | \/i- | + | |
- | Существует еще один способ подключения физической страницы памяти к ад- | + | |
- | ресному пространству.Для этого воспользуйтесь подпрограммой BIOS с именем | + | |
- | ENASLT , | + | |
- | расположенной в слоте 0 по адресу 0024h. | + | |
- | Обращение к ней выглядит следующим образом: | + | |
- | LD A, Указатель слота | + | |
- | LD HL,Начальный адрес (0000h,4000h или 8000h) | + | |
- | CALL ENASLT | + | |
- | RET | + | |
- | В качестве примера приведем программу подключения физической страницы | + | |
- | из некоторого слота к логической странице 2 адресного пространства. | + | |
- | П р и м е р 2. | + | |
- | ────────────── | + | |
- | 10 DATA 3E,00 :'LD A, Указатель слота | + | |
- | 20 DATA 21,00,80 :'LD HL,8000h ;Начальный адрес | + | |
- | 30 DATA CD,24,00 :'CALL ENASLT | + | |
- | 40 DATA C9 :'RET | + | |
- | 50 CLEAR 200,&HF300:DEFUSR=&HF300 | + | |
- | 60 FOR T=0 TO 8:READ Z$:POKE &HF300+T,VAL("&h"+Z$):NEXT | + | |
- | 70 INPUT"Номер первичного слота";N1 | + | |
- | 80 INPUT"Номер вторичного слота";N2 | + | |
- | 90 POKE &HF301,&H80+N2*4+N1 '◀── Указатель слота | + | |
- | 120 A=USR(A) | + | |
- | Кстати, подобного эффекта можно достичь путем воздействия на ячейку па- | + | |
- | мяти FFFFh в слоте 3-2: | + | |
- | POKE &HFFFF,&H80 - активизирован слот 3-0 (для учительского компьютера); | + | |
- | POKE &HFFFF,&HA0 - активизирован слот 3-2 (по умолчанию); | + | |
- | POKE &HFFFF,&HB0 - активизирован слот 3-3. | + | |
- | ┌───────────────────────────────────────────────────────────────┐ | + | |
- | │ Итак, прежде чем работать с памятью, ее необходимо явно │ | + | |
- | │ распределить в адресном пространстве компьютера ! │ | + | |
- | └───────────────────────────────────────────────────────────────┘ | + | |
- | Существует, однако, другой способ работы со слотами,заключающийся в ис- | + | |
- | пользовании подпрограмм BIOS, расположенных в слоте 0. В этом случае проб- | + | |
- | лема распределения памяти снимается с пользователя и целиком возлагается | + | |
- | на систему. | + | |
- | Опишем работу с некоторыми из этих подпрограмм. | + | |
- | З а п и с ь числа в RAM любого слота осуществляется путем обращения к | + | |
- | подпрограмме с именем WRSLT , | + | |
- | расположенной по адресу 0014h. | + | |
- | П р и м е р 3. | + | <WRAP round important> |
- | ────────────── | + | //Внимание// ! |
- | 10 DATA 3E,00 :'F300 LD A, Указатель слота | + | - Логическая страница с номером 3 ни при каких условиях не должна подвергаться изменениям, так как в ней расположены подпрограммы–ловушки и область системных переменных. Нарушение этого условия приведет к отказу системы от дальнейшего выполнения программы и ее сбросу. |
- | 20 DATA 21,00,00 :'F302 LD HL,Адрес ячейки | + | - Если для физической страницы Вы используете начальный адрес 8000h, то прежде чем подключать ее к адресному пространству, позаботьтесь о перемещении программы на [[msx:basic:|]] и стека в "безопасное" место, каковым является логическая страница с номером 3. Для этого выполните программу: |
- | 30 DATA 1E,00 :'F305 LD E, Число | + | <code> |
- | 40 DATA CD,14,00 :'F307 CALL WRSLT | + | 10 POKE &HF676,1:POKE &HF677,&HC0:POKE &HC000,0:NEW |
- | 50 DATA C9 :'F30A RET | + | </code> |
- | 60 CLEAR 200,&HF300:DEFUSR=&HF300 | + | </WRAP> |
- | 70 FOR T=0 TO 10:READ Z$:POKE &HF300+T,VAL("&h"+Z$):NEXT | + | |
- | 80 INPUT"Номер первичного слота";N1 | + | |
- | 90 INPUT"Номер вторичного слота";N2 | + | |
- | 100 POKE &HF301,&H80+N2*4+N1 '◀── Указатель слота | + | |
- | 110 INPUT"Адрес ячейки";AD% | + | |
- | 120 POKE &HF303,PEEK(VARPTR(AD%)):POKE &HF304,PEEK(VARPTR(AD%)+1) | + | |
- | 130 INPUT"Какое число запишете";Q%:POKE &HF306,Q%:A=USR(A) | + | |
- | Ч т е н и е числа из любой физической страницы, имеющей некоторый на- | + | Существует еще один способ подключения физической страницы памяти к адресному пространству. Для этого воспользуйтесь подпрограммой BIOS с именем ''ENASLT'', расположенной в слоте 0 по адресу 0024h. |
- | чальный адрес, осуществляется путем обращения к подпрограмме с именем | + | |
- | RDSLT , | + | |
- | расположенной по адресу 000Ch. | + | |
- | П р и м е р 4. | + | |
- | ────────────── | + | |
- | 10 DATA 3E,00 :'F300 LD A,Указатель слота | + | |
- | 20 DATA 21,00,00 :'F302 LD HL,Адрес читаемой ячейки | + | |
- | 30 DATA CD,0C,00 :'F305 CALL RDSLT | + | |
- | 40 DATA 32,10,F3 :'F308 ;Запись результата в доступную ячейку | + | |
- | ;памяти (в нашем случае &HF310) | + | |
- | 50 DATA C9 :'F30B RET | + | |
- | 60 CLEAR 200,&HF300:DEFUSR=&HF300 | + | |
- | 70 FOR T=0 TO 11:READ Z$:POKE &HF300+T,VAL("&h"+Z$):NEXT | + | |
- | 80 INPUT"Номер первичного слота";N1 | + | |
- | 90 INPUT"Номер вторичного слота";N2 | + | |
- | 100 POKE &HF301,&H80+N2*4+N1 '◀── Указатель слота | + | |
- | 110 INPUT"Адрес ячейки";AD% | + | |
- | 120 POKE &HF303,PEEK(VARPTR(AD%)):POKE &HF304,PEEK(VARPTR(AD%)+1) | + | |
- | 130 A=USR(A):PRINT"Вот Ваше число:";PEEK(&HF310) | + | |
- | Посмотрев на схему расположения памяти в слотах, Вы можете заметить, | + | Обращение к ней выглядит следующим образом: |
- | что некоторые физические страницы памяти слота 3-2 в компьютерах серии | + | <code> |
- | MSX-2 не имеют ф и к с и р о в а н н ы х адресов. Пронумеруем все физи- | + | LD A, Указатель слота |
- | ческие страницы слота 3-2 от 0 до 7 сверху вниз (в порядке следования на | + | LD HL,Начальный адрес (0000h,4000h или 8000h) |
- | рисунке). | + | CALL ENASLT |
- | Любую из этих физических страниц можно подключить к любой логической | + | RET |
- | странице адресного пространства. | + | </code> |
- | \/i | + | В качестве примера приведем программу подключения физической страницы из некоторого слота к логической странице 2 адресного пространства. |
- | При этом не рекомендуется изменять содержимое логической страницы с но- | + | |
- | мером 3, так как это приводит к перезагрузке системы! | + | |
- | \/i- | + | |
- | Подключить физические страницы слота 3-2 можно путем воздействия на | + | |
- | порты ввода-вывода с адресами 252, 253, 254 и 255. При этом, если Вы ис- | + | |
- | пользуете порт с адресом 252+N, то процессор подключит распределяемую фи- | + | |
- | зическую страницу к логической странице с номером N. | + | |
- | ┌──────────────────────────────────────────────────────────────────────┐ | + | |
- | │ Для подключения физической страницы к логической выполните команду │ | + | |
- | │ OUT 252+N1,&hF8+N2 , │ | + | |
- | │ где: N1 - номер логической страницы, │ | + | |
- | │ N2 - номер физической страницы, │ | + | |
- | │ &hF8 - число, полученное при вычитании 256 - M , │ | + | |
- | │ M - число физических страниц в слоте 3-2 . │ | + | |
- | └──────────────────────────────────────────────────────────────────────┘ | + | |
- | Таким образом Вы получите доступ к л ю б о й ячейке памяти в слоте 3-2 | + | |
- | (внимательно изучите т е к с т на схеме расположения памяти в слотах)! | + | |
- | В заключение отметим, что для доступа к физическим страницам памяти, | + | |
- | подключенным к адресному пространству,применяются оператор POKE и функция | + | |
- | PEEK. Кроме того, для работы с памятью компьютера серии MSX-2, подключен- | + | |
- | ного к локальной сети, применяются операторы CALL POKE и CALL PEEK. | + | |
- | Если адрес принадлежит отрезку [&h4000,&h7FFF], то операторы CALL POKE | + | |
- | и CALL PEEK "работают" с памятью, которая находится в слоте 3-3 и отвеча- | + | |
- | ет за работу локальной сети. Во всех остальных случаях действие оператора | + | |
- | CALL POKE совпадает с действием оператора POKE, а действие оператора CALL | + | |
- | PEEK совпадает с действием функции PEEK. | + | |
+ | {{anchor:e1082-03}} __//Пример 3//__. \\ {{.examples:1082-03.bas|}} \\ [[+tab|wmsxbpge>1082-03.bas]] | ||
+ | <code> | ||
+ | 10 DATA 3E,00 :'LD A, Указатель слота | ||
+ | 20 DATA 21,00,80 :'LD HL,8000h ;Начальный адрес | ||
+ | 30 DATA CD,24,00 :'CALL ENASLT | ||
+ | 40 DATA C9 :'RET | ||
+ | 50 CLEAR 200,&HF300:DEFUSR=&HF300 | ||
+ | 60 FOR T=0 TO 8:READ Z$:POKE &HF300+T,VAL("&h"+Z$):NEXT | ||
+ | 70 INPUT"Номер первичного слота";N1 | ||
+ | 80 INPUT"Номер вторичного слота";N2 | ||
+ | 90 POKE &HF301,&H80+N2*4+N1 '◀── Указатель слота | ||
+ | 120 A=USR(A) | ||
+ | </code> | ||
+ | Кстати, подобного эффекта можно достичь путем воздействия на ячейку памяти FFFFh в слоте 3-2: | ||
+ | * ''POKE &HFFFF,&H80'' — активизирован слот 3-0 (для учительского компьютера); | ||
+ | * ''POKE &HFFFF,&HA0'' — активизирован слот 3-2 (по умолчанию); | ||
+ | * ''POKE &HFFFF,&HB0'' — активизирован слот 3-3. | ||
- | Следует стремиться увидеть в каждой вещи то, | ||
- | чего еше никто не видел, и над чем еще ни- | ||
- | кто не думал. | ||
- | Г.Лихтенберг | ||
- | То, что я понял,прекрасно, из этого я заклю- | ||
- | чаю, что остальное, чего я не понял, тоже | ||
- | прекрасно. | ||
- | Сократ | ||
+ | <WRAP round important> | ||
+ | Итак, прежде чем работать с памятью, ее необходимо явно распределить в адресном пространстве компьютера ! | ||
+ | </WRAP> | ||
+ | |||
+ | Существует, однако, другой способ работы со слотами,заключающийся в использовании подпрограмм BIOS, расположенных в слоте 0. В этом случае проблема распределения памяти снимается с пользователя и целиком возлагается на систему. | ||
+ | |||
+ | Опишем работу с некоторыми из этих подпрограмм. | ||
+ | |||
+ | //Запись// числа в RAM любого слота осуществляется путем обращения к подпрограмме с именем ''WRSLT'' , расположенной по адресу 0014h. | ||
+ | |||
+ | {{anchor:e1082-04}} __//Пример 4//__. \\ {{.examples:1082-04.bas|}} \\ [[+tab|wmsxbpge>1082-04.bas]] | ||
+ | <code> | ||
+ | 10 DATA 3E,00 :'F300 LD A, Указатель слота | ||
+ | 20 DATA 21,00,00 :'F302 LD HL,Адрес ячейки | ||
+ | 30 DATA 1E,00 :'F305 LD E, Число | ||
+ | 40 DATA CD,14,00 :'F307 CALL WRSLT | ||
+ | 50 DATA C9 :'F30A RET | ||
+ | 60 CLEAR 200,&HF300:DEFUSR=&HF300 | ||
+ | 70 FOR T=0 TO 10:READ Z$:POKE &HF300+T,VAL("&h"+Z$):NEXT | ||
+ | 80 INPUT"Номер первичного слота";N1 | ||
+ | 90 INPUT"Номер вторичного слота";N2 | ||
+ | 100 POKE &HF301,&H80+N2*4+N1 '◀── Указатель слота | ||
+ | 110 INPUT"Адрес ячейки";AD% | ||
+ | 120 POKE &HF303,PEEK(VARPTR(AD%)):POKE &HF304,PEEK(VARPTR(AD%)+1) | ||
+ | 130 INPUT"Какое число запишете";Q%:POKE &HF306,Q%:A=USR(A) | ||
</code> | </code> | ||
+ | //Чтение// числа из любой физической страницы, имеющей некоторый начальный адрес, осуществляется путем обращения к подпрограмме с именем ''RDSLT'', расположенной по адресу 000Ch. | ||
+ | |||
+ | {{anchor:e1082-05}} __//Пример 5//__. \\ {{.examples:1082-05.bas|}} \\ [[+tab|wmsxbpge>1082-05.bas]] | ||
+ | <code> | ||
+ | 10 DATA 3E,00 :'F300 LD A,Указатель слота | ||
+ | 20 DATA 21,00,00 :'F302 LD HL,Адрес читаемой ячейки | ||
+ | 30 DATA CD,0C,00 :'F305 CALL RDSLT | ||
+ | 40 DATA 32,10,F3 :'F308 ;Запись результата в доступную ячейку | ||
+ | ;памяти (в нашем случае &HF310) | ||
+ | 50 DATA C9 :'F30B RET | ||
+ | 60 CLEAR 200,&HF300:DEFUSR=&HF300 | ||
+ | 70 FOR T=0 TO 11:READ Z$:POKE &HF300+T,VAL("&h"+Z$):NEXT | ||
+ | 80 INPUT"Номер первичного слота";N1 | ||
+ | 90 INPUT"Номер вторичного слота";N2 | ||
+ | 100 POKE &HF301,&H80+N2*4+N1 '◀── Указатель слота | ||
+ | 110 INPUT"Адрес ячейки";AD% | ||
+ | 120 POKE &HF303,PEEK(VARPTR(AD%)):POKE &HF304,PEEK(VARPTR(AD%)+1) | ||
+ | 130 A=USR(A):PRINT"Вот Ваше число:";PEEK(&HF310) | ||
+ | </code> | ||
+ | |||
+ | Посмотрев на схему расположения памяти в слотах, Вы можете заметить, что некоторые физические страницы памяти слота 3-2 в компьютерах серии MSX-2 не имеют //фиксированных// адресов. Пронумеруем все физические страницы слота 3-2 от 0 до 7 сверху вниз (в порядке следования на рисунке). | ||
+ | |||
+ | Любую из этих физических страниц можно подключить к любой логической странице адресного пространства. | ||
+ | |||
+ | <WRAP round important> | ||
+ | При этом не рекомендуется изменять содержимое логической страницы с номером 3, так как это приводит к перезагрузке системы! | ||
+ | </WRAP> | ||
+ | |||
+ | Подключить физические страницы слота 3-2 можно путем воздействия на порты ввода–вывода с адресами 252, 253, 254 и 255. При этом, если Вы используете порт с адресом 252+N, то процессор подключит распределяемую физическую страницу к логической странице с номером N. | ||
+ | |||
+ | Для подключения физической страницы к логической выполните команду | ||
+ | <WRAP group> | ||
+ | <WRAP half column> | ||
+ | <code> | ||
+ | OUT 252+N1,&hF8+N2 | ||
+ | </code> | ||
+ | </WRAP> | ||
+ | , | ||
+ | <WRAP half column> | ||
+ | |||
+ | </WRAP> | ||
+ | </WRAP> | ||
+ | где: | ||
+ | * ''N1'' — номер логической страницы, | ||
+ | * ''N2'' — номер физической страницы, | ||
+ | * ''&hF8'' — число, полученное при вычитании 256 - M , | ||
+ | * ''M '' — число физических страниц в слоте 3-2. | ||
+ | |||
+ | Таким образом Вы получите доступ к //любой// ячейке памяти в слоте 3-2 (внимательно изучите //текст// на схеме расположения памяти в слотах)! | ||
+ | |||
+ | В заключение отметим, что для доступа к физическим страницам памяти, подключенным к адресному пространству,применяются оператор ''POKE'' и функция ''PEEK''. Кроме того, для работы с памятью компьютера серии MSX-2, подключенного к локальной сети, применяются операторы ''CALL POKE'' и ''CALL PEEK''. | ||
+ | |||
+ | Если адрес принадлежит отрезку [&h4000,&h7FFF], то операторы ''CALL POKE'' и ''CALL PEEK'' "работают" с памятью, которая находится в слоте 3-3 и отвечает за работу локальной сети. Во всех остальных случаях действие оператора ''CALL POKE'' совпадает с действием оператора ''POKE'', а действие оператора ''CALL PEEK'' совпадает с действием функции ''PEEK''. | ||
+ | |||
+ | <WRAP group 99%> | ||
+ | <WRAP half column> \\ </WRAP> | ||
+ | <WRAP half column><WRAP justify> | ||
+ | Следует стремиться увидеть в каждой вещи то, чего | ||
+ | \\ еще никто не видел, и над чем еще ни кто не думал. | ||
+ | <WRAP rightalign> | ||
+ | —//Г.Лихтенберг// | ||
+ | </WRAP></WRAP> | ||
+ | </WRAP></WRAP> | ||
+ | |||
+ | <WRAP group 99%> | ||
+ | <WRAP half column> \\ </WRAP> | ||
+ | <WRAP half column><WRAP justify> | ||
+ | \\ То, что я понял,прекрасно, из этого я заключаю, | ||
+ | \\ что остальное, чего я не понял, тоже прекрасно. | ||
+ | <WRAP rightalign> | ||
+ | —//Сократ// | ||
+ | </WRAP></WRAP> | ||
+ | </WRAP></WRAP> | ||
{{anchor:n1083}} | {{anchor:n1083}} | ||
===== 1.8.3. Создание новых операторов ===== | ===== 1.8.3. Создание новых операторов ===== | ||
- | В языке [[msx:basic:|]] допускается использование так называемых "встроенных" подпрограмм. Каждая из этих подпрограмм имеет свое имя. Для обращения к встроенным подпрограммам используется оператор | + | В языке [[msx:basic:|]] допускается использование так называемых "встроенных" подпрограмм. Каждая из этих подпрограмм имеет свое имя. Для обращения к встроенным подпрограммам используется оператор: |
<WRAP group> | <WRAP group> | ||
<WRAP half column> | <WRAP half column> | ||
Строка 524: | Строка 545: | ||
</WRAP> | </WRAP> | ||
</WRAP> | </WRAP> | ||
- | где: | + | где: |
- | * ''CALL''("call"-"звать") - служебное слово, которое можно заменять знаком "_"; | + | * ''CALL''("call"-"звать") — служебное слово, которое можно заменять знаком "_"; |
- | * список параметров - необязательный список,содержащий одно или несколько выражений, отделенных друг от друга запятыми. | + | * список параметров — необязательный список,содержащий одно или несколько выражений, отделенных друг от друга запятыми. |
- | Рассмотрим несколько встроенных подпрограмм, имеющих отношение к локальной вычислительной сети компьютеров MSX-1. | + | Рассмотрим несколько встроенных подпрограмм, имеющих отношение к локальной вычислительной сети компьютеров MSX-1. |
- | - <WRAP>Каждый из компьютеров локальной сети имеет номер, который можно узнать, выполнив в непосредственном режиме команду | + | - <WRAP>Каждый из компьютеров локальной сети имеет номер, который можно узнать, выполнив в непосредственном режиме команду |
<WRAP group> | <WRAP group> | ||
<WRAP half column> | <WRAP half column> | ||
Строка 544: | Строка 565: | ||
где ''WHO'' ("кто") — служебное слово. | где ''WHO'' ("кто") — служебное слово. | ||
</WRAP> | </WRAP> | ||
- | - <WRAP>Скорость передачи информации по сети по умолчанию равна 2400 бод, однако ее можно регулировать оператором | + | - <WRAP>Скорость передачи информации по сети по умолчанию равна 2400 бод, однако ее можно регулировать оператором |
{{anchor:call_comini}} | {{anchor:call_comini}} | ||
<WRAP group> | <WRAP group> | ||
Строка 562: | Строка 583: | ||
В общем случае оператор ''CALL COMINI'' производит инициализацию сети. | В общем случае оператор ''CALL COMINI'' производит инициализацию сети. | ||
- | Информацию об аргументах подпрограммы ''COMINI'' можно получить командой | + | Информацию об аргументах подпрограммы ''COMINI'' можно получить командой |
{{anchor:call_comhelp}} | {{anchor:call_comhelp}} | ||
<WRAP group> | <WRAP group> | ||
Строка 577: | Строка 598: | ||
</WRAP> | </WRAP> | ||
- | - <WRAP>{{anchor:call_com}} Имеется возможность обработки прерываний после поступления данных из локальной сети. Оператор перехода к подпрограмме обработки прерываний выглядит следующим образом: | + | - <WRAP>{{anchor:call_com}} Имеется возможность обработки прерываний после поступления данных из локальной сети. Оператор перехода к подпрограмме обработки прерываний выглядит следующим образом: |
<WRAP group> | <WRAP group> | ||
<WRAP half column> | <WRAP half column> | ||
Строка 594: | Строка 615: | ||
* {{anchor:call_comoff}} ''CALL COMOFF'' — запрещает обработку прерываний; | * {{anchor:call_comoff}} ''CALL COMOFF'' — запрещает обработку прерываний; | ||
* {{anchor:call_comstop}} ''CALL COMSTOP'' — временно приостанавливает обработку. | * {{anchor:call_comstop}} ''CALL COMSTOP'' — временно приостанавливает обработку. | ||
- | + | ||
<WRAP round tip> | <WRAP round tip> | ||
Важно отметить, что пользователь может создать //новый// , собственный оператор ''CALL'' . | Важно отметить, что пользователь может создать //новый// , собственный оператор ''CALL'' . | ||
Строка 602: | Строка 623: | ||
- | В рабочей области RAM, начиная с адреса FCC9h, находится участок памяти, отвечающий за каждую //логическую// страницу памяти, находящуюся в некотором слоте, причем адрес байта памяти, непосредственно отвечающего за логическую страницу памяти, вычисляется по формуле: | + | В рабочей области RAM, начиная с адреса FCC9h, находится участок памяти, отвечающий за каждую //логическую// страницу памяти, находящуюся в некотором слоте, причем адрес байта памяти, непосредственно отвечающего за логическую страницу памяти, вычисляется по формуле: |
<WRAP group> | <WRAP group> | ||
<WRAP half column> | <WRAP half column> | ||
Строка 633: | Строка 654: | ||
файловыми устройствами. | файловыми устройствами. | ||
</code> | </code> | ||
- | Приведем теперь пример программы, позволяющей "изготовить" //новые// операторы ''CALL''. После запуска этой программы с адреса 9000h становится возможным использование операторов | + | Приведем теперь пример программы, позволяющей "изготовить" //новые// операторы ''CALL''. После запуска этой программы с адреса 9000h становится возможным использование операторов |
* ''CALL FATPRINT'' ("утолщение" символов), | * ''CALL FATPRINT'' ("утолщение" символов), | ||
* ''CALL SCRON'' (включение экрана дисплея), | * ''CALL SCRON'' (включение экрана дисплея), | ||
* ''CALL SCROFF'' (выключение экрана дисплея). | * ''CALL SCROFF'' (выключение экрана дисплея). | ||
- | Заметим, что число возможных подпрограмм для обработки нестандартных операторов ограничивается только размерами логической страницы! | + | Заметим, что число возможных подпрограмм для обработки нестандартных операторов ограничивается только размерами логической страницы! |
<WRAP group 99%> | <WRAP group 99%> | ||
<WRAP half column> \\ </WRAP> | <WRAP half column> \\ </WRAP> | ||
<WRAP half column><WRAP justify> | <WRAP half column><WRAP justify> | ||
- | Читающий, если не усвоишь - перечти, | + | Читающий, если не усвоишь — перечти, |
\\ переждав. | \\ переждав. | ||
<WRAP rightalign> | <WRAP rightalign> |