Важная информация

User Tag List

Показано с 1 по 10 из 10

Тема: Как лучше всего работать со строками и внешним устройством?

  1. #1
    Junior
    Регистрация
    28.03.2010
    Адрес
    Саранск
    Сообщений
    23
    Благодарностей: 7
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Как лучше всего работать со строками и внешним устройством?

    Суть такова: я немного модифицирую эмулятор qaop и могу добавлять различные обработчики к портам, в принципе можно и новые оп-коды к процессору, но не хотелось бы.

    Задача примерно такая: некоторому виртуальному устройству (которое сидит на порту 0x1234, например) передать строчку вида "cat /dev/storage/filename.log | tail -n20", а обратно получить ответ в виде текста.

    Как это лучше реализовать? Пока вижу что-то вроде RANDOMIZE USR 45000: REM set ram: 47500, cmd cat /dev/storage/...., а потом по адресу 47500 ловить искомый текст. НО! Хотелось бы это как-то красиво с бейсиком подружить, а вот как - не знаю. Есть идеи? Чего бы зачитать на тему такой интеграции?

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Guru
    Регистрация
    25.01.2005
    Адрес
    Miass, Chelyabinsk region
    Сообщений
    4,083
    Благодарностей: 924
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Uporot Посмотреть сообщение
    Есть идеи?
    для интеграции с бейсиком может быть полезно сделать такое через потоки ввода вывода, чтобы работать через PRINT #x.

  4. #3
    Junior
    Регистрация
    28.03.2010
    Адрес
    Саранск
    Сообщений
    23
    Благодарностей: 7
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Эм, а где бы зачитать? Спектрум я видел живьем очень давно, забыл все нафиг, был бы рад примерам и какой-то литературе. Алсо, возвратить текст в переменной - это реально? Хотелось бы что-то вроде LET a$=......"cat /dev/storage/file.txt | grep test | tail -n20" и получить ответ, т.е. одной строкой все.

  5. #4
    Guru
    Регистрация
    25.01.2005
    Адрес
    Miass, Chelyabinsk region
    Сообщений
    4,083
    Благодарностей: 924
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    даже не скажу щас где.. или в книжке Родионова и Ларченко "ZX-Spectrum для пользователей и программистов", или в какой инфоркомовской... но где-то я это оч давно видел. смысл такой. если делать PRINT #0, то печатать будет в 2х нижних строках экрана, если #2, то как обычно. так же можно делать и INPUT #x. идея заключается в создании своего собственного канала, например, #3, #4... можно определить подпрограммы, в которые будет поступать строка, и из которой будет получаться строка. как-то так. так что греп на спеке вполне реален.

  6. #5
    Veteran Аватар для GriV
    Регистрация
    18.02.2005
    Адрес
    Набережные Челны
    Сообщений
    1,574
    Благодарностей: 104
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    получить текст в басик почти реально.
    Можно сделать
    let b_var = usr <xxxx>
    тогда b_var будет содержать то, что было в регистровой паре bc.

    Для вашей задачи проще было бы вначале сделать print #y "<строка>" и затем делать let b_var = usr <xxxx> - которая вернёт адрес asciiz-строки, которая может быть (если небольшая), например в буфере принтера или в любой другой удобной области.
    Вернуть текст напрямую в какую-либо переменную - это много сложнее (там надо писать достаточно сложный обработчик).
    Биты рулят лучше байтов, байты рулят шустрее!
    View, Звук, Цвет

  7. #6
    Junior
    Регистрация
    28.03.2010
    Адрес
    Саранск
    Сообщений
    23
    Благодарностей: 7
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Вернуть текст напрямую в какую-либо переменную - это много сложнее (там надо писать достаточно сложный обработчик).
    Насколько сложный? Я так понимаю, что надо будет проэмулировать вызов LET R$="_200 байт_", получить указатель на сегмент памяти этой строки, после чего по print #123/usr 45123 сделать запись в эту строчку на уровне самой виртуальной машины, не? Вот только учебника по бейсику у меня нету, где и чего он там хранит и как выделяет память под строчки. Например, насколько сложно будет строчку "123" переделать в "12345".

  8. #7
    Master
    Регистрация
    08.05.2007
    Адрес
    Dnepropetrovsk
    Сообщений
    880
    Благодарностей: 470
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от GriV Посмотреть сообщение
    Вернуть текст напрямую в какую-либо переменную - это много сложнее (там надо писать достаточно сложный обработчик).
    Да ничего сложного, нужно пользоваться командой INPUT #x или INKEY$ #x.

    Например
    10 INPUT #3, a$
    вернет строку, если канал 3 открыт на нужный поток.
    или
    20 INPUT #3, LINE a$
    вернет строку, но без необходимости заключать ее в кавычки для устройства, формирующего ее.
    или
    30 LET b$ = INKEY$ #3
    вернет один символ из потока.

    Все это сделано в TR-DOS, там организован текстовый ввод и вывод в файлы. Изучайте исходники TR-DOS, чтобы понять, как это сделать лучше всего.

    Аналогично реализовано в ZX Interface 1, там тоже есть ввод и вывод в файлы на микродрайве и ввод/вывод по локальной сети. Можно изучить исходники ZX Interface 1 ROM (где-то в сети валяется полный дизассемблер с комментариями). Но Interface 1 для нашей страны экзотика, так что лучше все-таки поизучать TR-DOS, тем более что тут на форуме дизассемблер с русскими комментариями даже пробегал.

    Но это что касается реализации - то нужно изучать исходники, а для того, чтобы изучить, как пользоваться "родными" функциями бейсика вроде PRINT#, INPUT#, INKEY$ #, в частности - для ввода/вывода в файлы или по локалке - это нужно читать какое-нибудь описание бейсика и TR-DOS для пользователей - вроде книги Ларченко/Родионова. Или английский мануал к Interface 1.
    Последний раз редактировалось Barmaley_m; 12.04.2010 в 14:13. Причина: добавил про руководства пользователя, INPUT LINE

  9. Эти 2 пользователя(ей) поблагодарили Barmaley_m за это полезное сообщение:
    GriV (13.04.2010), Uporot (13.04.2010)

  10. #8
    Junior
    Регистрация
    28.03.2010
    Адрес
    Саранск
    Сообщений
    23
    Благодарностей: 7
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Некоторый промежуточный итог и ссылки:

    The INPUT # statement is slightly more complicated in that is can both read and write data, as in INPUT "What is your name? "; A$. In fact each stream really has two components, an input stream and an output stream.

    Т.е. можно отправлять запрос и читать ответ 1 простой командой, как я и хотел.

    http://www.worldofspectrum.org/ZXBas...manchap24.html - карта памяти, где чего лежит
    http://www.worldofspectrum.org/ZXBas...manchap25.html - системные переменные с указателями
    http://www.worldofspectrum.org/faq/r...kreference.htm - хорошая статья о каналах

    Я так понял, что: пишу 5 байт недалеко от начала CHANS (а почему в асмовой вставке от конца?), указывающие на 2 процедурки (чтения и записи), но вот что мне передадут туда? Я так понимаю, что данные для записи будут уже куда-то записаны и мне останется ловить указатель, но где именно? Аналогично несовсем понятно, как обработать операцию чтения. Завтра еще погуглю, может чего вкусного найду

  11. #9
    Guru
    Регистрация
    25.01.2005
    Адрес
    Miass, Chelyabinsk region
    Сообщений
    4,083
    Благодарностей: 924
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    не уверен, но возможно будешь ловить кучу раз по одному символу.

  12. #10
    Master
    Регистрация
    08.05.2007
    Адрес
    Dnepropetrovsk
    Сообщений
    880
    Благодарностей: 470
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Чтобы добавить новый тип потока в область информации о потоках, необходимо "расширить" эту область, ведь она уже забита. Для этого в ПЗУ бейсика есть процедура MAKE_ROOM (адрес не помню) - она раздвигает все бейсиковские структуры памяти, модифицирует системные переменные и т.д. Освобождение памяти - процедура RECLAIM2.

    В таблицу добавляется новый поток с какой-нибудь буквой. Туда же помещаются адреса двух процедур - ввода символа и вывода символа. Если поток работает только в одном направлении, то процедура ввода/вывода в противоположном направлении должна указывать на подпрограмму печати сообщения об ошибке J Invalid I/O device. Адрес этой подпрограммы хранится в информации о потоках для потоков S и P, например, потому что из них невозможен ввод.

    К сожалению, открывать каналы штатной командой Бейсика OPEN # не получится, из-за бага в бейсике. Поэтому реализация тех функций, которые должна была выполнять эта команда, возлагаются на пользовательскую программу. Все это сделано в TR-DOS и Interface 1 ROM, можно исходники изучать.

    Закрывать каналы командой Бейсика CLOSE# возможно, но при этом поток не будет уведомлен о закрытии, т.е. если это файл на диске - то TR-DOS не узнает, что его надо закрыть. Чтобы закрыть поток (а не канал, к которому он присоединен), необходимо опять же, городить что-то свое. При этом поток должен быть удален из области информации о потоках.

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. SDrive by C.P.U. как с ним работать?
    от Retrograd в разделе Atari
    Ответов: 10
    Последнее: 12.09.2010, 13:32
  2. Композитик отказывается работать
    от REMR в разделе Для начинающих
    Ответов: 8
    Последнее: 13.01.2010, 20:54
  3. Как работать в эмуляторе Unreal с HDD
    от zic в разделе Для начинающих
    Ответов: 19
    Последнее: 10.03.2008, 01:54
  4. Железо для связи с внешним миром
    от zxrat в разделе Unsorted
    Ответов: 1
    Последнее: 23.07.2007, 14:00
  5. Как работать с CF?
    от Максагор в разделе Unsorted
    Ответов: 3
    Последнее: 05.03.2007, 12:12

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •