PDA

Просмотр полной версии : Попытка написания чего-то типа MSX-DOS на языке MSX-BASIC



John Warner
04.11.2017, 15:03
Приветствую всех.

Когда-то, в начале 90-х, изучал я и потом преподавал MSX BASIC версии 2.1 в средней школе.
Я тогда начал, но так и не закончил написание подобия ДОСа, но на Бейсике.
Много позже, мою идею одобрили в MSX-клубе, просили закончить, но при пожаре дома у меня сгорели все мои Ямахи и документация к ним, включая тотально все мои записи по этому вопросу.
Я долго горевал, но жить как-то надо - и вот, занялся я написанием заново.

Возможно, моя работа будет кому-то интересна, и мне помогут потом скомпилить это в полноценный исполняемый файл.

Сейчас у меня написан тестовый модуль набора текста, представляю его тут:


10 'BASIC Text Loader
20 CLS: COLOR 15,4,4: SCREEN 0,,0,1,0: WIDTH 80: COLOR=(4,0,0,4):SET SCREEN 'Screen mode set
30 'Logo
40 PRINT"BASIC Text Loader Module"
50 PRINT"================================================"
60 PRINT CHR$(13)' Carr. return
70 'input
80 PRINT"BASIC:>";
90 WR$="" 'Clear
100 A$=INKEY$ 'character entering
110 IF A$=CHR$(27) THEN GOTO 280 'Getaway if ESC pressed
120 Q=LEN(A$):IF Q=0 THEN 130 ELSE GOSUB 160 'Check if character were entered
130 PRINT A$; 'Print the character
140 GOSUB 210 'To CMDs Module
150 IF A$=CHR$(13) THEN PRINT CHR$(13):GOTO 80 ELSE GOTO 100 'If Enter pressed then carr. return
160 'Capital Chars Transformer Start
170 IF A$=CHR$(13) THEN RETURN 'If Enter pressed then carr. return
180 IF ASC(A$)=>65 AND ASC(A$)=<90 THEN A=ASC(A$)+32:A$=CHR$(A) ELSE A$=A$ 'If char little then ok else make it little
190 RETURN 'Zuruck
200 'Capital Chars Transformer End
210 'Commands Module Start
220 WR$=WR$+A$ 'Word checking
230 FOR L=0 TO LEN(WR$) 'Exit cmd check cycle
240 IF WR$="cls"+CHR$(13) OR WR$="clear"+CHR$(13) THEN WR$="": CLS 'Clearing screen
250 IF WR$="exit"+CHR$(13) OR WR$="quit"+CHR$(13) THEN WR$="": GOTO 280 'Getting away if_then
260 NEXT L:RETURN 'Zuruck
270 'Commands Module End
280 'BASIC Wassup Module Start
290 PRINT CHR$(13)' Carr. return
300 PRINT"Exit to BASIC"
310 KEY 2,"exit"+CHR$(13)' Testing feature
320 END 'Fin
330 'BASIC Wassup Module End

Модуль умеет:
1) Набирать текст, сканируя побуквенно. Это важно для некоторых вещей - например, реакции на клавиши.
2) Выход из программы осуществляется по командам "exit", "quit" и по нажатию ESC.
3) В показанном коде, из остальных команд, сейчас работает лишь команда "cls", она же "clear". Это команда очистки экрана.
4) Остальное пока только проектируется.

