Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
msx:basic_dialogue_programming_language:108 [2023-02-15 19:07] 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 | ||
Строка 309: | Строка 307: | ||
+ | {{anchor:e1082-01}} __//Пример 1//__. \\ {{.examples:1082-01.bas|}} \\ [[+tab|wmsxbpge>1082-01.bas]] | ||
+ | <code> | ||
+ | 10 POKE &HFFFF, &B01101100 | ||
+ | 20 PRINT BIN$(PEEK(&HFFFF)) | ||
+ | run | ||
+ | 10010011 | ||
+ | Ok | ||
+ | </code> | ||
+ | |||
+ | |||
+ | Теперь для того, чтобы узнать, какие вторичные слоты подключены к адресному пространству, необходимо инвертировать полученный результат (заменить нули — единицами, а единицы — нулями). | ||
+ | |||
+ | <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> | <code> | ||
- | П р и м е р 1. 10 POKE &HFFFF, &B01101100 | ||
- | ────────────── 20 PRINT BIN$(PEEK(&HFFFF)) | ||
- | run | ||
- | 10010011 | ||
- | Ok | ||
- | Теперь для того, чтобы узнать, какие вторичные слоты подключены к ад- | ||
- | ресному пространству, необходимо инвертировать полученный результат (заме- | ||
- | нить нули - единицами, а единицы - нулями). | ||
- | ┌─────────────────────────────────────────────────────────────────────┐ | ||
- | │ Отметим, что при включении компьютера в логические страницы 0 и 1 │ | ||
- | │ "помещаются" физические страницы памяти из слота 0, а в логические │ | ||
- | │ страницы 2 и 3 "помещаются" физические страницы памяти из слота 3-2.│ | ||
- | │ Содержимое порта ввода-вывода с адресом A8h при этом становится рав-│ | ||
- | │ ным &B11110000, а истинное содержимое ячейки памяти FFFFh становит-│ | ||
- | │ ся равным &B10100000 (не забудьте про инвертирование!) │ | ||
- | └─────────────────────────────────────────────────────────────────────┘ | ||
- | Если до выключения компьютера на странице 1 слота 3-2 создать идентифи- | ||
- | катор ROM и разместить на данной странице Вашу подпрограмму, то она будет | ||
- | "стартовать" при включении компьютера, т.к.первое обращение идет к этой | ||
- | странице. | ||
- | П р и м е р 2. А теперь небольшой фрагмент на макроассемблере... | ||
- | ───────────── | ||
DEFB 0FEH ; Программа запускается с адреса &H9000 | DEFB 0FEH ; Программа запускается с адреса &H9000 | ||
DEFW START,KONEC+END-NACH,START | DEFW START,KONEC+END-NACH,START | ||
Строка 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 ; | ||
Строка 390: | Строка 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 right> | ||
+ | Следует стремиться увидеть в каждой вещи то, чего | ||
+ | \\ еще никто не видел, и над чем еще ни кто не думал. | ||
+ | <WRAP rightalign> | ||
+ | —//Г.Лихтенберг// | ||
+ | </WRAP></WRAP> | ||
+ | </WRAP></WRAP> | ||
+ | |||
+ | <WRAP group 99%> | ||
+ | <WRAP half column> \\ </WRAP> | ||
+ | <WRAP half column><WRAP right> | ||
+ | \\ То, что я понял,прекрасно, из этого я заключаю, | ||
+ | \\ что остальное, чего я не понял, тоже прекрасно. | ||
+ | <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> | ||
Строка 544: | Строка 546: | ||
</WRAP> | </WRAP> | ||
где: | где: | ||
- | * ''CALL''("call"-"звать") - служебное слово, которое можно заменять знаком "_"; | + | * ''CALL''("call"-"звать") — служебное слово, которое можно заменять знаком "_"; |
- | * список параметров - необязательный список,содержащий одно или несколько выражений, отделенных друг от друга запятыми. | + | * список параметров — необязательный список,содержащий одно или несколько выражений, отделенных друг от друга запятыми. |
Рассмотрим несколько встроенных подпрограмм, имеющих отношение к локальной вычислительной сети компьютеров MSX-1. | Рассмотрим несколько встроенных подпрограмм, имеющих отношение к локальной вычислительной сети компьютеров MSX-1. | ||
Строка 621: | Строка 623: | ||
- | В рабочей области RAM, начиная с адреса FCC9h, находится участок памяти, отвечающий за каждую //логическую// страницу памяти, находящуюся в некотором слоте, причем адрес байта памяти, непосредственно отвечающего за логическую страницу памяти, вычисляется по формуле: | + | В рабочей области RAM, начиная с адреса FCC9h, находится участок памяти, отвечающий за каждую //логическую// страницу памяти, находящуюся в некотором слоте, причем адрес байта памяти, непосредственно отвечающего за логическую страницу памяти, вычисляется по формуле: |
<WRAP group> | <WRAP group> | ||
<WRAP half column> | <WRAP half column> | ||
Строка 660: | Строка 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> |