nedoPC.org

Community for electronics hobbyists, established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 11 Dec 2024 22:15



Reply to topic  [ 120 posts ]  Go to page Previous  1 ... 3, 4, 5, 6, 7, 8  Next
[SDK] Старая тема про nedoPC SDK (август 2004) 
Author Message
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 23468
Location: Silicon Valley
Reply with quote
Shaos wrote:
Тут по ходу получается, что то, что я все эти годы считал сборкой для платформы Специалист (spec и позже spets) на самом деле является сборкой для Специлист-MX (я ещё в стародавние времена пользовался эмулятором Шевцова для отладки) - в настоящий момент оно немного сломанное, но я думаю сегодня вечерком я это дело доковыряю...
Доковырял :lol:
Attachment:
Screenshot from 2024-07-14 23-55-59.png
Screenshot from 2024-07-14 23-55-59.png [ 17.89 KiB | Viewed 1406 times ]

Теперь таргет называется spetsmx (также пришлось поправить spr_comp.c чтобы он понимал это слово) - при этом генерируется 2 файла - ${project}.CPU и ${project}.I80 для запуска в эмуляторе Шевцова (см. скриншот выше) - вот обновлённый скрипт DEFAULT.N:

Code:
#!./nedomake
# Universal NEDOMAKE script to build any nedoPC SDK example
\say Build ${project}
$src=MAIN
$spr=TILES
\if ${1} : checksys
\goto radio # by default it's Radio-86RK
\label checksys
# i8080 targets:
\if ${1}==radio   : radio
\if ${1}==orion   : orion
\if ${1}==spetsmx : spetsmx
\if ${1}==speccy  : speccy
# z80 targets:
\if ${1}==trdos   : speccy2
\if ${1}==estex   : sprinter
# other targets:
\if ${1}==clean   : clear
\say ERROR : unknown target "${1}"
\exit
\label clear
\remove ${spr}.R
\remove ${src}.RO
\remove ${src}.BIN
\remove ${project}.EXE
\remove ${project}.I80
\remove ${project}.CPU
\remove ${project}.BIN
\remove ${project}.bin
\remove ${project}.tap
\remove ${project}.trd
\remove ${project}$.bru
\goto endclean
\label radio
$syst=radio
\goto i8080
\label orion
$syst=orion
\goto i8080
\label spetsmx
$syst=spetsmx
\label i8080
$proc=i8080
$abin=#0000
$aspr=#5000
$avar=#6000
\goto action
\label speccy
$proc=i8080
\goto speccy1
\label speccy2
$proc=z80
\label speccy1
$syst=speccy
$abin=#8000
$aspr=#D000
$avar=#E000
\goto action
\label sprinter
$syst=sprinter
$proc=z80
$ahdr=#3F00
$abin=#4100
$aspr=#9000
$avar=#A000
\label action
\remove ${spr}.BIN
\remove ${spr}.R
spr_comp -S${syst} -O${aspr} ${spr}.SPR
\remove ${src}.RO
robbyc -p -l ${src}.R
\need ${src}.RO
\remove ${src}.A
robbycc ${src}.RO -P${proc} -S${syst} -O${abin} -B${avar}
\need ${src}.A
\remove ${src}.BIN
\if ${proc}!=z80 : rasm
\remove ${src}.bin
zmac ${src}.A
\need ${src}.bin
\rename ${src}.bin ${src}.BIN
\remove ${src}.lst
\goto bincont
\label rasm
rasm ${src}.A -t${EXEPATH}LIB/I8080/__RULES
\label bincont
\need ${src}.BIN
\if ${syst}==radio    : endradio
\if ${syst}==sprinter : sprinterexe
\remove ${project}.bin
\glue ${project}.bin ${src}.BIN ${abin}
\glue ${project}.bin ${spr}.BIN ${aspr}
\ltrim ${project}.bin
\need ${project}.bin
\if ${syst}==spetsmx : endspetsmx
\if ${syst}==speccy : endspeccy
# it must be orion at this point
bin2bru ${project}.bin ${abin}
\need ${project}$.bru
\remove ${project}.bin
\goto endclean
\label endspeccy
\if ${1}==trdos : endtrdos
# it must be tap at this point
\remove ${project}.tap
bin2tap ${project}.bin ${abin} ${EXEPATH}LIB/Z80/SPECCY/TAPE
\need ${project}.tap
\remove ${project}.bin
\goto endclean
\label endtrdos
\remove ${project}.trd
\remove ${project}.trl
\append ${project}.trl NORMAL "${project}"
\append ${project}.trl TRUNCATED
\append ${project}.trl hobeta "${EXEPATH}LIB/Z80/SPECCY/BOOT","boot","B"
\append ${project}.trl binary "${project}.bin","robot","C",32768
bin2trd ${project}.trl
\need ${project}.trd
\remove ${project}.trl
\remove ${project}.bin
\goto endclean
\label sprinterexe
\remove ${project}.EXE
\glue ${project}.EXE ${EXEPATH}LIB/Z80/SPRINTER/HEAD.BIN ${ahdr}
\glue ${project}.EXE ${src}.BIN ${abin}
\glue ${project}.EXE ${spr}.BIN ${aspr}
\ltrim ${project}.EXE
\need ${project}.EXE
\goto endclean
\label endspetsmx
\rename ${project}.bin ${project}.I80
\need ${project}.I80
\remove ${project}.CPU
\append ${project}.CPU 0000
\append ${project}.CPU 0000
\append ${project}.CPU SPMX.ROM
\need ${project}.CPU
\goto endclean
\label endradio
\rename ${src}.BIN ${project}.BIN
\need ${project}.BIN
\label endclean
\remove ${spr}.BIN
\remove ${spr}.R
\remove ${src}.BIN
\remove ${src}.LST
\remove ${src}.R!
\remove ${src}.RO
\remove ${src}.RLS
\remove ${src}.A

Теперь надо все остальные примеры оформить в том же виде, что и MAPGEN (т.е. в поддиректориях директория PRJ) и можно релизить nedoPC SDK v2.0 :rotate:

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


15 Jul 2024 00:11
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 23468
Location: Silicon Valley
Reply with quote
Вот ещё скриншотов с разных эмулей - мой эмулятор Ориона Orionix:

Attachment:
Screenshot from 2024-07-15 00-21-03.png
Screenshot from 2024-07-15 00-21-03.png [ 13.83 KiB | Viewed 1406 times ]

Мой эмулятор Спринтера SprintEm:

Attachment:
Screenshot from 2024-07-15 00-23-20.png
Screenshot from 2024-07-15 00-23-20.png [ 14.27 KiB | Viewed 1406 times ]

Эмулятор спектрума Fuse с TRD версией сборки (где шрифт nedoPC):

Attachment:
Screenshot from 2024-07-15 00-22-01.png
Screenshot from 2024-07-15 00-22-01.png [ 16.49 KiB | Viewed 1406 times ]

Эмулятор спектрума Fuse с TAP версией сборки (где шрифт родной ZX):

Attachment:
Screenshot from 2024-07-15 00-22-28.png
Screenshot from 2024-07-15 00-22-28.png [ 15.62 KiB | Viewed 1406 times ]

Ну и скриншот с моего эмулятора Pseudo-86RK я уже приводил на позапредыдущей странице:

Image

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


15 Jul 2024 00:28
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 23468
Location: Silicon Valley
Reply with quote
Shaos wrote:
Shaos wrote:
Тут по ходу получается, что то, что я все эти годы считал сборкой для платформы Специалист (spec и позже spets) на самом деле является сборкой для Специлист-MX (я ещё в стародавние времена пользовался эмулятором Шевцова для отладки) - в настоящий момент оно немного сломанное, но я думаю сегодня вечерком я это дело доковыряю...
Доковырял :lol:

Image

Теперь таргет называется spetsmx (также пришлось поправить spr_comp.c чтобы он понимал это слово) - при этом генерируется 2 файла - ${project}.CPU и ${project}.I80 для запуска в эмуляторе Шевцова (см. скриншот выше)...

Хотя я смотрю поддержка Специалиста у меня появилась 20 января 2002 года в RW1P2 v1.3 и Специалист там был ЧЁРНО-БЕЛЫМ т.к. запись в порт #FFF8 (адрес порта цвета в Специалисте-MX) была закомментирована! т.е. бинарник мог работать и в эмуляторе Шевцова и в эмуляторах обычного Специалиста, оставаясь чёрно-белым и там, и тут. Далее в RW1P2 v1.4 (12 июня 2002 года) у меня появился хитрый цвет записываемый по адресу #FFFE ( похоже на "восьмицвет" стандартного Специалиста как описано вот тут: viewtopic.php?p=103706#p103706 ) и в этот момент оно перестало работать в эмуляторе Шевцова, т.к. в MX по этому адресу находятся совсем другие штуки! Далее оно жило с записью в #FFFE пока я вчера не сделал обычный полноцвет MX (4-битный цвет символов и 4-битный цвет фона) и не вернул запись цвета в #FFF8 - теперь оно снова работает в эмуляторе Шевцова, но НЕ работает в обычном Специалисте - наверное я оставлю эту новую платформу spetsmx как есть сейчас, но верну обычный spets который по-умолчанию будет чёрно-белый, как было в версии 1.3, а "пятицвет" или "восьмицвет" можно будет включить программно, если нужно (т.к. информация о цвете будет оставаться в бинарнике спрайтов)...

P.S. Хотя нет - у меня всё-таки был реализован "пятицвет":
Code:
RGB:  CPI #01
      JNZ RGB1
      MVI_A, #C0
      RET
RGB1: CPI #02
      JNZ RGB2
      MVI_A, #80
      RET
RGB2: CPI #04
      JNZ RGB3
      MVI_A, #40
      RET
RGB3: XRA_A
      RET
но сильно выборочный - только если основные цвета заданы оно конвертирует - надо будет переписать...

P.P.S. Вернул spets отключив в нём цвет - вот так это выглядит в эмуляторе Шевцова:


Attachments:
Screenshot from 2024-07-15 23-08-40.png
Screenshot from 2024-07-15 23-08-40.png [ 19.39 KiB | Viewed 1365 times ]

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973
15 Jul 2024 17:34
Profile WWW
Maniac
User avatar

Joined: 14 Oct 2023 06:59
Posts: 292
Reply with quote
неплохо и обновить DOSBox до 0.74.3

_________________
uselessretro.blogspot.com


15 Jul 2024 20:04
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 23468
Location: Silicon Valley
Reply with quote
shiny wrote:
неплохо и обновить DOSBox до 0.74.3

ну уж какой дебиян даёт такой и юзаю :lol:

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


15 Jul 2024 20:07
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 23468
Location: Silicon Valley
Reply with quote
Shaos wrote:
Вернул spets отключив в нём цвет - вот так это выглядит в эмуляторе Шевцова:

Image
В данном случае всё выглядит более-менее прилично только потому, что в описателе спрайтов/тайлов стоит спецкоммент ! у тех квадратиков, которые надо инвертировать в случае сборки для чёрно-белого варианта :mrgreen:
Code:
;8x8-2/16

SP_E    DB  #55,#AA,#55,#AA,#55,#AA,#55,#AA,#F0 ;.!
SP_H    DB  #55,#BE,#7F,#FE,#7F,#FE,#7D,#AA,#F0 ;O!
SP_S    DB  #00,#2A,#54,#2A,#54,#2A,#54,#00,#07 ;@
SP_B    DB  #00,#54,#7E,#54,#54,#7E,#54,#00,#30 ;#!
SP_R    DB  #00,#76,#6E,#42,#7A,#56,#4E,#00,#CE ;*
SP_F    DB  #55,#AA,#5D,#BE,#5D,#AA,#55,#AA,#CE ;+
SP_R0   DB  #18,#7E,#7E,#3C,#3C,#7E,#7E,#00,#40 ;R!
SP_0    DB  #00,#00,#00,#00,#00,#00,#00,#00,#00 ;
SP_1    DB  #00,#00,#00,#00,#00,#00,#00,#00,#11 ;.!

P.S. А буква сразу после ; в каждой строчке это для текстового варианта сборки:


_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


16 Jul 2024 00:16
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 23468
Location: Silicon Valley
Reply with quote
Планы на ближайшее будущее:
- поддержать компьютер Башкирия-2М
- поддержать компьютер ПК-01 Львов
- поддержать хакадей-суперкон-бейдж 2022 года с 4-битным эмулируемым процом viewtopic.php?f=92&t=21961
- добавить правила для i8086 и поддержать сборку COM-файлов для DOS
- дободать правила для m68k и дописать поддержку пальмов?
- допилить таки работу с файлами?
- может быть RC2014?...
- режим высокого разрешения в ATM Turbo2+???...

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


16 Jul 2024 00:38
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 23468
Location: Silicon Valley
Reply with quote
> допилить таки работу с файлами?

Наверное надо выкинуть нафиг старую реализацию работы с файлами через каналы (да и сами каналы выкинуть тоже) - оно сейчас всё-равно только для системы speccy существует в виде SPECCY_.A (с подчёркиванием) в мнемониках Z80 и мнемониках 8080 (RASM) - вот как этот API описан в ROBBY.R (@P2_... это команды вызываемые через COMMAND):
Code:
@P2_CHSTAT=0x2110
@P2_CHOPEN=0x2111
@P2_CHCLOSE=0x2112
@P2_CHSEEK=0x2113

// CONST FOR CHSTAT
@P2OK=0
@P2SIZE=1
@P2TIME=2
@P2BLOCK=3
@P2ATTR=4

// CONST FOR FILEATTR
@P2A_RO=0x01
@P2A_HID=0x02
@P2A_SYS=0x04
@P2A_DIR=0x10

// CONST FOR CHOPEN
@P2OPENR=0
@P2OPENW=1
@P2OPENRW=2
@P2OPENA=3
@P2OPENSYS=4
@P2OPENRUN=5
и ROBBY.R опять же облегчится...

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


16 Jul 2024 22:10
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 23468
Location: Silicon Valley
Reply with quote
Shaos wrote:
Shaos wrote:
Shaos wrote:
Вопрос возник - нужно добавить в RW1P2 файловые операции. Я за эти годы несколько подходов окучил - пока ни один не понравился (каналы, спец-команды, ассемблерные вставки). Вобщем думается сделать на нижнем уровне передачу файлов блоками по 256 байт (как на CP/M-80), а на строки или на байты уже будет делить библиотека, написанная на RW1.


Weberta-интерпретатор байткода RW0 (который теперь входит в состав Rgrid.js) имеет следующую реализацию файловых операций:
Shaos wrote:
Файлы читаются так - получателю -4 (@filesystem) посылается пакет с именем файла (одна буква на ячейку), далее ждём евента от @filesystem - в нём будет размер прочитанного файла, далее обращаемся (через указатели A/B/C) в отрицательную область памяти переменных (ячейки с адресами от -32K до -1) за телом файла.

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


P.S. На самом деле ячейки с адресами от -32768 до -257 (т.е. 32512 слов или 65024 байта) потому что -256 и выше идут коды "регистров"

Переосмысливая идеи 2014 года можно предложить следующее
Пакет с именем файла - это массив слов, в первом слове которого указано количество следующих далее букв и сейчас поддерживается только чтение (например в Circuits.CC):
"filename" - прочитать текст из файла с именем filename, разместив его начиная с адреса #8000 по одной букве на слово, причём количество скопированных букв приходит в ответе от @filesystem
По аналогии добавляем:
"filename!" - записать буфер в файл с именем filename, причём пишем только младшие байты и останавливаемся, когда встретили ноль
"filename%" - прочитать двоичный файл, упаковав байты по 2 в слово (от системы придет прочитанный размер в байтах)
"filename%hhh" - записать двоичный файл с байтовым размером hhh (шестнадцатиричное число) пользуясь словами из буфера (если размер нечётный, то из последнего слова возьмется только младший байт)
"filename+" - дополнить текстовый файл строкой из буфера (буква на слово, писать до нуля) - хотя может быть проще say перенаправить в файл...
Работу с произвольным адресом пока можно отложить на будущее, но уже можно считать, что там в систему будут передаваться не строки, а структуры - с адресом, длиной, смещением внутри файла и т.д.

P.S. Скелет программы (вырезка из TERNARO.R):
Code:
robot "Test"
author "Shaos"
+INC/ROBBY
main()
{
 def tmp[17] = "START" // тут хранится пакет - в ячейке 0 будет 5, что есть длина слова, и далее 5 ячеек с буквами
 sendp tmp[0] @filesystem // хотим файл с именем START
 while(TRUE) // вечный цикл в котором мы будем обрабатывать приходящие сообщения
 {
   code = 0
   recv code // принять сообщение и записать его в переменную code
   if(N==0) continue // буфер принятых сообщений пуст
   if(N==@mouse) // это сообщение от мыши
   {
     ...
   }
   if(N==@filesystem) // это сообщение от файловой системы, сообщающее, что файл записан в буфер (в регистре K будет размер)
   {
      A = @filebuffer // начинаем читать с адреса #8000
      while(A[0]) // пока не встретили ноль (либо любой другой маркер окончания полезной информации - этот символ должен быть в файле)
      {
           // что-то делаем с очередной буквой A[0]
           A = A + 1 // сдвигаем указатель на 1
      }
   }
 }
}


P.P.S. На самом деле просто имя файла это чтение текстового файла где через запятую идут целые числа со знаком (обычно 16-битные т.е. signed short) и именно эти значения записываются в память при чтении из файла - одно значение на ячейку. Соответственно чтобы читать произвольный текстовый файл надо вводить спец.символ - например $ т.е. запросив чтение из файла filename$ мы читаем его как текстовый по одной букве на ячейку (по идее так можно и UTF8 читать, разворачивая его в полноценный 16-битный Unicode)...

Наверное отрицательную область памяти надо сделать read-only - программа оттуда сможет только читать и соответственно запись в файл будет не оттуда, а из произвольного массива - т.е. надо будет указывать не только размер, но и адрес:

filename - прочитать файл как массив слов (обинаризированный?)
filename$ - прочитать файл как текстовый (возможна поддержка юникода)
filename% - прочитать файл как последовательность байтов, где каждый байт будет хранится в одном слове
(прочитать ограниченное количество байт? прочитать со смещением?)

filename<AL - записать в файл массив слов начиная с адреса A и длиной L
filename$<AL - записать в файл текст из массива с адресом A и длиной L
filename%<AL - записать в файл массив байтов взятых из слов начиная с адреса A и длиной L

и видимо надо добавить возможность "дописать":

filename<<AL - дописать в файл массив слов начиная с адреса A и длиной L
filename$<<AL - дописать в файл текст из массива с адресом A и длиной L
filename%<<AL - дописать в файл массив байтов взятых из слов начиная с адреса A и длиной L

и может быть даже добавить возможность дописывать в файл с определённого места?

filename<<<ALO - дописать в файл массив слов начиная с адреса A и длиной L начиная со смещения O внутри файла
filename%<<<ALO - дописать в файл массив байтов взятых из слов начиная с адреса A и длиной L начиная со смещения O внутри файла

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

P.S. я о чём-то таком уже размышлял 10 лет назад: viewtopic.php?p=116548#p116548

P.P.S. да - удаление файла можно сделать через filename! :)

P.P.P.S. в системах без файловых осей должна быть возможность иметь read-only файлы в памяти, обращаясь к ним тем же самым способом...

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


16 Jul 2024 23:35
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 23468
Location: Silicon Valley
Reply with quote
Начал добавлять бестайловые тесты в PRJ/TESTS - вот первый тест 0001.R:
Code:
// CREATED: 17-JUL-2024
ROBOT "TEST-0001"
AUTHOR "SHAOS"
+INC/ROBBY
main()
{
 text "<><><><><><><><><><> MAIN-BEGIN"

 def ar[5]
 def arr[10] = {100, 101, 102}

 A = &arr
 B = A[0]
 C = A[1]

 say "&A &B &C #&A #&B #&C $&ARR[0] "

 text "<><><><><><><><><><> MAIN-END"
}
Он компилируется только для radio с помощью простейшего N-скрипта PRJ/TESTS/DEFAULT.N:
Code:
#!./nedomake
$abin=0000
$avar=4000
$syst=radio
$proc=i8080
\remove ${1}.RO
robbyc -p -l ${1}.R
\need ${1}.RO
\remove ${1}.A
robbycc ${1}.RO -P${proc} -S${syst} -O#${abin} -B#${avar} -I_FONT
\need ${1}.A
\remove ${1}.LST
\remove ${1}.BIN
rasm ${1}.A -t${EXEPATH}LIB/I8080/__RULES
\need ${1}.BIN
#\remove ${1}.LST
#\remove ${1}.R!
#\remove ${1}.RO
#\remove ${1}.RLS
#\remove ${1}.A
(запуск компиляции через NEDOMAKE PRJ/TESTS 0001)

