Вход

Просмотр полной версии : Оберон/GCC для УКНЦ/БК



Oleg N. Cher
05.11.2021, 19:02
Встречайте GCC для УКНЦ в Оберон-одёжке, господа.

http://i.piccy_.info/i9/fe641065ca6c287af4940d300b359d2b/1636126821/93756/1320134/UKNC.png

GCC для Windows берём отсюда (https://www.1801bm1.com/files/pdp11/cross-compilers/).

Если кому ещё интересно это направление, буду рад. Особенно интересно, если кто-то пожелает помочь с разработкой библиотек. Особенно для графики.

Я пока что перетаскиваю свои наработки с OMSI Pascal в новое окружение.

Ссылка на подсистему:

https://github.com/Oleg-N-Cher/Pdp11Dev

Трудности:

1. Сгенеренный файл .sav хотя и работает в эмуляторе Зимина, но не определяется IDA как .sav, что-то там со структурой не то. Генерил его по советам из статьи: http://ancientbits.blogspot.com/2012/07/programming-barebones-pdp11.html

2. Образ диска скомпонован Хоботом так, что программа с именем Demuk автостартует и зациклена. Как поменять имя в автостарте или как её расциклить - я не знаю, Хобот тоже не особо делился.

3. Краем уха слышал, что есть отличия между процем КМ1801ВМ2 и каноническим PDP-11, и это может всплыть в GCC. Пересобирать его я не умею.

yu.zxpk
06.11.2021, 00:39
GCC ничего не знает про ВМ1/ВМ2.
Я почти 3 года тому пытался чуть поковыряться с добавкой опций в компилятор и маппинг на "фичи": какие инструкции можно использовать в коде. Потом "застрял", начал переделывать с чистого листа на более свежем GCC, начал писать тесты под результат компиляции на pdp11.
Но, "забил" из-за загрузки по работе.
Надо бы освежить...

Oleg N. Cher
06.11.2021, 22:05
yu.zxpk, это очень сложная, но ценная и важная работа, за которую мало кто может взяться, говорю по опыту.
Буду рад быть чем-то полезным хотя бы в плане мотивации.

У меня есть в планах переносить игры на Оберон и пробовать собирать для разных платформ, наверное сюда включим и УКНЦ. Но - игры простенького вида, логические, разные шарики и прочие. Может карточные. Но для тестирования GCC вполне сгодятся.

yu.zxpk, а это не Вы собирали GCC 10 для PDP-11?


GNU C17 (GCC) version 10.0.1 20200318 (experimental) (pdp11-aout)
compiled by GNU C version 7.3-win32 20180312, GMP version 6.1.0, MPFR ve
rsion 3.1.4, MPC version 1.0.3, isl version none
GGC heuristics: --param ggc-min-expand=30 --param ggc-min-heapsize=4096

Кстати, если не хочется ковыряться в потрохах GCC, есть вариант менять инструкции в сгенеренном GCC асм-файле. Если это конечно имеет смысл. Я знаю человека, который приспособил bkasm для такой замены. Только вот его связка не работает с библиотеками и объектниками в формате GCC. Просто асм в бинарь (для БК-0010).

yu.zxpk
07.11.2021, 00:38
Судя по дате (март 2020) - да, я собирал gcc с помощью mingw.
Нашел свои рабочие каталоги. Попробовал запустить тесты. Что-то падает на самых базовых тестах (работало на 1й версии патча).
Надо брать отпуск и ковыряться дальше.

Oleg N. Cher
07.11.2021, 08:27
Отпуск отпуском, это ж такое. Но контактами с Вами я бы обменялся, чтобы быть на связи.

Господа, не подскажете почему установка палитры влияет на нижнюю линию верхней служебной строки и на верхнюю нижней?

http://i.piccy_.info/i9/60ed7af803a1fd6e120fda7a8385a2e7/1636262716/121886/1320134/UKNC.png


void PALET (void)
{
asm(" .GLOBL NEWPAL \n"
" MOV R0, NEWPAL \n"
" MOV R1, NEWPAL+2 \n"
" MOV $BUF0, R0 \n"
" MOV $5, R1 \n"
" MTPS $0200 \n"
" BR 2$ \n"
"1$: MOVB (R0)+, @$0176676 \n"
"2$: TSTB @$0176674 \n"
" BPL 2$ \n"
" SOB R1, 1$ \n"
" MTPS $0 \n"
" RTS PC \n"
"BLK: .WORD 020*0400, 032, 02470, NEWPAL, 2 \n"
"BUF0: .WORD BLK, -1 \n"
"NEWPAL: .WORD 0b1110111011001100, 0b1010101010001000 \n"
);
} // PALET

void SetPalette (int c0, int c1, int c2, int c3)
{
asm(" BICB $0177760, 8(SP) \n"
" BICB $0177760, 6(SP) \n"
" MOVB 6(SP), R0 \n"
" ASH $4, R0 \n"
" ADD 6(SP), R0 \n"
" ASH $4, R0 \n"
" ADD 8(SP), R0 \n"
" ASH $4, R0 \n"
" ADD 8(SP), R0 \n"
" BICB $0177760, 4(SP) \n"
" BICB $0177760, 2(SP) \n"
" MOVB 2(SP), R1 \n"
" ASH $4, R1 \n"
" ADD 2(SP), R1 \n"
" ASH $4, R1 \n"
" ADD 4(SP), R1 \n"
" ASH $4, R1 \n"
" ADD 4(SP), R1 \n"
);
PALET();
} // SetPalette

BlaireCas
07.11.2021, 13:38
почему установка палитры влияет на нижнюю линию верхней служебной строки и на верхнюю нижней?
Судя по всему код пытается установить два слова палитры подряд в памяти ПП начиная с адреса @#2470 (переслать их туда). На дефолтной системе адрес верный.
А чего в ассемблерном листинге получилось после компиляции? Мож GCC как-то не так компильнул

А не, норм. с программой все в порядке. Можно проверить зайдя скажем в эмулятор. Нажать в стартовом меню УСТ затем УПР-@ это будет периферийный процессор, набрать 2470, стрелка вправо, ввести слово палитры первое, нажать стрелка вниз, ввести слово палитры второе, нажать стрелка вниз, нажать УПР-Ц, ИСП). Так и поменяет палитру вместе с верхней и нижней одними строчками. Нууу видимо так уж устроена дефолтная таблица строк. Главное что на экран действует.

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

Oleg N. Cher
07.11.2021, 15:41
А как закрасить весь экран цветом фона? Вот такая процедура не помогает:


void ClearDevice (void)
{
asm(" MOV R2, -(SP) \n"
" MOV $0176640, R0 \n"
" MOV $0176642, R1 \n"
" MOV $0100000, R2 \n"
" MOV R2, @R0 \n"
"1$: CLR @R1 \n"
" INC @R0 \n"
" SOB R2, 1$ \n"
" MOV (SP)+, R2 \n"
);
} // ClearDevice

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

Мне вообще пока даже непонятно: почему при четырёхцветном режиме у служебных строк остаётся не тот же фон. Или для них надо отрубать третью плоскость отдельным кодом?

BlaireCas
07.11.2021, 16:00
не помогает

у служебных строк остаётся не тот же фон
Процедура на вид верная и очищает планы 1,2 видеопамяти. Просто из центрального процессора через 176640/176642 ты можешь поменять лишь два цветовых плана памяти. А третий (дефолтно он синий после загрузки компа) - поменять не выйдет через эти регистры.
После загрузки компа центральная часть экрана закрашена синим. А служебные строки - черным. Ты через 176642 делаешь очистку и очистишь только 2 байта из трех. А третий меняется через похожий регистровый способ, но только из периферийного процессора.
Вот поэтому и не очистить вышеприведенным кодом вообще весь экран.

Надо либо лезть в ПП и выполнять там кусок кода (не прям мегасложно).

Либо использовать (я сам не знаю какие) скажем ESC-команды терминала для того чтобы одна из процедур обработки терминала в ПП сама покрасила/очистила. Кстати этими ESC командами ЕМНИП можно линии кружки и пр. рисовать. Ну чтобы не изобретать велосипед и не реализовывать брезенхема или что-то навроде для линии. https://zx-pk.ru/threads/31436-kody-terminala-uknts.html

nzeemin
07.11.2021, 19:54
А как закрасить весь экран цветом фона?

Если из ЦП, то примерно любой мой проект на УКНЦ:


MOV #GAMESC, R1 ; Строка для подготовки игрового экрана
CALL PRINT
CALL PAUSE ; подождём пока очистится экран
...
MOV #EXITSC, R1 ; Строка очистки экрана перед выходом
CALL PRINT
.EXIT

; Подпрограмма: Печать строки: R1 = адрес строки, строка завершается 0; портит R0
PRINT:
PR0: MOVB (R1)+, R0 ; Конец строки?
BEQ PR2 ; да => завершаем
PR1: TSTB @#177564 ; Источник канала 0 готов?
BPL PR1 ; нет => ждём
MOV R0, @#177566 ; передаём символ в канал 0
BR PR0
PR2: RETURN

;Подпрограмма: пауза после очистки экрана чтобы ПП закончил работу
PAUSE: ; Pause to let PPU finish the previous commands
MOV #177777, R5
PAUSE0: NOP
SOB R5, PAUSE0
RETURN

GAMESC: ; Строка подготовки игрового экрана
.BYTE 033,246,62 ; Формат экрана 40x24
.BYTE 033,240,61 ; Цвет символа
.BYTE 033,241,60 ; Цвет знакоместа 0
.BYTE 033,242,60 ; Цвет фона 0
.BYTE 14 ; Clear screen
.BYTE 0
EXITSC: ; Строка очистки экрана перед выходом
.BYTE 33,246,061 ; Формат экрана 80x24
.BYTE 33,240,67 ; Цвет символа
.BYTE 33,241,61 ; Цвет знакоместа 1
.BYTE 33,242,61 ; Цвет фона 1
.BYTE 14 ; Очистить экран
.ASCII /BYE!/
.BYTE 0
.EVEN

Oleg N. Cher
07.11.2021, 21:47
Никита, это никак не решает мою проблему. После вывода GAMESC и установки цветного фона верхняя и нижняя линии как были - так и остаются.

Ваш вариант кода оставляет непогашенным курсор и надпись Лат. У меня есть коды, которые гасят и убирают:


"INIT$: .BYTE 033, 0246, 062 \n" // Screen mode 40x24
" .BYTE 033, 045, 041, 061 \n" // Text mode 1
" .BYTE 033, 0133, 060, 073, 060, 0162 \n"
" .BYTE 033, 045, 041, 060 \n" // Graph
" .BYTE 0 \n"

Подробностей не знаю, но как-то работает.

Никита, BlaireCas, вы умные ребята. А я не ставлю цели изучить УКНЦ в потрохах, я просто хочу немного её потрогать. И мне нужна простая вещь: убрать эти дебильные линии и сделать фон служебных строк тем же цветом, что и остальной экран. По возможности не тыкайте в доки и не говорите много умных букаф, лучше кажите рабочий код. Спасибо за понимание.

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

BlaireCas
08.11.2021, 08:15
нужна простая вещь: убрать эти дебильные линии


.mcall .print, .ttyout, .exit

TINITG: .asciz <33>"%!1"<33>"[0;0r"
TGRAFR: .asciz <33>"%!0"
TCOLRS: .asciz <33>"LI@@"<47>"@@"<40>"@@"<40>
TTEXTR: .asciz <33>"%!3"<14>

TLINCL: .asciz <33>"ML@@"<47>
TPOINT: .asciz <33>"UH"<40><140><140><40><100>
TLINE: .asciz <33>"UG!ao M"

.even

START:
; инициализация
.print #TINITG ; упорядочить таблицу строк
.print #TGRAFR ; графический режим
.print #TCOLRS ; цвета символа, знакоместа, экрана
.print #TTEXTR ; в текстовый режим & очистить экран

.exit

.END START


Переводит экран в графический чтобы выставить цвета символа: белый, знакоместа: черный, экрана: черный
Затем переводит обратно в символьный и очищает экран.
Дебильные линии должны пропасть ибо весь экран будет черным.
Для твоих целей наверное нужно выполнить печать этих последовательностей + добавить опять переход в графический режим и что-то начать рисовать.
Вся цель этого действа - очистить синий фон с экрана, он вызывает эти твои линии при установке своей палитры.

Насчет того как убрать служебные строки - задумано разработчиками чтобы они были. Вот и не трожь их пока-что.

Oleg N. Cher
08.11.2021, 23:57
Благодарю, но не помогло. УКНЦ настолько непростая машинка, что нам надо даже устаканить термины "текстовый" и "графический".

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

Пока фон рабочей площади чёрный - линии незаметны. Как только он становится цветной (мне нужно красный) - они сразу как здрасьте.

BlaireCas, а Вы тестировали эти последовательности или просто предполагаете, что они должны убирать линии?

Может всё-таки косяк в процедуре установки палитры? (её код я привёл выше)

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

http://i.piccy_.info/i9/599e302be8548a2dd2aad1e419f43490/1636404969/275458/1320134/UKNC.png

В общем, мы хотели сделать для УКНЦ одну программку, но вот эти линии конкретно отбили всю охоту.

nzeemin
09.11.2021, 00:31
Переформулирую задачу: можно ли установить свой фон в служебных строках? И даже не фон, а наверное всё-таки палитру. Кстати, а как появляется эта линия? Почему для фона служебных строк работает одна палитра, а для этих линий совсем другая?

Экран УКНЦ организован таким образом - через код в ROM для ПП.
Сначала служебная строка, потом основная часть, потом нижняя служебная строка. Служебные строки обычно имеют масштаб x2, основной экран масштаб x1. Палитры также могут быть разными.
Между основной частью и служебными строками есть по одной пустой строке.
Сделано это так из-за того, как работает видео. В одной строке нельзя переключить и масштаб (x1/x2/x4/x8) и палитру. Поэтому сначала переключается масштаб, а в следующей строке - палитра. В результате и сверху и снизу остаётся по пустой строке.

Можно в отладчике остановится и выполнить в консоли отладчика команду "udl" - она сохранит файл displaylist.txt - в нём вы хорошо увидите эти разделительные строки, с командами scale. Для загрузочного меню:


28 002454 ------ ------ 176450 002462 next: 4-word at 002460
29 002460 001007 000007 176520 002476 scale 1; next: 4-word at 002470
30 002470 135230 177334 177460 002500 palette;
31 002500 ------ ------ 100000 002504

294 004534 ------ ------ 151060 006742 next: 4-word at 006740
295 006740 000000 000027 177460 006756 scale 2; next: 4-word at 006750
296 006750 021000 063104 176570 006760 palette;
297 006760 ------ ------ 176640 006764


Но эти пустые строки куда-то всё-равно указывают. В норме они указывают в стандартные адреса экрана.
Моё предположение, что на том диске что у вас, какая-то программа при загрузке меняет адреса этих двух строк, и в результате они указывают на заполненный участок, поэтому становятся видимы.
Проверить это опять же можно командой "udl". Либо можно взять использовать другой образ загрузочного диска.

Oleg N. Cher
09.11.2021, 02:29
Предположение проверил: взял другой загрузочный диск с RT-11 (https://archive.pdp-11.org.ru/ukdwk_archive/ukncbtlwebcomplekt/RT1157C_UKNCsoftfixed/system.dsk) и запустил с него. То же самое - красная полоска.

76390

Реальщики с цветным УКНЦ есть? Можете потестить на реальном железе?

Ну и вообще ваши советы категорически приветствуются. Мысль в основе: раз нам игнорировать служебные строки, то хрен с ними, только не надо тогда уж полоски на них рисовать странными цветами. Здравая же мысль.

BlaireCas
09.11.2021, 09:52
Реальщики с цветным УКНЦ есть? Можете потестить на реальном железе?
https://i.imgur.com/xveLAXv.jpg

только не надо тогда уж полоски на них рисовать странными цветами
Почему странными? Полоски нарисованы черным цветом. Я в коде выше всего-лишь закрашиваю весь экран черным чтобы было под цвет полосок.
А ты меняешь палитру черного на зеленый - уупс, полоска стала зеленой как и ожидалось.
Чтобы убрать надоедливые линии - придется делать свою собственную таблицу вывода строк. А дай исходники этого DEMUK и скажи как их компилять, добавлю процедуру установки таблицы всех 288 строк экрана, пропадут и служебные строки до кучи.
Боюсь вылезут другие вопросы навроде "а как теперь напечатать текст в нижней части экрана", а почему встроенная процедура рисовки линий рисует не по всему экрану, а почему по УСТ опять все похерилось и т.д. Но строки точно пропадут :)


результате они указывают на заполненный участок, поэтому становятся видимы
Они (эти две строчки) просто отрисованы черным и используют ту-же палитру что и основной экран. Разумеется если в палитре заменить черный на зеленый и т.д. - они становятся заметны скажем так

Radon17
09.11.2021, 12:20
Реальщики с цветным УКНЦ есть? Можете потестить на реальном железе?
https://pic.maxiol.com/thumbs2/1636449613.1559558028.211109121553045.png (https://pic.maxiol.com/?v=1636449613.1559558028.211109121553045.png&dp=2)

(У меня GRB машина)

BlaireCas
09.11.2021, 12:33
Так.. код в принципе уже не нужен, сам разобрался как сделать сишную программку под этот GCC (боже мой, он полгига занял.. ужс и кошмар компилять полгиговым компилером под проц с 64кб памяти)

Кусок кода который устанавливает свою таблицу строк (все 288 строк экрана) по адресам видеопамяти начиная с 100000(8), делает разрешение 320х288, убирает курсор, очищает кусок видеопамяти по 288-ю строку
Внимание (!) - от такой записи ассемблера вытекут глаза.


asm(
"\
#mov $MSG000, R0 \n\
#emt $0351 # .print hello world \n\
# \n\
# init screen \n\
mov $0B1000100010001000, PAL01+2 # palette 1st word \n\
mov $0B1111100010001000, PAL02+2 # palette 2nd word \n\
mov $0B0000000000010000, RES01+2 # cursor \n\
mov $0B0000000000010111, RES02+2 # resolution & luminance \n\
mov $PPUSTA, R4 # PPU code addr \n\
# mov $<PPUEND-PPUSTA/2>, R5 # PPU code length in words \n\
# dont know how to write that in gcc asm \n\
mov $PPUEND, R5 \n\
sub $PPUSTA, R5 \n\
clc \n\
ror R5 \n\
jsr PC, PPRUN # allocate PPU memory, copy, run \n\
jsr PC, PPRELE # release PPU memory \n\
# init screen end \n\
# \n\
emt $0350 # .exit \n\
\n\
MSG000: .asciz \"Hello world!\" \n\
.even \n\
\n\
# PPU message \n\
PPMSG: .WORD PPARR # address of beginning of array \n\
.WORD 0177777 # end of transmission \n\
\n\
# PPU data exchange array \n\
PPARR: .BYTE 0 # return value (0 - OK) \n\
PPCMD: .BYTE 0 # command \n\
.WORD 032 # device type (032 - PPU mem) \n\
PPAPP: .WORD 0 # address for PPU \n\
PPACP: .WORD 0 # address for CPU \n\
PPLEN: .WORD 0 # length in words \n\
\n\
# send command to PPU \n\
PPSEN: mov R0, -(SP) \n\
mov R1, -(SP) \n\
mov $PPMSG, R0 # array address \n\
mov $05, R1 # bytes to send+1 (sending from PPMSG) \n\
br 1$ \n\
2$: movb (R0)+, @$0176676 \n\
1$: tstb @$0176674 # test if we are ready to send \n\
bpl 1$ # cycle if >= 0 (not set last bit in byte) \n\
sob R1, 2$ \n\
mov (SP)+, R1 \n\
mov (SP)+, R0 \n\
rts PC \n\
\n\
# send and start PPU code \n\
# R4 - start addr in CPU \n\
# R5 - length / 2 \n\
PPRUN: movb $1, PPCMD # 1 - allocate memory \n\
mov R5, PPLEN \n\
jsr PC, PPSEN \n\
tstb PPARR # test if allocate success \n\
beq 1$ # 0 - OK \n\
rts PC \n\
1$: movb $020, PPCMD # 20 - write to PPU mem \n\
mov R5, PPLEN \n\
mov R4, PPACP \n\
jsr PC, PPSEN \n\
movb $030, PPCMD # 30 - run \n\
jsr PC, PPSEN \n\
rts PC \n\
\n\
# release PPU memory in case of something.. \n\
PPRELE: movb $2, PPCMD # 2 - release memory \n\
jsr PC, PPSEN \n\
rts PC \n\
\n\
####### PPU CODE HERE ####### \n\
PPUSTA: jsr PC, PPCLRV \n\
# construct our own lines table \n\
mov PC, R0 \n\
add $PPLIN1-., R0 \n\
add $010, R0 # align addr with 8. bytes \n\
bic $07, R0 \n\
mov R0, R2 # save addr and use later \n\
# 1st element - set palette (YRGB YRGB YRGB YRGB) \n\
PAL01: mov $0B1101110010011000, (R0)+ \n\
PAL02: mov $0B1111111010111010, (R0)+ \n\
clr (R0)+ # vaddr is not used here \n\
mov R0, (R0) # next element addr \n\
add $2, (R0) # \n\
bis $2, (R0)+ # 2 = 010 - next element is scale&cursor \n\
# 2nd line - set scale, lumi and cursor \n\
RES01: mov $0B0000000000010000, (R0)+ # no cursor \n\
RES02: mov $0B0000000000010111, (R0)+ # 320x288, max luminance (..00111-640, ..10111 - 320)\n\
clr (R0)+ # vaddr is not used here \n\
mov R0, (R0) \n\
add $2, (R0)+ # next element is 2-words \n\
# 16 not used lines \n\
mov $16, R3 \n\
10$: clr (R0)+ \n\
mov R0, (R0) \n\
add $2, (R0)+ \n\
sob R3, 10$ \n\
# next 288 'main' lines from top \n\
mov $0100000, R1 \n\
mov $288, R3 \n\
20$: mov R1, (R0)+ \n\
mov R0, (R0) \n\
add $2, (R0)+ \n\
add $80, R1 \n\
sob R3, 20$ \n\
# set new lines table \n\
clr @$0270 \n\
bis $06, R2 # first line is palette \n\
mov R2, @$0272 # saved addr \n\
rts PC \n\
\n\
# clear vram \n\
PPCLRV: mov $0177010, R4 \n\
mov $0177012, R2 \n\
mov $0177014, R5 \n\
mov $0100000, R3 \n\
mov R3, (R4) \n\
30$: clr (R2) \n\
clr (R5) \n\
inc (R4) \n\
sob R3, 30$ \n\
rts PC \n\
\n\
# lines table data \n\
PPLIN1: .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \n\
.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \n\
.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \n\
.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \n\
.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \n\
.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \n\
.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \n\
.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \n\
.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \n\
.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \n\
.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \n\
.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \n\
.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \n\
.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \n\
.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \n\
.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \n\
.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \n\
.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \n\
.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \n\
.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \n\
.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \n\
.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \n\
.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \n\
.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \n\
.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \n\
.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \n\
.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \n\
.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \n\
.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \n\
.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \n\
.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \n\
PPUEND: \n\
##### PPU CODE ENDS ##### \n\
"
);

Что делает код: выделяется область памяти в периферийном процессоре, копируется туда кусок кода+даты из центрального, запускается. Код в периферийном процессоре собирает таблицу строк новую и прописывает ее адрес в ячейки памяти @#370(8), @#372(8). Дальше я освобождаю выделенную память, но это лучше не делать.

Думаю там легко разобраться куда подставить числа палитры/разрешения и курсора. Они в самом начале mov-ятся в нужные ячейки.
Зачем столько word-ов - а туда таблица строк новая прописывается (я х.з. как в этом чертовом asm-е написать .blkw ибо он заругался чегой-то).

И при переделывании на процедуру - нужно наверное убрать команду: jsr PC, PPRELE # release PPU memory. Думается о свобождать память в ПП не надо, иначе какой-либо вызов чего еще может затереть эту новую таблицу строк.
Но тогда вызывать это хозяйство придется лишь один раз, а не на каждый чих. Иначе память в ПП закончится. (она каждый раз будет allocate-ить новый кусок памяти).
Ну и это: emt $0350 # .exit - заменить на rts PC ибо я в виде .sav тестил и поэтому в конце макрос .exit прописал.

yu.zxpk
09.11.2021, 16:34
yu.zxpk, это очень сложная, но ценная и важная работа, за которую мало кто может взяться, говорю по опыту.
Буду рад быть чем-то полезным хотя бы в плане мотивации.

У меня есть в планах переносить игры на Оберон и пробовать собирать для разных платформ, наверное сюда включим и УКНЦ. Но - игры простенького вида, логические, разные шарики и прочие. Может карточные. Но для тестирования GCC вполне сгодятся.

yu.zxpk, а это не Вы собирали GCC 10 для PDP-11?


GNU C17 (GCC) version 10.0.1 20200318 (experimental) (pdp11-aout)
compiled by GNU C version 7.3-win32 20180312, GMP version 6.1.0, MPFR ve
rsion 3.1.4, MPC version 1.0.3, isl version none
GGC heuristics: --param ggc-min-expand=30 --param ggc-min-heapsize=4096

Кстати, если не хочется ковыряться в потрохах GCC, есть вариант менять инструкции в сгенеренном GCC асм-файле. Если это конечно имеет смысл. Я знаю человека, который приспособил bkasm для такой замены. Только вот его связка не работает с библиотеками и объектниками в формате GCC. Просто асм в бинарь (для БК-0010).

Посидел пару дней, разобрался со старыми наработками, сделал поддержку опций `-mbm1` (1801BM1) и `-mbm2` (1801BM2) в GCC 10 (20200318). То есть относительно старая версия, поскольку последняя стабильная - 11.2.
Выложил сборку под Windows, сделанную MING-W64:

http://www.1801bm1.com/files/pdp11/cross-compilers/ming-w64-pdp11-aout-20211109.zip

Проверяйте.
Если кому нужна сборка под Linux или MacOS - маякуйте.
Примеры использования кросс-компилятора есть у меня в репке:

https://github.com/yshestakov/pdp11-toolchain/tree/master/hello-gcc

Oleg N. Cher
09.11.2021, 18:10
BlaireCas, код интересный, я уже даже не надеялся поюзать полный экран.
А можно просто перепрограммировать палитру для этих мешающих нам линий на ту же, что у служебных строк?

Пока держу в голове мысль сделать всё минимальным кодом - просто замаскировать линии, хотя Ваш код тоже пойдёт в работу - сделаю версию библиотеки CGLIB для полного экрана.

yu.zxpk, мега-респект за Ваш мега-труд!

