Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
msx:basic_dialogue_programming_language:010 [2022-09-19 23:34] GreyWolf [X.10. Порты ввода–вывода] |
msx:basic_dialogue_programming_language:010 [2023-02-19 16:22] (текущий) GreyWolf |
||
---|---|---|---|
Строка 6: | Строка 6: | ||
<WRAP group 99%> | <WRAP group 99%> | ||
<WRAP half column> \\ </WRAP> | <WRAP half column> \\ </WRAP> | ||
- | <WRAP half column><WRAP justify> | + | <WRAP half column><WRAP right> |
Мозг, хорошо устроенный, стоит больше, чем мозг, хорошо наполненный. | Мозг, хорошо устроенный, стоит больше, чем мозг, хорошо наполненный. | ||
<WRAP rightalign> | <WRAP rightalign> | ||
Строка 489: | Строка 489: | ||
<WRAP group 99%> | <WRAP group 99%> | ||
<WRAP half column> \\ </WRAP> | <WRAP half column> \\ </WRAP> | ||
- | <WRAP half column><WRAP justify> | + | <WRAP half column><WRAP right> |
Ты славно роешь землю, старый крот! \\ | Ты славно роешь землю, старый крот! \\ | ||
Годишься в рудокопы. | Годишься в рудокопы. | ||
Строка 722: | Строка 722: | ||
<WRAP group 99%> | <WRAP group 99%> | ||
<WRAP half column> \\ </WRAP> | <WRAP half column> \\ </WRAP> | ||
- | <WRAP half column><WRAP justify> | + | <WRAP half column><WRAP right> |
Что имеем — не храним; потерявши — плачем. | Что имеем — не храним; потерявши — плачем. | ||
<WRAP rightalign> | <WRAP rightalign> | ||
Строка 846: | Строка 846: | ||
<WRAP group 99%> | <WRAP group 99%> | ||
<WRAP half column> \\ </WRAP> | <WRAP half column> \\ </WRAP> | ||
- | <WRAP half column><WRAP justify> | + | <WRAP half column><WRAP right> |
А люди все роптали и роптали, \\ | А люди все роптали и роптали, \\ | ||
А люди справедливости хотят: \\ | А люди справедливости хотят: \\ | ||
Строка 1256: | Строка 1256: | ||
<WRAP group 99%> | <WRAP group 99%> | ||
<WRAP half column> \\ </WRAP> | <WRAP half column> \\ </WRAP> | ||
- | <WRAP half column><WRAP justify> | + | <WRAP half column><WRAP right> |
Чтобы вычистить одно, приходится выпачкать что–нибудь другое; но можно испачкать всё, что угодно, и ничего при этом не вычистить. | Чтобы вычистить одно, приходится выпачкать что–нибудь другое; но можно испачкать всё, что угодно, и ничего при этом не вычистить. | ||
<WRAP rightalign> | <WRAP rightalign> | ||
Строка 1377: | Строка 1377: | ||
<WRAP group 99%> | <WRAP group 99%> | ||
<WRAP half column> \\ </WRAP> | <WRAP half column> \\ </WRAP> | ||
- | <WRAP half column><WRAP justify> | + | <WRAP half column><WRAP right> |
Garbage collection ("чистка памяти", "сборка мусора") — действия системы динамического распределения памяти для обнаружения неиспользуемых программой блоков памяти и присоединения их к списку свободной памяти для повторного использования. | Garbage collection ("чистка памяти", "сборка мусора") — действия системы динамического распределения памяти для обнаружения неиспользуемых программой блоков памяти и присоединения их к списку свободной памяти для повторного использования. | ||
<WRAP rightalign> | <WRAP rightalign> | ||
Строка 1693: | Строка 1693: | ||
<WRAP group 99%> | <WRAP group 99%> | ||
<WRAP half column> \\ </WRAP> | <WRAP half column> \\ </WRAP> | ||
- | <WRAP half column><WRAP justify> | + | <WRAP half column><WRAP right> |
Промедление с лёгким делом превращает его в трудное, промедление же с трудным делом превращает его в невозможное. | Промедление с лёгким делом превращает его в трудное, промедление же с трудным делом превращает его в невозможное. | ||
<WRAP rightalign> | <WRAP rightalign> | ||
Строка 1782: | Строка 1782: | ||
<WRAP group 99%> | <WRAP group 99%> | ||
<WRAP half column> \\ </WRAP> | <WRAP half column> \\ </WRAP> | ||
- | <WRAP half column><WRAP justify> | + | <WRAP half column><WRAP right> |
И я надеюсь, что наши потомки будут благодарны | И я надеюсь, что наши потомки будут благодарны | ||
\\ мне не только за то, что я здесь разъяснил, но | \\ мне не только за то, что я здесь разъяснил, но | ||
Строка 1838: | Строка 1838: | ||
| &HB5 | Чтение(Запись) | Чтение/запись данных в ОЗУ таймера | | | &HB5 | Чтение(Запись) | Чтение/запись данных в ОЗУ таймера | | ||
| &HB8 | | Световое перо (Sanyo) (через &HBB) | | | &HB8 | | Световое перо (Sanyo) (через &HBB) | | ||
- | |FIXME <code>├────────────────┼───────────────┼─────────────────────────────────────┤ | + | | &HF7 | Запись |<WRAP>Управление Audio/Video \\ \\ Номер бита / Назначение бита |
- | │ │ │ Управление Audio/Video │ | + | * 4 Управление AV (0 — TV) |
- | │ │ ├─────┬───────────────────────────────┤ | + | * 5 Управление Ym (0 — TV) |
- | │ │ │Номер│ Назначение бита │ | + | * 6 Управление Ys (0 — Super) |
- | │ │ │бита │ │ | + | * 7 Выбор Video (0 — TV) |
- | │ &HF7 │ Запись ├─────┼───────────────────────────────┤ | + | </WRAP>| |
- | │ │ │ 4 │ Управление AV (0 - TV) │ | + | |
- | │ │ │ 5 │ Управление Ym (0 - TV) │ | + | |
- | │ │ │ 6 │ Управление Ys (0 - Super) │ | + | |
- | │ │ │ 7 │ Выбор Video (0 - TV) │ | + | |
- | ├────────────────┼───────────────┼─────┴───────────────────────────────┤</code>||| | + | |
| &HFC | Чтение(Запись) | Регистры распределения //слотов// (расширений памяти) для компьютеров серии [[msx:msx_2]] | | | &HFC | Чтение(Запись) | Регистры распределения //слотов// (расширений памяти) для компьютеров серии [[msx:msx_2]] | | ||
| &HFD | Чтение(Запись) |:::| | | &HFD | Чтение(Запись) |:::| | ||
Строка 1913: | Строка 1908: | ||
Объясним роль логической операции ''AND''. Значением, возвращаемым функцией ''INP(&H02)'', является двоичное число, записанное в одном байте. "Содержимое" четырёх старших битов байта нас не интересует. Заметим, что число 15 = &b00001111. Как Вы уже, наверное, догадались, логическая операция ''AND'' позволяет выделить нужные нам четыре младших бита. | Объясним роль логической операции ''AND''. Значением, возвращаемым функцией ''INP(&H02)'', является двоичное число, записанное в одном байте. "Содержимое" четырёх старших битов байта нас не интересует. Заметим, что число 15 = &b00001111. Как Вы уже, наверное, догадались, логическая операция ''AND'' позволяет выделить нужные нам четыре младших бита. | ||
+ | |||
+ | 8-) Подробнее о портах ввода/вывода написано [[msx:io_ports|здесь]]. | ||
{{anchor:n10101}} | {{anchor:n10101}} | ||
Строка 1924: | Строка 1921: | ||
<WRAP centeralign>Порт А используется для выбора //слотов//, осуществляющих управление расширенной памятью компьютера.</WRAP> | <WRAP centeralign>Порт А используется для выбора //слотов//, осуществляющих управление расширенной памятью компьютера.</WRAP> | ||
+ | За подробностями мы отсылаем Вас к Приложению 1 ([[108#n182|раздел 1.8.2]]) | ||
- | <WRAP centeralign>Порты PPI B и C применяются для "работы" с матрицей клавиатуры, причём номер строки матрицы клавиатуры "посылается" в порт C, а номер столбца "читается" в порту B.</WRAP> | + | <WRAP centeralign>Порты B и C применяются для "работы" с матрицей клавиатуры, причём номер строки матрицы клавиатуры "посылается" в порт C, а номер столбца "читается" в порту B.</WRAP> |
{{anchor:e1011-01}} __//Пример 1//__. //Обнаружение// нажатия клавиши <key>GRAPH</key>. \\ {{.examples:1011-01.bas|}} \\ [[+tab|wmsxbpge>1011-01.bas]] | {{anchor:e1011-01}} __//Пример 1//__. //Обнаружение// нажатия клавиши <key>GRAPH</key>. \\ {{.examples:1011-01.bas|}} \\ [[+tab|wmsxbpge>1011-01.bas]] | ||
- | Отметим, что клавиша <key>GRAPH</key> находится в строке 6 и столбце 2 матрицы клавиатуры (и строки, и столбцы матрицы нумеруются, начиная с 0). Тогда: | + | Отметим, что клавиша <key>GRAPH</key> находится в строке 6 и столбце 2 матрицы клавиатуры (и строки и столбцы матрицы нумеруются, начиная с 0). Тогда: |
- номер строки матрицы клавиатуры "посылаем" в порт C : <code>OUT &HAA,6</code> | - номер строки матрицы клавиатуры "посылаем" в порт C : <code>OUT &HAA,6</code> | ||
- "извлекаем" номер столбца из порта B: <code>X=INP(&HA9)</code> | - "извлекаем" номер столбца из порта B: <code>X=INP(&HA9)</code> | ||
Строка 1950: | Строка 1948: | ||
Взгляните на приведённую ниже таблицу, в которой описаны назначения битов порта C: | Взгляните на приведённую ниже таблицу, в которой описаны назначения битов порта C: | ||
- | |Биты 0÷3|Строка клавиатуры| | + | |Биты 0÷3|Строка матрицы клавиатуры| |
- | |Бит 4|Если 0, то запускается кассетная лента| | + | |Бит 4|Если 0, то запускается магнитная лента| |
- | |Бит 5|Сигнал записи на ленту| | + | |Бит 5|Сигнал записи на магнитную ленту| |
|Бит 6|Если 0, то включается индикатор "CAPS"| | |Бит 6|Если 0, то включается индикатор "CAPS"| | ||
|Бит 7|Управление звуковым сигналом| | |Бит 7|Управление звуковым сигналом| | ||
Строка 2061: | Строка 2059: | ||
|<code>PLAY "O4B"</code>| 227 | 0 | | |<code>PLAY "O4B"</code>| 227 | 0 | | ||
|<code>PLAY "O5C"</code>| 214 | 0 | | |<code>PLAY "O5C"</code>| 214 | 0 | | ||
+ | |||
+ | Вы можете проверить эту таблицу при помощи следующей программы: | ||
+ | <code> | ||
+ | 10 PLAY "O4C" | ||
+ | 20 OUT &hA0,0: PRINT INP(&hA2) 'Читаем данные | ||
+ | 30 OUT &hA0,1: PRINT INP(&hA2) 'из регистров PSG | ||
+ | </code> | ||
+ | А теперь слушайте ... | ||
{{anchor:e1012-03}} __//Пример 3//__. Гамма "до–мажор". \\ {{.examples:1012-03.bas|}} \\ [[+tab|wmsxbpge>1012-03.bas]] | {{anchor:e1012-03}} __//Пример 3//__. Гамма "до–мажор". \\ {{.examples:1012-03.bas|}} \\ [[+tab|wmsxbpge>1012-03.bas]] | ||
Строка 2072: | Строка 2078: | ||
60 OUT &HA0,8:OUT &HA1,0 'Сбросим громкость канала A | 60 OUT &HA0,8:OUT &HA1,0 'Сбросим громкость канала A | ||
</code> | </code> | ||
+ | |||
{{anchor:e1012-04}} __//Пример 4//__. "В траве сидел кузнечик!" \\ {{.examples:1012-04.bas|}} \\ [[+tab|wmsxbpge>1012-04.bas]] | {{anchor:e1012-04}} __//Пример 4//__. "В траве сидел кузнечик!" \\ {{.examples:1012-04.bas|}} \\ [[+tab|wmsxbpge>1012-04.bas]] | ||
+ | \\ 8-) В авторском варианте отсутствует. | ||
<code> | <code> | ||
10 'DEFINTA-Z:BEEP | 10 'DEFINTA-Z:BEEP | ||
Строка 2165: | Строка 2173: | ||
Вы можете прервать затянувшееся "ожидание", нажав клавиши <key>CTRL+STOP</key> (при этом Вы вернётесь в командный режим). | Вы можете прервать затянувшееся "ожидание", нажав клавиши <key>CTRL+STOP</key> (при этом Вы вернётесь в командный режим). | ||
- | Содержимое порта с указанным адресом заносится в некоторый регистр процессора Z–80, который мы назовём X. Далее содержимое регистра X комбинируется со значениями параметров M и С, по формуле: | + | Содержимое порта с указанным адресом заносится в некоторый регистр процессора Z–80, который мы назовём X. Далее содержимое регистра X комбинируется со значениями параметров M и С по формуле: |
<code> | <code> | ||
X = (X XOR C) AND M | X = (X XOR C) AND M | ||
Строка 2179: | Строка 2187: | ||
| | | | | | | | ||
| (X XOR C) AND M |0 0 0 1 0 1 0 0| | | (X XOR C) AND M |0 0 0 1 0 1 0 0| | ||
+ | |||
Вопрос к читателю: Какой вид будет иметь таблица–"подсказка" при отсутствии параметра C ? | Вопрос к читателю: Какой вид будет иметь таблица–"подсказка" при отсутствии параметра C ? | ||
Строка 2193: | Строка 2202: | ||
* <code>WAIT &H90,2,0 'Ожидается отключение принтера</code> | * <code>WAIT &H90,2,0 'Ожидается отключение принтера</code> | ||
+ | {{anchor:n1011}} | ||
+ | ===== X.11. Дополнение ===== | ||
- | __//Дополнение//__. Работа с портом ввода–вывода с адресом &h0C | + | Работа с портом ввода–вывода с адресом &h0C |
- | Предварительно кратко опишем структуру порта &h0C… | + | Предварительно кратко опишем структуру данного порта. |
<code> | <code> | ||
Старший ┌───┬───┬───┬───┬───┬───┬───┬───┐ Младший | Старший ┌───┬───┬───┬───┬───┬───┬───┬───┐ Младший | ||
Строка 2209: | Строка 2220: | ||
</code> | </code> | ||
- | А теперь два примера использования данного порта… | + | А теперь два примера его использования. |
+ | ''//Внимание !//'' Слабонервных просим не смотреть: примеры написаны на [[msx:macro-80_assembler::|Макроассемблере M80]]! | ||
__//Пример 1//__. //Посылка// байта по сети | __//Пример 1//__. //Посылка// байта по сети | ||
Строка 2243: | Строка 2255: | ||
EI ; | EI ; | ||
RET ; | RET ; | ||
+ | </code> | ||
+ | |||
+ | Карта адресов портов ввода–вывода для компьютеров MSX-1 [[bibliography#b30|[30]]] | ||
+ | <code> | ||
+ | FF·┌──────────────────────────────┐ | ||
+ | │ │ | ||
+ | F8·├──────────────────────────────┤ | ||
+ | │ Порты управления Audio/Video │ | ||
+ | F7·├──────────────────────────────┤ | ||
+ | │ │ | ||
+ | F0·├──────────────────────────────┤ | ||
+ | │ │ | ||
+ | E0·├──────────────────────────────┤ | ||
+ | │ ROM для китайских иероглифов │ | ||
+ | D8·├──────────────────────────────┤ | ||
+ | │ Контроллер Floppy Disk │ | ||
+ | D0·├──────────────────────────────┤ | ||
+ | │ │ | ||
+ | C0·├──────────────────────────────┤ | ||
+ | │ Световое перо │ | ||
+ | B8·├──────────────────────────────┤ | ||
+ | │ │ | ||
+ | B5·├──────────────────────────────┤ | ||
+ | │ Календарь. Часы │ | ||
+ | B4·├──────────────────────────────┤ | ||
+ | │ Внешняя память │ | ||
+ | B0·├──────────────────────────────┤ | ||
+ | │ PPI (8255) │ | ||
+ | A8·├──────────────────────────────┤ | ||
+ | │ PSG (AY-3-8910) │ | ||
+ | A0·├──────────────────────────────┤ | ||
+ | │ VDP (9918A) │ | ||
+ | 98·├──────────────────────────────┤ | ||
+ | │ Принтер │ | ||
+ | 90·├──────────────────────────────┤ | ||
+ | │ │ | ||
+ | 88·├──────────────────────────────┤ | ||
+ | │ RS-232C │ | ||
+ | 80·├──────────────────────────────┤ | ||
+ | │ Зарезервированы │ | ||
+ | 40·├──────────────────────────────┤ | ||
+ | │ Не определены │ | ||
+ | 00·└──────────────────────────────┘ | ||
</code> | </code> | ||