Результат работы теста:

Attachment:
Screenshot from 2024-07-18 00-30-52.png
Screenshot from 2024-07-18 00-30-52.png [ 6.25 KiB | Viewed 1252 times ]

Я планирую запускать такие тесты в автоматическом режиме через stdout и сравнивать вывод с эталоном - так CI/CD будет проверять, что ничего не сломалось после заливки нового кода в репу (кстати ДЕФ будет печататься только на Радио-86РК, а на других платформах на этом месте будет def, но в данном случае я тестирую именно РК).

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


18 Jul 2024 00:31
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 23468
Location: Silicon Valley
Reply with quote
Как можно видеть в robbycc появилась опция -I_FONT которая означает игнорировать либу _FONT.A (в которой находится шрифт nedoPC) т.к. radio не печатает растровым шрифтом, а использует текстовый режим. Но если эту опцию опустить, то ничего страшного не произойдёт - просто в выходном коде будет сидеть шрифт, который не используется.

В тексте робота text "..." означает вставку комментария в ассемблерный исходник, который генерируется при сборке - это я ещё в 2006 году придумал (в незарелизенной версии RW1P2 v1.x) чисто для отладки - под спойлером можно поглядеть этот получившийся ассемблерный текст:

 0001.A
Code:
\ Generated by ROBBYCC v2.0.2 (Jul 18 2024)                                   
\ Part of nedoPC SDK, see http://www.nedopc.org/nedopc/SDK

        ORG     #0000
@BASE   EQU     #4000
@REGS   EQU     #405E
@REG_X  EQU     #405E
@REG_Y  EQU     #4060
\REG_D
@REG_N  EQU     #4064
\REG_K
@REG_R  EQU     #4068
@REG_T  EQU     #406A
\REG_E
\REG_M
\REG_I
@REG_A  EQU     #4072
@REG_B  EQU     #4074
@REG_C  EQU     #4076
\REG_P
@REG_L  EQU     #407A
\REG_S
@RAND   EQU     1000
        JMP     HEADER
        \ DATA
_L_BASE DW  @BASE
_L_REGS DW  @REGS
_L_STAK DW  @REGS
CHX     DB  0
CHY     DB  0
CHS     DB  4
CHB     DB  0
_NPLANE DW  0
_ANGLE  DB  0
_COLOR  DB  0
_CURX   DB  0
_CURY   DB  0
_SAYX   DB  0
_SAYY   DB  0
_SAYC   DB  0
_ATRS   DB  0
HEADER: \ INIT SYSTEM
        CALL    INIT
        \ SET SAY VARIABLES
        XRA_A
        STA     _SAYX
        MVI_A,  @DY
        DCR_A
        STA     _SAYY
        MVI_A,  2
        CALL    ATTRIB
        STA     _SAYC
        \ CLEAN FROM BASE TO REGS+32
        LHLD    _L_BASE
        XCHG
        LHLD    _L_REGS
        LXI_B,  32
        DAD_B
        XCHG
        MVI_C,  0
_STD_1: MOV_M,C
        INX_H
        MOV_A,H
        CMP_D
        JNZ     _STD_1
        MOV_A,L
        CMP_E
        JNZ     _STD_1
        \ SET SP & SAVE RETADDR
        POP_D
        LHLD    _L_STAK
        SPHL
        PUSH_D
_START:
\ *0x66
_j0000:
\ <><><><><><><><><><> MAIN-BEGIN
\ *0x01 %w1 %w2
_j0021:
        \ DEF1 is empty operation
\ *0x02 %w1 %w2 %w3
_j0026:
        LHLD    _L_BASE
        LXI_D,  #0005
        DAD_D
        DAD_D
        LXI_D,  #0064
        MOV_M,E
        INX_H
        MOV_M,D
        INX_H
        LXI_D,  #0065
        MOV_M,E
        INX_H
        MOV_M,D
        INX_H
        LXI_D,  #0066
        MOV_M,E
        INX_H
        MOV_M,D
        INX_H
\ *0x40
_j0033:
\ 0xF5
        PUSH_H
        LXI_H,  #FF0A
\ 0xF5
        PUSH_H
        LXI_H,  #0005
\ 0xF4
        POP_D
        XCHG
        MVI_A,  #FF
        CMP_H
        JNZ     _l0001
        \ REGISTER
        CALL    _R_SET
        JMP     _l0002
_l0001:
        \ VARIABLE
        CALL    _B_SET
_l0002:
        POP_H
\ *0x40
_j003C:
\ 0xF5
        PUSH_H
        LXI_H,  #FF0B
\ 0xF5
        PUSH_H
        LXI_H,  #FF0A
\ 0xF5
        PUSH_H
        LXI_H,  #0000
\ 0xF6
        POP_D
        MVI_A,  #FF
        CMP_D
        JNZ     _l0003
        PUSH_H
        MOV_L,E
        CALL    _R_GET
        POP_D
_l0003:
        DAD_D
\ 0xF3
        MVI_A,  #FF
        CMP_H
        JNZ     _l0004
        \ REGISTER
        CALL    _R_GET
        JMP     _l0005
_l0004:
        \ VARIABLE
        CALL    _B_GET
_l0005:
\ 0xF4
        POP_D
        XCHG
        MVI_A,  #FF
        CMP_H
        JNZ     _l0006
        \ REGISTER
        CALL    _R_SET
        JMP     _l0007
_l0006:
        \ VARIABLE
        CALL    _B_SET
_l0007:
        POP_H
\ *0x40
_j004A:
\ 0xF5
        PUSH_H
        LXI_H,  #FF0C
\ 0xF5
        PUSH_H
        LXI_H,  #FF0A
\ 0xF5
        PUSH_H
        LXI_H,  #0001
\ 0xF6
        POP_D
        MVI_A,  #FF
        CMP_D
        JNZ     _l0008
        PUSH_H
        MOV_L,E
        CALL    _R_GET
        POP_D
_l0008:
        DAD_D
\ 0xF3
        MVI_A,  #FF
        CMP_H
        JNZ     _l0009
        \ REGISTER
        CALL    _R_GET
        JMP     _l0010
_l0009:
        \ VARIABLE
        CALL    _B_GET
_l0010:
\ 0xF4
        POP_D
        XCHG
        MVI_A,  #FF
        CMP_H
        JNZ     _l0011
        \ REGISTER
        CALL    _R_SET
        JMP     _l0012
_l0011:
        \ VARIABLE
        CALL    _B_SET
_l0012:
        POP_H
\ *0x37
_j0058:
        CALL _SAY
\ SAY '&FF0A &FF0B &FF0C #&FF0A #&FF0B #&FF0C $&0005 '
        LXI_H,  #FF0A
        CALL    _R_GET
        CALL _SAY1
        MVI_C, #20
        CALL _SAY0
        LXI_H,  #FF0B
        CALL    _R_GET
        CALL _SAY1
        MVI_C, #20
        CALL _SAY0
        LXI_H,  #FF0C
        CALL    _R_GET
        CALL _SAY1
        MVI_C, #20
        CALL _SAY0
        MVI_C, #23
        CALL _SAY0
        LXI_H,  #FF0A
        CALL    _R_GET
        CALL _SAY2
        MVI_C, #20
        CALL _SAY0
        MVI_C, #23
        CALL _SAY0
        LXI_H,  #FF0B
        CALL    _R_GET
        CALL _SAY2
        MVI_C, #20
        CALL _SAY0
        MVI_C, #23
        CALL _SAY0
        LXI_H,  #FF0C
        CALL    _R_GET
        CALL _SAY2
        MVI_C, #20
        CALL _SAY0
        CALL    _V_B2B
        LXI_D,  #0005
        LXI_H,  #0000
        CALL    _ARADR
        CALL _SAY3
        MVI_C, #20
        CALL _SAY0
\ *0x66
_j0088:
\ <><><><><><><><><><> MAIN-END
\ *0x33
_j00A7:
        RET
\ *0xFF
_j00A8:

+/home/shaos/src/SDK-work/LIB/I8080/_STD
+/home/shaos/src/SDK-work/LIB/I8080/RADIO
+/home/shaos/src/SDK-work/LIB/I8080/_CLIB
+/home/shaos/src/SDK-work/LIB/I8080/_VARS
+/home/shaos/src/SDK-work/LIB/I8080/_SAY
+/home/shaos/src/SDK-work/LIB/I8080/NULL_
(и инклуд файла со шрифтом _FONT отсутствует в списке инкдуов в конце из-за новой опции)


P.S. В настоящий момент есть проблемка с зависимостями - файл _FONT.A включается если в программе использовалась команда SAY, однако подпрограмма PUTCH печатающая букву из шрифта 8х8 находится в системном ассемблерном файле - SPETS.A или там ORION.A - и если пытаться собрать программу без SAY для графических платформ (тех же SPETS или ORION), то будет ошибка ассемблера т.к. метка FONT8X8 не найдена - надо подумать как эту подпрограмму PUTCH обобщить для разных платформ и вставить в _SAY.A - там специфические вещи только для атрибутов цвета, поэтому должно быть решаемо т.к. у меня уже есть системные подпрограммы конверсии цвета - RGB и ATTRIB.

P.P.S. Похоже придумал как победить эту проблемку с зависимостями - заодно у пользователя появится возможность подключать свой собственный шрифт 8x8 :mrgreen:

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


18 Jul 2024 00:36
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 23468
Location: Silicon Valley
Reply with quote
Подкрутил чуток свой переупрощённый сишный препроцессор minicpp, чтобы он мог принимать предопределённые макросы из командной строки и появилась возможность заиметь роботов с условной компиляцией внутри :lol:

