Просмотр полной версии : Программирование на УКНЦ как?
Страницы :
1
2
3
4
[
5]
6
7
с нестандартным поведением - то есть когда на стек кладутся не два слова (PC, PSW) и/или не в том порядке ((SP) -> PC, 2(SP) - PSW). Если стек есть, не должно такого быть. А вот если стека нет (т.е. SP указывает не в память, а куда-то в пустое место, или в ПЗУ) возможны всякие чудеса, причем на разных ЦП разнообразные.
А вот если стека нет
Ну, по сути, на первое прерывание накладывается второе - таймаут от памяти или что то ещё - тут как бы понятно - нехрен левый код писать. Кстати, интересно, если стек указывает в ПЗУ, а ПЗУ на сигнал записи бодро рапортует - ок, всё записала - то хрень будет ещё цветней
Если стек есть, не должно такого быть
Вот я и хочу уточнить, что уважаемый MM имел ввиду :)
Вот я и хочу уточнить,
В БКшках на 1801ВМ1, там нет регистров пульта ( на МПИ), в связи с этим дело с R6 несколько сложнее.
Так же этот момент может зависить от набора ИС проца, и его микрокода, особенно на секционных и составных процах.
- - - Добавлено - - -
Если кто грамотный, расскажите, возможен ли пуск 1831ВМ1 на задание пользователя, при условии отсуствия терминала 177560 ?
Что произойдет, если встретится команда 000000 и нет терминала 177560 ?
там нет регистров пульта
Это что за звери?
Так же этот момент может зависить от набора ИС проца, и его микрокода, особенно на секционных и составных процах.
Ну, те процы, с которыми успел столкнуться, в этом плане ведут себя стандартно
Это что за звери?
Поищите ТО 1801ВМ1, его вроде Вслав г. Киев выкладывал где-то.
Для ВМ1 нужны регистры сохранения R7 и PS на главной МПИ.
Для ВМ1 нужны регистры сохранения R7 и PS на главной МПИ.Все проще. 1801-е процессоры, вместо встроенной микропрограммы микро-ODT, имеют т.наз. Halt-Mode, в которой исполняется специальная пультовая программа, расположенная в ПЗУ. У 1801ВМ1 при переключении в Halt-Mode весьма затейливо перепланируется страница ввода-вывода - кое-где включаются дополнительные кусочки ПЗУ, кое-где ОЗУ из 7-го банка - физически-то там 64К, пользователю из них доступно 56К, некоторые кусочки из оставшихся 8К используются пультовой программой. Всё это реализовано в 1201.01 и ее вариантах. А вот на БК-шке ничего этого нет, из-за чего и нужны какие-то дополнительные средства.
- - - Добавлено - - -
возможен ли пуск 1831ВМ1 на задание пользователя, при условии отсуствия терминала 177560 ? Это же М8, цельноутянутый с 11/73, да? Э-60 (М2) при наличии отсутствия 177560/66 банально зацикливала на обращении к 177564, как там у М8 не знаю, но подозреваю, что должно быть похоже. Ну и запуск с 24 вектора или с ПЗУ 173000, по идее, должен пройти нормально. А КЦГД воткнуть не ку?
MacBuster
07.07.2018, 09:11
Удаление в знак протеста против действий MM
Напомните, пожалуйста, как с дисководом работают - прочитать определенный сектор или всю дорожку целиком.
С полной платой ДВК КНГМД МХ - "всю дорожку", выделение секторов - программное в драйвере.
С контроллерами МФМ на основе 1801ВП1-128 - посекторное, при этом проц должен обеспечивать не менее ~360 т.рег-рег быстродействия, при работе с ВП1-128.
Контроллер КМД ДВК ( полуплата )- имеет свой проц и буферное СОЗУ, и может работать с очень медленным процессорами М1-М2 Э-60.
MacBuster
07.07.2018, 11:09
Удаление в знак протеста против действий MM
Кто-нибудь пробовал изменять адрес ВОЗУ в таблице строк на ОЗУ ЦП, например на 40000?
Во всех текстах по этому поводу сплошная интрига, "прямой доступ к ВОЗУ быстрее, но мы рассмотрим его в следующий раз..." как то так :)
Что в итоге получится? третий план будет в ОЗУ ПП, а в ЦП что происходит? Будет 2х битная графика как в БК (запретить 3й план?) или есть нюансы?
Есть у кого пример?
randomizer
09.10.2018, 14:45
Есть у кого пример?
https://github.com/aberranth/chibiakumas/blob/master/main.mac
Делал как раз для оценки скорости. В примере, асинхронно, на обоих процессорах запускается программа записывающая в видеопамять.
- - - Добавлено - - -
В целом - вполне обнадёживающий результат.
С чем связан выбор адреса для битпланов 11240?
randomizer
09.10.2018, 15:56
Почему 11240 уже не помню. Смысл в том что нужно попасть в нижние 32КБ памяти, при этом адрес строки в таблице строк соответсвует адресу в памяти ПП, а адреса битпланов в памяти ЦП идут со сдвигом.
Мне например неясно, почему высчитвая сдвиг для битплана 1 мне пришлось вычесть 280...
/* нужно попасть в нижние 32КБ памяти */
Наверное чтобы ПП осталась память.. у него же 32кб.
........
недостаточно памяти для запуска :(
randomizer
09.10.2018, 22:46
Хм, обычно я гружусь с HDD и в starts.com у меня прописано
SET EXIT SWAP
SET USR SWAP
возможно поэтому у меня запускалось без ошибок.
MacBuster
10.10.2018, 00:13
Удаление в знак протеста против действий MM
Почистил starts.com - запустилась.
randomizer
10.10.2018, 11:41
Обратил внимание, что на гитхабе более старая версия, в другой, с развёртыванием циклов работает шустрее, но изображение правда так и не слилось в одно, на это уже не хватает скорости.
В демо первый битплан пишет ЦП, а во второй ПП?
...
Малость запутался:
видимая часть это BP0+18*40 и размером (288*40)? а то я попробовал, что-то не так получается.
Спрайты лучше хранить отдельно битпланами?
randomizer
10.10.2018, 13:05
В демо первый битплан пишет ЦП, а во второй ПП?
битплан 0 в адресном прострастве ПП
битпланы 1 и 2 в адресном пространсве ЦП
Вообще, не помню где читал, организации памяти у машинки такая:
есть три банка памяти по 64КБ, с 8-ми битным доступом
соответсвенно, банк 0 у ПП - младшие 32КБ ОЗУ ПП, старшие - видеопамять (и отсюда 8-ми битная шина данных связывающаяя память и контроллер ОЗУ ПП)
банки 1 и 2 у ЦП, банк 1 - младший байт слова, банк 2 - старший байт слова, и по аналогии с ПП - младшие 32КБ(два банка дают 64КБ) это ОЗУ ЦП, старшие видепамять.
- - - Добавлено - - -
видимая часть это BP0+18*40 и размером (288*40)? а то я попробовал, что-то не так получается.
видимая часть начинается c BP0 в ОЗУ ПП и BP1 в ОЗУ ЦП
- - - Добавлено - - -
Спрайты лучше хранить отдельно битпланами?
Проще всего использовать только два битплана доступные ЦП, а там получается что, слово процессора включает по байту из обоих битпланов.
А BP2 судя по всему BP1+<WPBP*2> - 280. ?
банк 1 - младший байт слова, банк 2 - старший байт слова
если я правильно понял графику нужно хранить: Четные байты в одном блоке нечетные в другом?
... поэтому у меня полосатость получалась. как же блин спрайты хранить :( их же еще по точкам нужно двигать...
для полного счастья не хватает чтобы с инверсией и биты в обратном порядке... :)
....
попробовал очистку сделать.. вроде работает..
и еще внизу стек шевелится..
я его тоже очищаю с фатальным результатом :)
randomizer
10.10.2018, 14:58
А BP2 судя по всему BP1+<WPBP*2> - 280. ?
Каждый бит цвета хранится в отдельном банке памяти. Контроллер памяти ЦП подставляет байты банка 1 в чётные адреса, байты банка 2 в нечётные адреса. Байт 0 бит-плана 1 имеет адрес BP1, байт 0 бит плана 2 имеет адрес BP1+1 и т.д. в шахматном порядке.
Если банки 0, 1 и 2 обозначить как B, G, R, то в одном слове получается такое расположение бит | 7R 6R 5R 4R 3R 2R 1R 0R | 7G 6G 5G 4G 3G 2G 1G 0G |
Интересно как будет выглядеть алгоритм движения спрайта по точкам.. и будет ли быстро.
допер..
если например двигаемся влево то:
кладем в младший байт, сдвигаем влево.. и эти 2 байта уже кладем в свой план.. те через один..
так для обоих планов и для маски..
А ПП знает, что у него в памяти целый битплан образовался?
Меня смущает, что под верхней служебной строкой вылазит мерцающая строчка.. как стек.
В демке прерывания отключены, а если их включить всякая ерунда вылазит.. скрол вообще что попало творит.
может служебные строки не трогать? И как-то заблокировать запись в битплан который в ПП.
randomizer
10.10.2018, 18:49
А ПП знает, что у него в памяти целый битплан образовался?
Единственное что он "знает", это то что "он" выделил регион памяти под наши нужды.
В демке прерывания отключены, а если их включить всякая ерунда вылазит.. скрол вообще что попало творит.
Тут только один выход - вешать свои обработчики прерываний.
И как-то заблокировать запись в битплан который в ПП.
Не нужно ничего блокировать, достаточно переопределить цвета таким образом, чтобы бит битплана ПП ни на что не влиял, то есть задавая цвета в таблице строк, внести одинаковые цвета для случаев когда он установлен и когда нет.
При сборке в SAV стэк конец кода ставится?
Не могу понять что за полоски.. сверху изменяется, снизу просто мусор:
https://yadi.sk/i/veyV7XmFP614UQ
При сборке в SAV стэк конец кода ставится?
ЕМНИП, то по умолчанию (если не играться .ASECT секциями) все из .OBJ размещается с адреса 1000(8) и указатель стека на тот же адрес 1000(8).
Щас гляну
- - - Добавлено - - -
Да, так
- - - Добавлено - - -
http://bitsavers.informatik.uni-stuttgart.de/pdf/dec/pdp11/rt11/v5.6_Aug91/AA-PD6PA-TC_RT-11_Volume_and_File_Formats_Manual_Aug91.pdf
Есть ли простой способ вернуть значения по умолчанию в таблице строк?
код 4 по моему только рулон упорядочивает
randomizer
10.10.2018, 21:15
Есть ли простой способ вернуть значения по умолчанию в таблице строк?
Думаю что будет достаточно вызвать подпрограмму, которая вот здесь (http://www.emuverse.ru/wiki/%D0%A3%D0%9A%D0%9D%D0%A6_ROM_disasm_3) в самомо начале листинга.
- - - Добавлено - - -
Тольк как её вызвать из программы ЦП...
MacBuster
10.10.2018, 21:32
Удаление в знак протеста против действий MM
Для резервирования памяти под экран можно использовать сплэшскрин:
https://yadi.sk/i/fEaMpdl1ZibuVA
с битпланами разобрался, одна проблема мигающая строка вверху.. см. картинку.
Мигает с частотой курсора.. как бы ее прибить...
При сборке в SAV стэк конец кода ставится?
Не могу понять что за полоски.. сверху изменяется, снизу просто мусор:
https://yadi.sk/i/veyV7XmFP614UQ
Из моего опыта (в частности, при разработке HWYENC) стек ставится на конец занятой памяти.
Мне даже приходилось в конце резервировать память под стек, чтобы он не портил другие области и чтобы его не портили.
/* приходилось в конце резервировать память под стек */
Да я так и сделал. Но почему так, это же косяк...?
Да я так и сделал. Но почему так, это же косяк...?
Это не косяк. Это не совсем по феншую использование стека :)
Поскольку в PDP-11 он растёт вниз - традиционно он в начале программы.
При таком подходе есть риск запороть вектора прерываний, но если программа работает с включённым ДП (RT-11XM, TSX, RSX), то блок векторов прерываний (опять же - традиционный размер 0-376(8) или 0-максимальный используемый) как правило не задействован (кроме некоторых ячеек в самом низу - зависит от операционки) - и для стека доступен больший объем ОЗУ.
Если выделять блок памяти выделять в конце программы - риск потереть верхушку кода или данных программы. И более интересные чудеса :)
Как мне кажется, лучше наверное использовать традиционный подход, а так же желательно прикинуть потребную глубину стека (если нет рекурсии - в принципе возможно) - и при линковке программы указать
MacBuster
13.10.2018, 19:42
Удаление в знак протеста против действий MM
/* Переопределите там палитру. */
Хотелось бы туда тоже рисовать.. пробовал менять адреса строк с 1 по 18.. мигалка эта не уходит..
может это "невидимая" строчка (или что там под служебной строкой) и ее как буфер что-то использует?
...
Я уже склоняюсь к тому, что хоть прямой доступ и хорош по скорости, но при этом памяти не остается от слова "совсем"..
написать что-то серьезное не реально, демку какую возможно...
...
А курсор можно выключить? (по простому)
и еще что я делаю не так?
MOV #100000, R3
MOV R3, @#176640
MOV #SPLASH, R1
MOV R4,3840. ; ***********
1$: MOV (R1)+, R0
MOV R0, @#176642
INC @#176640
SOB R4, 1$
Что бы ни писал в R4-- крутит 55000, если поменять на R2.. крутит ~320 раз
короче пофиг что в счетчик записываю... :(
MacBuster
13.10.2018, 21:16
Удаление в знак протеста против действий MM
MOV R4,3840. ; ***********
Странно, что употребляется десятичный адрес ячейки памяти (ибо в таком варианте содержимое R4 пишется в ячейку с адресом 3840(10))
Или это ошибка и должно быть MOV #3840., R4 ? Исходя вот из этого:
Что бы ни писал в R4
написать что-то серьезное не реально
если установить режим экрана 40Х24 у вас будет две страницы,
1-я видимая, вторая как бы справа висит за границей экрана (именно справа "смайл"),
между ними можно переключаться.
курсор можно сделать 0 цветом
есть верхняя и нижняя служебные строки у них свои адрес начала и конца в памяти
читайте все советы в архиве где Alex_K комментирует документация (я же выше писал где брать Феликса архив скачайте!)
/*Или это ошибка */
Это все x86, подсознательно написал.
/*есть верхняя и нижняя служебные строки у них свои адрес начала и конца в памяти*/
Да я уже как бы в курсе, я спросил есть ли простой способ (например ПП в ПЗУ) чем каждый раз таблицу строк переписывать...
.. пп.. выкл. курсор
.. пп. переключить экран 0-1
Это все x86, подсознательно написал
Известная проблема. Тут только вырабатывать рефлекторное переключение :) Я в обратную привыкал :) По мне, так в MACRO-11 удобней - скользишь взглядом вдоль строки и - что делаем - перенести, с чем - вон коробка стоит, куда - в тот дальний угол :)
Ещё совет - никаких числовых констант в тексте. Описываются как именованные в самом начале и в тексте - только по имени. Так же исключает некоторый класс ошибок. Ещё неплохо именно константы (типа - длина строчки экрана) как то текстуально выделять - то же некоторые ошибки исключают. Хотя тут конечно мешает и раздражает ограничение на длину идентификаторов - в шесть символов бывает сложно уместить удобное имя..
MacBuster
14.10.2018, 12:15
Удаление в знак протеста против действий MM
которые умеют понимать метки человеческой длины.
Что не отменит то, что в obj файлах все равно (глобальные) метки останутся шестисимвольными, которые такими же останутся у существующих нативных компиляторов, так что проблема практически нерешаемая. Да и вызвано это, на самом деле, ограниченным объёмом памяти, доступным программам.
изобрести макрос какой
Всё равно это будет работать только для локальных меток - в глобальных то вылезет
бессмысленными и безжалостными короткими
Так что только сокращения... Хотя периодически скребётся мысль - восстановить текст ассемблера MACRO-11 и добавить (для локальных меток) поддержку длинных имён.. Ишо бы время найти :) И что ещё останавливает - как раз для локальных проблема несколько менее раздражающая, чем для глобальных...
Что не отменит то, что в obj файлах все равно (глобальные) метки останутся шестисимвольными, которые такими же останутся у существующих нативных компиляторов, так что проблема практически нерешаемая. Да и вызвано это, на самом деле, ограниченным объёмом памяти, доступным программам.
Как вариант, сделать человеческий современный компилятор сразу в .SAV, без промежуточных обьектников. А там и метки любой длины и все остальное.
сделать человеческий современный компилятор сразу в .SAV
(существующие) Библиотеки и откомпилированные модули - раз
Необходимость компилировать всех исходников сразу - а не частями - как при существующем подходе в OBJ - а значит объём компилируемого возрастёт - и опять вопрос про доступную память - два
Поддержка всего функционала существующего ассемблера MACRO-11 (включая макросы) - что тоже увеличит потребность в памяти или какие то исходники, которые захочется использовать в своём проекте вы не сможете откомпилировать - три.
Существует не только операционная система RT-11 - четыре
И это только навскидку.
Или же пилить под определённый круг сценариев использования - что сузит круг интересующихся и пользующихся
В итоге как курсор прибить?
в ПП MOVB #177,@23160 - не сработала
ESC 33,131,Y,X - только для видимых координат
MacBuster
14.10.2018, 19:13
Удаление в знак протеста против действий MM
Ага, заодно поправить синтаксис
А что не так с синтаксисом?
сделать человеческие сообщения об ошибках
Экономия памяти
По затратам это почти тоже самое, что написать свой ассемблер
Не совсем. Тут сохранится полностью функционал, а при написании своего - не факт, что всё останется - документацию надо хорошо лопатить - и то не факт, что всё упомянуто.
компоновщик
А линкер то зачем? Я поэтому и написал - для локальных меток - потому как трогать формат OBJ - это на многое повлияет. Можно сделать расширение формата - но это усложнит линкер - не знаю, как у него с памятью
Ещё совет - никаких числовых констант в тексте. Описываются как именованные в самом начале и в тексте - только по имени. Так же исключает некоторый класс ошибок. Ещё неплохо именно константы (типа - длина строчки экрана) как то текстуально выделять - то же некоторые ошибки исключают. Хотя тут конечно мешает и раздражает ограничение на длину идентификаторов - в шесть символов бывает сложно уместить удобное имя..
Я вот думаю - может изобрести макрос какой, чтобы сопоставлять осмысленные длинные имена с бессмысленными и безжалостными короткими?
Если программа компилируется "батником" - есть очень простой путь: в начале файла (в комментариях) описываете все метки/имена с признаком "замена" (любые 2-3 символа) и коротким именем, затем в батнике добавляете команду в которой парсер (написанный Вами) проходит по тексту программы и заменяет длинные имена на короткие. Результат парсера - новый файл и его передать на компиляцию. В конце "батника" - удалить новый файл.
MacBuster
14.10.2018, 21:39
Удаление в знак протеста против действий MM
Что-то мне подсказывает
а мне что то подсказывает, что по поводу ваших "претензий" по синтаксису вы отказываетесь давать показания (пояснения)? или система перегружена и вывод на терминал (форум) из за этого тормозит мало мало ?
/* Пройти по таблице и сбросить бит или найти установленный бит и поправить координаты. */
По таблице это понятно, но должны же быть и простые пути. Например в листинге ПЗУ на Emuverse видел кучу полезных подпрограмм, только как ими пользоваться.. пробовал вызывать в ПП ерунда получается.. или они вообще из юзермода не работают?
только как ими пользоваться
Разбираться - что на входе, что на выходе. Другого пути нет
/* Разбираться - что на входе,*/
Да там в исходнике все написано, только не делает оно того.. вот я и спрашиваю возможен ли их вызов из режима пользователя..
пример:
; П/п начальной инициализации
107744$:JSR R5,173730$ ; Очистка ОЗУ
.WORD 13142,4017 ; Начальный адрес - 13142, число слов - 4017
107754$:MOV #0,@#177026 ; Разрешить все планы видеопамяти
CLR @#177020 ; Очистка регистров цвета кода фона
... все понятно.. но блин не инициализирует
также есть для установки видеорежима, гашения курсора.. и.т.д.
П.С.
вызов делаю из ПП.
режима пользователя
Ну, строго говоря, нет на ВМ2 режима пользователя.
И да, можно обращаться к коду ПЗУ из загруженного кода.
только не делает оно того
Значит, что то делаете не так. Поэтому я и написал - разбираться, что на входе и что на выходе.
Тогда вопрос:
Если ПЗУ начинается со 120000, то почему в УКНЦ ROM disasm 3 -
; * ДРАЙВЕР ТЕКСТОВОГО ТЕРМИНАЛА *
; * Адреса 107744 - 125027 *
цитата: "Системное ПЗУ (банки 2-4 в адресах 120000-176777). До него нам тоже пока нет дела. Всему свой черед."
p.s.
То что я что-то делаю не так я уже догадался.. можно по существу
можно по существу
И в своё время игрался с программированием на ПП (не игры), так что точно помню, что можно. Но это было под 30 лет назад. Попробую посмотреть, что у меня осталось из текстов - может и подскажу
цитата: "Системное ПЗУ (банки 2-4 в адресах 120000-176777).
Логично было бы предположить, что банк 1 начинается с адреса 100000. Но так ли это - память ничего не говорит и сейчас я на работе :)
randomizer
15.10.2018, 18:43
Если программа компилируется "батником" - есть очень простой путь: в начале файла (в комментариях) описываете все метки/имена с признаком "замена" (любые 2-3 символа) и коротким именем, затем в батнике добавляете команду в которой парсер (написанный Вами) проходит по тексту программы и заменяет длинные имена на короткие. Результат парсера - новый файл и его передать на компиляцию. В конце "батника" - удалить новый файл.
Как вариант, можно использовать препроцессор, который путём хеширования укоротит метки до необходимой длинны.
Посмотрел свои файлы. Ну, в общем я начинал дизаассемблировать ROM ПП, но (судя по датам), когда у меня УК-НЦ погорел - забросил я это дело...
107744$:
107754$:
такие метки использовать нельзя ? неужели транслятор не ругается?
- - - Добавлено - - -
S_V_B, попробуйте переписать программу не используя меток (только самые необходимые!)
такие метки использовать нельзя
Это называется - локальные метки и ассемблер MACRO-11 их воспринимает нормально
- - - Добавлено - - -
Хотя.. Вроде как там десятичное число в начале в диапазоне 1-65535..
MacBuster
15.10.2018, 21:43
Удаление в знак протеста против действий MM
randomizer
15.10.2018, 22:39
Заодно можно повыкидывать лишнее (комментарии) и привести исходник к человеческому виду.
А что даст? Разве что ускорит обработку файлов ассемблером. Только критично ли это на современных компьютерах?
MacBuster
15.10.2018, 23:27
Удаление в знак протеста против действий MM
Это называется - локальные метки и ассемблер MACRO-11 их воспринимает нормально
меня смущают цифры (числа ) и значок бакса как 7-й символ )
нормальные локальные меточки кое Где это 1$: 2$:
ну метки для текстовых сообщений и для прыжков JMP - длинных переходов оформляются 6-ю оригинальными символами (буквами) вроде так.
проверил = транслятор не пропускает такое на сами строки с метками ругается как TU, на команды перехода к ним ругается ATU (подглядел в MACMIS.LST и вах! теперь не усну - но энтузиазма автору кода не занимать, что похвально!)
Так же как и МакБастеру с его "правильным синтаксисом и правильным УК-НЦ и правильном всем остальным)
/* 107744$: */
Товарищи, это был листинг драйвера терминала из ПЗУ.. и такая метка указана для наглядности.. т.к. это абсолютный адрес в памяти.. никто листинг ПЗУ транслировать не собирался :)
Вопрос был в другом.. почему драйвер терминала в листинге начинается со 100000, а ПЗУ в документации со 120000... и какие тогда реальные адреса?
......
/* Вопрос к Hunta */
Возможно в тетрадке где дизассемблировали ПЗУ есть реальные адреса?
/*В целом*/
Где-то выше я сетовал, что при первом знакомстве с УКНЦ мне не понравилась ее некая "терминальность"... согласен, что это сделано для совместимости с древним ПО. НО УКНЦ не терминал, а компьютер и если ты пишешь свою программу зачем упираться в эти навороты. Зачем посылать ESC последовательности чтобы драйвер терминала подумал, обработал их и вызвал процедуру из ПЗУ которую я и так сразу могу вызвать? Если писать в "старом" стиле то ничего кроме "рогаликов" не получится..
P.S.
Не нужно рассуждать о синтаксисе, кто хотя бы раз использовал ПЗУ УКНЦ скажите какие адреса реально и почему в исходниках так..
ну метки для текстовых сообщений и для прыжков JMP - длинных переходов оформляются 6-ю оригинальными символами (буквами) вроде так. Не так. Число (0-65535) со знаком доллара в конце - это локальная метка. Локальная в своей области действия. Обычно это область между двумя постоянными метками, хотя с помощью парных директив
.ENABL LSB
; здесь будет одна большая область локальных меток,
; в которой могут быть и посточнные метки.
.DSABL LSB Обычно потребность в этом возникает, когда вдруг выясняется, что внутрь уже имеющегося блока локальных меток между двух постоянных, надо сослаться откуда-то издалека.
- - - Добавлено - - -
За пределами этой области действия локальных меток (т.е. в другой области) они могут повторяться.
нормальные локальные меточки кое Где это 1$: 2$:
Нормальные локальные метки - это 1$-65535$. И обычно при первом подходе их пишут через 10-ок, а то и через 20-ть
цитата: "Системное ПЗУ (банки 2-4 в адресах 120000-176777).
Вопрос был в другом.. почему драйвер терминала в листинге начинается со 100000, а ПЗУ в документации со 120000... и какие тогда реальные адреса?
Логично было бы предположить, что банк 1 начинается с адреса 100000
Возможно в тетрадке где дизассемблировали ПЗУ есть реальные адреса?
Серьёзно? Вы думаете, я его руками дизассемблил? Даже на БК была написана программа (на Бейсике), которая мне вывела листинг ROM, а уж под RT их..
для совместимости с древним ПО
Для совместимости с исходной архитектурой. Именно она позволила портировать на УК-НЦ RT и стандартные редакторы
Зачем посылать ESC последовательности
вызвал процедуру из ПЗУ которую я и так сразу могу вызвать?
С ЦП код на ПП Вы не вызовете.
- - - Добавлено - - -
Число (0-65535)
По документации - с 1. Но я это не проверял. Так как начинал с 10, а после разборки использования пакета структурных макросов вообще забыл про локальные метки
- - - Добавлено - - -
В общем, как я и писал ранее - код ПЗУ в файл я выгрузил и на этом всё закончилось, размер - 63 блока, что явно указывает на стартовый адрес не выше 100000 плюс, насколько я помню - ПЗУ-х в УК-НЦ - 4, а учитывая из размер - 8 кб - предположение, что банк 1 начинается с адреса 100000 становится ещё более обоснованным. И учитывая, что у Вас УК-НЦ прямо таки под рукой - кто мешает проверить, что там - по адресам типа 107744
/* Серьёзно? Вы думаете, я его руками дизассемблил? Даже на БК была написана программа (на Бейсике) */
Ваша программа адреса показывала?
/*1 начинается с адреса 100000 */
Был ли там код ПЗУ ЦП, вообще 100000-160000 это еще ОЗУ пользователя.., а в ПП 100000-120000 - окно для кратриджа
Поэтому я и спрашивал возможно что-то нужно переключить.. режим, банки, страницы.. я блин не знаю.. поэтому и спрашиваю то что я пробовал не работает.
Нужен совет по удачному использованию ПЗУ..
/* С ЦП код на ПП Вы не вызовете. */
Я и не собирался, я же писал выше, что вызываю из ПП.
Ваша программа адреса показывала?
Программа писалась под БК. На УК-НЦ я бы стал использовать стандартный DESS, а в нём (по крайне мере тот, который тогда был у меня) - можно было указать, с какого адреса расположен код. Но, как я писал выше - до дизассемблирования дело не дошло - есть только двоичные файлы
Был ли там код ПЗУ, вообще 100000-160000 это еще ОЗУ пользователя..
Адресные пространства у ЦП и ПП достаточно самостоятельные
возможно что-то нужно переключить
ПЗУ у ПП доступно всегда
Я и не собирался, я же писал выше, что вызываю из ПП.
А что бы туда попасть - код ещё нужно загрузить на ПП. И обычно (например, для текстовых редакторов) на это никто не заморачивался, использовали именно ESC-последовательности.
Нужен совет по удачному использованию ПЗУ..
Сильно подозреваю, что никто Вам особо ничего не подскажет - кроме тех, кому нужна была большая скорость вывода картинки на экран, а таких на этом форуме вроде как немного. У меня потребности что то грузить в ПП и использовать возможности ROM особо не было - если только расширить ESC-последовательности.
/* (например, для текстовых редакторов) на это никто не заморачивался, использовали именно ESC-последовательности. */
Проблема в том, что как раз нужна скорость, а не текстовый редактор и прочие "рогалики".. обидно просто убивать кучу времени для выяснения прописных истин.. башка сейчас не тем занята, приколов без этого хватает в этом "чуде техники"..
Даже и подумать не мог, что чтобы погасить курсор нужно столько танцев..(и никого это не напрягало), на самом деле все гораздо проще..просто все упирается во время на "археологию"..
/* А что бы туда попасть - код ещё нужно загрузить на ПП. */
Вы блин меня совсем за дебила что ли считаете?
MacBuster
16.10.2018, 07:47
Удаление в знак протеста против действий MM
/*О каких танцах речь? Пройдите по элементам таблицы видео-адресов, сбросьте бит курсора или найдите установленный бит и измените координаты. Это десять строк на ассемблере. */
И это не танцы :))
Зачем?
когда можно одним CALL обойтись.. Все уже написано до наc , в исходниках я видел. Вопрос какие реальные адреса..
Сами подумайте.. десяток строк для гашения курсора :)
Особенно когда памяти в обрез, я лучше еще спрайт добавлю..
Вы блин меня совсем за дебила что ли считаете?
Я Вам объяснил - почему ESC последовательности. Судя по тому, что вопрос возник в контексте вывода на экран - просто не знакомы со СТАНДАРТОМ архитектуры, на котором построена УК-НЦ. Лично у меня такой вопрос не возникает в принципе.
просто все упирается во время на "археологию"..
А что вы хотите от компа - которому под или уже за тридцатник. Большой аудитории опытных программистов? Исчерпывающей документации? Ну ну. Листинг в зубы и вперёд - это наше всё.
- - - Добавлено - - -
Вопрос какие реальные адреса
Я бы уже сотню адресов успел проверить за время, которое Вы ведёте дискуссию. Но если я это сделаю за Вас - это только продолжит поток вопросов. Сделаете сами - существует хорошая вероятность, что научитесь и не будете задавать ТРИВИАЛЬНЫЕ вопросы (а вопрос - где там висят ПЗУ-хи - из их числа). Так что нет - не полезу проверять.
/* Я бы уже сотню адресов успел проверить за время, которое Вы ведёте дискуссию. */
Вы тоже конкретными ответами не сыплете.. все из пустого в порожнее.. пока я на работе к сожалению не проверю ни одного адреса..
А тривиальные вопросы были для людей которые это уже проходили.. зачем делать то что уже сделали до тебя..
Две страницы софистики, когда можно было сказать.. "нет не знаю" или "добавить смещение в исходник ПЗУ + 20000"... и все.
которые это уже проходили
30 лет назад
когда можно было сказать
- умолкаю.
MacBuster
16.10.2018, 09:05
Удаление в знак протеста против действий MM
/* Все ответы уже даны, другое дело что вас они почему-то не устраивают*/
Какие ответы?
Вопрос был один:
Есть исходник Драйвера терминала ПЗУ с emuverse.. он со 100000.. ПЗУ начинается со 120000.. по каким в итоге адресам искать описанные там процедуры?
на него я не услышал ответа, а то что что можно ли править таблицу строк я и не спрашивал..
На emuverse всё есть
УКНЦ ROM disasm 1 — обслуживание меню УСТАНОВКА и ЗАГРУЗКА. Адреса 100000 - 103553.
УКНЦ ROM disasm 2 — драйвер клавиатуры. Адреса 103554 - 107743.
УКНЦ ROM disasm 3 — драйвер текстового терминала. Адреса 107744 - 125027.
УКНЦ ROM disasm 4 — драйвер канала 2 (обслуживание дисковода, магнитофона, кассет ПЗУ и памяти ПП). Адреса 125030 - 135435.
УКНЦ ROM disasm 5 — драйвер графического терминала, драйвер параллельного порта, печать экрана пользователя. Адреса 135436 - 157777.
УКНЦ ROM disasm 6 — монитор (пультовый отладчик), тестовые подпрограммы, эмуляция команд FIS (FADD, FSUB, FMUL, FDIV), обработка прерываний, загрузчики. Адреса 160000 - 176777.
MacBuster
16.10.2018, 09:30
Удаление в знак протеста против действий MM
shattered
16.10.2018, 10:23
ПЗУ у ПП доступно всегда
по адресам 100000-117777 - не всегда, а только если 177054 бит 0 равен 1, и не выбран картридж с ПЗУ (биты 1-2 того же регистра).
/* не вы интересовались как выключить курсор */
интересовался как "просто", без десятка строк кода выключить курсор, но на последних двух страницах пытался узнать как работать с ПЗУ и как с этим связан листинг emuverse.
/*Вы нас за идиотов держите*/
Никто Вас ни за кого не держит..
.....................
Вот кстати на обеде не удержался попробовал:
.....
CLR @#23164 ; Запретить курсор
MOV #2,@#7134
MOVB #177,@23160 ; Убрать курсор с экрана;
..........
Прекрасно работает и без вашего любимого скакания по таблице строк....
Просто и красиво :) Трудно было подсказать?
............
В любом случае спасибо за участие.. :)
по адресам 100000-117777 - не всегда, а только если 177054 бит 0 равен 1, и не выбран картридж с ПЗУ (биты 1-2 того же регистра).
Спасибо, вылетело из головы - у меня картриджей с ПЗУ не было, а в контроллере флопов вроде ПЗУ же нет?..
S_V_B, http://archive.pdp-11.org.ru/ukdwk_archive/ukncbtlwebcomplekt/Other/UKROM/
наследие заслуженных УК-НЦ программистов, в частности соавтора UKNCBTL Alex_K, он кстати на форум заходит не так уж и редко (здоровья, Алексею!).
в этом "чуде техники"..
это чудо техники - младшая родственница гигантских PDP, то есть некий ПРОМЫШЛЕННЫЙ СТАНДАРТ
RT-11 - то же стандарт, идеально вылизанная, продуманная система реального времени под которую
есть трансляторы всех самых популярных языков, МАКРО-11 лучший и самый правильный ассемблер,
а цифры 8 и 9 придумали враги ))) Реализация графики как и работа с ней у каждой машинки сделана по своему,
у ДВК = КЦГД, у УК-НЦ встроенная БКашка в виде ПП, у БК своя там область экрана и заморочки с ней связанные
Системная МАКРО библиотека и сам язык более рассчитаны не на специфику (напрямую к железу), а на системные вызовы,
тем самым добывается запуск на любой ЭВМ под RT-11 или её эмуляцией.
Возможно ли в UKNCBTL ставить точки останова?
Пробовал в текст BPT вставлять, просто вылетает из программы.
Пошаговое выполнение есть, а как остановить?
Возможно ли в UKNCBTL ставить точки останова?
есть системный вызов
.TWAIT ! 375 ! 24 ! ПРИОСТАНАВЛИВАЕТ ВЫПОЛНЕНИЕ !
! ! ! ! ЗАДАНИЯ НА УКАЗАННЫЙ ИНТЕРВАЛ!
! ! ! ! ВРЕМЕНИ
читайте текстовый файл-описание SYSMAC.SML
как вариант само собой )
Возможно ли в UKNCBTL ставить точки останова?
Пробовал в текст BPT вставлять, просто вылетает из программы.
Пошаговое выполнение есть, а как остановить?
Там есть типа "одна" точка останова. В консоли отладчика вводим g12345 -- это значит ставится точка на адрес 12345, запускается на выполнение. Точка пропадает при первом останове эмулятора, без разницы ручном или по точке. Только при выполнении команды g12345 внимательно смотрите на каком процессоре вы сейчас стоите. Текущий процессор переключается командой p.
Команда Step Over реализована так же -- определяется адрес следующей команды, выполняется g12345 с этим адресом.
Полный хелп по всем командам консоли отладчика -- команда h.
https://github.com/nzeemin/ukncbtl-doc/wiki/Debugger-ru
randomizer
26.12.2018, 23:18
Возможно ли как то собрать бинарный файл который можно просто загрузить в память и выполнить?
Т.е. например, запускается программа, загружает этот файл в память(расчитанный на загрузку с адреса 024000) и посылает его в память ПП, или же в дополнительную память, адреса которой выше верхней границы памяти используемой ОС.
MacBuster
26.12.2018, 23:27
Удаление в знак протеста против действий MM
randomizer
26.12.2018, 23:31
М-м-м, вопрос в том, чтобы не превращать код в .sav?
Проще говоря, да
MacBuster
27.12.2018, 00:16
Удаление в знак протеста против действий MM
randomizer, я не уверен, но адрес запуска можно прописать компилятору принудительно (?), команда GET загружает файл (.SAV по умолчанию) в пользовательское ОЗУ, после этого программа может быть запущена командой STart
randomizer
27.12.2018, 12:37
Линкер запущенный с ключом /LDA делает какой-то абсолютный двоичный файл.
Как раз то что нужно :) Единственное что, нужно как то импортировать адреса меток в основную программу. В принципе, из .MAP файла можно сделать .MAC файл с метками и их адресами.
Проверил - да, похоже что с ним получается только код с 6-байтовым заголовком. Заголовок не смотрел.
Формат LDA описан в RT-11 Volume And File Formats Manual (http://www.bitsavers.org/pdf/dec/pdp11/rt11/v5.6_Aug91/AA-PD6PA-TC_RT-11_Volume_and_File_Formats_Manual_Aug91.pdf). В общем случае файл делится на куски, каждый из них предваряется заголовком в котором прописан адрес в который этот кусок грузится и его длина, а в конце идет контрольная сумма. Заканчивается файл голым заголовком который сообщает стартовый адрес или 1 если его нет. Формат предназначен для записи на перфоленту. Так же используется в XXDP для запускаемых файлов (там формат немного расширен для использования расширенной памяти).
Если нужен чистый код без нулевого блока SAV файла, то проще сделать
.SPLIT FILE.SAV/B:1 ,FILE.BIN(нужна программа SPLIT.SAV из стандартного набора RT-11).
Возможно ли как то собрать бинарный файл который можно просто загрузить в память и выполнить?Проще всего действительно собрать обычный .SAV-файл и (если надо) вырезать из него нужный кусок, той же программой SPLIT, как подсказал form. А для того, чтобы расположить этот .SAV с нужного адреса, дать линкеру ключик /BOTTOM:<addr>
randomizer
28.12.2018, 13:06
Одни недостаток, при генерации .SAV, и после выполнения команды SPLIT, размер файла оказыватся округлённым до размера блока. А в .LDA файле прописаны размеры кодовых блоков. Пожалуй всё же .LDA файлы удобней, за минусом того, что в программу нужно будет включать загручик для них.
Одни недостаток, при генерации .SAV, и после выполнения команды SPLIT, размер файла оказыватся округлённым до размера блока.
Он всегда округлен до размера блока. RT-11 в принципе не умеет делать размеры файла не кратные блоку.
Если же речь о коде, то до отрезания нулевого блока в ячейке 50 лежит последний используемый адрес.
Возможно ли как то собрать бинарный файл который можно просто загрузить в память и выполнить?
Т.е. например, запускается программа, загружает этот файл в память(расчитанный на загрузку с адреса 024000) и посылает его в память ПП, или же в дополнительную память, адреса которой выше верхней границы памяти используемой ОС.
Прочитал вопрос полностью.
Если речь идет о загрузке в ПП, то проще собирать обычный REL файл и грузить его программой PRUN (http://pdp-11.org.ru/~form/files/pdp-11/uknc/prun/) - для того ее и делал. Бонус: не требуется позиционно-независимого программирования, грузится только чистый код.
В любом случае, в качестве примера можно посмотреть IOSCAN (https://zx-pk.ru/threads/10718-soft-dlya-dvk-pdp11.html?p=721628&viewfull=1#post721628) - там программа собирается как обычный SAV, как LDA как программа для загрузки в ПП УКНЦ, как загрузчик для ленты итд.
В комплекте с PRUN есть примеры программ для ПП которые выполняют определенный действия (в том числе убираются из памяти по завершении или остаются и выполняют нужные функции).
Описание PRUN V2.0 (https://zx-pk.ru/threads/12877-soft-dlya-uknts.html?p=893429&viewfull=1#post893429).
randomizer
28.12.2018, 19:48
Пока у меня задача можно сказать попроще. ОС загружается в адреса ниже 170000, выше есть ещё 3Кбайтная страница быстрой памяти. В эту память я как раз и хочу вынести несколько процедур. И пожалуй да, будет проще из .SAV файла вырезать нужный участок и загрузить в эту область.
Подскажите как в ЦП по простому синхронизироваться с сетевым таймером?
Задача стереть-вывести спрайт с началом обратного хода.
В ПП все тривиально: 7130 - 1, 7132- адрес процедуры.
перекинул вопрос в тему, надо системнее справочки шпаргалочки, потом искать проще )
S_V_B
Как и можно ли выполнить LOAD SYS из программы?
допустим я хотел бы из своей программы запускать часики form 'a CL.SYS которые?
Это хороший пример, поскольку часики для старта не нужны никакие SET, just LO CL?
Как и можно ли выполнить LOAD SYS из программы?
.TITLE RELEAS
;In this example, the Null handler (NL) is loaded into memory,
;used, then released. If NL is LOADed the handler is
;resident, and .FETCH will return HSPACE in R0.
.MCALL .FETCH,.RELEAS,.EXIT,.PRINT
START: .FETCH #HSPACE,#NLNAME ;Load NL handler
BCS FERR ;Not available
; Use handler
.RELEAS #NLNAME ;Mark NL no longer in memory
.EXIT
FERR: .PRINT #NONL ;NL not available
.EXIT
NLNAME: .RAD50 /NL / ;Name for NL handler
NONL: .ASCIZ /?ERELEA-F-NL handler not available/
.EVEN
HSPACE: ;Beginning of handler area
.END START
Как и можно ли выполнить LOAD SYS из программы?
Выше Hunta привет пример.
Вроде CL поддерживает вызов .FETCH - не помню уже. Если нет - можно сделать :)
Разве что замечу, что метка перед .END не всегда будет последним адресом программы. Более универсальный метод - взять значение по адресу 50 и прибавить к нему 2 (или взять значение, генерируемое директивой .LIMIT).
Более универсальный метод - взять значение по адресу 50 и прибавить к нему 2
Более правильный метод - получить размер драйвера (.DSTAT?), выделить кусок памяти соответствующего размера и грузить драйвер туда. Но это если в SJ/FB. А если в XM и виртуальная программа - с ходу не скажу - таких я мало писал
Hunta,
form, благодарю )
пока результат такой, буду эксп-ть )
*** CТOП ***
000016/ 000000
@ 0
*** ДBOЙНOE ЗABИCAНИE ***
000006/ 000000
@
двойное зависание - обожаю, но "сбой аппаратуры" это абсолютный хит!
пока результат такой
Вот этот код
.TITLE RELEAS
.MCALL .FETCH,.RELEAS,.EXIT,.PRINT
START: .FETCH #HSPACE,#NLNAME ;Load NL handler
BCS FERR ;Not available
; Use handler
.RELEAS #NLNAME ;Mark NL no longer in memory
.PRINT #OK ;NL not available
.EXIT
FERR: .PRINT #NONL ;NL not available
.EXIT
NLNAME: .RAD50 /NL / ;Name for NL handler
NONL: .ASCIZ /?RELEAS-F-NL handler not available/
OK: .ASCIZ /?RELEAS-I-Ok!/
.EVEN
HSPACE: ;Beginning of handler area
.END START
под эмулятором Патрона показал вот такой результат
HD (177720) disk driver v1.6 2017
SL V08.00 [SW] Сторожевых С.В. 1988
KZ V01.00 (C) ВЦ МИЭТ, НОЯБРЬ 1987
RT-11SB (Y) V05.07
.SET TT FORM
.SET TT SCOPE
.SET EDIT K52
.SET SL ON
.DAY
Время Дата
11:29:52 30-Май-2019, Четверг
.ASS HD1 DK
.EXE T
?RELEAS-I-Ok!
.
Более правильный метод - получить размер драйвера (.DSTAT?), выделить кусок памяти соответствующего размера и грузить драйвер туда. Но это если в SJ/FB. А если в XM и виртуальная программа - с ходу не скажу - таких я мало писал
Использование .DSTAT и .SETTOP имеет смысл если хочется грузить драйвера начиная сверху вниз, а промежуток до них использовать на свое усмотрение. MU BASIC-11 так делает например.
В остальном смысла особого нет так как единственное что делает .SETTOP - это просто переставляет значение ячейки 50.
Так что если нет нужды в вышеописанном варианте, можно просто использовать .FETCH с указанием первого свободного адреса, а на выходе получать новый свободный адрес с учетом загруженного драйвера.
Бонусом будет отсутствие лишней суеты с файлом SWAP.SYS после выхода из программы :)
Что касается XM, в нем FG job е может использовать .FETCH, а в виртуальной BG программе .SETTOP просто переставит лимит задачи на который .FETCH и загруженному драйверу глубоко наплевать :)
Ну и для полноты картины, остается упомянуть VBGEXE BG job - в этом случае указанный в .FETCH адрес вообще никак не используется.
Вот этот код
заменил название на CL
закомментировал выгрузку
часики появились на долю секунды но одновременно с .EXIT исчезли
???
! Apxивны дeл ЖД ! ЛAТ
.TITLE RELEAS
.MCALL .FETCH,.RELEAS,.EXIT,.PRINT
START: .FETCH #HSPACE,#NLNAME ;Load NL handler
BCS FERR ;Not available
; Use handler
; .RELEAS #NLNAME ;Mark NL no longer in memory
.PRINT #OK ;NL not available
.EXIT
FERR: .PRINT #NONL ;NL not available
.EXIT
NLNAME: .RAD50 /CL / ;Name for NL handler
NONL: .ASCIZ /?RELEAS-F-NL handler not available/
OK: .ASCIZ /?RELEAS-I-Ok!/
.EVEN
HSPACE: ;Beginning of handler area
.END START
имеет смысл если хочется грузить драйвера начиная сверху вниз, а промежуток до них использовать на свое усмотрение
Я писал программы, которые всю доступную память забирали себе в пул, из которой потом и выделялась память кусками. По описанной мной схеме мой код так с подгрузкой драйверов и работал - получить информацию - сколько надо памяти (посмотрел - да, .DSTAT), получить, проверить, что выдали затребованное, загрузить драйвер
.FETCH с указанием первого свободного адреса, а на выходе получать новый свободный адрес с учетом загруженного драйвера. как это значение получить, ведь у всех свои конфиги ?
часики появились на долю секунды но одновременно с .EXIT исчезли
Значит, динамически загруженные с завершением программы выгружаются
но одновременно с .EXIT исчезли
Так и должно быть. С помощью .FETCH драйвер подгружается для программы, а не насовсем.
Если хочется из программы подгрузить драйвер нужно использовать другой вариант: с помощью .DSTAT проверить загружен ли он, если нет - сделать выход с выполнением командами LOAD CL и RUN имяпрограммы (пример выходя с командой есть в описании макробиблиотеки).
- - - Добавлено - - -
как это значение получить, ведь у всех свои конфиги ?
Начальный верхний адрес - это содержимое @#50 плюс 2.
После вызова .FETCH, новый адрес вернется в R0
- - - Добавлено - - -
Я писал программы, которые всю доступную память забирали себе в пул, из которой потом и выделялась память кусками.
У меня тоже некоторые проги так делают.
В последних прогах где-то перешел на родной $INIDM от DEC :)
https://pic.maxiol.com/images/1559203319.787613759.20190530075909177.png
красота, да будут часики на экране ! form про команду на выходе - я понял, мне наверное и то и то нужно
- - - Добавлено - - -
form > Начальный верхний адрес - это содержимое @#50 плюс 2.
После вызова .FETCH, новый адрес вернется в R0
Правильно или не очень )))
- такой вариант часы запускает.
START: MOV @#50,R0
SUB #2,@#R0
.FETCH @#R0,#NLNAME ;Load NL handler
BCS FERR ;Not available
; Use handler
перешел на родной $INIDM от DEC
У меня комбинация динамики и псевдостатики, поэтому их библиотеку не пользую
Правильно или не очень
Плюс два, а не минус :)
TST (R0)+
Только вот R0 не годится - любой другой регистр должен быть.
И не @#Rx, а просто Rx ;)
Только вот R0 не годится - любой другой регистр должен быть.
.TITLE RELEAS
.MCALL .FETCH,.RELEAS,.EXIT,.PRINT
START: MOV @#50,R1
ADD #2, R1
.FETCH R1,#NLNAME ;Load NL handler
BCS FERR ;Not available
; Use handler
; .RELEAS #NLNAME ;Mark NL no longer in memory
.PRINT #OK ;NL not available
BR .
FERR: .PRINT #NONL ;NL not available
.EXIT
NLNAME: .RAD50 /CL / ;Name for NL handler
NONL: .ASCIZ /?RELEAS-F-NL handler not available/
OK: .ASCIZ /?RELEAS-I-Ok!/
.EVEN
HSPACE: ;Beginning of handler area
.END START
поправил в такой вид, часики подгружает и на выходе выгружает,
получается .RELEAS можно не использовать? я его закомментил как видно.
поправил
Годится. Вместо ADD #2,R1 здесь можно использовать TST (R1)+ - это на слово короче.
.RELEAS можно не использовать?
Он нужен только если тебе в рамках работы программы потребовалось освободить память от ранее .FETCHнутого драйвера. Специально вызывать его перед выходом не надо - он неявно сам выполнится когда потребуется.
дится. Вместо ADD #2,R1 здесь можно использовать TST (R1)+ - это на слово короче.
Да! Я это и хотел попросить разжевать для меня. Я очень туг в плане этой регистровой математики, иначе быть мне системщиком однозначно. По синтаксису я понимаю эту строку так, сравниваем с нулём содержимое R1? Но что в
данном случае означают скобки с плюсом и как сравнение с нулём может заменить операцию сложения (типа сдвиг, смещение). ??? может немного сумбурно, но я же хотел чётко понимать процедуру, а не тупо шпаргалить. вот прибавить двойку мне более понято, ещё вопрос третий вариант два INC подряд будет тем же самом в плане результата, ведь можно
тогда написать свой макрос где тупо задать количество операций INC или DEC?
- - - Добавлено - - -
Годится.
ура! я сдал Олегу контрольную ))) Спасибо за шпору Хунта!
По синтаксису я понимаю эту строку так, сравниваем с нулём содержимое R1?
Просто проверяем значение ячейки памяти, адрес которой хранится в регистре (как итог - знаем равно нулю/меньше нуля или наоборот). В данном случае для нас результат проверки неинтересен, для нас важно, что такой адрес существует в принципе (иначе такая команда не годилась бы).
что в
данном случае означают скобки с плюсом
Это значит что после обращения, значение регистра увеличится на 2 (или на 1 если обращение байтовое [исключение - регистры 6 (SP) и 7 (PC) - они всегда на 2 изменяются]).
задать количество операций INC или DEC?
Это не имеет смысла поскольку уже два вызова INC/DEC - это два слова (для регистра), а дальше - больше. Тут как раз ADD будет лучше.
Это значит что после обращения, значение регистра увеличится на 2 (или на 1 если обращение байтовое [исключение - регистры 6 (SP) и 7 (PC) - они всегда на 2 изменяются]).
тогда можно переписать так
START: MOV @#50,R1
TST (R1)+
BEQ GOGOGO
.PRINT #СООБЩЕНИЕ О ТОМ, ЧТО ПАМЯТИ НЕТ?
.EXIT
GOGOGO: ДАЛЕЕ ПО ШПОРЕ
тогда можно переписать так
Код:
Не ясна логика проверки ;)
Не ясна логика проверки
сверяем с нулём
- если адрес существует получаем ноль и выполняем дальше по склону холма,
иначе при любом раскладе "нету памяти или несуществующий адрес или как грамотнее?" и выход. примерно это я подразумевал,
Тогда что есть CMP (R0)+,(R0)+
:)
Тогда что есть CMP (R0)+,(R0)+
константа )
Тогда что есть CMP (R0)+,(R0)+
Не знание предмета
- - - Добавлено - - -
Что можно творить на MACRO-11
PROCEDURE READ1
;
; R0 - sector num
; R1 - word count - zeroed
; R2 - memory address - updated
;
; in work
; R3 - sector count
;
BEGIN
LET R4 := BTCSR2
LET (R4) := #DC.STA!DC.NIE
LET R3 := R1 OFF.BY #377
SWAB R3
IF #377 SET.IN R1 THEN
LET R3 := R3 + #1
END
; R3 sector count
LET R4 := R4 + #P$STAT-P$CSR2
REPEAT
LET R5 :B= (R4)
.ASSUME CS.BSY EQ <^O200>
UNTIL RESULT IS PL AND #CS.DRD SET.IN R5
LET R4 := R4 + #P$SCNT-P$STAT
LET (R4)+ := R3 ; 24
.ASSUME P$SNUM EQ <P$SCNT+2>
LET (R4)+ := R0 ; 26
.ASSUME P$CYLL EQ <P$SNUM+2>
SWAB R0
LET (R4)+ := R0 ; 30
.ASSUME P$CYLH EQ <P$CYLL+2>
LET (R4)+ := @#B$DEVU ; 32
.ASSUME P$DH EQ <P$CYLH+2>
LET (R4)+ := BTDH ; 34
.ASSUME P$CMD EQ <P$DH+2>
LET (R4) := #CS.RD ; 36
REPEAT
REPEAT
LET R5 :B= (R4)
.ASSUME CS.BSY EQ <^O200>
UNTIL RESULT IS PL AND #CS.DRQ SET.IN R5
IF #CS.ERR SET.IN (R4) GOTO 80$
LET R4 := R4 + #P$DBUF-P$STAT
THRU R3 := #256.
IF R1 NE #0 THEN
LET (R2)+ := (R4)
LET R1 := R1 - #1
ELSE
TST (R4)
END
END
LET R4 := R4 + #P$STAT-P$DBUF
UNTIL R1 EQ #0
LET CARRY := OFF
RETURN
80$:
RESET
JMP BIOERR
END READ1
ок, попробую по другому спросить, вы видите ошибку явно там,
где у меня "мёртвая зона" и так
[CODE]
Плюс два, а не минус
TST (R0)+
1. сойдёт я получил за вариант с ADD #2,R1
на замену этой команды form посоветовал оптимизацию TST (R1)+
я конечно как честный Паскале-Любитель синтаксис ассембл. не совсем
чётко понимаю, но я забыл о чотности и что арифметика "словесная",
то есть смещение ()+ всегда на 2 и только байтовая может быть нечётной
получив такую рекомендацию я пишу код в моём понимании означающий
MOV @#50,R1 ; КЛАДЁМ СОДЕРЖИМОЕ ЯЧЕЙКИ 50 В R1
TST (R1)+ ; form ПОЯСНИЛ, ЧТО ЭТО ПРОВЕРКА НА СУЩЕСТВ. АДРЕСА
; НУЖНОГО, ДАЛЕЕ Я ПИШУ
BEQ GOGOGO ; ЕСЛИ РЕЗУЛЬТАТ ПРЕД.-ЕЙ КОМАНДЫ 0 ЗНАЧИТ ВСЁ ОК И
; МЫ ИДЁМ ФЭТЧИТЬ ДРАЙВЕР, И СЛЕДУЩИЕ ДВЕ СТРОКИ ПЕРЕД
МЕТКОЙ GOGOGO - ЭТО сообщение об ошибке и екзит
за что сразу учебником по макушке%
Не ясна логика проверки
Тогда что есть CMP (R0)+,(R0)+
Не знание предмета
господа не лишайте стипендии в чём ошибка,
помните вы смотрите на бублик изнутри, я же снаружи да ещё через упаковку ) две разницы !
господа не лишайте степендии в чём ошибка,
Если присмотреться все очень просто:
Команда TST как и CMP не изменяет операнд, но поскольку стоит автоинкремент то R0 увеличивается на 2, в случае с CMP на 4. Получаем TST(R0)+ ~ R0+=2; CMP(R0)+,(R0)+ ~ R0+=4;
При этом экономим память :)
Если присмотреться
то ты запутал меня окончательно )
где вы там CMP видите - вот я чего не понимаю (раз)
и чем вам переход по нулю не понравился
а как ещё TST проверить и сделать ветвление?
(уже начал занимать, без стипендии кушать нетуть)
В ячейке 50 - последний используемый (в данный момент) программой адрес. Нуля там не будет в принципе. Первый свободный - последний используемый + 2. В .FETCH надо указать - с какого адреса грузить. Поскольку первый свободный - это последний используемый + 2 - берём содержимое ячейки 50, добавляем два и этот адрес указываем в вызове .FETCH.
MOV @#50, R1
ADD #2, R1
.FETCH R1, #CL
Знающие систему команд и способы адресации PDP-11 вместо ADD #2 используют TST (R1)+, которая сделает следующее - возьмёт содержимое R1, извлечёт содержимое ячейку по адресу, извлечённому из R1 (попутно устанавливая или сбрасывая флаги), увеличит извлечённое из R1 значение на 2 (поскольку команда словная) и запишет обратно в R1. Нас интересует только воздействие на R1, поэтому дальше никаких проверок флагов не делается (хотя обычно после TST они проверяются тем или иным способом). Возможная проблема - R1 указывает на несуществующую память и мы словим прерывание по V4 - в данном случае неактуальна, потому что @#50 всегда (ну, точнее, если мы работает под RT11) указывает на существующую память (последняя ячейка программы).
- - - Добавлено - - -
Вдогонку
Возможные проблемы в коде в сообщении (https://zx-pk.ru/threads/15587-programmirovanie-na-uknts-kak.html?p=1014666&viewfull=1#post1014666)
- после программы не достаточно памяти для загрузки выбранного драйвера (не сильно страшно, подозреваю, что монитор откажется грузить, если памяти не хватает)
- насколько я понял из описания, .FETCH не корректирует значение в @#50, в R0 он возвращает адрес следующей ячейки памяти после загруженного драйвера (а это уже серьёзней, код из другого места может взять содержимое из ячейки @#50 и затереть драйвер)
- даже если за .RELEASE идёт .EXIT - отсутствие .RELEASE - это неряшливый стиль, в результате чего могут появиться вопросы и который потенциально может привести к ошибкам в программе - человек просто забудет написать .RELEASE там, где он точно нужен и потенциально получить нехватку памяти
Правильный подход
- получить информацию (включая размер) о драйвере
- сохранить текущую верхнюю границу + 2
- используя текущую верхнюю границу программы и размер драйвера - посчитать новую и установить её, используя .SETTOP (попутно установится и новое значение в @#50
- загрузить драйвер, используя сохранённое значение из 2-ого пункта
плюс в каждом пункте проверять корректность выполнения действий в пункте
подозреваю, что монитор откажется грузить, если памяти не хватает
Да, границы проверяются. Даже в старых SJ где много чего без всяких проверок делается.
установить её, используя .SETTOP
Добавлю: предварительно сохранить старое значение и восстановить его перед переходом в точку следующего цикла программы (если программа циклическая [например просит ввода команды]) или просто обнулить @#50 перед выходом - это позволит предотвратить лишнюю дисковую активность после .EXIT.
классная шпора-исходник на последнем образе (https://zx-pk.ru/threads/30767-redkij-ekzemplyar-uk-nts.html?p=1027553&viewfull=1#post1027553)
; ПРОГРАММИРОВАНИЕ КЛЮЧЕЙ
; =======================
.MCALL .EXIT
PKL: MOV #TKL,R1
BR 1$
2$: TSTB @#177564
BPL 2$
MOVB R0,@#177566
1$: MOVB (R1)+,R0
BNE 2$
.EXIT
TKL:
.ASCII <33><164><60><60>/*/
.ASCII \-KK ZNKT\<15> ;- К1
.ASCII \-EX ZNKT\<15> ;- К2
.ASCII \-ZNKT\<15> ;- К3
.ASCII \- \ ;- К4
.ASCII \- \ ;- К5
.ASCII \-*\
.ASCII <33><164><61><60>/*/
.ASCII \-Dir .BAK\<15> ;- НР/К1
.ASCII \-Dir/fu\<15> ;- НР/К2
.ASCII \-Copy/pred (\ ;- НР/К3
.ASCII \-).mac SY:\<15> ;- НР/К4
.ASCII \-Del/noq .BAK\<15> ;- НР/К5
.ASCII \-*\
.ASCII <33><164><62><60>/*/
.ASCII \-\<33>\P\<33>\?wLIST \ ;- УПР/К1
.ASCII \-\<33>\P\<33>\?wQUIT\<33>\?M\ ;- УПР/К2
.ASCII \-\<33>\P\<33>\?wEDIT \ ;- УПР/К3
.ASCII \- \ ;- УПР/К4
.ASCII \-\<33>\P\<33>\?wEXIT\<33>\?M\ ;- УПР/К5
.ASCII \-*\
.ASCII <33><164><63><60>/*/
.ASCII \-Dir/bad/fi\<15> ;- ФИКС/К1
.ASCII \-Copy/w/dev SY: DK:\<15> ;- ФИКС/К2
.ASCII \-Del/noq .BAK\<15> ;- ФИКС/К3
.ASCII \-Sq/noq DK:\<15> ;- ФИКС/К4
.ASCII \- \ ;- ФИКС/К5
.ASCIZ \-*\
.EVEN
.END PKL
с того же образа (https://zx-pk.ru/threads/30767-redkij-ekzemplyar-uk-nts.html?p=1027553&viewfull=1#post1027553) "скомпилировал" MUZ.MAC
! Apxивный paздeл ЖД ! ЛAТ
M У З Ы К A Л Ь Н Ы Й M A Г A З И Н
=====================================
Н A Б O P M E Л O Д И Й
-------------------------
1 - MEЛOДИЯ 1 ( M1 )E
2 - MEЛOДИЯ 2 ( M2 )
3 - MEЛOДИЯ 3 ( M3 )
4 - MEЛOДИЯ 4 ( M4 )
5 - MEЛOДИЯ 5 ( M5 )
6 - MEЛOДИЯ 6 ( M6 )
7 - MEЛOДИЯ 7 ( M7 )
8 - MEЛOДИЯ 8 ( M8 )
9 - MEЛOДИЯ 9 ( M9 )
0 - BЫXOД
! Apxивный paздeл ЖД !
ПРОГРАММА успешно запустилась, ищет - хочет в качестве мелодий
Mn.TXT пронумерованные файлы. Подсовывал ей M1.TXT для теста,
содеращего мелодию из MUZRED.SAV - сплошной гул стандартным
звуком на выходе, прервать и выйти в монитор только через
стоп>0>исп получилось. Шпоры-описания к ней нет увы, как понять
что она хочет в качестве нот ???
как понять что она хочет
Посмотреть
MUZ.MAC
Там всё есть
Там всё есть
это домысел или факт?
я не настолько сильно рюхаю макроассемблер, сопроводите ваш комментарий файлом с нужными входными?или подробнее опишите распишите октаву?
это домысел или факт?
Если это программа для проигрывания файлов, очевидно, что там есть разборщик файлов и проигрыватель нот.
Вы спросили:
как понять что она хочет в качестве нот ???
я ответил - при наличии исходника (да ещё и такого мелкого) - проблем в этом нет
там есть разборщик файлов и проигрыватель нот.
там и коментарии есть о входящем формате я ничего не увидел кроме заранее прописанных имён файлов,
как я понял там что с таймером связано, а сама программа кидается в ОЗУ ПП
; *********************************************
; * *
; * М У З Ы К А Л Ь Н Ы Й М А Г А З И Н *
; * *
; *********************************************
; L9 = 0
MUZ:: .MCALL .EXIT,.LOOKUP,.READW,.CLOSE
; К О Н С Т А Н Т Ы
; =================
N = 40 ;- начало координат
.IF DF,L9
RSK2PR = 177510
RDK2PR = 177512
RSK2PD = 177514
RDK2PD = 177516
RSK3PD = 176554
RDK3PD = 176556
.IFF
RSK2PR = 176660
RDK2PR = 176662
RSK2PD = 176664
RDK2PD = 176666
RSK3PD = 176674
RDK3PD = 176676
.ENDC
; И Н И Ц И А Л И З А Ц И Я
; =========================
MINMUZ: CLR @#177560
; М О Н И Т О Р
; =============
MONMUZ: JSR R5,PCS ;- заголовок
TZAG
JSR R5,PMENU ;- главное меню
TGMENU,SCGM
BNE PMUZ ;- на чтение файла
WYH: JSR R5,PCS
TWMUZ
MOV #100,@#177560
.EXIT ;- выход в систему
PMUZ: JSR PC,PCTF ;- прочитать файл
BEQ MONMUZ
JSR PC,PWMEL ;- выполнить мелодию
BR MONMUZ
; ЧТЕНИЕ ФАЙЛА
; ------------
PCTF: MOV @#SCGM,R0
ASL R0
ASL R0
MOV TABR50(R0),@#SPF+2 ;- установка спецификации файла
MOV TABR50+2(R0),@#SPF+4
.LOOKUP #BUFEMT,#10,#SPF ;- открыть файл
BCS PCOSH
TST R0
BEQ PCOSH
MOV R0,R1
MUL #256.,R1
.READW #BUFEMT,#10,#BUFT,R1,#0 ;- прочитать файл
BCS PCOSH
MOV R0,@#DLF
ASL @#DLF ;- длина файла
MOV R0,R1
PSBK: .CLOSE #10 ;- закрыть файл
TST R1
RTS PC
PCOSH: JSR R5,PCS
TOSH
JSR PC,PRK
CLR R1
BR PSBK
TABR50: .RAD50 /M1 /
.RAD50 /M2 /
.RAD50 /M3 /
.RAD50 /M4 /
.RAD50 /M5 /
.RAD50 /M6 /
.RAD50 /M7 /
.RAD50 /M8 /
.RAD50 /M9 /
SPF: .RAD50 /DK M1 TXT/ ;- спецификация файла
BUFEMT: .BLKW 5
; ВЫПОЛНИТЬ МЕЛОДИЮ
; =================
PWMEL: JSR PC,PPRMEL ;- преобразовать мелодию
MOV #40000,APRPP ;- адрес программы в ПП
MOV #MUZPP,APRCP ;- адрес программы в ЦП
MOV #KMUZPP-MUZPP/2,DLPR ;- длина программы
JSR PC,PZPPP ;- запись программы в ПП и запуск
JSR PC,PIMEL ;- исполнить мелодию
RTS PC
; ПРЕОБРАЗОВАТЬ МЕЛОДИЮ
; ---------------------
PPRMEL: MOV #BUFT,R1 ;- просмотр шапки
1$: CMPB (R1)+,#'/
BNE 1$
CLRB -1(R1)
JSR R5,PCS ;- печать шапки
BUFTK
MOV #BUFT,R2 ;- буфер счетчиков
2$: JSR PC,PCT10C
MOV R3,(R2)+
BNE 2$
CLR (R2)+
RTS PC
; ИСПОЛНИТЬ МЕЛОДИЮ
; -----------------
PIMEL: MOV @#100,-(SP)
MOV #POPT,@#100
TST @#RDK2PR ;- сброс канала
1$: SOB R0,1$
;2$: SOB R0,2$
M0:
4$: MOV #BUFT,R2 ;- буфер счетчиков
2$: TSTB @#RSK2PD
BPL 2$
MOVB (R2)+,@#RDK2PD ;- младший байт частоты
1$: TSTB @#RSK2PD
BPL 1$
MOVB (R2)+,@#RDK2PD ;- старший байт частоты
MOV (R2)+,@#SCT ;- длительность
BEQ 4$
3$: TST @#SCT
BNE 3$
TSTB @#RSK2PR ;- прерывание с клавиатуры?
BPL 2$ ;- нет.
TST @#RDK2PR
KIMEL: MOV (SP)+,@#100
RTS PC
; ПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЙ ТАЙМЕРА
; --------------------------------------
POPT: DEC @#SCT
RTI
; ЗАГРУЗКА ПРОГРАММЫ В ПП И ЗАПУСК
; --------------------------------
PZPPP: MOVB #20,KOM
JSR PC,PDABP ; запись программы в ПП
1$: MOVB #30,KOM
JSR PC,PDABP ; запуск программы в ПП
RTS PC
; ПЕРЕДАЧА АДРЕСА БЛОКА ПАРАМЕТРОВ
; --------------------------------
PDABP: MOV #ABLPAR,R1
MOV #4,R2
1$: TSTB @#RSK3PD ; передача байта в канал
BPL 1$
MOVB (R1)+,@#RDK3PD
SOB R2,1$
2$: TSTB @#RSK3PD ; ожидание готовности
BPL 2$
RTS PC
ABLPAR: BLPAR,177777 ;- адрес блока параметров
; БЛОК ПАРАМЕТРОВ
; ---------------
BLPAR: .BYTE 0 ;- ответ
KOM: .BYTE 20 ;- команда
TIPU: .WORD 32 ;- ОЗУ
APRPP: .WORD 40000 ;- адрес программы в ПП
APRCP: .WORD MUZPP ;- адрес программы в ЦП
DLPR: .WORD KMUZPP-MUZPP/2 ;- длина программы
; ПРОГРАММА НА ПП
; ===============
WPKL = 300 ;- вектор клавиатуры
WPK2 = 330
MUZPP: CLR @#177130 ;- сброс диска
MOV #401,@#177054 ;- включить таймер ЦП и выключить таймер ПП
MOV @#WPKL,-(SP) ;- установка векторов
MOV @#WPK2,-(SP)
MOV #<POPKL-MUZPP>+40000,@#WPKL
MOV #<POPK2-MUZPP>+40000,@#WPK2
TST @#RDK2PP ;- сброс канала
4$: MOV #100200,@#177716 ;- генерация звука
MOV CZW,R0
BEQ 1$
2$: SOB R0,2$
MOV #100000,@#177716
MOV CZW,R0
3$: SOB R0,3$
BR 4$
1$: MOV (SP)+,@#WPK2
MOV (SP)+,@#WPKL
MOV #1,@#177054
RTS PC
; ОБРАБОТКА ПРЕРЫВАНИЙ КЛАВИАТУРЫ
; -------------------------------
POPKL: CLR CZW
TST @#177702
MOV #100,@#177072 ;- код завершения на ЦП
RTI
; ОБРАБОТКА ПРЕРЫВАНИЙ КАНАЛА 2
; -----------------------------
RDK2PP = 177062
POPK2: BIT #1,ICZW
BNE 1$
MOVB @#RDK2PP,CZW
INC ICZW
RTI
1$: MOVB @#RDK2PP,CZW+1
INC ICZW
RTI
CZW: .WORD 177777
ICZW: .WORD 0
KMUZPP:
; БИБЛИОТЕКА ПРОЦЕДУР
; ===================
; ПРИЕМ КОДА
; ----------
PRK: TSTB @#177560
BPL PRK
MOV @#177562,R0
RTS PC
; ПЕЧАТЬ КОДА
; -----------
PCK: TSTB @#177564
BPL PCK
MOV R0,@#177566
RTS PC
; ПЕЧАТЬ СЛОВА
; ------------
PCS: MOV (R5)+,R0
PCSR:
1$: TSTB @#177564
BPL 1$
MOVB (R0)+,@#177566
BNE 1$
RTS R5
; НОВАЯ СТРОКА
; ------------
PCNS: JSR R5,PCS
TWKPS
RTS PC
; ЧТЕНИЕ 8-РИЧНОГО ЧИСЛА
; ----------------------
; Вход: R1 - текущий адрес
; Выход: R3 - слово
PCT8C: CLR R3
1$: MOVB (R1)+,R0 ;- поиск первой цифры
BEQ KCT8C
CMP R0,#60
BLO 1$
CMP R0,#67
BHI 1$
2$: BIC #177770,R0 ;- запись триады в R0
ASL R3
ASL R3
ASL R3
BIS R0,R3
MOVB (R1)+,R0 ;- чтение следующей цифры
CMP R0,#60
BLO KCT8C
CMP R0,#67
BHI KCT8C
BR 2$
KCT8C: DEC R1
RTS PC
; ЧТЕНИЕ 10-ТИЧНОГО ЧИСЛА
; -----------------------
; Вход: R1 - текущий адрес
; Выход: R3 - слово
PCT10C: CLR R3
1$: MOVB (R1)+,R0 ;- поиск первой цифры
BEQ KCT8C
CMP R0,#60
BLO 1$
CMP R0,#71
BHI 1$
2$: BIC #177760,R0 ;- запись триады в R0
MUL #10.,R3
ADD R0,R3
MOVB (R1)+,R0 ;- чтение следующей цифры
CMP R0,#60
BLO KCT8C
CMP R0,#71
BHI KCT8C
BR 2$
KCT10C: DEC R1
RTS PC
; ВЫБОР МЕНЮ
; ==========
; Вход: (R5) - текст меню
; - указатель меню
; Выход: SCM - указатель меню
; R0 - код выхода
PMENU:
PMENU0: MOV (R5)+,R1 ;- текст меню
MOVB (R1)+,R2 ;- счeтчик меню
MOV R2,R4 ;- верхняя граница меню
CLR R3 ;- текущий указатель меню
MOV #16,R0 ;- РУС
JSR PC,PCK
3$: CMP R3,@(R5)
BNE 1$
JSR R5,PCS ;- включить инверсию
TWINW
1$: MOV R1,R0 ;- напечатать строку
JSR R5,PCSR
MOV R0,R1
CMP R3,@(R5)
BNE 2$
JSR R5,PCS ;- отключить инверсию
TOINW
2$: INC R3 ;- текущий счетчик
SOB R2,3$
MOV #17,R0 ;- ЛАТ
JSR PC,PCK
5$: JSR PC,PRK ;- принять код
CMP R0,#60 ;- цифра?
BLO 4$ ;- нет.
SUB #60,R0
BNE 11$
MOV R4,R0
11$: DEC R0
CMP R0,R4 ;- проверка на верхнюю границу
BHIS 5$
MOV R0,@(R5) ;- новая активная позиция
10$: TST -(R5) ;- на печать меню
BR PMENU0
4$: CMP R0,#15 ;- ввод?
BEQ KMENU ;- да.
; CMP R0,#40 ;- пробел?
; BEQ KMENU ;- да.
CMP R0,#33 ;- АР2?
BNE 5$ ;- нет.
JSR PC,PRK
CMP R0,#101 ;- стрелка вверх?
BNE 7$ ;- нет.
8$: DEC @(R5)
BPL 10$
MOV R4,@(R5)
BR 8$
7$: CMP R0,#104 ;- стрелка влево?
BEQ 8$
CMP R0,#102 ;- стрелка вниз?
BEQ 6$ ;- да.
CMP R0,#103 ;- стрелка вправо?
BNE 5$ ;- нет.
6$: INC @(R5)
CMP @(R5),R4
BNE 10$
CLR @(R5)
BR 10$
KMENU: DEC R4
CMP @(R5)+,R4 ;- выход из меню
RTS R5
; Т Е К С Т Ы
; ===========
TZAG: .ASCII <14><33><41><33><100><16>
.ASCII <33><131><N+1><N+20.>
.ASCII /М У З Ы К А Л Ь Н Ы Й М А Г А З И Н/
.ASCII <33><131><N+2><N+20.>
.ASCII /=====================================/
.ASCII <33><131><N+6><N+26.>
.ASCII /Н А Б О Р М Е Л О Д И Й/
.ASCII <33><131><N+7><N+26.>
.ASCIZ /-------------------------/
TGMENU: .ASCII <10.>
.ASCIZ <33><131><N+09.><N+29.>/1 - МЕЛОДИЯ 1 ( М1 )/
.ASCIZ <33><131><N+10.><N+29.>/2 - МЕЛОДИЯ 2 ( М2 )/
.ASCIZ <33><131><N+11.><N+29.>/3 - МЕЛОДИЯ 3 ( М3 )/
.ASCIZ <33><131><N+12.><N+29.>/4 - МЕЛОДИЯ 4 ( М4 )/
.ASCIZ <33><131><N+13.><N+29.>/5 - МЕЛОДИЯ 5 ( М5 )/
.ASCIZ <33><131><N+14.><N+29.>/6 - МЕЛОДИЯ 6 ( М6 )/
.ASCIZ <33><131><N+15.><N+29.>/7 - МЕЛОДИЯ 7 ( М7 )/
.ASCIZ <33><131><N+16.><N+29.>/8 - МЕЛОДИЯ 8 ( М8 )/
.ASCIZ <33><131><N+17.><N+29.>/9 - МЕЛОДИЯ 9 ( М9 )/
.ASCIZ <33><131><N+19.><N+29.>/0 - ВЫХОД /<33><131><50><75>
TMENUR: .ASCII <2.>
.ASCIZ <33><131><N+23.><N+4.>/ ПУСК /
.ASCIZ <33><131><N+23.><N+12.>/ ВЫХОД /<33><131><N+23.><N>
;.IF DF,L9
TWINW: .ASCIZ <33><145> ;- включить инверсию
TOINW: .ASCIZ <33><177><145> ;- отключить инверсию
;.IFF
;TWINW: .ASCIZ <33><243> ;- включить инверсию
;TOINW: .ASCIZ <33><277><243> ;- отключить инверсию
;.ENDC
TSBRE: .ASCIZ <14><33><41><33><100> ;- сброс экрана
TZB: .ASCIZ <32><40><32> ;- забой
TNE: .ASCIZ <33><110> ;- начало экрана
TSTPS: .ASCIZ <33><113> ;- стирание последней строки
TWKPS: .ASCIZ <15><12> ;- новая строка
TOSH: .ASCII <33><131><N+22.><N+22.><7><16>
.ASCIZ /*** Файл на диске не обнаружен *** /<17>
TKPCC: .ASCIZ <15><33><101>
TWMUZ: .ASCIZ <14><33><41><33><100><17> ;- выход из программы
.EVEN
SCGM: .WORD 0 ;- счетчик главного меню
SCMR: .WORD 0 ;- счетчик меню режимов
ANTS: .WORD 0 ;- адрес начала теста
DLF: .WORD 0 ;- длина файла
SCT: .WORD 0 ;- счетчик таймера
.WORD 111111
BUFTK: .ASCII <33><131><N+22.><N> ;- коортинаты шапки
BUFT: ;- буфер для текста
.END MUZ
там и коментарии
Там самое главное есть - команды и системные макровызовы. Остальное дело техники.
randomizer
14.10.2019, 16:30
Любопытно существует для PDP-11 реализация какого нибудь быстрого и компактного декомпрессора?
Хочется загружать заранее сжатые данные в битпланы и быстро их оттуда вытаскивать в последствии.
Судя по всему LZ4 (https://lz4.github.io/lz4/) то что нужно. Но реализацию на ассемблере и 16-битного проца я нашел только для 8086/8088
Любопытно существует для PDP-11 реализация какого нибудь быстрого и компактного декомпрессора?
Хочется загружать заранее сжатые данные в битпланы и быстро их оттуда вытаскивать в последствии.
Судя по всему LZ4 (https://lz4.github.io/lz4/) то что нужно. Но реализацию на ассемблере и 16-битного проца я нашел только для 8086/8088
Я могу вам дать и декомпрессор на PDP-11 коде и компрессор к нему на C/C++ -- см. https://github.com/nzeemin/ukncbtl-utils/tree/master/Sav2Cartridge
там реализован и простой RLE, и LZSS (из кода by Ostapenko Alexey).
- - - Updated - - -
Bonus track: вот тут troosh делал LZ4 в ту же утилиту, но вроде как не доделано - https://github.com/troosh/ukncbtl-utils/commits/master
Любопытно существует для PDP-11 реализация какого нибудь быстрого и компактного декомпрессора?
Хочется загружать заранее сжатые данные в битпланы и быстро их оттуда вытаскивать в последствии.
Судя по всему LZ4 (https://lz4.github.io/lz4/) то что нужно. Но реализацию на ассемблере и 16-битного проца я нашел только для 8086/8088
Кроме выложенного почти год назад распаковщика минимального размера, также сегодня выложил более быстрые варианты за счет unroll циклов.
Впрочем подготовка для раскрученного цикла не бесплатна (подготовка адреса для прыжка внутрь цикла и коррекция счётчика цикла), поэтому могут быть данные на которых выиграша в скорости не будет (как бы вообще не замедлилось). Так что лучше померить скорость разных вариантов. Возможно для разных данных стоит использовать разные версии распаковщика, тоесть в коде программы иметь все версии сразу.
Всё тут: https://github.com/troosh/ukncbtl-utils/tree/master/Sav2Cartridge/sandbox
UNLZ4.MAC - компактный вариант
UNLZ43.MAC - оба цикла раскручены
UNLZ42.MAC - только цикл копирования раскручен
UNLZ41.MAC - только цикл литералов раскручен
Дальнейшее ускорение возможно за счёт копирования слов, а не байт... Но это снова рост размера распаковщика и риск получить код который не заработает, например, на ВМ3.
randomizer
16.10.2019, 15:36
Дальнейшее ускорение возможно за счёт копирования слов, а не байт... Но это снова рост размера распаковщика и риск получить код который не заработает, например, на ВМ3.
Почему размер распаковщика дожен вырасти?
На первый взгляд, если заменить
4$:
.rept 16.
MOVB (R1)+, (R5)+ ; Копируем строку из
.endr
SOB R2, 4$ ; уже распакованных данных
на
4$:
.rept 8.
MOV (R1)+, (R5)+ ; Копируем строку из
.endr
SOB R2, 4$ ; уже распакованных данных
то размер кода только уменьшится.
Почему размер распаковщика дожен вырасти?
На первый взгляд, если заменить
...
то размер кода только уменьшится.
Оригинальный формат LZ4 подразумевает возможность копирования с точностью до байта. И вот как тогда скопировать, допустим, 7 байт в предлагаемой новой версии кода? Что будет, если адреса на входе такого цикла будут невыровненные по границе слова?
риск получить код который не заработает, например, на ВМ3.
Эт почему?
Вероятно, потому, что ВМ3 делает Trap to 4 при попытке словной записи по нечетному адресу. В отличие от ВМ1/2 и LSI-11, включая наши ее клоны (Э-60). Правда, и LSI-11, и ВМ1/2 пишут таки по четному адресу, игнорируя этот младший адресный бит (А0), он анализируется только при байтовой записи, блокируя запись в невыбранный байт памяти. LSI-11 при этом (при байтовой записи) выставляет записываемый байт в оба байта шины, а адресный бит рулит тем, какой из них запишется, это заявлено в моей любимой книжке про ЦП М2 (3.858.382 ТО), а как там оно у ВМ1 и ВМ2 - не знаю. Но, по-любому, ломиться с нечетным адресом в программу со словной записью неправильно.
Вероятно, потому, что ВМ3 делает Trap to 4 при попытке словной записи по нечетному адресу.
Это я знаю. Так же как и то, что за такое в программе бить канделябром стоит.
Но я подумал, что может что то ещё...
randomizer, troosh, в соседнем разделе форума подвезли реализацию LZSA1 для БК - https://zx-pk.ru/threads/11381-napisanie-programm-dlya-bk0010.html?p=1030619&viewfull=1#post1030619
Исходник: https://gitlab.com/ivagor/lzsa8080/blob/master/PDP11/LZSA1/lzsa1.asm
Запаковщик тут: https://github.com/emmanuel-marty/lzsa
Решил с распаковщиками для PDP-11 переехать сюда, т.к. здесь подобные вопросы уже обсуждались.
Выложил (https://gitlab.com/ivagor/lzsa8080/tree/master/PDP11) распаковщик LZSA2 (и обновил LZSA1). Он толще и медленнее LZSA1, зато сжатие заметно лучше. Ну и оптимизировать скорее всего можно.
- - - Добавлено - - -
Хотя надо отметить, что команды ВМ2 в распаковщиках я не использовал (ASH вроде подойдет), может мне и не стоило переезжать из темы БК.
ivagor, а вы FCU архиватор под RT-11 щупали в плане сжатия весьма не плох.
http://archive.pdp-11.org.ru/ukdwk_archive/ukncbtlwebcomplekt/Other/FCU_PLUSPLUS/
http://archive.pdp-11.org.ru/ukdwk_archive/ukncbtlwebcomplekt/Other/FCU_Shurick_inc/
FCU я не пробовал, но по описанию там LZ+Хаффман, т.е. должен сжимать на уровне zip. LZSA слабее, там LZ, но распаковщики наверняка более быстрые.
но распаковщики наверняка более быстрые.
не проверял, а вот пакует большие файлы под осью быстрее и компактнее - это факт.
- - - Добавлено - - -
единственный минус "не универсальный" от LZA архивы не кушает, а так вообще был бы единственным современным архиватором под RT-11, автор насколько известно - Украинский программист.
Минус FCU для нас сейчас в том что сишного запаковщика/распаковщика нет. Теперь только если реверсить из MACRO-11 кода.
В архиве FCU_PLUSPLUS есть AEUK.SAV и LEUK.SAV, которые согласно описанию распаковывают ARJ и LHA. Если это действительно так, то по крайней мере для LHA есть исходники упаковщика (http://gnuwin32.sourceforge.net/packages/lha.htm). Для ARJ наверняка тоже есть, просто я не искал. Все LZ+Хаффман (arj, lha, zip и, скорее всего, fcu) примерно одинаковые по степени сжатия и сложности распаковщика. Т.е. все они сложнее и медленнее LZSA, их распаковщик больше по размеру и они требуют место под таблицу.
Победить их по степени сжатия сможет LZMA, например shrinkler, на для его нормального использования нужно быстрое умножение.
shrinkler, на для его нормального использования нужно быстрое умножение.
Умножение (требуется беззнаковое!), да полезно...Но это только одна проблема, - там регистров рабочих в алгоритме распаковке в два раза больше, чем есть у pdp11, а значит нужно их спиливать в стек, либо использовать модификацию кода. Плюс необходимость памяти под контекст (~3 Кбайт).
Я бы разделил вопросы скорости и принципиальной реализуемости. Ключевой момент для скорости - быстрое умножение. Много регистров, конечно, тоже нужно, но раз получилось сделать даже для 8080, то для PDP11 получится (если задаться целью) не хуже. Но версии для 8080 (да и для z80) очень медленные. Для R800 и 8088/86 работают почти приемлемо.
Необходимость выделения 2.5 Кб под таблицы не добавляет привлекательности shrinklerу, но тут все зависит от задач.
Насчет самомодификации. В LZSA2 можно на слово сократить, если хранить повторно используемое смещение в самой команде, но я пока не стал так делать.
Сократил распаковщик LZSA2 на 20 байт и немного ускорил, LZSA1 сократил на 2 байта.
Ребят, мне бы для тестирования кросс-линковщика получить от вас что-нибудь на Фортране и Паскале - можно просто в форме набора .OBJ-файлов + команда для LINK, исходники НЕ нужны. В общем, ищу сложные случаи линковки.
В общем, ищу сложные случаи линковки.
в архиве два файла (http://archive.pdp-11.org.ru/vid/DWKQOBJ.rar) - программа и библиотека от нужной версии Паскаля,
на выходе после LIN DWKQCO, PASDWK, полученный SAV - выводит символьную
эмблему название инициативной группы (участником которой ты так же являешься,
ув. Никита), подойдёт?
в архиве два файла (http://archive.pdp-11.org.ru/vid/DWKQOBJ.rar) - программа и библиотека от нужной версии Паскаля,
на выходе после LIN DWKQCO, PASDWK, полученный SAV - выводит символьную
эмблему название инициативной группы (участником которой ты так же являешься,
ув. Никита), подойдёт?
Спасибо, этот линкуется.
Нужны ещё примеры, чем больше разнообразных модулей тем лучше.
Неважно что делает, неважно что внутри - я не буду их даже запускать, я проверяю что результат моего линковщика 1-в-1 совпадает с RT-11 LINK.
я проверяю что результат моего линковщика 1-в-1 совпадает с RT-11 LINK.
у меня предложение прогони тесты из поставки Фортрана77, системы Грей, что то на форуме было под библиотеку от form'а RSXLIB.OBJ - у меня вот так нахрапом ничего "многобиблиотечного" нет.
Вот другой участник ИГ оформит библиотеки и редактор для работы со спрайтами в Паскале для УК-НЦ - будут )
hobot, можно конкретную ссылку на диск? и желательно командники для сборки.
hobot, можно конкретную ссылку на диск? и желательно командники для сборки. к сложным вариантам можно отнести
ПРОГРАММА PRUN
Программа PRUN предназначена для запуска кода на периферийном процессоре.
УКНЦ. Для работы достаточно скопировать файл PRUN.SAV на SY:, написать
программу (код не обязательно делать позиционно-незвисимым), скомпилить
и собрать в виде перемещаемой программы (.REL) командой LINK/FOREGROUND.
Для выхода из ПП программы можно использовать команду RETURN (при этом
область памяти, выделенная под программу, останется зантой или передать
управление подпрограмме освобождения памяти по адресу 176300:
MOV #начальныйадрес,R1
JMP @#176300
Приведенный ниже пример печатает "Хочу пива !!!" в центре нижней служебной
строки и выходит, освобождая занятую память.
Сборка и запуск программы:
.MAC PPTEST
.LIN/FO PPTEST
.PRUN PPTEST
.TITLE PPTEST -- ТЕСТ ПРОГРАМИРОВАНИЯ ПП
.IDENT /V01.00/
START: MOV #TEXT+1,R0 ;КОНВЕРТИРУЕМ СТРОКУ ТЕКСТА
10$: TSTB @R0 ; В РУССКИЙ ЯЗЫК
BEQ 20$ ;
CMPB #'@,(R0)+ ;
BHI 10$ ;
BISB #200,-1(R0) ;
BR 10$ ;
20$: EMT 56 ;ПЕЧАТАЕМ СТРОКУ В НИЖНЕЙ
.WORD TEXT ; СЛУЖЕБНОЙ СТРОКЕ
MOV #START,R1 ;ОСВОБОЖДАЕМ ПАМЯТЬ И ВЫХОДИМ
JMP @#176300 ;
TEXT: .ASCIZ <14.>/hO^U PIWA!!!/ ;ТЕКСТ ДЛЯ СЛУЖЕБНОЙ СТРОКИ
.END START
К сложным вариантам можно отнести программы с перекрытиями (резидентными на диске и в памяти) и виртуальные массивы FORTRAN
derfliegenddehollander
10.11.2019, 10:21
Может кто может помочь с этим вопросом?
Кое какие книги скачал, но пока ни чего не понятно. Где взять образы дисков с тем же ассемблером или с "С".
Как вообще чего делать??
В общем прошу помощи...!
Есть ASM от господина Морозова пишем под виндой компилируем проверяем н эмуляторе и потом грузим на живую УКНЦ и будет Вам шастие!
Я такое проделывал на БК - в целом одно и тоже!
Есть ASM от господина Морозова пишем под виндой компилируем проверяем н эмуляторе и потом грузим на живую УКНЦ и будет Вам шастие!
Я такое проделывал на БК - в целом одно и тоже!
Ну если уж отвечать на сообщение 8-летней давности, так хоть ссылки давать.
Видимо вот этот ассемблер имеется в виду - https://github.com/alemorf/pdp11asm - за него ничего не скажу. не использовал.
Под УКНЦ работает родная RT-11, так что мне кажется более естественным и надёжным использовать родные MACRO и LINK, которые можно запускать через RT-11 Simulator от Patron - см. http://emulator.pdp-11.org.ru/RT-11/distr/ и https://zx-pk.ru/threads/24755-emulyator-rt-11.html
Собственно для своих проектов я так и делаю.
Кроме того, есть кросс-ассемблер macro11 от Richard Krehbiel - например тут: https://github.com/shattered/macro11
И ещё до кучи я дописываю кросс-линкер - см. https://github.com/nzeemin/pclink11 и https://zx-pk.ru/threads/30666-pclink11-kross-linkovshchik.html
randomizer
10.11.2019, 23:31
Кроме того, есть кросс-ассемблер macro11 от Richard Krehbiel - например тут: https://github.com/shattered/macro11
Любопытно распознает ли он символы длинной более 6? Не могу себе представить большой проект без человекочитаемых символов.
Именно из-за этого ограничения я стал использовать GNU Assembler несмотря на некоторые неудобства. (А из замеченных недостатков, он не проверят что переход по инструкции BR не вышел за предел 64-х слов)
Любопытно распознает ли он символы длинной более 6?
Распознавать он может и распознает, но проблема в том, что если использовать стандартный LINK - всё равно упрёмся в шесть символом. Стандартный формат OBJ таков. Так что для полной поддержки нужен и транслятор и линкер. При этом трансляторы, которые были написаны в те времена - они практически все (если не все) использовали стандартный OBJ, со всеми вытекающими...
есть кросс-ассемблер macro11 от Richard Krehbiel - например тут: https://github.com/shattered/macro11
Форкнут. живет и поддерживается тут
https://github.com/simh/simtools/tree/master/crossassemblers/macro11
derfliegenddehollander
11.11.2019, 03:24
Ну если уж отвечать на сообщение 8-летней давности, так хоть ссылки давать.
Видимо вот этот ассемблер имеется в виду - https://github.com/alemorf/pdp11asm - за него ничего не скажу. не использовал.
Под УКНЦ работает родная RT-11, так что мне кажется более естественным и надёжным использовать родные MACRO и LINK, которые можно запускать через RT-11 Simulator от Patron - см. http://emulator.pdp-11.org.ru/RT-11/distr/ и https://zx-pk.ru/threads/24755-emulyator-rt-11.html
Собственно для своих проектов я так и делаю.
Кроме того, есть кросс-ассемблер macro11 от Richard Krehbiel - например тут: https://github.com/shattered/macro11
И ещё до кучи я дописываю кросс-линкер - см. https://github.com/nzeemin/pclink11 и https://zx-pk.ru/threads/30666-pclink11-kross-linkovshchik.html
Хорошо! Понял, в следующий раз так и буду делать! Спасибо Вам за информацию!
Не могу себе представить большой проект без человекочитаемых символовСоветую заглянуть в исходники RT-11. Берем бонусный дистрибутив, и смотрим...
есть какой-то способ - "обнулить всю память за одну команду". Может кто знает ? (помню, что работает не на всех реализациях PDP-11)
За одну не получится. Но если подготовить регистры, то можно
есть какой-то способ - "обнулить всю память за одну команду". Может кто знает ? (помню, что работает не на всех реализациях PDP-11)
Не совсем за одну.
Есть способ обнулить память и чисто остановиться (речь разумеется идет о ситуации когда управление памятью выключено). Выглядит это так:
MOV #160000,SP
MOV #4747,@#0
CLR PC
Результатом будет непрерывное выполнение команды CALL -(PC) по адресу 0, что вызовет последовательную запись нулей вниз, начиная с адреса 157776. Конечным итгогом будет запись 0 - команды HALT - по адресу 0 и выполнение ее.
Стоит отметить, что способ не сработает на процессорах с защитой стека - там раньше произойдет прерывание по границе стека.
Есть еще вариант - команда MOV -(PC),-(PC) которая копирует сама себя вниз по памяти, но тут завершение не будет чистым :)
да, наверное, это именно то. Не совсем в одну команду - сначала в стек заносится, наверное, конец памяти. Но потом (точно помню - одна команда).
Думаю в Вашем варианте - одна лишняя. А на каких именно машинах работало, а на каких - нет не помню. Даже пробовали типы процессоров таким "тестом" определять. Вроде - порядок выполнения (очередность действий "внутри" команды) у разных процессоров разная.
- - - Добавлено - - -
одна лишняя
лишняя команда, наверное - HALT, в пульт можно и вручную переключить (и убедиться, что память обнулилась). Чем завершалось(каким событием) - не помню.
порядок выполнения (очередность действий "внутри" команды) у разных процессоров разная.
Машины были скорее всего : 100/25; 11/34; разные Воронежские на 1811(F-11); разные на J-11 и 1831; МС1201.01-02; самодельные на 1807ВМ1(T-11).
Можно и сейчас попробовать запускать на разных, но сначала интересно сократить "программку" именно до одной команды.
А на каких именно машинах работало, а на каких - нет не помню.То, то! Просто в R6 заносишь 160000, по нулевому адресу пишешь 4747 и пускаешь машинку с нулевого адреса.
А на каких именно машинах работало, а на каких - нет не помню.Работало на всех машинках без ДП. В частности, я это делал на Э-60 с процессором М2, на ДВК с 1801ВМ1 и ВМ2. А вот на ВМ3 - облом, вылетает куда-то по прерыванию (Trap to 4 ? - Не помню) с 000400 (376? 374? Тоже не помню...) в R6. То есть, очищена память 400-157776, а 0-376 - нет.
одна лишняя
Ни одной лишней нету.
Разве что выставить регистры и содержимое ячейки 0 из пульта - тогда останется только сама одна команда :)
J-11
Вот на них как раз такой способ работать не будет - как только SP снизится ниже 400, возникнет прерывание по вектору 4.
ишняя команда, наверное HALT
...которой тут нету в принципе - она самогенерящаяся в конце :)
лишняя команда, наверное HALT - в пульт можно и вручную переключитьТак она сама собой организуется. Если смотреть на то, что предложил коллега form, лишние все команды, ибо действия на ДВК следующие
R6/xxxxxx 160000<Enter>
0/xxxxxx 4747<Enter>
0G
На УКНЦ действия примерно те же, только служебные кнопки другие. В частности, вместо G давят, вроде-бы, ИСП. Ну не помню я пультовой режим УКНЦ...
То, то! Просто в R6 заносишь 160000, по нулевому адресу пишешь 4747 и пускаешь машинку с нулевого адреса.
- вот это похоже.
Но если подготовить регистры
а это "другой вид спорта" - попробовать что-то сделать на машине у которой нет памяти - на одних регистрах.
у которой нет памяти - на одних регистрах.
К слову, прошивки KDJ11 процессоров вполне себе справляются с работой без использования памяти, активно используя при том вызовы подпрограмм и прерывания :)
J-11 - Вот на них как раз такой способ работать не будет - как только SP снизится ниже 400, возникнет прерывание по вектору 4. с J-11 - понятно с М2 и 1201.01-02 - тоже.
на каких еще из перечисленных мной будет работать на каких нет ?
Вроде разбирались тогда и пришли к выводу, что порядок выполнения команд у разных процессоров - разный (что-то в процессе выполнения команды выполняется в разной очередности - сначала делается одно, потом другое - при одинаковом результате в итоге и в данном случае препятствует выполнению (обнулению памяти). Запустили бы на разных машинах (у кого какие есть) да и в разных эмуляторах при разных конфигах и сообщили бы о результате.
на каких еще из перечисленных мной будет работать на каких нет ?
В советских не особо силен. У ВМ3 есть ненастраиваемое YSA прерывание.
Насчет Э100/25 не уверен, но либо в нем, либо в СМ1420 - в том что 22-битный - есть регистр SL (177774) в котором выставляется ограничение стека (скорее всего все-таки в СМ1420).
- - - Добавлено - - -
порядок выполнения команд у разных процессоров - разный
У разных процессоров разное поведение. В DECовском описании J11 в конце есть таблица различий. Опираясь на эти различия и прочие обвески DECовская программа автоконфигурации определяет тип процессора.
Многие подобные команды при компиляции выдают ошибку Z чтобы показать что они неоднозначны. Например JMP (R0)+, MOV R0,(R0)+ итд.
В каком-то драйвере для УК-НЦ видел MOV PC,LABEL - это тоже неоднозначная команда, и ее спасает только, что драйвер кроме как на УКНЦ нигде не работает :)
Просто в R6 заносишь 160000, по нулевому адресу пишешь 4747
Но если подготовить регистры, то можно
Как я и говорил - чисто за одно команду не получится.
Если же вспомнить СМ-4 с памятью с контролем чётности, где нам было по барабану - что прописано, главное, что бы прописалось - то мы записывали в 157776 код 14747 и пускали с адреса 157776. Результат - все контрольные биты в памяти были проинициализированы.
замораживаться должен регистр текущего значения (который 0177714).
=== ребята, у меня такой вопрос, как мне содержимое оттуда получить в переменную
в простой программе на Паскале для функции Random ? иначе при первом запуске всегда
одинаковое расположение псевдослучайных элементов ?
Загадайте число, быть может оно пригодится вам ТАМ... (с) Сталкер, или как его там...
Сколько лет Ваше Превосходительство рассчитывает находиться у власти? (с) Анчурия.
Оба числа используются для установки ГСЧ. Как в Сталкере - не знаю, а в Анчурии - банально: перед запуском игры делают
1630 FOR I=1 TO N
1640 LET G2=RND(N)
1650 NEXT I
Ну, там перед этим огранияивают это N до 200 или что-то в том же духе, но это мелочи. Заодно можно считерить - набирай то число, которое ты запомнил с прошлого удачного раза и будет тебе счастье!..
AFZ, готовой RND и RANDOMIZE для OMSI Pascal"я нет, как и модуля CRT (!)
Вопрос в том, неужели нет шансов использовать значение таймера?
Функция RND (ранее уже публиковал, это из школьных времён черновика)
FUNCTION RND: REAL;
VAR IRND: INTEGER;
BEGIN
/*$C
BR M1
RN: .WORD 435
M1: MOV RN, R1
MUL #12869, R1
ADD #6925, R1
MOV R1, RN
BIC #^O100000, R1
MOV R1, IRND(SP)
*/
RND:=IRND/32767;
END;
может через переменную типа REGISTER можно? по аналогии с RA и RD клавиатуры?
В тему разработки на MACRO-11, нашёл для себя вот такой приём.
Иногда бывает что нужно контролировать выход кода за некоторую границу - дальше идут данные с фиксированного адреса, т.е. их нельзя двигать.
Раньше я это делал вручную, иногда забывая и отлавливая глупые ошибки из-за этого.
Собственно нашёл вот такой вариант, с использованием директивы .IIF:
; до этого тут блок кода
.IIF GT <.-023340>, ERR023
.=023340
; дальше тут данные с фиксированного адреса
Получается что .IIF сработает, если текущий адрес станет больше заданного, тогда в код добавится строчка "ERR023", что приведёт к появлению неопределённой метки, и на линковке вы это увидите в сообщении об ошибке.
.IIF GT <.-023340>, .ERROR ; ERR023
вот такой приём.
В стандартной библиотеке RT-11 начиная с v5 есть хорошая макрокоманда .ASSUME для подобных целей.
Выглядит так:
.ASSUME . LE START+1000,MESSAGE=<;CODE TOO LARGE>
Есть еще интересная макрокоманда .BR addr, проверяющая, что в этом месте именно такой адрес получился.
BlaireCas
21.02.2020, 14:48
"Быстрый" рандомайзер. Это с вики. Линейный сдвиговый регистр.
.radix 16
LFSR00: .WORD 0ACE1
LFSR01: .WORD 0B400
RANDOM: mov R1, -(SP)
mov LFSR00, R0
mov LFSR01, R1
clc
ror R0
bcc 2$
xor R1, R0
2$: mov R0, LFSR00
mov (SP)+, R1
return
.radix 8
Рандом в R0. Он хуже прочих, но довольно быстр. Можно применить разные ухищрения чтобы получить более-менее рандомное число.
Так и делаем. Все равно будет циклично.
Oleg N. Cher
03.03.2020, 23:03
Вопрос по теме! Как работать из OMSI Pascal с бинарными файлами?
FILE OF CHAR читается через READ только до первого встреченного нуля.
Есть там ещё какие-то хитрые GET и PUT, но я не понял как они работают.
Предположительно: бинарные файлы побайтово читать нельзя, нужно только через буферы. Плоховасто. :-(
Как работать из OMSI Pascal с бинарными файлами?
Насколько мне помнится, должно проходить что то типа
TYPE BYTE =0..255; /* не помню все встроенные типы, если вдруг такого нет */
BINARY = FILE OF BYTE;
Дальше пример не из RT, а из RSX, но насколько мне помнится, в OMSI всё было очень похоже
С ходу программы, которая работала бы без буфера - не нашел. А с двоичными файлами и буфером:
PROGRAM SYSTEM_GENERATION;
CONST
BUFF_LAST = 377B;
(* NEXT CONSTANT - FROM FILE RTS.MAC,
( ALSO, MODULE PDP11 CONTAIN IT ) *)
INITIAL_START_ENTRY = 452B;
INITIAL_START_STACK_BOTTOM = 454B;
INITIAL_START_STACK_LIMIT = 456B;
LOADER_INFO = 460B;
TYPE
CARDINAL =0..65535;
FLAG_TYPE =(ENTRY_POINT_FLAG,
CODE_FLAG,
LINKER_TABLE_FLAG,
DEBUGGER_TABLE_FLAG,
OLD_LOAD_KEY_FLAG,
NEW_LOAD_KEY_FLAG,
FIRST_FREE_LOC_FLAG,
OLD_FIRST_FREE_LOC_FLAG,
MAX_FLAG);
FLAG_SET =SET OF FLAG_TYPE;
FILE_NAME =PACKED ARRAY [1..35] OF CHAR;
BLOCK =0..BUFF_LAST;
BIG_BUFFER=ARRAY [BLOCK] OF CARDINAL;
WORK =FILE OF BIG_BUFFER;
DOUBLE =ARRAY [0..1] OF CARDINAL;
VAR
FOUND : FLAG_SET;
FLAG : FLAG_TYPE;
WHERE,
WORD,
NBYTES,
I,
X : CARDINAL;
LOD_NAME,
RTS_NAME,
TSK_NAME : FILE_NAME;
LOD_FILE,
RTS_FILE,
TSK_FILE : WORK;
EOF_LOD_FILE : BOOLEAN;
CH : CHAR;
CHECK_SUM : CARDINAL;
BUFFER_R : BIG_BUFFER;
INDEX_R,
LIMIT_R : BLOCK;
SYSTEM_ENTRY_POINT_VALUE: CARDINAL;
SYSTEM_LOAD_KEY_VALUE : CARDINAL;
OLD_FREE_LOC : CARDINAL;
FIRST_FREE_LOC : CARDINAL;
BUFFER_W : BIG_BUFFER;
INDEX_W,
CURRENT_BLOCK,
LIMIT_W : CARDINAL;
LIMIT_RTS : CARDINAL;
RTS_BLOCK : CARDINAL;
EOF_RTS_FILE : BOOLEAN;
PROCEDURE EXITST(I: INTEGER ); EXTERNAL;
FUNCTION FLGTYP(WORD: CARDINAL): FLAG_TYPE; EXTERNAL;
PROCEDURE INIT_TTIO;
BEGIN
IF INPUT^ <> ' ' THEN
REPEAT
READ(CH)
UNTIL CH = ' ';
END (* INIT_TTIO *);
PROCEDURE HALT(I: CARDINAL);
BEGIN
CASE I OF
1: WRITELN('LOD INPUT FILE HAS WRONG FORMAT');
2: WRITELN('NO ENTRY POINT BLOCK FOUND ON LOD INPUT FILE');
3: WRITELN('NO NEW KEY BLOCK FOUND ON LOD INPUT FILE');
4: WRITELN('NO FIRST FREE LOC BLOCK FOUND ON LOD INPUT FILE');
5: WRITELN('SINTAX ERROR IN FILE NAME');
6: WRITELN('EOF REACHED ON LOD INPUT FILE');
7: WRITELN('CHECK. SUMM ERROR ON LOD INPUT FILE');
8: WRITELN('BOTH PARTS OF SYSTEM TRY TO OCCUPY SAME LOCATION');
9: WRITELN('EOF REACHED ON RTS INPUT FILE');
10: WRITELN('NO OLD FIRST FREE LOC BLOCK FOUND ON LOD INPUT FILE');
ELSE WRITELN('UNKNOWN ERROR')
END;
EXITST(4)
END (* HALT *);
PROCEDURE READ_FILE_NAME(VAR F_N: FILE_NAME;
VAR S : BOOLEAN;
VAR D : BOOLEAN );
VAR
I: INTEGER;
BEGIN
FOR I:=1 TO 35 DO F_N[I]:=CHR(0);
I:=0;
S:=FALSE;
D:=FALSE;
REPEAT
I:=I+1;
READ(F_N[I]);
IF F_N[I] = ' ' THEN BEGIN
IF EOLN AND (I=1) THEN D:=TRUE;
I:=I-1
END;
UNTIL EOLN OR EOF OR D OR (I>=34);
IF EOF THEN EXITST(0);
IF EOLN AND (I<=34) THEN S:=TRUE;
IF EOLN OR (I>=34) THEN READLN;
END (* READ_FILE_NAME *);
(*-------------------rabota s LOD-fajlom--------------------*)
PROCEDURE READ_SECTOR;
BEGIN
BUFFER_R:=LOD_FILE^;
GET(LOD_FILE);
INDEX_R:=0;
LIMIT_R:=BUFFER_R[BUFF_LAST];
IF LIMIT_R=0 THEN EOF_LOD_FILE:=TRUE;
END;
PROCEDURE READ_AND_CHECK;
VAR
X : CARDINAL;
BEGIN
IF EOF_LOD_FILE THEN
HALT(6)
ELSE BEGIN
X:=BUFFER_R[INDEX_R];
INDEX_R:=INDEX_R+1;
IF INDEX_R = LIMIT_R THEN
IF LIMIT_R = BUFF_LAST THEN
READ_SECTOR
ELSE
EOF_LOD_FILE := TRUE;
IF CHECK_SUM <> X THEN HALT(7)
END;
END (* READ_AND_CHECK *);
PROCEDURE READ_WORD(VAR X:CARDINAL);
BEGIN
IF EOF_LOD_FILE
THEN HALT(6)
ELSE
BEGIN
X := BUFFER_R[INDEX_R];
INDEX_R := INDEX_R + 1;
IF INDEX_R = LIMIT_R
THEN
IF LIMIT_R = BUFF_LAST
THEN READ_SECTOR
ELSE EOF_LOD_FILE :=TRUE;
CHECK_SUM := CHECK_SUM + X
END;
END;
PROCEDURE SKIP_RECORD( COUNT : CARDINAL );
VAR
X : CARDINAL;
BEGIN
WHILE COUNT > 0 DO BEGIN
READ_WORD(X);
COUNT := COUNT - 1
END
END;
PROCEDURE START_READ;
BEGIN
CHECK_SUM := 0;
EOF_LOD_FILE := FALSE;
READ_SECTOR
END;
PROCEDURE OPEN_READ;
VAR
SUCCESS,
DEFAULT : BOOLEAN;
BEGIN
WRITE('MODULA-2 PROGRAM LOAD FILE >');
READ_FILE_NAME(LOD_NAME,SUCCESS,DEFAULT);
IF SUCCESS
THEN
IF DEFAULT
THEN RESET(LOD_FILE,'SY:MOD.LOD/SE/RO')
ELSE RESET(LOD_FILE,LOD_NAME,'SY:MOD.LOD/SE/RO')
ELSE
HALT(5);
START_READ
END;
PROCEDURE RE_OPEN_READ;
BEGIN
RESET(LOD_FILE);
START_READ
END;
PROCEDURE CLOSE_READ;
BEGIN
CLOSE(LOD_FILE)
END;
(*---------------------rabota s TSK-fajlom---------------*)
PROCEDURE WRITE_SECTOR;
VAR
I : BLOCK;
BEGIN
SEEK(TSK_FILE,CURRENT_BLOCK);
TSK_FILE^ := BUFFER_W;
PUT(TSK_FILE);
INDEX_W := 0;
CURRENT_BLOCK := CURRENT_BLOCK + 1
END;
PROCEDURE WRITE_WORD( W : CARDINAL );
VAR
I : BLOCK;
BEGIN
IF W <> 0
THEN
IF BUFFER_W [INDEX_W] <> 0
THEN
HALT(8)
ELSE
BUFFER_W[INDEX_W] := W;
IF INDEX_W < BUFF_LAST
THEN
INDEX_W := INDEX_W + 1
ELSE
BEGIN
WRITE_SECTOR;
IF LIMIT_W < CURRENT_BLOCK
THEN
BEGIN
FOR I := 0 TO BUFF_LAST DO BUFFER_W [I] := 0;
LIMIT_W := CURRENT_BLOCK
END
ELSE
BEGIN
BUFFER_W := TSK_FILE^;
GET(TSK_FILE)
END
END
END;
PROCEDURE WRITE_ZERO_LABEL_BLOCK;
VAR
I : BLOCK;
BEGIN
FOR I := 0 TO BUFF_LAST DO BUFFER_W[I] := 0;
WRITE_SECTOR;
WRITE_SECTOR
END;
PROCEDURE START_WRITE( WHERE : CARDINAL );
VAR
I : CARDINAL;
BEGIN
CURRENT_BLOCK := ( WHERE DIV (( BUFF_LAST+1)*2)) + 3;
INDEX_W := ( WHERE DIV 2 ) MOD ( BUFF_LAST+1 );
IF LIMIT_W < CURRENT_BLOCK
THEN
BEGIN
FOR I := 0 TO BUFF_LAST DO BUFFER_W [I] := 0;
REPEAT
LIMIT_W := LIMIT_W + 1;
IF LIMIT_W < CURRENT_BLOCK
THEN
BEGIN
SEEK(TSK_FILE,LIMIT_W);
TSK_FILE^ := BUFFER_W;
PUT(TSK_FILE)
END;
UNTIL LIMIT_W = CURRENT_BLOCK
END
ELSE
BEGIN
SEEK(TSK_FILE,CURRENT_BLOCK);
BUFFER_W := TSK_FILE^
END
END;
PROCEDURE END_WRITE;
BEGIN
WRITE_SECTOR
END;
PROCEDURE OPEN_WRITE;
VAR
I : INTEGER;
POINT : BOOLEAN;
BEGIN
FOR I := 1 TO 35 DO TSK_NAME[I] := CHR(0);
I := 1;
WHILE ( LOD_NAME[I] <> CHR(0) ) AND
( LOD_NAME[I] <> '.' ) AND
( LOD_NAME[I] <> ';' ) AND
( I <= 34 ) DO BEGIN
TSK_NAME[I] := LOD_NAME[I];
I := I + 1
END;
IF I = 1
THEN
REWRITE(TSK_FILE,'SY:MOD.TSK/SE/NOBL/RW')
ELSE
BEGIN
LOD_NAME[I] := '.';
LOD_NAME[I+1] := 'T';
LOD_NAME[I+2] := 'S';
LOD_NAME[I+3] := 'K';
REWRITE(TSK_FILE,TSK_NAME,'SY:MOD.TSK/SE/NOBL/RW')
END;
INDEX_W := 0;
LIMIT_W := 1;
CURRENT_BLOCK := 1
END;
PROCEDURE CLOSE_WRITE;
BEGIN
CLOSE(TSK_FILE)
END;
PROCEDURE TRANSFER_RECORD( C,A : CARDINAL );
VAR
X : CARDINAL;
BEGIN
START_WRITE(A);
WHILE C > 0 DO BEGIN
READ_WORD (X);
WRITE_WORD(X);
C := C - 1
END;
END_WRITE
END;
(*--------------------rabota s RTS--------------------*)
PROCEDURE READ_RTS_SECTOR;
BEGIN
RTS_BLOCK := RTS_BLOCK + 1;
SEEK(RTS_FILE,RTS_BLOCK);
BUFFER_R := RTS_FILE^;
GET(RTS_FILE);
INDEX_R := 0
END;
PROCEDURE READ_RTS_WORD( VAR X : CARDINAL);
BEGIN
IF EOF_RTS_FILE
THEN
HALT(9)
ELSE
BEGIN
X := BUFFER_R[INDEX_R];
IF RTS_BLOCK < LIMIT_RTS DIV ((BUFF_LAST+1)*2) + 3
THEN
IF INDEX_R < BUFF_LAST
THEN
INDEX_R := INDEX_R + 1
ELSE
READ_RTS_SECTOR
ELSE
IF INDEX_R < ( LIMIT_RTS DIV 2 ) MOD ( BUFF_LAST+1 )
THEN
INDEX_R := INDEX_R + 1
ELSE
EOF_RTS_FILE :=TRUE
END
END;
PROCEDURE MERGE_RTS;
VAR
I : BLOCK;
X : CARDINAL;
F1 : CARDINAL;
F2 : CARDINAL;
BEGIN
FOR I := 0 TO BUFF_LAST DO BUFFER_W[I] := BUFFER_R[I];
LIMIT_RTS := BUFFER_R [5];
CURRENT_BLOCK := 1;
WRITE_SECTOR;
START_WRITE(0);
READ_RTS_SECTOR; (* 2 BLOCK *)
READ_RTS_SECTOR; (* 3 BLOCK *)
REPEAT
READ_RTS_WORD(X);
WRITE_WORD(X);
UNTIL EOF_RTS_FILE;
END_WRITE;
CURRENT_BLOCK := 1;
SEEK(TSK_FILE,CURRENT_BLOCK);
BUFFER_W := TSK_FILE^;
IF (FIRST_FREE_LOC MOD 100B) = 0 THEN FIRST_FREE_LOC := FIRST_FREE_LOC+1;
F1 := ( FIRST_FREE_LOC DIV 100B )*100B + 77B;
F2 := ( FIRST_FREE_LOC + 77B ) DIV 100B;
(* HIGHEST VIRT. ADR., MAPPED BY ADR. WINDOW 0 *)
BUFFER_W [5] := F1;
(* HIGHEST TASK VIRTUAL ADDRESS (=BUFFER_W[5]) *)
BUFFER_W [6] := F1;
(* TASK LOAD SIZE IN 64(10)-WORDS BLOCKS (SIZE OF THE ROOT SEGMENT) *)
BUFFER_W [7] := F2;
(* TASK MAXIMUM SIZE IN 64(10)-WORDS BLOCKS. = THE SIZE OF THE
ROOT SEGMENT + ANY ADDITIONAL PHYSICAL MEMORY, NEEDED TO CONTAIN
TASK OVERLAYS *)
BUFFER_W [8] := F2;
(* TASK EXTENSION - UP TO 64 KB *)
BUFFER_W [352B DIV 2] := 2000B-F2;
(* RELATIVE BLOCK NUMBER OF R/O IMAGE *)
BUFFER_W [364B DIV 2] := FIRST_FREE_LOC DIV (( BUFF_LAST+1)*2) + 4;
TSK_FILE^ := BUFFER_W;
PUT(TSK_FILE);
CURRENT_BLOCK := 3;
SEEK(TSK_FILE,CURRENT_BLOCK);
BUFFER_W := TSK_FILE^;
(* INITIAL STACK POINTER *)
BUFFER_W [8] := 0; (* WE ARE USED ALL 64 KB MEMORY *)
TSK_FILE^ := BUFFER_W;
PUT(TSK_FILE)
END;
PROCEDURE OPEN_RTS_READ;
VAR
S,
D : BOOLEAN;
BEGIN
WRITE(CHR(15B));
WRITELN(' FILE OF RUN TIME SYSTEM OR');
WRITE ('<CR> FOR DEFAULT MS:[1,54]RTS.TSK:');
READ_FILE_NAME(RTS_NAME,S,D);
IF S
THEN
IF D
THEN
RESET(RTS_FILE,'MS:[1,54]RTS.TSK/RO/SE')
ELSE
RESET(RTS_FILE,RTS_NAME,'SY:[1,54]RTS.TSK/RO/SE')
ELSE
HALT(5);
RTS_BLOCK := 0;
READ_RTS_SECTOR;
LIMIT_RTS := 177777B
END;
PROCEDURE CLOSE_RTS_READ;
BEGIN
CLOSE(RTS_FILE)
END;
PROCEDURE WRITE_LUN_BLOCK;
VAR
I : CARDINAL;
BEGIN
CURRENT_BLOCK := 2;
SEEK(TSK_FILE,CURRENT_BLOCK);
FOR I := 1 TO BUFF_LAST DO BUFFER_W [I] := 0;
FOR I := 1 TO 16 DO BUFFER_W [2*I-2] := 54523B;
FOR I := 19 TO 20 DO BUFFER_W [2*I-2] := 54523B;
BUFFER_W [2*17-2] := 44524B;
BUFFER_W [2*18-2] := 44524B;
WRITE_SECTOR
END;
PROCEDURE WRITE_COMMUNICATION_AREA;
BEGIN
START_WRITE(INITIAL_START_ENTRY);
WRITE_WORD(SYSTEM_ENTRY_POINT_VALUE);
END_WRITE;
START_WRITE(INITIAL_START_STACK_BOTTOM);
WRITE_WORD(0); (* USE ALL MEMORY *)
END_WRITE;
START_WRITE(INITIAL_START_STACK_LIMIT);
WRITE_WORD (FIRST_FREE_LOC);
END_WRITE;
START_WRITE(LOADER_INFO);
WRITE_WORD (SYSTEM_LOAD_KEY_VALUE);
END_WRITE;
END;
(*---------------------M A I N---------------------*)
BEGIN
INIT_TTIO;
OPEN_READ;
OPEN_WRITE;
WRITE_ZERO_LABEL_BLOCK;
FOUND := [];
WHILE NOT EOF_LOD_FILE DO BEGIN
READ_WORD(X);
FLAG := FLGTYP(X);
READ_WORD(NBYTES);
READ_WORD(WHERE);
IF FLAG >= MAX_FLAG THEN HALT(1);
FOUND := FOUND+[FLAG];
CASE FLAG OF
ENTRY_POINT_FLAG : SYSTEM_ENTRY_POINT_VALUE := WHERE;
NEW_LOAD_KEY_FLAG : SYSTEM_LOAD_KEY_VALUE := WHERE;
OLD_FIRST_FREE_LOC_FLAG : OLD_FREE_LOC := WHERE;
FIRST_FREE_LOC_FLAG : FIRST_FREE_LOC := WHERE;
ELSE
END;
IF FLAG = CODE_FLAG
THEN TRANSFER_RECORD((NBYTES-6) DIV 2, WHERE)
ELSE SKIP_RECORD ((NBYTES-6) DIV 2 );
READ_AND_CHECK
END;
IF NOT (ENTRY_POINT_FLAG IN FOUND) THEN HALT(2);
IF NOT (NEW_LOAD_KEY_FLAG IN FOUND) THEN HALT(3);
IF NOT (OLD_FIRST_FREE_LOC_FLAG IN FOUND) THEN HALT(10);
IF NOT (FIRST_FREE_LOC_FLAG IN FOUND) THEN HALT(4);
TRANSFER_RECORD(0,FIRST_FREE_LOC-1);
CLOSE_READ;
OPEN_RTS_READ;
MERGE_RTS;
CLOSE_RTS_READ;
WRITE_COMMUNICATION_AREA;
WRITE_LUN_BLOCK;
CLOSE_WRITE;
WRITELN('END SYSTEM GENERATION ');
END.
Oleg N. Cher, ты раздел "работы с файлами" 1 раз прочитай и все вопросы исчезнут ) В целом по Паскалю, лучше бы конечно в теме Паскаля + МАКРО11 обсуждать = ибо ближе к теме легче потом нужную инф. найти.
- - - Добавлено - - -
8.1.1. ПРОЦЕДУРЫ РАБОТЫ С ФАЙЛАМИ
PUT(F)
- ПРИСОЕДИНЯЕТ ЗНАЧЕНИЕ БУФЕРНОЙ ПЕРЕМЕННОЙ F^ К ФАЙЛУ
"F". ОПРЕДЕЛЕНО ТОЛЬКО В СЛУЧАЕ, КОГДА ПЕРЕД ИСПОЛНЕНИЕМ
ЗНАЧЕНИЕ ПРЕДИКАТА EOF(F) ЕСТЬ TRUE; EOF(F) СОХРАНЯЕТ
ЗНАЧЕНИЕ TRUE, ЗНАЧЕНИЕ ЖЕ F^ СТАНОВИТСЯ НЕОПРЕДЕЛЕННЫМ;
GET(F)
- СМЕЩАЕТ ТЕКУЩУЮ ПОЗИЦИЮ ФАЙЛА (ГОЛОВКУ ЧТЕНИЯ-ЗАПИСИ) НА
СЛЕДУЮЩУЮ КОМПОНЕНТУ И ПРИПИСЫВАЕТ ЗНАЧЕНИЕ ЭТОЙ
КОМПОНЕНТЫ БУФЕРНОЙ ПЕРЕМЕННОЙ F^. ЕСЛИ СЛЕДУЮЩЕЙ
КОМПОНЕНТЫ НЕ СУЩЕСТВУЕТ, ТО ЗНАЧЕНИЕМ ЕОF(F) СТАНОВИТСЯ
TRUE, А ЗНАЧЕНИЕ F^ НЕ ОПРЕДЕЛЕНО. РЕЗУЛЬТАТ GET(F)
OПРЕДЕЛЕН ТОЛЬКО ТОГДА, КОГДА ПЕРЕД ИСПОЛНЕНИЕМ
СООТВЕТСТВУЮЩЕГО ВЫЗОВА EOF(F)=FАLSE;
RESET(F)
- ВОЗВРАЩАЕТ ТЕКУЩУЮ ПОЗИЦИЮ ФАЙЛА В НАЧАЛО ФАЙЛА И
ПРИПИСЫВАЕТ БУФЕРНОЙ ПЕРЕМЕННОЙ F^ ЗНAЧЕНИЕ ПЕРВОГО
ЭЛЕМЕНТА "F". ЗНАЧЕНИЕМ EOF(F) СТАНОВИТСЯ FALSE, ЕСЛИ
"F" НЕ ПУСТ; В ПРОTИВНОМ СЛУЧАЕ F^ НЕ ОПРЕДЕЛЕНО, А
ЗНАЧEНИЕМ EOF(F) ОСТАЕТСЯ TRUE;
REWRITE(F)
- УНИЧТОЖАЕТ ТЕКУЩЕЕ ЗНАЧЕНИЕ "F", ТАК ЧТО МОЖЕТ НАЧАТЬСЯ
ЗАПОЛНЕНИЕ НОВОГО ФАЙЛА; EOF(F) ПРИНИМАЕТ ЗНАЧЕНИЕ TRUE;
BREAK(F)
- ВЫЗЫВАЕТ НЕМЕДЛЕННЫЙ ВЫВОД ВОЗМОЖНО ЕЩЕ НЕПОЛНОГО БУФЕРА
(БЛОКА) В ФАЙЛ. ЭТО НАДО ИСПОЛЬЗОВАТЬ ПРИ РАБОТЕ С
ТЕРМИНАЛОМ, НАПРИМЕР, ДЛЯ ВЫВОДА ПОДСКАЗКИ ИЛИ
СООБЩЕНИЯ. СЛЕДУЕТ ОТМЕТИТЬ, ЧТО ДАННЫЙ ПАСКАЛЬ НЕ
БУФЕРИЗУЕТ РАБОТУ С ДРАЙВЕРАМИ,О КОТОРЫХ ИЗВЕСТНО ЧТО
ОНИ ЯВЛЯЮТСЯ "ИНТЕРАКТИВНЫМИ", ТАКИМИ КАК ВЫХОДНОЙ ФАЙЛ
ПО УМОЛЧАНИЮ .
PAGE(F)
- ЗАСТАВЛЯЕТ ПРИНТЕР ПЕРЕХОДИТЬ НА НАЧАЛО НОВОЙ СТРАНИЦЫ
ПЕРЕД ПЕЧАТЬЮ СЛЕДУЮЩЕЙ СТРОКИ ТЕКСТОВОГО ФАЙЛА.
ПРИМЕР:
VAR F:TEXT;
BEGIN
REWRITE(F,'TT:');
WRITELN(F,'ВВЕДИТЕ КОМАНДНУЮ СТРОКУ');
BREAK(F); (* ВЫВЕСТИ ДАННЫЕ НА ТТ: *)
END.
CLOSE(F)
- ПЕРЕСЫЛАЕТ НА ВНЕШНЕЕ УСТРОЙСТВО НЕ ДО КОНЦА ЗАПОЛНЕННЫЙ
БУФЕР, УСТРАНЯЕТ СВЯЗЬ С ВНЕШНИМ ФАЙЛОМ И ОСВОБОЖДАЕТ
БУФЕРНУЮ ПАМЯТЬ ДЛЯ ИСПОЛЬЗОВАНИЯ ЕЕ В ДРУГИХ ЦЕЛЯХ.
ПРОЦЕДУРЫ "RESET" ИЛИ "REWRITE" ДОЛЖНЫ ПРЕДШЕСТВОВАТЬ
ВСЯКОЙ РАБОТЕ С ФАЙЛОВОЙ ПЕРЕМЕННОЙ.
П_Р_И_М_Е_Ч_А_Н_И_Е. ПРОЦЕДУРA "CLOSE" ВСЕГДА ДОЛЖНА
ИСПОЛЬЗОВАТЬСЯ В КОНЦЕ РАБОТЫ С ФАЙЛОМ, СОЗДАННЫМ ПРОГРАММОЙ
(ВЫХОДНЫМ ФАЙЛОМ), ИНАЧЕ МОЖНО ПОТЕРЯТЬ ПОСЛЕДНИЙ БУФЕР,КОТОРЫЙ
НЕ БУДЕТ ЗАПИСАН В ФАЙЛ. ЗАКРЫВАНИЕ ФАЙЛОВ ДЛЯ ВВОДА НЕ ЯВЛЯЕТСЯ
ОБЯЗАТЕЛЬНЫМ, НО ПОЗВОЛЯЕТ ОСВОБОДИТЬ БУФЕРНУЮ ПАМЯТЬ.
8.1.2. ДОПОЛНИТЕЛЬНЫЕ АРГУМЕНТЫ ДЛЯ "RESET" И "REWRITE"
В ДАННОЙ РЕАЛИЗАЦИИ РАСШИРЕНЫ СТАНДАРТНЫЕ ПРОЦЕДУРЫ "RESET"
И "REWRITE" ТРЕМЯ ДОПОЛНИТЕЛЬНЫМИ ПАРАМЕТРАМИ ДЛЯ УКАЗАНИЯ СВЯЗИ
МЕЖДУ ВНУТРЕННИМИ ФАЙЛОВЫМИ ПЕРЕМЕННЫМИ И ФАЙЛАМИ НА ВНЕШНИХ
УСТРОЙСТВАХ
PROCEDURE RESET(F:FILE;NAME,DEFEXT:STRING;
VAR LEN:INTEGER)
ПРОЦЕДУРА RESET СВЯЗЫВАЕТ ФАЙЛОВУЮ ПЕРЕМЕННУЮ С СУЩЕСТВУЮЩИМ
ВНЕШНИМ ФАЙЛОМ, А ТАКЖЕ УСТАНАВЛИВАЕТ УКАЗАТЕЛЬ ФАЙЛА НА ПЕРВЫЙ
ЭЛЕМЕНТ (ЗАПИСЬ). "F" ВСЕГДА ДОЛЖНА ПРИСУТСТВОВАТЬ И БЫТЬ
ФАЙЛОВОЙ ПЕРЕМЕННОЙ. ИМЯ ФАЙЛА "NAME" И РАСШИРЕНИЕ ИМЕНИ ФАЙЛА
ДОЛЖНЫ ИМЕТЬ ТИП "ARRAY OF CHAR".
ИМЯ ФАЙЛА ДОЛЖНО СООТВЕТСТВОВАТЬ ПРИНЯТОМУ В ОСДВК
СТАНДАРТНОМУ ОБОЗНАЧЕНИЮ И МОЖЕТ ВКЛЮЧАТЬ ИМЯ И НОМЕР УСТРОЙСТВА,
А ТАКЖЕ ТИП ФАЙЛА. ЕСЛИ ВО ВТОРОМ ПАРАМЕТРЕ ОТСУТСТВУЕТ ТИП
ФАЙЛА,ТО ПО УМОЛЧАНИЮ БУДЕТ ИСПОЛЬЗОВАН ТИП "DAT".
ПЕРЕМЕННАЯ "LEN" ПОЛУЧИТ ЗНАЧЕНИЕ, РАВНОЕ ЧИСЛУ БЛОКОВ ПО
512 БАЙТ В ФАЙЛЕ, ЛИБО - 1, ЕСЛИ ФАЙЛ НЕ НАЙДЕН. СЛЕДУЕТ УЧЕСТЬ,
ЧТО ЕСЛИ ЭТОТ ПАРАМЕТР НЕ ИСПОЛЬЗОВАН, ТО ОТСУТСТВИЕ ФАЙЛА
ПРИВЕДЕТ К ФАТАЛЬНОЙ ОШИБКЕ ПРОГРАММЫ.
PROCEDURE REWRITE(F:FILE; NAME,DEFEXT:STRING;
VAR LEN:INTEGER)
ПРОЦЕДУРА "REWRITE" СОЗДАЕТ НОВЫЙ ФАЙЛ НА ВНЕШНЕМ
УСТРОЙСТВЕ. ПАРАМЕТРЫ "NAME" И "DEFEXT" ИМЕЮТ ТО ЖЕ ЗНАЧЕНИЕ
(СМЫСЛ), ЧТО И ДЛЯ ПРОЦЕДУРЫ "RESET". ПАРАМЕТР "LEN" УКАЗЫВАЕТ
РАЗМЕР СОЗДАВАЕМОГО ФАЙЛА В БЛОКАХ ПО 512 БАЙТ.
ПРИМЕР:
VAR NAME: ARRAY[1..20] OF CHAR;
INF,OUTF: TEXT;
(* ОПРЕДЕЛЕНО В СИСТЕМЕ КАК "FILE OF CHAR *)
LEN: INTEGER;
BEGIN
(* СВЯЗАТЬ OUTF С УСТРОЙСТВОМ ПЕЧАТИ *)
REWRITE(OUTF,'LP:');
REPEAT
WRITE('FILENAME: ');
(* ЗАПРОСИТЬ ИМЯ ФАЙЛА С ТЕРМИНАЛА *)
READLN(NAME);
(*СВЯЗАТЬ INF С СУЩЕСТВУЮЩИМ ФАЙЛОМ *)
RESET(INF,NAME,'PAS',LEN)
(* ПОВТОРЯТЬ ПОКА ФАЙЛ НЕ БУДЕТ ОТКРЫТ *)
UNTIL LEN<>-1;
END.
и конечно при работе с файлами надо контроллировать момент
"конец строки" стандартные функции EOLN и "конец файла" EOF
WHILE NOT EOF(F) DO
BEGIN P(F^); GET(F)
END
Oleg N. Cher
04.03.2020, 17:08
Хобот, ты конечно красава. У тебя есть пример рабочего кода, который ты точно проверил, и он работает?
Про GET и PUT я уже прочитал, но нихрена не понял как они работают. Дайте примеров кода.
Не возражаю против переноса моих сообщений в нужную тему.
Дайте примеров кода
Пример кода я уже привёл
Oleg N. Cher
04.03.2020, 17:21
Hunta, спасибо конечно, но то простыня необозримейшая. А попроще никак нельзя? Создавать вручную буфер, когда ОС уже сама создала буфер - получится двойная буферизация. И только потому, что файл не текстовый. Или я что-то не так понял?
- - - Добавлено - - -
Вот это:
WHILE NOT EOF(F) DO
BEGIN P(F^); GET(F)
ENDза пример кода не катит, хорошо? Потому что непонятно, что такое P, ну и F тоже. К тому же, никто не проверял как оно работает с бинарными файлами. Но вообще доку по Паскалю мне цитировать не надо, я её уже видел.
но то простыня необозримейшая.
Ничем не могу помочь
Создавать вручную буфер, когда ОС уже сама создала буфер - получится двойная буферизация.
Ни RT, ни RSX не буферизует
за пример кода не катит, хорошо? Потому что непонятно, что такое P, ну и F тоже.
Писал в конце 90-ых, я не буду сейчас разбираться, чего там и как
К тому же, никто не проверял как оно работает с бинарными файлами.
Оно РАБОТАЕТ (написано мной для меня, так что гарантируется) с двоичными файлами и создает файл в формате задачи для RSX (двоичный) из результата компиляции-линковки программы на Modula-2
- - - Добавлено - - -
простыня необозримейшая.
Простыня - это несколько десятком листов (по 92 строки на лист) программы на фортране, состоящей из пяти-десяти подпрограмм. А этот пример - так, на один зуб.
Хобот, ты конечно красава. У тебя есть пример рабочего кода, который ты точно проверил, и он работает?
HD7>PASDWK SHONC,TT:=SHONC
SHOWONC OMSI PASCAL-1 RT11 V1.1G 4- -88 Page 1
Univ. Tasmania, Info. Sciences, Physics Bldg, Hobart 7001, site #72-12
LINE STMT LEVEL NEST SOURCE STATEMENT
1 PROGRAM SHOWONC;
2 VAR
3 SYM: CHAR;
4 INF: FILE OF CHAR;
5 BEGIN
6 1 1 1 RESET(INF,'ONC.DAT');
7 2 1 1 WHILE NOT EOF DO
8 3 1 2 BEGIN
9 4 1 3 READ(INF,SYM);
10 5 1 3 WRITE(SYM:1);
11 6 1 3 END;
12
13 7 1 1 CLOSE(INF);
14 8 1 1 WRITELN;
15 9 1 1 END.
ERRORS DETECTED: 0
FREE MEMORY: 9835 WORDS
ERRORS DETECTED: 0
FREE MEMORY: 9835 WORDS
HD7>RU SHONC
OLEG_N_CHER DETECTED ! END OF FILE ON DEVICE - FROM PC 004542
HD7>TY ONC.DAT
OLEG_N_CHER DETECTED !
HD7>TY SHONC.PAS
PROGRAM SHOWONC;
VAR
SYM: CHAR;
INF: FILE OF CHAR;
BEGIN
RESET(INF,'ONC.DAT');
WHILE NOT EOF DO
BEGIN
READ(INF,SYM);
WRITE(SYM:1);
END;
CLOSE(INF);
WRITELN;
END.
HD7>
INF: FILE OF CHAR;
Вопрос по теме! Как работать из OMSI Pascal с бинарными файлами?
Классно ответил
Oleg N. Cher, А по поводу файлов с данными , там ЕМНП удобнее всякие SEEK, PUT, GET - ничего сложного там нет. Если действительно читал учебник-лекции ?
- - - Добавлено - - -
ну и F тоже - очевидно же, что связанная с реальным файлом переменная,
Oleg N. Cher
04.03.2020, 18:57
Сократил простыню до более вменяемой, но оно всё равно глючит. Я конечно понимаю, что в моих глюках ковыряться никому не охота.
За помощь спасибо конечно, но я смотрю, тут всё в пещерном состоянии. Ещё из "приятностей" вскрылось то, что OMSI Pascal не понимает "_" в идентах. Стыдоба.
http://i.piccy_.info/i9/2a23c65b7ecfce152aa4be93c2478e73/1583337273/69962/1320134/OMSI.png
Хобот, ахтунг. Ты работаешь не с бинарными файлами, а с текстовыми. Там где нуль в конце. Ты в танке, Хобот. %) Вылазь уже из танка, что ли?
CONST
BufLast = 511;
TYPE
BYTE = 0..255;
BLOCK = 0..BufLast;
BigBuf = ARRAY [BLOCK] OF BYTE;
VAR
ImgFile : FILE OF BigBuf;
EofImgFile : BOOLEAN;
BufR : BigBuf;
IdxR, LimR : BLOCK;
PROCEDURE ReadSector;
BEGIN
BufR := ImgFile^;
GET(ImgFile);
IdxR := 0;
LimR := BufR[BufLast];
IF LimR = 0 THEN EofImgFile := TRUE;
END {ReadSector};
PROCEDURE ReadByte (VAR x: BYTE);
BEGIN
IF EofImgFile THEN x := 0
ELSE BEGIN
x := BufR[IdxR];
IdxR := IdxR + 1;
IF IdxR = LimR THEN
IF LimR = BufLast
THEN ReadSector
ELSE EofImgFile :=TRUE;
END;
END {ReadByte};
PROCEDURE StartRead;
BEGIN
EofImgFile := FALSE;
ReadSector;
END {StartRead};
VAR size: INTEGER; ch: BYTE;
BEGIN
Reset(ImgFile, 'Dur6.BMP', '', size);
StartRead;
WHILE NOT EofImgFile DO BEGIN
ReadByte(ch);
Write(CHR(ch));
END;
Close(ImgFile); write('File closed!');
- - - Добавлено - - -
Классно ответилА чо - надо было описать как FILE OF 0..255 ? Нету же байтового типа. Я даже не уверен, что 0..255 будет храниться не в INTEGER.
OMSI Pascal не понимает "_" в идентах
Вариант для RSX понимает. Программа транслировалась второй версией OMSI компилятора для RSX
А чо - надо было описать как FILE OF 0..255
Хобот, ахтунг. Ты работаешь не с бинарными файлами, а с текстовыми.
Сам же и ответил
Oleg N. Cher
04.03.2020, 19:43
Ладно, я поясню для Хобота, а то он наверно не понимает. Если читать из файла командой Read, то первый же встреченный нуль будет воспринят как конец файла, а Eof не сработает никогда. Проверено.
Не знаю, что такое RSX.
- - - Добавлено - - -
Hunta, как-то странно Вы определяете конец файла. По наличию двух нулей в конце блока. Это связано с тем, что файлы известной структуры? Мне вообще с байтами надо работать, а не со словами.
Не знаю, что такое RSX
RSX-11M или RSX-11M-Plus. В отличии от RT нормально поддерживает большой объём памяти, многозадачность и многопользовательскость. У меня на аналоге Кванта-4с 4 мб памяти и большие "диски", смысла запускать RT нет вообще
Hunta, как-то странно Вы определяете конец файла.
Память ничего не подсказывает про структуру .LOD файла
Это связано с тем, что файлы известной структуры?
Возможно. В документации на реализацию Modula-2 от Вирта описана структура
Если читать из файла командой Read
а говоришь читал
8.3. КОНЕЦ ФАЙЛА
В ОСДВК ФАЙЛ ПРЕДСТАВЛЯЕТСЯ ПОСЛЕДОВАТЕЛЬНОСТЬЮ БЛОКОВ ПО
512 БАЙТ КАЖДЫЙ. ПРИ ЭТОМ В КОНЦЕ ФАЙЛА ОТСУТСТВУЕТ ПРИЗНАК КОНЦА
ФАЙЛА. ПОЭТОМУ ФУНКЦИЯ "EOF" НЕ ВСЕГДА ОБЕСПЕЧИВАЕТ ПРАВИЛЬНУЮ
ИНДИКАЦИЮ КОНЦА ФАЙЛА. РЕШИТЬ ЭТУ ПРОБЛЕМУ МОЖНО, ИСПОЛЬЗУЯ
СЧЕТЧИК ЗАПИСЕЙ В ФАЙЛЕ ИЛИ ПУТЕМ ИСПОЛЬЗОВАНИЯ СИМВОЛЬНОЙ
ЗАПИСИ, КОТОРАЯ БУДЕТ ВЫСТУПАТЬ В КАЧЕСТВЕ ПРИЗНАКА КОНЦА.
ДАННАЯ ПРОБЛЕМА НЕ ОТНОСИТСЯ К ТЕКСТОВЫМ ФАЙЛАМ, КОТОРЫЕ В
КАЧЕСТВЕ ПРИЗНАКА КОНЦА ИСПОЛЬЗУЮТ ЗНАК <CTRL/Z>.
и, если лень читать мат.часть, то хотя бы мои сообщения читай внимательно!
- - - Добавлено - - -
Не знаю, что такое RSX.
а вот это и правда "стыдоба"
Oleg N. Cher
05.03.2020, 00:43
Ой, Хобот, не надо. А то я щас пройдусь по OMSI Pascal'ю, что он выводит ошибки исключительно количеством, и никакой инфы про то, в какой строке ошибка. Это застрелиться можно. Тогда как XDev тыкает тебя носом (курсором) во все ошибки. Но господам кодерам там очень сильно не хватает фолдинга и приноса кофе в постель. Так это они ещё OMSI не видели. А ты вот Оберона не знаешь, стыдоба же ;-)
Вот тебе матчасть, читай внимательно.
http://i.piccy_.info/i9/4cf5a328ad8e38c5baf560c048e375f9/1583358231/404003/1320134/OMSI.png
А будешь троллить программера со стажем - будешь отгребать, что закономерно.
и никакой инфы про то, в какой строке ошибка. Это застрелиться можно.
стреляться не надо! надо доки читать )
pascal <filename>,TT:=<filename>
выведет тебе листинг трансляции популярно на терминал ;-)
Вот тебе матчасть, читай внимательно.
отлично ты мои же сообщения чуть выше цитируешь на инглише ) смело ) по заграничному )
и про тексты - и про файлы с нетекстом я написал, ты читаешь посты мои вообще??? или я зря пишу???
- - - Добавлено - - -
Но господам кодерам там очень сильно не хватает
тебя там грызут нативщики (и правильно делают, что бы не расслаблялся!), но не надо ЭТО
сюда приносить, пожалуйста!
Oleg N. Cher
05.03.2020, 21:36
pascal <filename>,TT:=<filename>pascal? Не PASDWK? Что-то не сходится. А для PASDWK? Который надо вызывать только PASDWK S.PAS S.MAC (если S.MAC не будет указано, то он ничего и не делает).
и про тексты - и про файлы с нетекстом я написал, ты читаешь посты мои вообще???Вопрос мой исходно был про бинарные файлы, а ты мне ткнул код, который работает с текстовыми через READ. Это некрасиво с твоей стороны, или ты криво прочитал мой вопрос? Достаточно было написать: READ не годится. А не тыкать мне кучу левых ссылок.
Hunta помог, спасибо ему. Хотя с признаком конца бинарного файла всё загадочно. Пока я предположу, что лучше всего прочесть длину файла посредством вызова RESET, и потом читать его блоками посредством GET, не выходя за пределы этой длины. Чего мой вьювер и делает.
А для PASDWK? Который надо вызывать только PASDWK S.PAS S.MAC (если S.MAC не будет указано, то он ничего и не делает).
Это похоже на первую версию OMSI паскаля - она, ЕМНИП, как раз и выдавала .mac, а не .obj файл
Хотя с признаком конца бинарного файла всё загадочно.
Что то мне припоминается, что в LOD файле в последнем слове - количество записанных байт. Не точно. В выходные будет больше свободного времени - постараюсь глянуть.
Пока я предположу, что лучше всего прочесть длину файла посредством вызова RESET, и потом читать его блоками посредством GET, не выходя за пределы этой длины.
В RT - вполне возможно, потому что стандартно никакого понятия - количество записанной в файл информации (в отличии от RSX) - нет.
pascal? Не PASDWK? Что-то не сходится
имя транслятора - не критично, хоть brevno.sav, главное что внутри там был Паскальный-транслятор в мак файл.названия эти возникли от того, что мне на одной дискете все варианты pascal.sav собрать требовалось, а их там много ))) позже на одном разделе ЖД - приходится переименовывать.
- - - Добавлено - - -
Это похоже на первую версию OMSI паскаля - она, ЕМНИП, как раз и выдавала .mac, а не .obj файл
любая версия паскаля выдаёт .MAC файл
- - - Добавлено - - -
надо вызывать только PASDWK S.PAS S.MAC
ну что за бред, открой руководство и в самом начале команд трансляции целая глава !!!
любая версия паскаля выдаёт .MAC файл
Не любая. Был у меня (может и сейчас есть) компилятор OMSI второй версии для RT - он выдавал .obj. И для RSX вторая версия компилятора OMSI выдаёт.
Вопрос мой исходно был про бинарные файлы, а ты мне ткнул код, который работает с текстовыми через READ. Это некрасиво с твоей стороны, или ты криво прочитал мой вопрос? Достаточно было написать: READ не годится. А не тыкать мне кучу левых ссылок.
как скажешь...
Сообщение от Hunta
надо вызывать только PASDWK S.PAS S.MAC
ну что за бред, открой руководство и в самом начале команд трансляции целая глава !!!
Ты кому пишешь?
Не любая. Был у меня (может и сейчас есть) компилятор OMSI второй версии для RT - он выдавал .obj. И для RSX вторая версия компилятора OMSI выдаёт.
я видел только доки на английском... там ещё такая хитрая вещь! есть psc.sav в комплекте - так вот он сразу в SAV делает командой psc file.pas , но выяснилось, что он просто запускает поочерёдно pascal, macro, link
- - - Добавлено - - -
Ты кому пишешь?
Деду Морозу )
я видел только доки на английском
Ты много чего не видел.
И кстати - вызови свой компилятор pascal вот так pascal <filename> <filename> - будешь удивлён
- - - Добавлено - - -
Деду Морозу )
Это твой врач?
Oleg N. Cher
06.03.2020, 02:59
Был у меня (может и сейчас есть) компилятор OMSI второй версии для RT - он выдавал .obj.О, я бы OMSI Pascal 2.x с удовольствием посмотрел. Если можно.
- - - Добавлено - - -
В выходные будет больше свободного времени - постараюсь глянуть.Это не очень актуально в данный момент. Давайте лучше поможем Хоботу с проверкой существования файла. Я изучил матчасть по Паскалю вдоль и впоперёк и выдвигаю предположение, что на OMSI Pascal 1.x этого сделать нельзя - надо обратиться к функции RT-11 из вставки на ассемблере. А вот как именно это сделать - вам виднее, господа любители PDP-11.
Если можно.
Не если можно, а если он остался...
Коллеги, вы что, забыли, что настоящие программисты не использкют Паскаль (http://lib.ru/ANEKDOTY/non_pas.txt)? ИМХО, если бы фирма Борланд в свое время не подсуетилась со своим Турбо-Паскалем, про него к нынешнему времени благополучно забыли бы, равно, как и про кучу других языков, вроде Модулы, Алгола во всех вариациях и пр...
Тут произошло досадное недоразумение, сам Вирт ляпнул, что придумал паскаль для обучения студентов, а в МИНОБР недолго думая воткнули его в программу обучения вузов.. вот и распространился он как вирус:)
- - - Добавлено - - -
если бы фирма Борланд в свое время не подсуетилась со своим Турбо-Паскалем
С турбо СИ они тоже неплохо подсуетились и надолго обошли мелкомягких, хотя мелкомягкие всегда муру пишут.
Коллеги, вы что, забыли, что настоящие программисты не использкют Паскаль (http://lib.ru/ANEKDOTY/non_pas.txt)? ИМХО, если бы фирма Борланд в свое время не подсуетилась со своим Турбо-Паскалем, про него к нынешнему времени благополучно забыли бы, равно, как и про кучу других языков, вроде Модулы, Алгола во всех вариациях и пр...
я не программист, не системщик - мне можно Паскалить )
не думаю, что Паскаль забыт был бы, поскольку реальность доказывает, что это далеко не так.
вот кто сейчас помнит Миранду? )
https://bourabai.ru/alg/lang/5.htm
- - - Добавлено - - -
Коллеги, вы что, забыли,
https://youtu.be/ZbtB1Aqc41A
Oleg N. Cher
07.03.2020, 03:06
Эта мантра (высер) про "настоящие программисты не используют Паскаль" придумана и муссируется для самоудовлетворения. Во время написания статьи уже была Модула-2, в которой были исправлены известные на тот момент недостатки Паскаля. Более того, там критикуется старый Паскаль, а Паскаль тоже менялся, он трансмутировал в Оберон, который, как ни крути, остаётся самым лучшим из именно простых языков.
Меня тошнит от того, как самоудовлетворяются подобным способом. Паскаль очень годная основа, так как содержит сбалансированный набор языковых средств без излишеств. И он действительно очень подходит для обучения, это лично подтвердилось у меня опытным путём много раз.
SuperMax
07.03.2020, 11:11
Меня тошнит от того, как самоудовлетворяются подобным способом. Паскаль очень годная основа, так как содержит сбалансированный набор языковых средств без излишеств. И он действительно очень подходит для обучения, это лично подтвердилось у меня опытным путём много раз.
очень спорное утверждение
помню паскаль изучали на 1м курсе, да, его можно использовать, вопрос только вот зачем ?
я к тому, что если надо написать что-то быстрое, тут СИ без вариантов (использование ООП облегчает написание, но очевидно снижает производительность)
если нужен язык высокого уровня - то берем яву (если речь об общем применении)
итд
в случае с нашими клонами и фантазиями на тему PDP-11, где таки производительности явно недостает, то СИ это максимум, что можно использовать из языков. Путем надо писать на MACRO11.
зачем сейчас можно использовать паскаль или его клоны - честно, ума не приложу, те скорости как у СИ нет, при этом использование си-шных либ откровенно неудобное. гибкости/мощности как у явы тоже нет. подскажите какие именно задачи удобнее/эффективнее решать на паскале сейчас ? те где он лучше других ЯП ?
касаемо обучения, первый язык это бейсик ибо он прост и понятен. далее можно двигать в СИ и яву.
Тут произошло досадное недоразумение, сам Вирт ляпнул, что придумал паскаль для обучения студентов, а в МИНОБР недолго думая воткнули его в программу обучения вузов.. вот и распространился он как вирус
верное замечание, ибо много раз встречал людей которые ограничились языками которые изучили в школе/универе. эффект утенка. в свое время был распространен FoxPRO - как ЯП - уродская и тормозная система, но причина - изучали в универе. хотя была и есть прекрасная замена - Clarion. следует отметить, что Clarion первая (1989й если не ошибаюсь) реализовали полностью визуальную систему разработки. (не мастера форм а полностью все можно сделать визуально). Результат - скорость разработки - банально на разработку телефонного справочника до exe-шника надо 7минут и это на 286й машине(!). На FoxPRO на это уйдет полчаса и полноценного exe не получить.
Если говорить о программирование для УКНЦ, то правильно сделать набор хорошо документированных библиотек написанных на MACRO11
Приходилось писать на многих языках, но вот именно С (классический) не взлетел от слова никак. Исходно на PDP-11 - мизерное преимущество перед MACRO-11, а потом его PDP-11-ориентированность попытались натянуть на другие архитектуры, да ещё и как обычно у создателей или упоротых последователей - объявить его универсальным достаточно низкоуровневым языком. Обе попытки, с моей точки зрения, дали так себе результат
SuperMax
07.03.2020, 11:55
Приходилось писать на многих языках, но вот именно С (классический) не взлетел от слова никак.
вопрос в задачах
те если нужна скорость и важны микросекунды то вариантов просто нет
те если нужна скорость и важны микросекунды то
MACRO-11 или соответствующий ассемблер
- - - Добавлено - - -
Но для PDP-11 - даже когда скорость и микросекунды не важны - практически наверняка это будет MACRO-11, и на 100 процентов - не C
и на 100 процентов - не C
хотя на Си писали и не так уж мало, в том числе специализированно для УК-НЦ,
где ресурса под Си мало-мало совсем ) Я Паскалю на ретро-машинках, но без
вставок на асме никогда не обходился - это отличное подспорье и классическое
(золотое) сочетание. Под дос уже (на уровне хобби опять же) Турбо Паскаль и
Дельфинчик в окошки ) Си - мне чужд по природе восприятия и составления текста
программы. Я не понимаю все это скобочки и синтаксис вообще. Конечно это можно освоить,
но это же ломка, в то время как любой паскаль - сравним с языком обычной человеческой математики.
Кстати по совместимости, скорости компиляции и размера проекта на выходе + компактности кода -
Дельфинчика переплюнуть сложно )
Oleg N. Cher
07.03.2020, 14:23
Для меня очевидно, что мы не сойдёмся во мнениях, но всё-таки прокомментирую.
помню паскаль изучали на 1м курсе, да, его можно использовать, вопрос только вот зачем ?Как простой, ясный и чистый язык, код на котором понятен любому человеку, мало-мальски знакомому с программированием. На котором удобно записывать алгоритмы, чтобы их потом держать в понятном виде. И чтобы без барьеров входа, по возможности. Ну какие барьеры входа в Паскаль? Разве что если неофит наслушается "крутых сишников", которые Паскаль никогда не юзали, а Си знают так себе, а C++ тем более, и путаются сами в его средствах. Но им же как-то надо показать всему миру свою крутизну. А неофит верит, что ему ещё остаётся.
я к тому, что если надо написать что-то быстрое, тут СИ без вариантов (использование ООП облегчает написание, но очевидно снижает производительность)Дельфи был никак не медленнее, чем, допустим, Visual C версий того же времени. Сейчас есть LLVM. Не в языке дело. Если язык компилируемый, создать для него хороший компилятор можно. Просто я смотрю на Паскаль как на потенциально годный для варения в нём язык, а Вы смотрите на него как конъюнктурщик - чтобы чего-то из него выжать сейчас. Вот вся суть нашей дискуссии. Мы на это смотрим по-разному.
если нужен язык высокого уровня - то берем яву (если речь об общем применении)Угу. И намертво привариваемся к стомегабайтной JVM, пожирающей память как зараза.
в случае с нашими клонами и фантазиями на тему PDP-11, где таки производительности явно недостает, то СИ это максимум, что можно использовать из языков.Я вот не уверен, что Си для PDP-11 имеет какое-то преимущество перед Паскалем, по крайней мере, те реализации, которые можно пощупать. Да, мне не удалось запустить компилятор Си под эмулем Патрона. Там требуется назначение диска C, с чем я не разобрался. Без этого он не хочет работать. Хотя примерно понял куда копать.
зачем сейчас можно использовать паскаль или его клоны - честно, ума не приложу, те скорости как у СИ нетОчень спорное утверждение. Но даже если и так, это не значит, что причина тормозов именно сам язык, а не откровенно более слабый транслятор. Значит можно было сделать лучше.
касаемо обучения, первый язык это бейсик ибо он прост и понятен. далее можно двигать в СИ и яву.Си и яву это потому что Вы асилили Си и яву? Ну да, конечно, Ваш путь подходит именно для всех. А чем Бейсик лучше Паскаля?И какой именно Бейсик? Может неструктурный с метками строк и GOTO? Тогда почему сразу не Фортран?
хотя была и есть прекрасная замена - Clarion.Вы наверное не в курсе, но Clarion был написан на Modula-2. Этот язык - дальнейшее развитие идей Паскаля. О чём скромно умолчали в статье "настоящие программисты..."
• http://old-dos.ru/index.php?page=files&mode=files&do=show&id=2442
Если говорить о программирование для УКНЦ, то правильно сделать набор хорошо документированных библиотек написанных на MACRO11Ну да, так и поступаем.
хотя на Си писали и не так уж мало,
Мне без разницы - писали или не писали. Кому то удобней - ради бога. Для PDP-11 систему команд спроектировали под удобное написание на языке ассемблера. Хотя, конечно, не обошлось без некоторых закидонов. Учитывая количество и стоимость ресурсов (в те времена) - без вариантов. Если бы проектировали 32-битную систему (VAX не с нуля проектировали - учитывалась возможная совместимость с PDP-11, но проектировали так же под написание на языке ассемблера) - возможно, получилось бы что то столь же удобное. Но учитывая, сколько нужно написать символов для стандартных действий - по скорости написания программирование на языке ассемблера будет медленней и чревато то большим количеством ошибок (которые в какой то степени ловят компиляторы высокоуровневых языков).
Правильный подход, как мне кажется - проектирование высокоуровневого языка и ПОД НЕГО систему команд процессора. Хотя и тут не без проблем - попытка запихать в язык всё, что только может понадобиться. Как показывает история - попытка спроектировать универсальный язык (PL/1, Алгол-68, ADA, Java) в исторической перспективе терпит фиаско. Нужен язык, который можно было бы расширить под предметную область, причём так, что бы это НЕ ПОТРЕБОВАЛО БЫ переделки компилятора (близкая по идее возможность - макросы в MACRO-11) - то есть некий пакет расширения языка плюс исполняющая система (ака библиотеки) под него.
Но тут мы налетаем на
а) коммерческим фирмам это почти нахрен не нужно - ибо требует длительного проектирования с неясными перспективами получения результата, денежные затраты с неясными перспективами возможности на этом заработать
б) научные круги обычно закапываются в высокие сферы со слабой применимостью в коммерческих фирмах. Классический пример - Алгол-68 проектировали ботаники. Описание языка (синтаксис и семантика) - книга формата примерно А4 толщиной сантиметра 3, причём, насколько я помню, примерно треть книги - это описание метаязыка (с использованием БНФ, если мне не изменяет память), на котором потом описывался Алгол-68. Когда она мне попалась в руки (год так 85, а начал я иметь дела с компом в феврале 84-ого) - я смог с трудом осилить страниц 10. Жаль, не сохранил печатное издание :)
в) технологии меняются настолько быстро, что и проектировать это надо тоже... не медленно
г) ахеренное количество софта, написанное под x86-x64, который будет грубо и злобно конкурировать с этими язык и машиной мечты.
Языки типа Паскаля, Modula-2 и Оберонов страдают существенным недостатком, по сравнению с С-подобными - при прочих равных условиях приходится вводить больше СИМВОЛОВ, ну и плюс никакая синтаксическая расширяемость - ни макросов, ни шаблонов, ни дженериков. Так что - идеалисты, фанаты, спец области, но не коммерческая разработка.
- - - Добавлено - - -
Вдогонку. Ни макросы, ни шаблоны сами по себе не являются удобным способом расширения языка - достаточно вспомнить С++. Что то более близкое к идеалу - идея дженериков. С ней я знаком практически на 100 процентов из C#, так что не могу сказать - насколько это удобно в других языках, поддерживающих эту идею
Oleg N. Cher
07.03.2020, 14:46
Нужен язык, который можно было бы расширить под предметную область, причём так, что бы это НЕ ПОТРЕБОВАЛО БЫ переделки компилятораДа, именно эту возможность мы видим в Обероне. Кто-то называет его ООП-ассемблером.
• Что такое Оберон-парадигма? (https://zx.oberon.org/paradygm)
Что такое Оберон-парадигма?
По этой статье это вообще ни в какой виде не видно, тем более - в моём варианте
Си позволяет огромное количество вольностей как в синтаксисе так и с типами в отличие от паскаля. Это и хорошо и плохо одновременно.
Поэтому исходники на Си всегда выглядят по разному (зависит от психического состояния программиста) в отличии от паскаля. Кстати где-то встречал программу прикол..
исходник из одной строки выдает двадцать восемь страниц не повторяющегося текста :)
SuperMax
07.03.2020, 18:21
MACRO-11 или соответствующий ассемблер
я говорю о современных задачах где требуется высокая производительность
и тут СИ без вариантов. _очень_ редки ассемблерные вставки тк кроссплатформенность очень важна.
Но для PDP-11 - даже когда скорость и микросекунды не важны - практически наверняка это будет MACRO-11, и на 100 процентов - не C
я уже написал что нужен MACRO-11.
хотя на Си писали и не так уж мало, в том числе специализированно для УК-НЦ,
где ресурса под Си мало-мало совсем ) Я Паскалю на ретро-машинках, но без
вставок на асме никогда не обходился - это отличное подспорье и классическое
(золотое) сочетание. Под дос уже (на уровне хобби опять же) Турбо Паскаль и
Дельфинчик в окошки ) Си - мне чужд по природе восприятия и составления текста
программы. Я не понимаю все это скобочки и синтаксис вообще. Конечно это можно освоить,
но это же ломка,
я же не зря написал про эффект утенка ;-)
в то время как любой паскаль - сравним с языком обычной человеческой математики.
Кстати по совместимости, скорости компиляции и размера проекта на выходе + компактности кода -
Дельфинчика переплюнуть сложно )
в сравнении с чем ? я спорю ради спора - мне интересно
Для меня очевидно, что мы не сойдёмся во мнениях, но всё-таки прокомментирую.
Как простой, ясный и чистый язык, код на котором понятен любому человеку, мало-мальски знакомому с программированием. На котором удобно записывать алгоритмы, чтобы их потом держать в понятном виде. И чтобы без барьеров входа, по возможности. Ну какие барьеры входа в Паскаль?
а разве они есть при входе на Си ? (про ООП и С++ не говорим)
я видел множество неофитов которые начали именно с СИ в IDE Ардуино и вообще никаких проблем не испытали.
я лично писал на паскале и на ДВК и на ЕС и на дельфе проекты делал, и честно СИ функциональнее , да и синтаксис не перегружен лишними конструкциями. хотя, следует отметить, что изучив пару десятков языков, на синтаксис обращаешь меньше всего внимания.
Дельфи был никак не медленнее, чем, допустим, Visual C версий того же времени. Сейчас есть LLVM. Не в языке дело. Если язык компилируемый, создать для него хороший компилятор можно. Просто я смотрю на Паскаль как на потенциально годный для варения в нём язык, а Вы смотрите на него как конъюнктурщик - чтобы чего-то из него выжать сейчас. Вот вся суть нашей дискуссии. Мы на это смотрим по-разному.
ну да, мне шашечки не нужны - мне ехать надо.
Угу. И намертво привариваемся к стомегабайтной JVM, пожирающей память как зараза.
ява очень хороша когда "надо быстро из говна и палок"
но очевидно, что это преимущество имеет и обратную сторону в числе которых и жуткое потребление памяти.
Я вот не уверен, что Си для PDP-11 имеет какое-то преимущество перед Паскалем, по крайней мере, те реализации, которые можно пощупать. Да, мне не удалось запустить компилятор Си под эмулем Патрона. Там требуется назначение диска C, с чем я не разобрался. Без этого он не хочет работать. Хотя примерно понял куда копать.
для PDP-11 СИ будет чуточку быстрее тк он таки написан для PDP-11.
Очень спорное утверждение. Но даже если и так, это не значит, что причина тормозов именно сам язык, а не откровенно более слабый транслятор. Значит можно было сделать лучше.
нет, именно сам язык, и вызвано это работой с памятью и строками
если говорить о современных задачах - как из паскаля работать с shared memory ? мне просто интересно.
я собственно потому и задал вопрос - "подскажите какие именно задачи удобнее/эффективнее решать на паскале сейчас ? те где он лучше других ЯП ?"
может такие задачи есть и я просто не в курсе ?
Си и яву это потому что Вы асилили Си и яву? Ну да, конечно, Ваш путь подходит именно для всех. А чем Бейсик лучше Паскаля?И какой именно Бейсик? Может неструктурный с метками строк и GOTO? Тогда почему сразу не Фортран?
Си применяется уже более 45 лет, а ява более 25, и что важно, ни тот ни другой никуда не денутся. да, в общем виде сидящие на СИ не любят яву, и наоборот, но правильно знать и уметь применять и то и другое.
если говорить о моем опыте, то он достаточно широк и включает в себя и Fortran тоже - давно когда-то писал математические задачи на нем (сугубо из-за огромного количества готовых библитек).
и я сужу о ЯП именно исходя из опыта программирования большом количестве систем и языков. вот на питоне я не писал, ничего про него не скажу.
на самом деле, надо будет изучу и его - не вижу проблемы.
Вы наверное не в курсе, но Clarion был написан на Modula-2. Этот язык - дальнейшее развитие идей Паскаля. О чём скромно умолчали в статье "настоящие программисты..."
Вы заблуждаетесь
Брюс Баррингтон написал Clarion на СИ в 1984ом, а встроенные компиляторы модулы и СИ появились в Clarion-е сильно позднее - в 92м когда Clarion Software Corporation объединились с Jensen & Partners International(JPI)
а если говорить о влиянии на синтаксис то, да на автора языка повлияли кобол и модула-2.
что такое CPD можно посмотреть, как оказалось, на ютубе
https://www.youtube.com/results?search_query=Clarion+Professional+Develope r+2.1+for+DOS
я говорю о современных задачах где требуется высокая производительность
И я именно про них. И именно когда важными становятся такты. Что бы выжать из платформы максимум и ещё чуть чуть - язык ассемблера
SuperMax
07.03.2020, 18:28
Си позволяет огромное количество вольностей как в синтаксисе так и с типами в отличие от паскаля. Это и хорошо и плохо одновременно.
Поэтому исходники на Си всегда выглядят по разному (зависит от психического состояния программиста) в отличии от паскаля. Кстати где-то встречал программу прикол..
исходник из одной строки выдает двадцать восемь страниц не повторяющегося текста :)
да, мощность дает возможность извращениям, но мудрые программисты хорошо документируют свой код и уж тем более не допускают неясностей - ибо кто знает через сколько лет придется вернуться к задаче ?
вот у меня стек поисковой системы зеркал:
- Java
- Oracle SQL и PL/SQL
- PHP
- javascript
сейчас добавились программки на С/С++
тк все документировано - то вернуться легко и просто
Oleg N. Cher
10.03.2020, 08:15
Hunta, жизнь показала, что такие языки как Forth и Lisp, в которых можно на лету доопределять части самого языка, не взлетели нигде особо. У них самая ограниченная область применения. Меня до сих пор удивляет, почему на Forth'е не писали для RT-11 или, скажем, CP/M с их ограниченными ресурсами. Ведь язык очень гибкий, намного гибче Си.
Предположу, что здесь такая же ситуация, как с ПЛИС: туда можно вшить абсолютно любую систему команд; гибкость потрясающая. Но на практике тяготеют к чему-то привычному или готовому. Как в Sprinter'е или Spectrum Next к системе команд Z80. Нужен какой-то костяк, хребет, который задаст рёбра жёсткости. Это напоминает пример с дождевым червём: он очень гибкий, но прямо ходить не может. А у человека скелет зафиксирован, но зато он может прямо ходить.
Так что излишняя гибкость в языках оказалась не очень ко двору. Лучше уже зафиксировать минимальный сбалансированный объём языковых средств, о чём как раз в статье по ссылке постом выше.
Hunta, жизнь показала, что такие языки как Forth и Lisp, в которых можно на лету доопределять части самого языка, не взлетели нигде особо
Причина простая - их интерпретируемость и порог вхождения в понимании чужих программ. Да, переносить удобно, да, доопределять удобно, но скорость и сложность понимания.
И примерно как с ПЛИС - нужно перестраивать мышление. Меня, честно говоря, удивляет, что я, как программист, а не железячник, всё таки достаточно быстро разобрался в разработкой под FPGA (ну как быстро - по времени, вроде как два года уже вожусь, но если учесть, что это хобби, а не работа - то не по восемь часов в день и часто даже не по восемь часов в неделю, так что - наверное всё таки быстро). Хотя основной прорыва - это примерно последние полгода - когда вылез из песочницы DE10.
И что бы втянуть народ в разработку на FPGA - пытаются создать привычные языковые средства - типа программирования для FPGA на Verilog или вообще на C.
А по мне так VHDL нормаль. Просто до какой то степени мыслить надо как железячняк, а не только программист.
Так что излишняя гибкость в языках оказалась не очень ко двору.
Кому как.
Лучше уже зафиксировать минимальный сбалансированный объём языковых средств, о чём как раз в статье по ссылке постом выше.
Может он и сбалансированный, вот только если сравнивать с коммерческими языками разработки - набить символов, прежде чем получишь результат - придётся в разы больше. Чем на том же C# или C++. Так что точно так же - удел энтузиастов.
И ещё раз - статья - рассуждения в общем, никаких примеров из Оберона. Так что уже примерно на половине стало скучно.
Oleg N. Cher
10.03.2020, 09:01
Про "переносить удобно" я бы поспорил. Не очень удобно. Достаточно вспомнить барьер, когда Forth стал 32-битным. 90% 16-битного кода отправилось на помойку сразу. А у Си/Паскаля ситуация с этим оказалась несколько получше даже. Парадокс.
Поспорим ещё о том, что программирование состоит не только в наборе "многабукаф"?) Я ещё давно-давно здесь на форуме приводил примеры, где на Обероне код получается в символах короче, чем на Си. Их все демонстративно проигнорили. Где-то длиннее, где-то короче. Но барьер вхождения в Оберон для неофитов почти отсутствует, если им старпёры, желающие самоутвердиться, голову не заморочат.
Меня тошнит от того, как самоудовлетворяются подобным способом. Паскаль очень годная основа, так как содержит сбалансированный набор языковых средств без излишеств. И он действительно очень подходит для обучения, это лично подтвердилось у меня опытным путём много раз.Как сказать?.. Возьмем писюк. Винды. Визуальный С/С++ от Микрософта был, есть и будет. Писюк, линюха. GCC. Был, есть и будет. Мобильные устройства. Не знаю, какой там С/С++, но он тоже был, есть и будет. Берем любой микроконтроллер. (Возможно) асм и какой-то С/С++, был, есть и будет. И где здесь Паскаль?
Нет, конечно, для некоторых из перечисленных платформ можно найти систему программирования на Паскале, но далеко не факт, что она сохранится в будущем - продастся в очередной раз фирма-производитель этой системы, а новый хозяин возьмет, да и прикроет этот Паскаль. Как в свое время прикрыли на фиг MUMPS - тоже были великолепные и язык, и системы программирования (для баз данных).
И зачем, спрашивается, засирать мозги молодежи этим самым Паскалем?
Не знаю, какой там С/С++, но он тоже был, есть и будет.
На мобильных Java у Андроидов, и Swift у айфонов.
Обычно на Паскале для ДВК писали штатные блондинки согласно ТЗ , например в областях :
1. Тестирование ИС на стендах
2. Софт с десятичной арифметикой, особенно плавучкой.
3. Прочий некритичный к быстродействию и объему выходного файла софт.
Соотношение качества программы на Паскале ДВК и ассемблера - примерно на полпорядка хуже по объему и быстродействию на Паскале.
При применении плавучки - сопоставимо.
https://pic.maxiol.com/images2/1583881745.787615031.20200310230705049.png
Oleg N. Cher
11.03.2020, 06:48
засирать мозги молодежи этим самым Паскалем?Вы, видимо, понимаете программирование как кодирование на определённом языке, тогда как я смотрю на это шире. Обучающимся нужно прививать алгоритмическое мышление и системный подход. В этом свете фраза "засирать мозги Паскалем" для меня звучит как "дать обучающемуся стабильную хорошую базу для алгоритмирования, притом чистую и не перегруженную". Помните как изобретали разные Кумиры и Рапиры? Вот примерно для того же. А потом человек после небольшого изучения тонкостей синтаксиса легко овладеет любым средством.
Что же до того, что везде доминирует Си. Ну как сказать. Пока что как бы да, да и то везде это громко сказано. Даже в плане натива его уже потесняет Rust и, отчасти, Go. Другие языки, работающие через LLVM.
Я нашёл своё решение в виде Ofront+: синтаксис Оберона, трансляция в Си. Дёшево и сердито.
SuperMax
11.03.2020, 07:53
Как сказать?.. Возьмем писюк. Винды. Визуальный С/С++ от Микрософта был, есть и будет. Писюк, линюха. GCC. Был, есть и будет. Мобильные устройства. Не знаю, какой там С/С++, но он тоже был, есть и будет. Берем любой микроконтроллер. (Возможно) асм и какой-то С/С++, был, есть и будет. И где здесь Паскаль?
Нет, конечно, для некоторых из перечисленных платформ можно найти систему программирования на Паскале, но далеко не факт, что она сохранится в будущем - продастся в очередной раз фирма-производитель этой системы, а новый хозяин возьмет, да и прикроет этот Паскаль. Как в свое время прикрыли на фиг MUMPS - тоже были великолепные и язык, и системы программирования (для баз данных).
И зачем, спрашивается, засирать мозги молодежи этим самым Паскалем?
я потому и задал вопрос специалистам - "подскажите какие именно задачи удобнее/эффективнее решать на паскале сейчас ? те где он лучше других ЯП ?"
но так и не получил ответа.
видимо реально нет смысла на него тратить время.
На мобильных Java у Андроидов, и Swift у айфонов.
на андроидах есть выбор - С++ (Android NDK) или Java (Android SDK) (баловался простенькими приложениями)
на айфонах вроде тоже можно на С++, тк это тоже linux по-сути, но вопрос не изучал
Обычно на Паскале для ДВК писали штатные блондинки согласно ТЗ , например в областях :
1. Тестирование ИС на стендах
2. Софт с десятичной арифметикой, особенно плавучкой.
3. Прочий некритичный к быстродействию и объему выходного файла софт.
Соотношение качества программы на Паскале ДВК и ассемблера - примерно на полпорядка хуже по объему и быстродействию на Паскале.
При применении плавучки - сопоставимо.
собственно ожидаемо. с другой стороны надо понимать что Паскаль это язык высокого уровня со всеми вытекающими.
- - - Добавлено - - -
Вы, видимо, понимаете программирование как кодирование на определённом языке, тогда как я смотрю на это шире. Обучающимся нужно прививать алгоритмическое мышление и системный подход.
ну так можно сделать это сразу на C++ или Java (которая в чем-то является потомком Оберона)
программирование не должно быть абстрактным программированием ради красивой программы/структуры/концепции, оно должно решать задачи.
Что же до того, что везде доминирует Си. Ну как сказать. Пока что как бы да, да и то везде это громко сказано. Даже в плане натива его уже потесняет Rust и, отчасти, Go. Другие языки, работающие через LLVM.
надо понимать что Rust потенциально конкурирует с C++ а не с чистым Си.
про "потесняет"
https://habr.com/ru/post/309968/
https://eax.me/cpp-will-never-die/
итд
иначе говоря он еще немного поживет но перспективы не радуют.
Go - проприетарный язык, который будет жить пока его прокачивает гугл.
те использовать его стратегически опасно.
а чистый Си остается для быстродействующих задач.
Oleg N. Cher
11.03.2020, 08:47
В чистом виде подход конъюнктурщика: "а что я буду иметь с этого сейчас?". SuperMax, такие люди, как Вы, губят планету ради получения максимальной прибыли сегодня. А я думаю про отдалённые перспективы, во что надо инвестировать свои силы, чтобы получить достойный инструмент, за который не будет стыдно.
Да, сейчас Паскаль в самой интересной своей инкарнации - Free Pascal - отстаёт от разных прочих средств. Там сравнительно небольшая команда. Но всё-таки.
Си остаётся опасным языком, полным хаков. И сложность его растёт с появлением новых редакций.
- - - Добавлено - - -
И давайте прекратим спор, мы из разных миров. Это как сытый голодного не поймёт.
SuperMax
11.03.2020, 10:53
В чистом виде подход конъюнктурщика: "а что я буду иметь с этого сейчас?". SuperMax, такие люди, как Вы, губят планету ради получения максимальной прибыли сегодня. А я думаю про отдалённые перспективы, во что надо инвестировать свои силы, чтобы получить достойный инструмент, за который не будет стыдно.
а давайте без хамства и грязных инсинуаций ? оскорбления собеседника не делают Вам чести.
и если уж на самом говорить о спасении планеты, то программы на более высокоуровневом языке потребляют больше ресурсов и является злом в чистом виде, ибо требует гигабайтов оперативной памяти там, где задача на чистом СИ обойдется мегабайтами, не говоря о потребление процессорных ресурсов.
Одни люди выбирают адекватный инструмент под задачу. Другие любимым инструментом решают "любую" задачу.
SuperMax
11.03.2020, 11:31
Одни люди выбирают адекватный инструмент под задачу. Другие любимым инструментом решают "любую" задачу.
совершенно верно!
не надо бояться изучать новые системы и языки
ибо язык это инструмент (всего лишь, а не предмет поклонения) со своими особенностями и предназначением
Oleg N. Cher
11.03.2020, 12:11
Зачем хамство. Вы же выразили сами свою точку зрения, а я Вам в ответ свою. Просто обменялись видением вопроса.
требует гигабайтов оперативной памяти там, где задача на чистом СИ обойдется мегабайтамиВот именно. Значит нам нужен ЯВУ, который берёт из Си самое лучшее, но при этом позволяет избежать большинства его недостатков. Ибо Си архаичен, а люди любят решать задачи быстро, и пофиг на ресурсы железа.
Или вот, допустим, выкатывают разработчики нового супер-Андроида новый язык, на котором предлагается всё писать под него. Язык этот ничем не примечательный, но позволяет очень круто дёргать фишки этого самого супер-Андроида. Сообщество получает плюс один язык, на котором обязательно будут писать. Вот так и плодится современный треш. Потом вокруг него образуется движняк, начинают на нём обучать, постепенно вылизывают и делают из него что-то более или менее юзабельное. Но этого всего могло бы и не быть на самом деле. Если язык ничем особо не хорош, просто делает получше что-то одно, то имеет ли он право на жизнь?
Впрочем, я вижу точку зрения: "я начинал на Васике, потом кодил на Си и Яве. Значит Васик, Си и Ява подойдут всем". И понятно, что в этой схеме Паскаля нет и быть не может. А вот я начинал с асма, а Паскаль мне нравился на всех платформах, начиная со Спека и УКНЦ.
- - - Добавлено - - -
Кстати, программа на чистом Си, занимающая мегабайты, может упасть из-за утечек памяти или обращения по неверно инициализированному указателю. И убить людей, например. Или чего-то взорвать. А на более тяжёлом, но более безопасном языке - нет. Так что тут не так всё однозначно, как Вы пытаетесь показать.
SuperMax
11.03.2020, 12:45
Зачем хамство. Вы же выразили сами свою точку зрения, а я Вам в ответ свою. Просто обменялись видением вопроса.
Вот именно. Значит нам нужен ЯВУ, который берёт из Си самое лучшее, но при этом позволяет избежать большинства его недостатков. Ибо Си архаичен, а люди любят решать задачи быстро, и пофиг на ресурсы железа.
я не являюсь сторонником/или противником явы, я просто умею работать и с этим инструментом тоже.
Или вот, допустим, выкатывают разработчики нового супер-Андроида новый язык, на котором предлагается всё писать под него. Язык этот ничем не примечательный, но позволяет очень круто дёргать фишки этого самого супер-Андроида. Сообщество получает плюс один язык, на котором обязательно будут писать. Вот так и плодится современный треш. Потом вокруг него образуется движняк, начинают на нём обучать, постепенно вылизывают и делают из него что-то более или менее юзабельное. Но этого всего могло бы и не быть на самом деле. Если язык ничем особо не хорош, просто делает получше что-то одно, то имеет ли он право на жизнь?
это рынок.
есть задача - разработка мобильного приложения
и тут выигрывает тот кто решит эту задачу за меньшие время/деньги
я в свое время очень полюбил Clarion, ибо он позволял решать теже задачи, что решали люди на FoxPro, но значительно быстрее, функциональнее и качественнее - те мои программы летали даже на 286х (!)
а для моего магазина хватало 386й SX, причем количество наименований товара превышало 10тыс (1С на таком количестве на такой же машине очень жестко тупила). ну и поддержка сети появилась раньше.
так и сейчас - "надо быстро" и тут придется делать на яве и свифте
а потом, когда приложение "взлетит" будут деньги сделать тоже самое но более качественно.
Впрочем, я вижу точку зрения: "я начинал на Васике, потом кодил на Си и Яве. Значит Васик, Си и Ява подойдут всем". И понятно, что в этой схеме Паскаля нет и быть не может. А вот я начинал с асма, а Паскаль мне нравился на всех платформах, начиная со Спека и УКНЦ.
я же просил - не надо инсинуаций
и если уж говорить о моем стеке, то он сейчас
C / C++ начиная от PDP11 кончая Linux-ом и микроконтроллерами
Java
Oracle SQL / Oracle Java / Oracle PL/SQL
PHP
Javascript
Verilog HDL
HTML /CSS/HTML5
а вообще опыт шире
Basic
Focal
ассемблер PDP11
ассемблер х86
ассемблер C51
ассемблер Atmel 8bit
Pascal / Delphi
Fortran
всякие скриптовые языки
Clarion начиная CPD кончая 10-кой
FoxPro /Visual FoxPro
MSSQL SQL/T-SQL
Кстати, программа на чистом Си, занимающая мегабайты, может упасть из-за утечек памяти или обращения по неверно инициализированному указателю. И убить людей, например. Или чего-то взорвать. А на более тяжёлом, но более безопасном языке - нет. Так что тут не так всё однозначно, как Вы пытаетесь показать.
ЯП тут совсем не причем - речь идет о кривости рук программиста, я к тому, что надо выпрямлять руки, а не пенять на инструмент. те же утечки памяти или прочее это кривые руки в чистом виде.
и языки с автоматизированными сборщиками мусора не застрахованы от утечек.
Oleg N. Cher
11.03.2020, 12:51
Ну, мой опыт говорит, что есть языки, которые позволяют делать меньше ошибок, чем другие прочие языки.
Ваш стек не включает Паскаля, а значит у Вас не может к нему быть добрых чувств. Мы тут все собрались из ностальгии по старому, часто первому компьютеру. Такая же привязка идёт и к языку программирования.
Что до "рыночек всё порешает, надо бабло делать" - тут, как говорится, рыночек решает, каким странам умереть. Или те, кто за этим рыночком стоят и за ниточки дёргают. Ваше дело насколько Вы сможете приспособиться. Я лично жду, когда эта система мировой финансово-кредитной кабалы рухнет. И продолжаю оберонить, паскалить просто потому, что мне это нравится.
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot