Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
msx:basic_dialogue_programming_language:108 [2023-02-15 19:41] GreyWolf [1.8.2 Работа со слотами] |
msx:basic_dialogue_programming_language:108 [2023-02-19 16:28] (текущий) GreyWolf |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
[<>] | [<>] | ||
~~TOC wide~~ | ~~TOC wide~~ | ||
- | |||
- | [[msx:basic_dialogue_programming_language:108_old|]] | ||
FIXME | FIXME | ||
Строка 11: | Строка 9: | ||
<WRAP group 99%> | <WRAP group 99%> | ||
<WRAP half column> \\ </WRAP> | <WRAP half column> \\ </WRAP> | ||
- | <WRAP half column><WRAP justify> | + | <WRAP half column><WRAP right> |
Удачное аппаратное и программное решение определили | Удачное аппаратное и программное решение определили | ||
\\ популярность MSX–компьютеров в нашей стране. Однако | \\ популярность MSX–компьютеров в нашей стране. Однако | ||
Строка 22: | Строка 20: | ||
В подготовке этого материала принимали непосредственное участие: | В подготовке этого материала принимали непосредственное участие: | ||
- | \\ В.С.Лашук (Владимирский государственный педагогический институт), | + | \\ В.С.Лашук (Владимирский государственный педагогический институт), |
\\ Ю.В.Юзифович (учащийся 8–го класса, г.Куйбышев). | \\ Ю.В.Юзифович (учащийся 8–го класса, г.Куйбышев). | ||
Строка 31: | Строка 29: | ||
<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> | ||
—//Из дорожных правил Джоунса// | —//Из дорожных правил Джоунса// | ||
Строка 39: | Строка 37: | ||
</WRAP></WRAP> | </WRAP></WRAP> | ||
- | Каждый, кому приходится работать с большим объемом информации, неизбежно сталкивается с проблемой нехватки памяти. Обычно считается, что объем доступной для пользователя памяти на MSX-компьютерах (RAM) составляет всего 32 Кбайта. Однако оказывается, что действительный объем RAM гораздо больше: 64 Кбайта на компьютерах серии MSX-1 и 134 Кбайта на компьютерах | + | Каждый, кому приходится работать с большим объемом информации, неизбежно сталкивается с проблемой нехватки памяти. Обычно считается, что объем доступной для пользователя памяти на MSX–компьютерах (RAM) составляет всего 32 Кбайта. Однако оказывается, что действительный объем RAM гораздо больше: 64 Кбайта на компьютерах серии MSX-1 и 134 Кбайта на компьютерах |
серии MSX-2 ! | серии MSX-2 ! | ||
Строка 219: | Строка 217: | ||
</code> | </code> | ||
<WRAP round box> | <WRAP round box> | ||
- | Нумерация физических и логических страниц слота 3-2, а также адреса соответствующих портов в ученическом компьютере аналогичны учительскому компьютеру. | + | Нумерация физических и логических страниц слота 3-2, а также адреса соответствующих портов в ученическом компьютере аналогичны учительскому компьютеру. |
</WRAP> | </WRAP> | ||
</WRAP> | </WRAP> | ||
Строка 240: | Строка 238: | ||
<WRAP group 99%> | <WRAP group 99%> | ||
<WRAP half column> \\ </WRAP> | <WRAP half column> \\ </WRAP> | ||
- | <WRAP half column><WRAP justify> | + | <WRAP half column><WRAP right> |
— Боюсь, что эти подробности утомительны, | — Боюсь, что эти подробности утомительны, | ||
\\ но вам не разобраться в ситуации, если | \\ но вам не разобраться в ситуации, если | ||
Строка 249: | Строка 247: | ||
</WRAP></WRAP> | </WRAP></WRAP> | ||
- | Все адресное пространство MSX—компьютера разобьем на //четыре// т.н. //логические// страницы (объемом по 16 Kбайтов каждая). | + | Все адресное пространство MSX—компьютера разобьем на //четыре// т.н. //логические// страницы (объемом по 16 Kбайтов каждая). |
Пронумеруем их следующим образом: | Пронумеруем их следующим образом: | ||
Строка 255: | Строка 253: | ||
^ Логическая страница | 0 | 1 | 2 | 3 | | ^ Логическая страница | 0 | 1 | 2 | 3 | | ||
- | Заметим, что каждый слот также можно разбить на участки объемом по 16 Кбайтов каждый, которые мы будем называть //физическими// страницами памяти. Прежде чем начать работу с физической страницей памяти, ее необходимо //подключить// к некоторой логической странице адресного пространства, для чего выполнить следующие операции: | + | Заметим, что каждый слот также можно разбить на участки объемом по 16 Кбайтов каждый, которые мы будем называть //физическими// страницами памяти. Прежде чем начать работу с физической страницей памяти, ее необходимо //подключить// к некоторой логической странице адресного пространства, для чего выполнить следующие операции: |
* α) указать компьютеру //номер// подключаемой логической страницы(тем самым мы присвоим физической странице некоторый начальный адрес). Заметим, что при включении компьютера некоторым физическим страницам памяти начальный адрес присваивается автоматически; | * α) указать компьютеру //номер// подключаемой логической страницы(тем самым мы присвоим физической странице некоторый начальный адрес). Заметим, что при включении компьютера некоторым физическим страницам памяти начальный адрес присваивается автоматически; | ||
- | * β) указать //номера// первичного и вторичного слотов, которым принадлежит выбранная физическая страница памяти. | + | * β) указать //номера// первичного и вторичного слотов, которым принадлежит выбранная физическая страница памяти. |
- | Номера первичных слотов записываются в порт ввода–вывода с адресом A8h, а номера вторичных слотов - в ячейку FFFFh рабочей области (слот 3-2). | + | Номера первичных слотов записываются в порт ввода–вывода с адресом A8h, а номера вторичных слотов — в ячейку FFFFh рабочей области (слот 3-2). |
Порт ввода–вывода A8h: (номера //первичных// слотов) | Порт ввода–вывода A8h: (номера //первичных// слотов) | ||
Строка 287: | Строка 285: | ||
</code> | </code> | ||
- | Например, если содержимое порта A8h равно &B11001001 , а содержимое ячейки FFFFh равно &B01101100 , то в этом случае: | + | Например, если содержимое порта A8h равно &B11001001, а содержимое ячейки FFFFh равно &B01101100 , то в этом случае: |
* логическая страница 3 рассматривается как участок памяти из слота 3-1, | * логическая страница 3 рассматривается как участок памяти из слота 3-1, | ||
* логическая страница 2 рассматривается как участок памяти из слота 0-2, | * логическая страница 2 рассматривается как участок памяти из слота 0-2, | ||
Строка 295: | Строка 293: | ||
Теперь ясно, что подпрограмма подключения памяти к адресному пространству выглядит следующим образом: | Теперь ясно, что подпрограмма подключения памяти к адресному пространству выглядит следующим образом: | ||
<code> | <code> | ||
- | DI ; Запретить прерывания при работе с портами ввода-вывода | + | DI ; Запретить прерывания при работе с портами ввода–вывода |
LD A, Номера первичных слотов | LD A, Номера первичных слотов | ||
OUT (A8h),A | OUT (A8h),A | ||
Строка 319: | Строка 317: | ||
- | Теперь для того, чтобы узнать, какие вторичные слоты подключены к адресному пространству, необходимо инвертировать полученный результат (заменить нули — единицами, а единицы — нулями). | + | Теперь для того, чтобы узнать, какие вторичные слоты подключены к адресному пространству, необходимо инвертировать полученный результат (заменить нули — единицами, а единицы — нулями). |
<WRAP center round info 60%> | <WRAP center round info 60%> | ||
- | Отметим, что при включении компьютера в логические страницы 0 и 1 "помещаются" физические страницы памяти из слота 0, а в логические страницы 2 и 3 "помещаются" физические страницы памяти из слота 3-2. | + | Отметим, что при включении компьютера в логические страницы 0 и 1 "помещаются" физические страницы памяти из слота 0, а в логические страницы 2 и 3 "помещаются" физические страницы памяти из слота 3-2. |
- | Содержимое порта ввода-вывода с адресом A8h при этом становится равным &B11110000, а истинное содержимое ячейки памяти FFFFh становится равным &B10100000 (не забудьте про инвертирование!) | + | Содержимое порта ввода-вывода с адресом A8h при этом становится равным &B11110000, а истинное содержимое ячейки памяти FFFFh становится равным &B10100000 (не забудьте про инвертирование!) |
</WRAP> | </WRAP> | ||
Строка 342: | Строка 340: | ||
CONSOL EQU 00A2H ; Вывод символа на консоль. | CONSOL EQU 00A2H ; Вывод символа на консоль. | ||
- | START: LD HL,PROM ; Адрес старта реставрируемой подпрограммы | + | START: LD HL,PROM ; Адрес старта реставрируемой подпрограммы |
PUSH HL ; Сохранили в стеке и при встрече RET | PUSH HL ; Сохранили в стеке и при встрече RET | ||
DI ; переходим на этот адрес. | DI ; переходим на этот адрес. | ||
Строка 350: | Строка 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 ; | ||
Строка 394: | Строка 392: | ||
<WRAP round important> | <WRAP round important> | ||
//Внимание// ! | //Внимание// ! | ||
- | - Логическая страница с номером 3 ни при каких условиях не должна подвергаться изменениям, так как в ней расположены подпрограммы-ловушки и область системных переменных. Нарушение этого условия приведет к отказу системы от дальнейшего выполнения программы и ее сбросу. | + | - Логическая страница с номером 3 ни при каких условиях не должна подвергаться изменениям, так как в ней расположены подпрограммы–ловушки и область системных переменных. Нарушение этого условия приведет к отказу системы от дальнейшего выполнения программы и ее сбросу. |
- | - Если для физической страницы Вы используете начальный адрес 8000h, то прежде чем подключать ее к адресному пространству, позаботьтесь о перемещении программы на [[msx:basic:|]] и стека в "безопасное" место, каковым является логическая страница с номером 3. Для этого выполните программу: | + | - Если для физической страницы Вы используете начальный адрес 8000h, то прежде чем подключать ее к адресному пространству, позаботьтесь о перемещении программы на [[msx:basic:|]] и стека в "безопасное" место, каковым является логическая страница с номером 3. Для этого выполните программу: |
<code> | <code> | ||
10 POKE &HF676,1:POKE &HF677,&HC0:POKE &HC000,0:NEW | 10 POKE &HF676,1:POKE &HF677,&HC0:POKE &HC000,0:NEW | ||
Строка 410: | Строка 408: | ||
RET | RET | ||
</code> | </code> | ||
- | В качестве примера приведем программу подключения физической страницы из некоторого слота к логической странице 2 адресного пространства. | + | В качестве примера приведем программу подключения физической страницы из некоторого слота к логической странице 2 адресного пространства. |
{{anchor:e1082-03}} __//Пример 3//__. \\ {{.examples:1082-03.bas|}} \\ [[+tab|wmsxbpge>1082-03.bas]] | {{anchor:e1082-03}} __//Пример 3//__. \\ {{.examples:1082-03.bas|}} \\ [[+tab|wmsxbpge>1082-03.bas]] | ||
Строка 435: | Строка 433: | ||
</WRAP> | </WRAP> | ||
- | Существует, однако, другой способ работы со слотами,заключающийся в использовании подпрограмм BIOS, расположенных в слоте 0. В этом случае проблема распределения памяти снимается с пользователя и целиком возлагается на систему. | + | Существует, однако, другой способ работы со слотами,заключающийся в использовании подпрограмм BIOS, расположенных в слоте 0. В этом случае проблема распределения памяти снимается с пользователя и целиком возлагается на систему. |
- | | + | |
Опишем работу с некоторыми из этих подпрограмм. | Опишем работу с некоторыми из этих подпрограмм. | ||
Строка 458: | Строка 456: | ||
</code> | </code> | ||
- | //Чтение// числа из любой физической страницы, имеющей некоторый начальный адрес, осуществляется путем обращения к подпрограмме с именем ''RDSLT'', расположенной по адресу 000Ch. | + | //Чтение// числа из любой физической страницы, имеющей некоторый начальный адрес, осуществляется путем обращения к подпрограмме с именем ''RDSLT'', расположенной по адресу 000Ch. |
{{anchor:e1082-05}} __//Пример 5//__. \\ {{.examples:1082-05.bas|}} \\ [[+tab|wmsxbpge>1082-05.bas]] | {{anchor:e1082-05}} __//Пример 5//__. \\ {{.examples:1082-05.bas|}} \\ [[+tab|wmsxbpge>1082-05.bas]] | ||
Строка 478: | Строка 476: | ||
</code> | </code> | ||
- | Посмотрев на схему расположения памяти в слотах, Вы можете заметить, что некоторые физические страницы памяти слота 3-2 в компьютерах серии MSX-2 не имеют //фиксированных// адресов. Пронумеруем все физические страницы слота 3-2 от 0 до 7 сверху вниз (в порядке следования на рисунке). | + | Посмотрев на схему расположения памяти в слотах, Вы можете заметить, что некоторые физические страницы памяти слота 3-2 в компьютерах серии MSX-2 не имеют //фиксированных// адресов. Пронумеруем все физические страницы слота 3-2 от 0 до 7 сверху вниз (в порядке следования на рисунке). |
- | Любую из этих физических страниц можно подключить к любой логической странице адресного пространства. | + | Любую из этих физических страниц можно подключить к любой логической странице адресного пространства. |
<WRAP round important> | <WRAP round important> | ||
Строка 486: | Строка 484: | ||
</WRAP> | </WRAP> | ||
- | Подключить физические страницы слота 3-2 можно путем воздействия на порты ввода-вывода с адресами 252, 253, 254 и 255. При этом, если Вы используете порт с адресом 252+N, то процессор подключит распределяемую физическую страницу к логической странице с номером N. | + | Подключить физические страницы слота 3-2 можно путем воздействия на порты ввода–вывода с адресами 252, 253, 254 и 255. При этом, если Вы используете порт с адресом 252+N, то процессор подключит распределяемую физическую страницу к логической странице с номером N. |
Для подключения физической страницы к логической выполните команду | Для подключения физической страницы к логической выполните команду | ||
Строка 503: | Строка 501: | ||
* ''N1'' — номер логической страницы, | * ''N1'' — номер логической страницы, | ||
* ''N2'' — номер физической страницы, | * ''N2'' — номер физической страницы, | ||
- | * ''&hF8'' — число, полученное при вычитании 256 - M , | + | * ''&hF8'' — число, полученное при вычитании 256 - M , |
* ''M '' — число физических страниц в слоте 3-2. | * ''M '' — число физических страниц в слоте 3-2. | ||
Таким образом Вы получите доступ к //любой// ячейке памяти в слоте 3-2 (внимательно изучите //текст// на схеме расположения памяти в слотах)! | Таким образом Вы получите доступ к //любой// ячейке памяти в слоте 3-2 (внимательно изучите //текст// на схеме расположения памяти в слотах)! | ||
- | В заключение отметим, что для доступа к физическим страницам памяти, подключенным к адресному пространству,применяются оператор ''POKE'' и функция ''PEEK''. Кроме того, для работы с памятью компьютера серии MSX-2, подключенного к локальной сети, применяются операторы ''CALL POKE'' и ''CALL PEEK''. | + | В заключение отметим, что для доступа к физическим страницам памяти, подключенным к адресному пространству,применяются оператор ''POKE'' и функция ''PEEK''. Кроме того, для работы с памятью компьютера серии MSX-2, подключенного к локальной сети, применяются операторы ''CALL POKE'' и ''CALL PEEK''. |
- | Если адрес принадлежит отрезку [&h4000,&h7FFF], то операторы ''CALL POKE'' и ''CALL PEEK'' "работают" с памятью, которая находится в слоте 3-3 и отвечает за работу локальной сети. Во всех остальных случаях действие оператора ''CALL POKE'' совпадает с действием оператора ''POKE'', а действие оператора ''CALL PEEK'' совпадает с действием функции ''PEEK''. | + | Если адрес принадлежит отрезку [&h4000,&h7FFF], то операторы ''CALL POKE'' и ''CALL PEEK'' "работают" с памятью, которая находится в слоте 3-3 и отвечает за работу локальной сети. Во всех остальных случаях действие оператора ''CALL POKE'' совпадает с действием оператора ''POKE'', а действие оператора ''CALL PEEK'' совпадает с действием функции ''PEEK''. |
<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> | ||
Строка 524: | Строка 522: | ||
<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> | ||
—//Сократ// | —//Сократ// | ||
Строка 535: | Строка 533: | ||
===== 1.8.3. Создание новых операторов ===== | ===== 1.8.3. Создание новых операторов ===== | ||
- | В языке [[msx:basic:|]] допускается использование так называемых "встроенных" подпрограмм. Каждая из этих подпрограмм имеет свое имя. Для обращения к встроенным подпрограммам используется оператор | + | В языке [[msx:basic:|]] допускается использование так называемых "встроенных" подпрограмм. Каждая из этих подпрограмм имеет свое имя. Для обращения к встроенным подпрограммам используется оператор: |
<WRAP group> | <WRAP group> | ||
<WRAP half column> | <WRAP half column> | ||
Строка 548: | Строка 546: | ||
</WRAP> | </WRAP> | ||
где: | где: | ||
- | * ''CALL''("call"-"звать") - служебное слово, которое можно заменять знаком "_"; | + | * ''CALL''("call"-"звать") — служебное слово, которое можно заменять знаком "_"; |
- | * список параметров - необязательный список,содержащий одно или несколько выражений, отделенных друг от друга запятыми. | + | * список параметров — необязательный список,содержащий одно или несколько выражений, отделенных друг от друга запятыми. |
Рассмотрим несколько встроенных подпрограмм, имеющих отношение к локальной вычислительной сети компьютеров MSX-1. | Рассмотрим несколько встроенных подпрограмм, имеющих отношение к локальной вычислительной сети компьютеров MSX-1. | ||
Строка 625: | Строка 623: | ||
- | В рабочей области RAM, начиная с адреса FCC9h, находится участок памяти, отвечающий за каждую //логическую// страницу памяти, находящуюся в некотором слоте, причем адрес байта памяти, непосредственно отвечающего за логическую страницу памяти, вычисляется по формуле: | + | В рабочей области RAM, начиная с адреса FCC9h, находится участок памяти, отвечающий за каждую //логическую// страницу памяти, находящуюся в некотором слоте, причем адрес байта памяти, непосредственно отвечающего за логическую страницу памяти, вычисляется по формуле: |
<WRAP group> | <WRAP group> | ||
<WRAP half column> | <WRAP half column> | ||
Строка 664: | Строка 662: | ||
<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> |