А теперь немного рассуждений и ответов на вопросы, которые я сам себе задавал:
Вопрос: Шошо, DOS? А как называется?
Ответ: Пусть называется MSX JW DOS.
Вопрос: Зачем оно надо, если есть куча DOS`ов?
Ответы:
1) Напишу - вспомню детство и юность.
2) Графоманство и зависть (ответ для тех, кого мои ответы не устроят).
3) Ну не всё пьянствовать же, и не в тупые игры играть, типа WOT и прочего выноса мозга.
Выберите вариант по вкусу :)
Вопрос: Зачем врукопашную на Басике писать модуль изготовления маленьких букаф из больших, если в MSX-машине подвида КУВТ2 есть встроенная фича для этого?
Ответ: Помимо ученической машины КУВТ2, каковой я располагаю, есть ещё и 805-е, всякие там ДЭУшки и прочие представители семейства, набор адресов в оперативной памяти для хранения переменных и их тип может несколько различаться - отсюда проистекает, что, следуя ДОСовскому принципу "всё своё ношу с собой", пишем этот модуль сами. Правда, моя реализация зависит от BIOSа, и с этим надо что-то делать - об этом я подумаю отдельно, тем более, модули на то и модули, что их можно переписать когда захочешь.
К тому же, я ещё русские букафки не перепаивал - но перепаяю обязательно.
Вопрос: Как будет осуществляться настройка и инициализация?
Ответ: Текстовым ini-файлом. Пока не реализовано. Но после реализации станет возможным задать тип машины - и, таким мухтаром, решим проблему перепаивания букаф, например, и распределения памяти. Файл назовём, ну например, init.bat.

Пока это все вопросы и ответы, остальных у меня пока не возникло.

А теперь, рассуждения.

Ну, допустим, модуль обработки команд мною уже писался и работал - там нет ничего сложного. А вот сделать хитрушку типа, выражаясь современным форточным языком, dll-ки, или подгружаемые оверлеи - это я пока не придумал как.
А ведь они нужны, однако.
И, видимо, придётся как-то, по-взрослому, устанавливать пространство имён для модулей - иначе есть риск запутаться самому.

Кстати, замечено, что на эмуляторе программка знатно подтупливает, чего на реальном железе не наблюдалось.
В связи с этим я думаю, что надо бы размещать программку в другой области памяти, дабы Бейсиковая память оставалась свободной, надо этот момент обдумать, как реализовать: ведь софтина будет потом перекукожена в COM-файл, и она должна уметь работать именно так.

Сейчас же я думаю о том, как придумать загрузку исполняемых файлов в оперативку и их исполнение, а также запуск оверлеев (OBJ) с автоматической проверкой на предмет предварительной сборки их. То есть, учитывая раздолбайство MSX-софта с неявным объявлением типа файла через указание расширений имени - надо предварительно как-то устанавливать типы файлов - и без всяких там PE-заголовка, DOS-заглушки или MYME-type.
Шо делать!? Пока не ясно...

ЗЫ Кстати, вот что.
Испытал программку конвертацией в ROM и запуском на эмуляторе - пашет, да ещё и как.
Конвертил прожкой basicrom.exe, попутно перевёл её на русский, но не всю: мне надо как-то аккуратно раскукожить текстовые вставки из самого экзешника, ибо ресурсы-то я сделал, не могу пока лишь в экзешник влезть, но и это я сделаю.
Где-то прожка у мну для этого была.
Нарою, переведу - поделюсь переведённым basicrom.exe :)
Сейчас программка выглядит так:
https://pp.userapi.com/c841235/v841235156/319a0/9_HVpyjQeUk.jpg


ЗЗЫ Команды попытаюсь вообще реализовывать иначе, чем сейчас - хочу поюзать не Бейсиковые команды в основе, а те "верёвочки", за которые дёргают сам Бейсик и его кореш MSX-DOS. ИЗ этого выходит, что моя программа будет, увы и ах, аппаратно зависимой - то есть, BIOS-зависимой, КУВТ-ориентированной.
Но это пока только обдумывается. Не кидайтесь в меня флоппиками, я Бейсик и вообще MSX, равно как и вообще погромирование забыл давно и прочно, поэтому - как могу, так и пытаюсь писать.
HTML, PHP и CSS c жабой не в счёт.
Как говорится, не стреляйте в (тапира, он хрюкает как умеет) тапёра, он играет как умеет :)
Но дельным советам буду рад.
Не обещаю вообще, что выйдет закончить проект (20 лет назад я его так и не закончил), но сколько смогу - постараюсь сделать. Опять же, возможно, мои наработки пригодятся кому-либо.


Такая вот загогулина.

John Warner
04.11.2017, 17:41
А вот и я.
Закончил перевод программы basicrom.exe, представляю переведённую программу!
basicrom_rus.zip (https://yadi.sk/d/ydKjSC333PQna5) - скачать zip-архив, 102.4 килобайта.

Shiny
04.11.2017, 18:10
Яндекс Диск?

John Warner
04.11.2017, 19:37
Так точно!

Baton
10.11.2017, 12:15
Как же мне повезло, что у меня были другие учителя информатики ;-)
ЗЫ. Это называется хреносозидательство.

Wierzbowsky
10.11.2017, 14:47
Вот уж совсем ни к чему обижать увлечённого человека. Мы тоже в те времена пытались много чего создать на бейсике. Но упёршись в ограничение по памяти, функционалу и производительности вынуждены были досконально изучить матчасть, а также язык ассемблера и начать писать всё на нём. Так что не надо наездов, коллега. Кто не пробует, тот не пьёт сакэ.

John Warner
11.11.2017, 05:33
Спасибо за тёплые слова.
Как я и писал выше - каждый сходит с ума по своему. Кто-то играет в танки, кто-то собирает РК-86, кто-то играет в игры на MSX-Turbo. Впрочем, даже возможный отрицательный результат - тоже результат.
Вот думаю, как мне придумать подгрузку модулей. Приуныл я немного. Не придумывается простыми методами подгрузка модулей.
Изучал сегодня интересный проект Maximite (http://geoffg.net/maximite.html) из Австралии. Там даже есть русская документация (http://geoffg.net/Downloads/Maximite/MMBasic%20Language%20Manual%20RUS.pdf).
Так вот, автор языка MMBasic, что сидит в той машинке, видимо, тоже задавался моим вопросом, и придумал команду CHAIN - она позволяет вызывать подпрограммы непосредственно с диска, выполнять их и возвращаться обратно в вызывавшую программу.
Жаль, у нас нет такого.

Камраду Baton`у: чрезвычайно рад за вас. Вижу, что у вас был отличный информатик, но отвратительные педагоги по социальному воспитанию и этике.
У меня сейчас 10-летний парнишка уже бойко рисует картинки с помощью операторов, вот закрепит материал, и будем спрайты изучать.