Code:
robot "Random"
author "Shaos"

+INC/ROBBY
+TILES

main()
{
#ifdef counter
    cc=0
#endif
    command @P2_TERMINFO
    dx=A;dy=B

LOOP:

#ifdef counter
    cc=cc+1
    if((cc&127)==127)
    {
       SAY "&CC "
    }
#endif
    Random(dx);ii=C
    Random(dy);jj=C
    Random(4);kk=C
    select ii jj
    if kk!=0 : L1
    set @sp_0
    goto LOOP
L1: if kk!=1 : L2
    set @sp_1
    goto LOOP
L2: if kk!=2 : L3
    set @sp_2
    goto LOOP
L3: set @sp_4
    goto LOOP
}

+LIB/RANDOM
чтобы такого робота собрать скажем для ориона без счётчика надо в досе выполнить следующую команду (ну т.е. как обычно):

nedomake prj\random orion

а чтобы со счётчиком:

nedomake prj\random orion counter

в линуксе немного покучерявей:

$(pwd)/nedomake PRJ/RANDOM orion counter

(это я расширяю дефолтный скрипт сборки DEFAULT.N чтобы он умел всё на свете - он теперь 240 строк длиной)


Attachments:
Screenshot from 2024-07-18 23-22-03.png
Screenshot from 2024-07-18 23-22-03.png [ 16.78 KiB | Viewed 1170 times ]

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973
18 Jul 2024 23:17
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 23468
Location: Silicon Valley
Reply with quote
Вот тот же самый бинарник запущенный в Emu80:

Attachment:
Screenshot from 2024-07-19 00-37-37.png
Screenshot from 2024-07-19 00-37-37.png [ 37.75 KiB | Viewed 1169 times ]

Получается 10000 тайлов случайно вывелось за 2м13с или 133 секунды, что значит порядка 75 тайлов в секунду - небыстро получается с высокоуровневым рандомом - вот эта функция вызывается 3 раза на каждый тайл:
Code:
Random() // A-RANGE => C-RESULT L=C
{
  Rand = 0x6255*Rand+0x3619
  C = ((Rand&0xFF00)|(((Rand>>8)^Rand)&0x00FF))&0x7FFF
  if(A) C=C%A;
  return C
}


P.S. Перешёл на внутренний рандом, написанный на ассемблере (через чтение псевдопеременной R которая с точки зрения Robby-программиста всегда возвращает новое псевдослучайное число по той же самой формуле, но написанной на ассемблере) и стало быстрее - 10000 тайлов за 1м40с или 100 секунд, что значит порядка 100 тайлов в секунду (ускорение на 33%):
Code:
Random() // A-RANGE => L&C-RESULT
{
  Rand=R // get random variable
  C=Rand
  if(A) C=C%A
  return C
}

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


19 Jul 2024 00:44
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 23468
Location: Silicon Valley
Reply with quote
Shaos wrote:
Выяснилось, что арифметика 16-битных целых чисел со знаком для процессора 8080 позаимствована мной из компилятора сей Small-C для CP/M:
SMALL C v2.1 by Jim Hedrix ( http://www.cpm.z80.de/small_c/smallc21.zip ) - точнее из текстового файла CLIB.ARC, у которого был свой собственный копирайт:
Small-C Library: Copyright 1984 J. E. Hendrix, L. E. Payne
надо эту математику переписать "из головы" т.к. я хочу все либы сделать PUBLIC DOMAIN, а эта штука была чуть ли не шареваре:
Code:
Small-C Compiler: Copyright 1982, 1983 J. E. Hendrix
Small-C Library:  Copyright 1984 J. E. Hendrix, L. E. Payne

    This is copyrighted material.  All rights are reserved.  Use it
only in accordance with the terms set forth in the registration form
(file REGISTER).

Code:
          --------- Small-C User Registration (June 1, 1985) -----------
         
          The  Small-C  compiler  is copyrighted material and all rights
          are reserved by the author.  You may use Small-C  in  any  way
          you  please,  except  that  you  may not sell copies without a
          signed agreement  from  the  author.    You  are   encouraged,
          however,  to distribute copies freely so long as you charge no
          more than your actual costs for  just  media,  packaging,  and
          postage.  You must retain all copyright notices and inform the
          recipient  of  his  obligation to the author (next paragraph).
          These terms apply to both source and object Small-C files.
         
          If you received a "free" copy of this  package  (as  described
          above),  you  are  obliged to send a royalty payment of $20 to
          the author, J. E. Hendrix.  Besides satisfying a  moral  debt,
          you  will  be  supporting  further  development of Small-C and
          related software.    Be  sure  to  include  a  copy  of   this
          registration   form   so   you   can  be  informed  of  future
          developments.
         
          This software carries no warranty, either written or  implied,
          regarding  its  performance  or  suitability to any particular
          task.  Neither the author  nor  the  distributor  accepts  any
          responsibility for losses which might derive from its use.
         
          Any   correspondence   requiring   a   reply  must  include  a
          self-addressed, stamped envelope.
         
              NAME: __________________________________ DATE: ___________
                                         
           ADDRESS: ____________________________________________________
                                         
                    ____________________________________________________
                                         
                    ____________________________________________________
                                         
          COMPUTER: __________________________________ OP SYS: _________
                                         
          I RECEIVED MY COPY OF SMALL-C FROM: __________________________
         
         
         
                                     Mail to:

                                  J. E. Hendrix
                                     Box 8378
                              University, MS  38677
                                      U.S.A.
         
         
          "The Small-C Handbook" by J. E.  Hendrix  (Reston  Publishing,
          1984)   provides   complete   documentation  for  the  Small-C
          compiler.  Individual copies can be obtained from the  author.
          Dealers  should  direct  inquiries  to  Prentice-Hall, 200 Old
          Tappan Road, Old Tappan, NJ 07675.

P.S. Про замену математики завёл новую тему: viewtopic.php?f=46&t=22486 (я наверное новые практически реализуемые в SDK вещи буду описывать в новых темах с префиксом [SDK], а эту тему я переименовываю из "nedoPC SDK" в "[SDK] Старая тема про nedoPC SDK (август 2004)", в которой планирую обсуждать теоретические вещи и планы на будущее)

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


19 Jul 2024 20:28
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 23468
Location: Silicon Valley
Reply with quote
Я тут размышлял на досуге и подумал, что в будущем надо будет отходить от способа привязки к адресам, который я использую с 2001 года - это когда при сборке программы в SDK задаются три адреса:

  • адрес спрайтов/тайлов ($aspr)
  • адрес оттранслированного кода ($abin)
  • адрес памяти переменных ($avar)

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

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

А можно пойти ещё дальше и сделать более универсальное решение - компилировать всё в перемещаемый с шагом 256 байт код по типу как я делал в DLL для Спринтера или как планировал перемещать EXE-файлы при загрузке в ShaOS - с таблицей корректировки BITMAP занимающей 1/8 от размера кода, которая помечает битами какие байты кода требуют модификации при переносе кода в памяти (аналогично программы в MSX-DOS перемещали себя в верхние адреса - помню я в 90х чего-то такое дизассемблировал). Причём можно сделать 2 таблицы - для перемещения кода и для перемещения данных (в данном случае блока переменных и регистров языка Robby, а рабочие ячейки скомпилированного кода останутся с кодом), чтобы код и данные могли теоретически находиться где угодно в памяти, в том числе располагаясь плотно друг за другом (настолько плотно насколько позволяет шаг перемещения в 256 байт).

Применительно к Радио-86РК такой подход был описан в статье "О перемещении программ в машинных кодах" из журнала Радио №3 за 1989 год (автор Г.Штефан). Причём там даже вариант с двумя BITMAP-таблицами упоминался для кода и для данных (а для перемещения экранной области предлагалась третья таблица, но это наверное уже перебор) с описанием алгоритма как такие таблицы BITMAP получать (для двух таблиц достаточно оттранслировать программу 3 раза). Также там приводились 2 дампа подпрограмм - одна которая может готовить такую BITMAP-таблицу (BITF2) и вторая которая может корректировать код по такой BITMAP-таблице (BIТCOR).

P.S. Такой "вдвойне перемещаемый" формат может использоваться в nedoPC SDK например для сохранения промежуточных "объектных" файлов, которые могут объединяться с другими программами на бинарном уровне без перекомпиляции - у меня ведь есть возможность собирать код не привязанный к какой-то системе - если в ROBBYCC не задать опцию -S определяющую систему, то будет выбрана система NULL и при сборке будет подключен файл-пустышка NULL.A в котором не определена ни одна системная подпрограмма:
Code:
\ NEDOPC SDK : NULL FOR I8080
\ http://nedoPC.org/nedopc/SDK
\ This code was written by Shaos
\ and moved to PUBLIC DOMAIN
\ File created: 28-JAN-2002
\ Last updated: 17-JUL-2024

\ System NULL (i8080)

@SCREEN EQU #0
@ATTRIB EQU #0
@DX     EQU 0
@DY     EQU 0
@CMODEL EQU 0
@TCK    EQU 0

INIT:
DELAY:
SET_T:
GETPIX:
SETPIX:
SETS8:
PUTCH: \ ???
RGB:   \ ???
ATTRIB:
KEY:
\SENDS:
\RECVS:
\CHANNEL:
        RET
Такой робот не будет иметь возможности принимать что-то с клавиатуры или выводить что-то на экран, но сможет обмениваться сообщениями через SEND[P] и RECV[P] (если я придумаю как связать разных роботов каналами связи), а также сможет выполнять манипуляции со своими переменными, которые могут быть "перемещены" в область переменных другого робота и они оба смогут использовать этот блок как shared memory (в данный момент такой NULL-робот будет одноразовым - на него можно передать управление, он что-то поделает и вернёт управление через RET, т.е. пока никакой кооперативной многозадачности с очередями обмена сообщениями, но теоретически и это можно реализовать)...

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


21 Jul 2024 21:18
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 120 posts ]  Go to page Previous  1 ... 3, 4, 5, 6, 7, 8  Next

Who is online

Users browsing this forum: No registered users and 3 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.