Мой знакомый освоил GNU Pascal для генерации кода для БК-0010, но он использует очень старый GCC 3.x. Говорит, что GNU Pascal под более новый GCC не собирается. Могли бы Вы его проконсультировать? Можно же до кучи к Си получить ещё и Паскаль. Хотя мне и Оберона с головой)

yu.zxpk
09.11.2021, 19:28
BlaireCas, код интересный, я уже даже не надеялся поюзать полный экран.
А можно просто перепрограммировать палитру для этих мешающих нам линий на ту же, что у служебных строк?

Пока держу в голове мысль сделать всё минимальным кодом - просто замаскировать линии, хотя Ваш код тоже пойдёт в работу - сделаю версию библиотеки CGLIB для полного экрана.

yu.zxpk, мега-респект за Ваш мега-труд!

Мой знакомый освоил GNU Pascal для генерации кода для БК-0010, но он использует очень старый GCC 3.x. Говорит, что GNU Pascal под более новый GCC не собирается. Могли бы Вы его проконсультировать? Можно же до кучи к Си получить ещё и Паскаль. Хотя мне и Оберона с головой)


Пожалуйста :)
На предмет GNU Pascal. Как я понял, с 2011 года проект не поддерживается, потому его выкинули из GNU Compiler Collection
https://en.wikipedia.org/wiki/GNU_Pascal

Рекомендуют смотреть на Free Pascal.
Портирование старого GNU Pascal на новый GCC - точно за пределами моих возможностей.

В данный момент я вижу поддержку следующих языков прогаммирования в GCC, помимо "включенных" С и C++ в моей сборке pdp11-aout-gcc:

gcc/ada/config-lang.in:language="ada"
gcc/brig/config-lang.in:language="brig"
gcc/c/config-lang.in:language="c"
gcc/cp/config-lang.in:language="c++"
gcc/d/config-lang.in:language="d"
gcc/fortran/config-lang.in:language="fortran"
gcc/go/config-lang.in:language="go"
gcc/jit/config-lang.in:language="jit"
gcc/lto/config-lang.in:language="lto"
gcc/objc/config-lang.in:language="objc"
gcc/objcp/config-lang.in:language="obj-c++"

yu.zxpk
09.11.2021, 23:59
Сделал порт на свежий GCC-11.2.1

gcc/build-zx-pk$ ./gcc/xgcc --version
xgcc (GCC) 11.2.1 20211109
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


Пересобранные бинарники под Windows будут чуть позже.

Oleg N. Cher
10.11.2021, 03:24
Да, это отличная новость. Я сразу беру в разработку тестировать.

yu.zxpk, правильно ли я понимаю, что с активной опцией `-mbm1` или `-mbm2` GCC не будет генерировать команд вроде SETD/SETI ?

Дело в том, что я забыл упомянуть ещё про одну трудность: как только я определяю функцию main, то для неё сразу создаётся код с командами SETD/SETI. Приходится вместо main писать start и в начале главного модуля пихать функцию на асме для перехода к метке _start. Костыль конечно, но пока не придумал ничего лучше.

http://i.piccy_.info/i9/3d752e2a950e6538222474e87f254094/1636503684/54850/1320134/GCC.jpg

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

P.S. Есть здесь любители БК-0010 и 0011? Подскажите: как лучше получить бинарник для загрузки полученного от GCC кода в эмуль БК?

yu.zxpk
10.11.2021, 11:15
Да, это отличная новость. Я сразу беру в разработку тестировать.

yu.zxpk, правильно ли я понимаю, что с активной опцией `-mbm1` или `-mbm2` GCC не будет генерировать команд вроде SETD/SETI ?

Дело в том, что я забыл упомянуть ещё про одну трудность: как только я определяю функцию main, то для неё сразу создаётся код с командами SETD/SETI. Приходится вместо main писать start и в начале главного модуля пихать функцию на асме для перехода к метке _start. Костыль конечно, но пока не придумал ничего лучше.


Да, я в курсе. Сейчас, как workaround, надо добавить в команду опцию `-msoft-float`
Постараюсь это исправить сегодня