Baton
11.11.2017, 07:07
Камраду Baton`у: чрезвычайно рад за вас. Вижу, что у вас был отличный информатик, но отвратительные педагоги по социальному воспитанию и этике.
У меня сейчас 10-летний парнишка уже бойко рисует картинки с помощью операторов, вот закрепит материал, и будем спрайты изучать.

Рад за вашего парнишку ;-)

Но вот у меня, к сожалению (или к счастью?), 30 лет назад педагогов по этике в школе не было. Поэтому говорю прямо.
Даже сейчас, когда прошло 25 лет с того момента, когда я что-то пытался программировать, мне хватило одного взгляда на ваше "творение" что бы понять, что вы, как это ноне говорится "вообще не в теме". Это видно начиная от постановки задачи и заканчивая кодом. Вы не учитель информатики (по образованию), вас им могли назначить из-за отсутствия оного.

Но спасибо, что представили ваше творение на обозрение. Стали понятны некоторые ваши высказывания в иных ветках.
И нет, я не против энтузиастов ;-)

ЗЫ. Ниже простенький скриптик, который я, можно сказать, впервые "накодил" за последние 25 лет на языке, который видел в первый раз в жизни. Просто чтобы видно, что я не профи ни разу.

/ip dhcp-server lease
:local clientid [get [find address=$leaseActIP] host-name]
:if ($clientid = "android-3c99815b83973bc5") do={
/interface wireless access-list set [find comment="Kitchen1"] mac-address=$leaseActMAC
remove [find address=$leaseActIP]
log info "--- Kitchen1 detected!"
}

:if ([: pick $leaseActMAC 0 8] = "00:08:22") do={
/interface wireless access-list set [find comment="Kitchen2"] mac-address=$leaseActMAC
remove [find address=$leaseActIP]
log info "--- Kitchen2 detected!"
}

John Warner
11.11.2017, 08:51
Повторяю, рад за вас чрезвычайно.

Pencioner
11.11.2017, 18:29
Сделать код-ревью представленного куска кода. Очень сильно не всматривался, что сразу бросилось в глаза:

ELSE A$=A$ --- в строке 180 лишнее, else в Бейсике совсем необязателен, можно без него

230 FOR L=0 TO LEN(WR$) --- этот цикл тут не нужен, из-за того что мы очистим экран L раз он чище не будет, увы :)


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

Я бы посоветовал Вам, John Warner, перед тем как начинать сложные программы - набраться побольше знаний, попробовать все на более простых прожках :) А с ребенком - если заинтересуется - можно просто попробовать написать какую-то несложную игру со спрайтами. Первая программка которую я написал в 9 классе называлась SPACE PIRAT и там надо было сбивать корабль пришельцев стреляя со своего - они двигались друг напротив друга вертикально, одним управляет игрок. Помню, никак не мог додуматься как так сделать, чтобы когда ты выстрелил то пока летит твоя пуля остальное действо тоже продолжалось - у меня все останавливалось пока пуля не долетит. А все потому что знаний не хватало - об ON INTERVAL GOSUB еще не знал. Поэтому и важно сначала побольше знаний набирать, а там тогда и понятнее будет что и как правильнее сделать :)

TomaTLAB
12.11.2017, 02:48
ЗЫ. Ниже простенький скриптик, А Вы можете рассказать,что происходит хотя бы при парсинге Вашего скриптика?
А то таких накодеров, в последнее время...
Ну и анегдод в тему: "Вы знаете, что означает буква "S" в аббривиатур IoT?"

- - - Добавлено - - -

А изыскания Дмитрия имеют весьма ценный "академический интерес". Сам по себе васик - язык больше "академический" чем "прикладной", изначально.

Pencioner
12.11.2017, 03:13
Насчет академичности позволю себе не согласиться. Он именно самый что ни на есть прикладной. Академические - пожалуйста, Haskell, ML/OcaML, APL, Lisp на худой конец. А Бейсик именно что и был задумал как самый прикладной из прикладных, чтобы любой человек мог маленькие программки для себя сразу писать, не нагружая себя теорией...

Baton
12.11.2017, 03:17
А Вы можете рассказать,что происходит хотя бы при парсинге Вашего скриптика?
А то таких накодеров, в последнее время...
Ну и анегдод в тему: "Вы знаете, что означает буква "S" в аббривиатур IoT?"

А изыскания Дмитрия имеют весьма ценный "академический интерес". Сам по себе васик - язык больше "академический" чем "прикладной", изначально.

Да не важно, что скриптик делает. Он призван просто показать объем "написанного" за 25 лет ;-) Ну и, возможно, "стиль письма". Например, то, что вместо конструкции A=ASC(A$)+32:A$=CHR$(A) я бы написал a$=chr$(asc(a$)+32), где хотя бы нет лишней переменной.

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

TomaTLAB
12.11.2017, 17:40
где хотя бы нет лишней переменной. Вот далеко не факт, что любимый многими сишниками "стиль письма", когда норовят все и вся свалить в одну большую кучу, действительно лучше.
А для интерпретаторов и подавно, что лучше, сильно зависит от того как калькулятор у него устроен.

krt17
12.11.2017, 21:32
А я думал это я агрессивный излишне бываю :) Скрипты микротиковские изначально сделаны так что бы любой идиот мог на них написать без подготовки, можно поздравить вы справились. Мне конечно чужда тема басика на мсх, но не вижу ничего плохого что кому то это интересно.

Baton
13.11.2017, 01:08
А я думал это я агрессивный излишне бываю :) Скрипты микротиковские изначально сделаны так что бы любой идиот мог на них написать без подготовки, можно поздравить вы справились. Мне конечно чужда тема басика на мсх, но не вижу ничего плохого что кому то это интересно.
Насчет "без подготовки" не согласен. Базовые знания быть должны. Иначе это будет как письменность для дикарей. Кстати, что наглядно и показывает первое сообщение топика. Другой вопрос, что для идиотов с базовыми знаниями (пусть и древними) скрипты действительно не представляют большой сложности.

Я тоже не вижу ничего плохого в интересе к басику, тем более энтузиастом с навыками начинающего и без базы. Но то, что он был преподавателем информатики меня удивило. Как и некоторые его ранние сообщения.

И ничего больше, и ничего личного ;-)

Shadow Maker
13.11.2017, 02:39
Насчет "без подготовки" не согласен. Базовые знания быть должны. Иначе это будет как письменность для дикарей. Кстати, что наглядно и показывает первое сообщение топика. Другой вопрос, что для идиотов с базовыми знаниями (пусть и древними) скрипты действительно не представляют большой сложности.

Я тоже не вижу ничего плохого в интересе к басику, тем более энтузиастом с навыками начинающего и без базы. Но то, что он был преподавателем информатики меня удивило. Как и некоторые его ранние сообщения.
Ну удивило и удивило. Зачем обижать-то его? Хочешь сделать лучше - сделай лучше. Я тоже потенциально возможно могу написать чуть лучше. Но фактически - нет (мне лень, нет желания отлаживать, всё плохо, нужное подчеркнуть). И реально выходит, что я не могу, а раз я не могу дать ни конкретики (как Pencioner), ни каких-то иных ценных советов - я молчу. А ты вот нет, почему-то. Хотя ничем не лучше меня. Чего люди злые какие, а?

Baton
13.11.2017, 03:32
Ну удивило и удивило. Зачем обижать-то его?
В чем обида то состоит? В том что человеку прокомментировали его творение? Так он и публиковал его тут, чтобы его обсудили. Кто ж виноват, что ожидание не всегда совпадает с реальностью? Я хз что там за MSX-клуб одобрил его затею и тем более, попросил закончить. По моему мнению, идея практического смысла не имеет, окромя обучения, и обсуждения выше чем на уровне кружка не требует. Что я и озвучил.

Согласен с советом Пенсионера - учиться, учиться и еще раз учиться.

Ну а если нужны советы автору от меня, то пжалста:
- избавиться от подпрограмм. Тут они не в тему. Если только не стоит задача их изучения.
- обрабатывать BackSpace хотя бы.
- игнорировать управляющие (да и вообще лишние) символы, кроме обрабатываемых.
- приклеивать CR к введенному тексту - лишнее, по его получении просто уходить на обработку.
- контролировать длину набранного текста и внести иные "защиты от дурака".
Достаточно для начала? И это очевидные вещи, которые он упустил.

TomaTLAB
13.11.2017, 13:07
Ну а если нужны советы автору от меня, то пжалста:
... ...
Достаточно для начала? И это очевидные вещи, которые он упустил.

Вот это написать нельзя было, вначале? Вместо того, чтобы сходу кидаться заявлениями в духе "все вокруг леголасы, один я - Арагорн!"

Baton
13.11.2017, 13:55
Вот это написать нельзя было, вначале? Вместо того, чтобы сходу кидаться заявлениями в духе "все вокруг леголасы, один я - Арагорн!"

Мне показалось, что получить совет в элементарных вещах не было приоритетной задачей ТС.
Про советы совсем другой человек сказал и несколько позже.

OrionExt
14.11.2017, 14:30
Вставлю пять копеек.

Вот эти современные методы программирования, ну совсем для бейсика не подходят. В то время msx-барсик давал не виданную свободу программисту (8-битные конкуренты спокойно выдыхали в сторонке). Одно прерывание в барсике чего стоило. Не говоря о том, что можно было программировать прямо по железу.

- - - Добавлено - - -

А вообще если у не окрепшего молодого ума есть предпосылки к программированию, то msx-барсик - лучший выбор. Что бы кашу в голове систематизировать пускай в простой алгоритм.

- - - Добавлено - - -

И причем тут учитель программирования бейсика. Не стоит даже сравнивать бейсик и паскаль, и т.д. Это уже следующий шаг. Дальше продолжать не буду (бо как сейчас програмят через десяток программных прокладок, гигаватты мощности – преобразуются в тепло и только).

- - - Добавлено - - -

И последнее. Не довольны бу-бу-бу. Откуда вы взяли инфу, что учитель заставлял детей писать некий DOS (и пытался привить свое мнение – делайте так). Детей обучали по программе.

ТС, просто опубликовал свою программу, и попросил написать отзыв о его размышлениях. чего ни будь полезное.

А еще учитель программист не программистом ценен. А чем? Увлечь детей этой темой:)

John Warner
20.11.2017, 13:09
Всем привет!
Я немного подзабросил тему, занят был.
Попутно, кстати, восстановил на своей машине кассетный вход (менял помершие детали на маме), теперь могу грузить программы с телефона, сконвертив CasLink`ом. А то мой малец начал терять интерес, пущай поиграет :)
Сын мой до спрайтов пока не дошёл, но уже бодренько рисует картинки на милллиметровке, и потом описывает их операторами языка; тут самое главное - получить навык описания чего-либо алгоритмическим языком. Надо бы ему ещё нарыть Рапиру и Робика для КУВТ2. Когда-то у меня были.
Я не пытаюсь поставить рекорд скорости усвоения материала - идём постепенно, приобретая навык.

Отвечаю всем:
1) Да, уроки ИВТ я вёл вообще будучи восьмиклассником. Три года. Да, вынужденно. Потом зато вёл кружок. Работал по утверждённой программе. Отмечали мою способность увлечь детей.
2) Программированием не занимался 25 лет. Трудился и тружусь автоэлектриком, специализируюсь на свапах, апгрейдах, восстановлении и пережгутовывании, преимущественнно Тойот. Вывод - хоть не гений, но и не последний дурак. Но Бейсик и прочая из башки вылетели напрочь.
И вот есть предложение: предлагаю критичному камраду Батону (он же из Владика, так?) за два часа обойти ограничитель скорости на сотом Марк 2 без вмешательства в нутро компов и родной проводки машины так, чтоб джекичан не истерил, агрегаты отменно работали и диагностика показала, что всё в ажуре :)
Ну, как он может - навскидку, нахрапом, увидал - и готово.
3) Академичности в моих постах не ждите: терпеть не могу пафоса. Поставить задачу, как в диссертации - могу. Но не буду. Снижение стиля - наше всё.
4) Сейчас читаю материалы, книжки у меня есть, в Гугле я не забанен. По возможности вечерами, набираюсь опыта и знаний.

Будут результаты - напишу обязательно.

С уважением.

ЗЫ Не ожидал такого резонанса от темы...

Vadim
22.11.2017, 07:36
"Что-то на подобии MSXDOS на MSX-Basic" - более бредовой идеи я в жизни не встречал. Вы хоть представляете, что делает BDOS при обработке файловых функций? На бейсике конечно написать можно, но объём будет просто адский, ни в какое ОЗУ это не поместится и понять потом код будет совершенно невозможно. Идея бредовая изначально, тем более что это "родил" учитель информатики. Мдааа, я бы такого уволил бы с работы за полное не понимание матчасти.

DJs3000
27.11.2017, 14:00
Хоспаде, что вы как собаки бешанные накинулись... это походу наша ментальность насрать в душу, если тебе что-то не нравиться. Пусть человек делает все что ему хочется и даже если это кажется кому-то бессмысленным. В любом случае это движение в перед, и в будущем полученные навыки и знания могут подарить действительно что-то полезное. Каждый считает своим долгом пройти и пнуть. Фу ля аж бесите!!! Сори, бомбануло немного)

OrionExt
27.11.2017, 14:28
Вот и меня удивляет, почему то так бамбонуло. И каждый второй - уволить учителя (не читатели. учитель то в 8-ом классе учился тогда:)). Ну, покритиковали взятое направление и остановилась бы на этом.

Baton
27.11.2017, 15:01
Вот и меня удивляет, почему то так бамбонуло. И каждый второй - уволить учителя (не читатели. учитель то в 8-ом классе учился тогда:)). Ну, покритиковали взятое направление и остановилась бы на этом.
Ыы... Так "учителю" (сам назвался, никто за язык не тянул), идею которого "одобрили на клубе и попросили продолжать" (как пафосно то звучит! Хоть ТС, типа, пафос то и не любит!), критика по делу не понравилась. Он то надеялся на иное (типа "Коллега! Гениально!! Это прорыв!!!"). А тут с небес на землю спустили на раз...
Реакция же защитников вообще мало понятна. Вроде очевидно, что херь полная, и критика полностью по делу, но как-то стесняются признать очевидное.
ЗЫ. Ну уж ахинею про спидометры марков я даже не комментирую, как и не вижу связи между жительством во Владивостоке и оными. А защитники видят? Или даже им стало очевидно, что клиент не адекватен?
ЗЗЫ. И вообще, тема тихо-мирно ушла бы в небытие, но сегодня у очередного защитника "бомбануло" ;-)

OrionExt
27.11.2017, 15:22
Ну вот сделайте чего ни будь и опубликуйте, а мы рассмотрим;)

Baton
27.11.2017, 15:27
Ну вот сделайте чего ни будь и опубликуйте, а мы рассмотрим;)
Не... Ноне писать ничего уже не буду. Ибо, что знал и то уже забыл, а новое изучать лень...
Старое рассматривайте, 30 летней давности ;-) И это вы попросили, я ничего не предлагал!

Как раз по теме ТС - ввод строки (с обработкой всяких символов и т.д.). Чтобы стало выглядеть красиво, надо TAB c 8 на 10 заменить.
;-----------------------------------------------------------
; Крутая подпрограмма ввода строки
;
; [hl] - Адрес буфера
; +0 - Максимальная длина строки
; +1 - Текущая длина строки
; +2 - Размер окна
; +3 - Координаты окна (y*80+x) or 4000h
; +5 - Позиция курсора в строке
; +6 - Отступ слева
; +7 - строка
InpString:
xor a ; курсор ┬
ld (CStyle),a

ISInit: push hl

push hl
pop ix
ld de,0005h ; Устанавливаем указатель на позицию курсора
add hl,de
ld a,(hl) ; позиция курсора
inc hl
add a,(hl) ; + отступ слева
ld e,a
ld d,0
add hl,de ; Получаем адрес текущего символа
;---------
ISOutStr: ex (sp),hl
push hl ; Адрес буфера

ld de,DMA1+22 ; Временный буфер
push de

ld bc,0006
add hl,bc
ld a,(hl) ; Смещение
inc hl ; Адрес первого символа в строке
ld c,a
ld b,0
add hl,bc
and a
ld a,' '
jr z,$+4
ld a,'░'
ld (de),a
inc de
ld b,(ix+2) ; Берем размер окна

IS004: ld a,(hl) ; Если это последний символ
cp cr
jr z,IS003
ld (de),a
inc de
inc hl ; Ставим указатель на следующий
djnz IS004
jr IS006 ; И обходим забивание пробелами

IS003: ex de,hl
call Fill32
ex de,hl

IS006: ld a,(ix+2) ; Берем размер окна
add a,(ix+6) ; отступ слева
sub (ix+1) ; длина строки
ld a,' '
jr nc,$+4
ld a,'▐'
ld (de),a

pop hl
push hl
ld e,(ix+5) ; Позиция курсора
ld d,0
add hl,de
ld (hl),255

pop hl
ld e,(ix+3)
ld d,(ix+4)
ld b,(ix+2)
inc b
inc b
call LdrVM

pop hl
ex (sp),hl

push hl
ld a,(hl)
cp cr
jr nz,$+4
ld a,' '
ld h,0
ld b,3
rlca
rl h
djnz $-3
and 11111000b
ld l,a
ld de,(CgpBasic)
add hl,de
ld de,DMA1+22
ld b,8
push de
call LdrMV

pop hl
push hl
ld a,(CStyle)
ld c,a
ld b,0
add hl,bc
ld a,8
sub c
ld b,a
ld a,(hl)
cpl
ld (hl),a
inc hl
djnz $-4
ld hl,(CgpBasic)
ld de,255*8
add hl,de
ex de,hl
pop hl
ld b,8
call LdrVM

pop hl

ISInputKey:
push hl
call Inputs
ld b,a
ld hl,ISOnKeyGoTo
call OnKeyGoToFunction
pop hl
ld a,b ; Это случаем не управляющий символ?
cp 32
jr c,ISInputKey ; Тогда игнорируем его!
;----------------------------------------
ld a,(hl)
cp cr
jr z,IS008 ; Добавляем символ к строке
;-
ld a,(CStyle) ; Вставка или надпечатка?
and a
jr z,IS009 ; Надпечатка
;-
ld a,(ix+1) ; Текущая длина
cp (ix+0) ; Сравниваем с максимальной длиной
jr z,ISInputKey ; Если равны, то ничего не делаем

push bc ; Сохраним символ
push hl ; Куда записать
inc (ix+1) ; Увеличиваем текущую длину строки
ld a,(ix+1) ; Текущая длина
sub (ix+6) ; Отступ слева
sub (ix+5) ; Берем текущую позицию курсора
ld c,a
ld b,0
add hl,bc ; Получаем: откуда сдвигать
ld d,h
ld e,l
inc de ; Куда сдвигать
inc bc ; Сколько сдвигать
lddr
pop hl ; Куда записать символ
pop bc ; [a] - какой символ
;-
IS009: ld (hl),b ; Новый символ
inc hl
jr IS010
;-
IS008: ld a,(ix+1) ; Текущая длина
cp (ix+0) ; Сравниваем с максимальной длиной
jr z,ISInputKey ; Если равны, то ничего не делаем

ld (hl),b ; Добавляем символ к строке
inc hl
ld (hl),cr
inc (ix+1) ; Увеличиваем текущую длину строки
IS010: ld a,(ix+5) ; Берем Позицию курсора
cp (ix+2) ; Сравниваем с размером окна
jr z,IS017 ; Если равна
inc (ix+5) ; Увеличиваем позицию курсора
jp ISOutStr ; И выводим стоку

IS017: inc (ix+6) ; Отступ слева
jp ISOutStr
;----------------------------------------
ISEsc: scf
;-
ISEnter: ex af,af'
pop hl ; Адрес текущего символа
ld a,(hl)
cp cr
jr nz,$+4
ld a,' '
ld l,(ix+3) ; Адрес окна
ld h,(ix+4)
ld e,(ix+5) ; Позиция курсора
ld d,0
add hl,de ; Адрес символа с курсором
call WrVrHL ; Затираем курсор символом
ex af,af'
pop hl ; Извлекаем указатель на буфер
ret
;--
ISRight: pop hl
ld a,(hl) ; Текущий символ
cp cr ; Последний?
jp z,ISInputKey
inc hl ; Увеличиваем указатель на текущий символ
ld a,(ix+5) ; Позиция курсора
cp (ix+2) ; Сравниваем с размером окна
jr nz,IS015 ; Если не последняя возможная позиция
inc (ix+6) ; Если последняя, то увеличиваем отступ слева
jp ISOutStr

IS015: inc (ix+5) ; Иначе увеличиваем позицию курсора
jp ISOutStr
;--
ISLeft: pop hl
;
ISLeft_: ld a,(ix+6) ; Слева от окна что-нибудь есть?
and a
jr z,IS013 ; Если нет
ld b,a
ld a,(ix+2) ; Берем размер окна
srl a ; Делим пополам
cp (ix+5)
jr c,IS013 ; Если курсор правее, то сдвигаем его ; Если курсор левее
ld a,b
dec (ix+6) ; Иначе уменьшаем отступ слева
dec hl ; Уменьшаем указатель на текущий символ
jp ISOutStr ; и выводим строку

IS013: ld a,(ix+5)
dec a
jp z,ISInputKey
ld (ix+5),a ; Устанавливаем новую позицию курсора
dec hl ; Уменьшаем указатель на текущий символ
jp ISOutStr ; И выводим строку
;--
ISBackStep:
pop hl
ld a,(ix+6)
add a,(ix+5) ; Мы не на первом символе стоим?
dec a
jp z,ISOutStr ; Если да, то ничего не делаем
;-
ld a,(hl) ; Тогда может за последним?
cp cr
jr nz,IS002
dec (ix+1) ; Уменьшаем текущую длину строки
dec hl ; Возвращаемся на один символ назад
ld (hl),cr ; И устанавливаем указатель конца строки
inc hl
jr ISLeft_
;-
IS002: ld d,h ; Ставим указатель на следующий символ
ld e,l
push hl ; Это будет новый указатель
dec de
ld a,(ix+1)
sub (ix+6) ; Отступ слева
sub (ix+5) ; Добавляем позицию курсора
add a,2 ; + текущий символ + cr
ld c,a
ld b,0
ldir
dec (ix+1) ; Уменьшаем текущую длину строки
pop hl
jr ISLeft_
;--
ISIns: pop hl
ld a,(CStyle)
xor 0 xor 5
ld (CStyle),a
jp ISOutStr
;--
ISDel: pop hl
ld a,(hl)
cp cr
jp z,ISInputKey

ld d,h
ld e,l
push hl
inc hl
ld a,(ix+1) ; Текущая длина строки
sub (ix+6) ; Отступ слева
sub (ix+5) ; Добавляем позицию курсора
inc a
ld c,a
ld b,0
ldir
dec (ix+1) ; Уменьшаем текущую длину строки
pop hl
jp ISOutStr
;--
ISDelToEndOfLine:
pop hl
ld (hl),cr
ld a,(ix+6) ; Отступ слева
add a,(ix+5) ; Позиция курсора в окне
dec a
ld (ix+1),a ; Новая длина строки
jp ISOutStr
;--
ISDelAllLine:
pop hl
ld (ix+1),0 ; Текущая длина строки
ld (ix+5),1 ; Позиция курсора в строке
ld (ix+6),0 ; Отступ слева
ld (ix+7),cr ; Пустая строка
pop hl ; Указатель на блок
jp ISInit ; Переходим на инициализацию буфера
;--
ISBeginOfLine:
pop hl
ld (ix+5),1 ; Позиция курсора в строке
ld (ix+6),0 ; Отступ слева
pop hl
jp ISInit
;--
ISEndOfLine:
pop hl
ld a,(hl) ; Текущий символ
cp cr ; Последний?
jp z,ISOutStr
inc hl ; Увеличиваем указатель на текущий символ
ld a,(ix+5) ; Позиция курсора
cp (ix+2) ; Сравниваем с размером окна
jr nz,IS0151 ; Если не последняя возможная позиция
inc (ix+6) ; Если последняя, то увеличиваем отступ слева
jr ISEndOfLine+1

IS0151: inc (ix+5) ; Иначе увеличиваем позицию курсора
jr ISEndOfLine+1
;------------------------------------------------------------
ISOnKeyGoTo:
db esc
dw ISEsc

db cr
dw ISEnter

db 28
dw ISRight

db 29
dw ISLeft

db 30
dw ISBeginOfLine

db 31
dw ISEndOfLine

db 8
dw ISBackStep

db 18
dw ISIns

db 127
dw ISDel

db 5
dw ISDelToEndOfLine

db 21
dw ISDelAllLine

db 0
;---------------------------------------------------------------------
OnKeyGoToFunction:
ld a,(hl) ; Проверяем
inc hl ; Адрес перехода по клавише
and a ; Конец меню?
ret z ; если да, то возвращаемся
ld e,(hl)
inc hl
ld d,(hl)
inc hl
xor b ; Эта клавиша нажата?
jr nz,OnKeyGoToFunction; Если нет, то продолжаем проверку
pop hl ; Удаляем из стека адрес возврата
ex de,hl ; [hl] - адрес перехода
jp (hl) ; Переходим к функции
;---------------------------------------------------------------------

b2m
27.11.2017, 15:43
Давным-давно видел я в инете симулятор unix на JavaScript. Так вот это тоже не юникс, и "херь полная". Но человек делал, изучал юникс, и у него кое-что получилось. И прикольно получилось.

Щас погуглил, на первом месте совсем не то, там реально эмулятор. А вот чуть ниже есть похожее: http://www.masswerk.at/jsuix/ (кликнуть на open terminal, пользователь guest)

Эта шняга ведёт себя почти как юникс. Написана исключительно на JavaScript, прикольно посмотреть на исходники. Я так полагаю, топикстартер хочет сделать нечто подобное, но на MSX-BASIC, этакий игрушечный симулятор MSX-DOS. Так что не надо "нашу птичку обижать" (с) Матроскин.

OrionExt
27.11.2017, 17:34
Baton, позитивно. Правда, не понял куда приложить. Но обилие коментариев, очень радует.

Ага, тут обнаружил в MSX-барсике - REM можно заменить на " ' ".

Можно отлично оформить код на большом брате, а потом запулить без коментов на целевую машину;)

- - - Добавлено - - -

А так, я больше по железу в соседней теме.

Baton
28.11.2017, 02:51
Baton, позитивно. Правда, не понял куда приложить. Но обилие коментариев, очень радует.
Ну это основы культуры программирования.
Именно благодаря им, я и спустя 30 лет могу хотя и приблизительно, но понять, что где делается даже при беглом взгляде.

А вот в железе я ни бум-бум, поэтому на эту тему дискуссию поддержать не смогу ;-)
Надувать же щеки и при этом нести охинею ничего не понимая в вопросе - не наш выбор. Да и палится враз.