MacBuster (Registered Developer)
2003/05/12 16:35
|
Фонд процедур и подпрограмм
|
| |
Есть предложение огранизовать нечто вроде фонда алгоритмов, процедур и подпрограмм для разработчиков ПО. Что-бы каждому не приходилось изобретать элементарные функции (вроде процедур преобразования данных, вещественной математики и проч.) Предлагаю выделять полностью работающие части своих подпрограмм и помещать их либо сюда в форум, либо на свой сайт и указывать прямую ссылку на страницу с подрограммой. При публикации рекомендуется указывать ассемблер с помощью которого следует ассемблировать код. Кроме присланых вами процедур и подпрограмм, на сайте будут размещаться статьи из спектрумовских, амстрадовских, сэм-коуповских и прочих электронных изданий в их неизменном виде (с указанием всех авторов), а так же ссылки на сайты схожей тематики. Принимаются предложения и пожелания относительно организации фонда :)
|
Alex_Goryachev (Sprinter Team)
2003/05/12 16:57
|
|
Первые процедуры, присланные приватно, уже вошли в новый раздел базы знаний нашего сайта.
Routines Collection
Пока имеется только англоязычная база, но при достаточно активном участии вполне вероятно появление и русскоязычной базы знаний.
---
Sprinter Team
PETERS PLUS LTD
|
uzWer (stranger
)
2003/05/12 17:28
|
|
хорошая идея... есл надо закину MVG-шные процедуры работы в символьном режиме...
|
Vasil (Registered Developer)
2003/05/12 21:07
|
|
Пробегала процедурка по эхе ZX.SPECTRUM.
; Расчитать число 16kB-страниц для загрузки файла
; (макс. размер файла 4 метра)
;
; вх: BDE = старший,средний,младший разряды (размер файла)
; вых: B = #00..#FF число страниц
AllocPages:
ld a,d
rla
rl b
rla
rl b
ld a,d
and 0x3F
or e
ret z
inc b
ret
Процедура printf.
; Сборка: ассемблер z80asm.exe
;
; Заполняет текст. строку данными, после за один
; вызов функции DSS выводит строку на экран.
;
test:
; push xx ; сохранить регистры
; push xx
; ...
ld hl,1234 ; число
push hl
ld hl,string ; строка
push hl
call printf
db "Строка: %s Число: %d\n",0
pop hl ; восст. баланс стека
pop hl ;
; ...
; pop xx ; восстановить регистры
; pop xx
ret
string: db "Hello world!",0
;[]=================================================[]
; Форматированный вывод
; Буфер выводимой строки 128 байт.
; (сохранять регистры до загрузки данных в стек)
; Первый выводимый %X сохр. последним в стеке.
; Младший разряд чисел сохр. последним в стеке.
; Форм. строка должна заканчиваться нулем.
; Не сохраняются регистры: AF,HL',HL,DE,BC,IX,IY
; Форматы:
; d - dec 16-bit
; l - dec 32-bit
; h - hex 16-bit
; u - hex 32-bit
; c - symbol
; s - string
; \n - new line
;
printf: ex (sp),hl
ld iy,2
add iy,sp
ld de,.fbuff ; буфер строки
.loop: ld a,(hl)
inc hl
or a
jr nz,.loc1
; выход (конец форм. строки)
ld (de),a ; ноль в буфер строки
ex (sp),hl ; (sp) = конец строки форматов + 1
; вывести готовую строку
ld hl,.fbuff
ld c,5Ch
rst 10h
ret
;
.loc1: cp "%" ; префикс форматов
jr z,.form
cp "\"
jr nz,.loc2
ld a,(hl)
inc hl
cp "n" ; \n новая строка
jr nz,.loc2
ld a,0Dh
ld (de),a
inc de
ld a,0Ah
.loc2: ld (de),a ; символ в буфер
inc de
jr .loop
;
.form: ld a,(hl)
inc hl
cp '%'
jr z,.loc2 ; вывести сам '%'
push hl
ld l,(iy+0)
inc iy
ld h,(iy+0)
inc iy
and 0x5F
cp "L" ; десятичный 32-bit
jr nz,.dec16
exx
ld l,(iy+0)
inc iy
ld h,(iy+0)
inc iy
call IntToChar32
inc de
jr .done
;
.dec16: cp "D" ; десятичный 16-bit
jr nz,.hex32
exx
ld hl,0
exx
ld ix,tmp1
res 7,(ix+0)
call IntToChar16
inc de
jr .done
;
.hex32: cp "U" ; hex 32-bit
jr nz,.hex16
push hl
ld l,(iy+0)
inc iy
ld h,(iy+0)
inc iy
call hex_hl
pop hl
call hex_hl
jr .done
;
.hex16: cp "H" ; hex 16-bit
jr nz,.string
call hex_hl
jr .done
;
.string:cp "S" ; вывод строки
jr nz,.symb
.str: ld a,(hl)
or a
jr z,.done
cp 0x0D
jr z,.done
ld (de),a ; копир. символы в буфер строки
inc de
inc hl
jr .str
;
.symb: cp 'C' ; вывод одиночного символа
jr nz,.done
ld a,(hl)
pop hl
jr .loc2 ; символ в буфер
;
.done: pop hl
jp .loop
.fbuff: times 128 db 0 ; буфер строки "printf"
;[]=====================================[]
; Вывод в десятичном формате (32-bit)
; в буфер строки (рег."de")
; вход:
; hl = ст.разряд, hl'= мл.разряд
; de = буфер строки
IntToChar32:
exx
ld bc,0xCA00 ; 1.000.000.000
exx
ld bc,0x3B9A
exx
ld ix,tmp1
res 7,(ix+0)
call GetLen32
ld bc,0xE100 ; 100.000.000
exx
ld bc,0x05F5
exx
call GetLen32
ld bc,0x9680 ; 10.000.000
exx
ld bc,0x98
exx
call GetLen32
ld bc,0x4240 ; 1.000.000...9.999.999
exx
ld bc,0x0F
exx
call GetLen32
ld bc,0x86A0 ; 100.000...999.999
exx
ld bc,1
exx
call GetLen32
; вывод 16-bit (hl'= 0)
IntToChar16:
ld bc,10000 ; 10.000...99.999
exx
ld bc,0
exx
call GetLen32
ld bc,1000 ; 1.000..9.999
call GetLen16
DigitToChar:
ld bc,100 ; 100..999
call GetLen16
ld bc,10 ; 10..99
call GetLen16
ld a,l
add a,"0"
ld (de),a
ret
tmp1: db 0
GetLen32:
ld a,2Fh
or a
.loc1: inc a
sbc hl,bc
exx
sbc hl,bc
exx
jr nc,.loc1
add hl,bc
exx
adc hl,bc
exx
glen32: cp "0"
jr z,.loc1
set 7,(ix+0)
.loc1: bit 7,(ix+0)
ret z
ld (de),a
inc de
ret
GetLen16:
ld a,2Fh
or a
.loc1: inc a
sbc hl,bc
jr nc,.loc1
add hl,bc
jr glen32
;[]==============================[]
; Вывод в hex формате (16-bit)
; в буфер строки (рег."de")
; вход:
; hl = число
hex_hl: ld a,h
call .hex_a
ld a,l
; "a" в hex-формате
.hex_a: ld c,a
and 0xF0
rra
rra
rra
rra
call .loc1
ld a,c
and 0x0F
.loc1: cp 0x0A
sbc a,0x69
daa
ld (de),a ; символ в буфер строки
inc de
ret
|
Alex_Goryachev (Sprinter Team)
2003/05/13 12:30
|
|
Конечно надо! Какие могут быть сомнения? :)
---
Sprinter Team
PETERS PLUS LTD
|
Anonymous (Unregistered) 2003/05/13 15:56
|
|
Извините, конечно, что встреваю. Случайно наткнулся на ваш сайт и очень удивился, что клоны спектрума все еще развиваются - сам бывший заядлый спектрумист. Очень заинтересовался Спринтером - достаточно, мне кажется, занятный проект. Поскольку я по текущей профессии почти программист, то, естественно, мне стало интересно, как обстоят дела с этим вокруг Спринтера. Хотел бы просто не быть назойливым, но сделать несколько предложений. Так как популярность какой-либо аппаратной платформы в первую очередь определяется количеством и качеством софта, то, естественно, нужны предпосылки для его быстрой и эффективной разработки. Это, в первую очередь, стандарт операционной системы. Как я понял, в рамках Спринтера создается ОС Estex, и хотя я не в курсе ее архитектурных особенностей, будем считать, что этот компонет присутствует. Главный критерий - стандартный и удобный API. (Стандарты - это вообще полезная штука, дабы позволяет избежать дублирования, варения в собственном соку, неразберихи и пр.) Далее - инструментарий разработки (компиляторы (Asm, C и т.д.) + стандартные библиотеки). Мне кажется ключевым моментом в данном случае являются стандартные библиотеки - совокупность API и его реализации охватывающая такие области, как менеджмент памяти, управление процессами, ввод-вывод, работа с ВУ. Я думаю, такая библиотека - первое, что нужно создать, дабы это будет базой для последующих разработок. Иначе можно получить то, что и было на обычном спектруме - кто в лес, кто по дрова - каждый пишет одни и те же функции для себя. В данном случае это будет непозволительной роскошью, так как времени не так уж и много, да и программистов тоже. Если что-то подобное уже реализовано - хорошо. То, что здесь предлагается (сбор полезных функций) это тоже неплохо, но, к сожалению, движется не в том ракурсе. Стандарты, стандарты и еще раз стандарты, хотя бы на базовую функциональность (API OS + API стандартной библиотеки) - это нужно сделать обязательно. И в первую очередь нужно формировать API - (в первом приближении - набор вызовов функций с определенными параметрами) (реализацию можно отложить на потом). Когда это будет реализовано, мне кажется, стоит говорить о чем-то высокоуровневом (сетевые взаимодействия, графический интерфейс (где собственно, тоже хорошо бы реализовать какой-то стандартный API), прикладные программы). Вот такие мои соображения. Конечно, если принять во внимание то, что разработчиков для Спринтера пара - тройка, то такой подход к делу может показаться излишне академическим, но, если вдруг произойдет что-то и Спринтер обретет популярность, то данная реализация будет иметь только положительный эффект. Было бы очень интересно услышать от главных мантейнеров Спринтера (я так понимаю - это сами разработчики этого компьютера) какие тенденции в разработке системного ПО и аппаратных возможностей существуют на данный момент.
С уважением,
Максим А. Телегин
mailto: aiker@rambler.ru
|
MacBuster (Registered Developer)
2003/05/13 16:07
|
|
Замечательный отзыв :) На сайте фонда кроме прочего планируется разместить список функций, которые не плохо было бы реализовать в ближайшее время. Список будет составляться на основе функций стандартных библиотек Си.
|
Alex_Goryachev (Sprinter Team)
2003/05/13 19:04
|
|
У вас очень пристальный взгляд, Максим, хоть и со стороны. :)
Во-первых, предлагаю взглянуть на Developer Zone .
Здесь можно окинуть взглядом тенденции создания спринтеровского ПО. Вообще, в плане полноты информации англоязычный сайт более предпочтителен поскольку целиком посвящен компьютеру Sprinter.
Вопрос со стороны по стандартизации пришелся как раз впору. Но как бывает, самое очевидное - самое сложное. Мы все - Sprinter Team и наши коллеги-программисты - сейчас как раз усилинно обсуждаем оптимальные пути создания ПО для Спринтера.
Создание операционной системы и прикладного (игрового в меньшей мере) софта идет параллельно. В качестве операционной системы сегодня выступает дисковая подсистема (Estex DSS). Уже продолжительное время имеется определенный набор функций, которые в купе с функциями BIOS позволяют полностью использовать аппаратные возможности компьютера. И только незначительная часть железа требует прямого управления.
В качестве средств разработки используются преимущественно различные ассемблеры как на самом Спринтере, так и кроссассемблеры. Вопрос о языках высокого уровня только обсуждается.
Есть стандарт DLL (библиотеки формата L0), который так и не стал стандартом.
В целом, создано очень много заделов, накоплен богатый опыт который доступен в виде исходников.
Аппаратные возможности развиваются по пути компенсации слабых сторон компьютера.
Например акселератор.
Но железо используется программистами еще неполностью. Как правило программисты имеют опыт программирования Z80, но придя на Спринтер приходится изучать по-сути новую машину.
Думаю, меня с удовольствием дополнят другие участники форума.
---
Sprinter Team
PETERS PLUS LTD
|
Shaos (Registered Developer)
2003/05/13 19:41
|
|
> есл надо закину MVG-шные процедуры работы в символьном режиме...
где-то они у меня лежат - все никак не могу сделать из них DLL для либмана
Alexander Shabarshin (shaos@mail.ru)
NedoPC Project
|
Denis Parinov (Sprinter Team)
2003/05/14 02:10
|
|
> Извините, конечно, что встреваю.
Нам очень интересно услышать, новые идеи и свежий взгляд на проект. Политика компании всегда была направлена на максимальную открытость к различным пожеланиям по развитию.
> Так как популярность какой-либо аппаратной платформы в первую очередь определяется количеством и качеством софта, то, естественно, нужны предпосылки для его быстрой и эффективной разработки. Это, в первую очередь, стандарт операционной системы. Как я понял, в рамках Спринтера создается ОС Estex, и хотя я не в курсе ее архитектурных особенностей, будем считать, что этот компонет присутствует. Главный критерий - стандартный и удобный API. (Стандарты - это вообще полезная штука, дабы позволяет избежать дублирования, варения в собственном соку, неразберихи и пр.)
Изначально Sprinter имел BIOS со стандартизированным API, в которое входили функции различных низкоуровневых операций (чтение/запись секторов, вывод на текстовый экран, распределение памяти и т.п.)
Программы хранились в TRD-образах, на дискетах и винчестере.
Далее, при разработке ПО встал вопрос о полноценной работе с файловой системой. Нами к тому времени был разработам файловый менеджер работающий с дисками в формате MSDOS FAT. В его состав входил модуль работы с файловой системой (условно его можно назвать DSS0). На его основе мы начали разрабатывать свою дисковую операционную систему, были расширены файловые функции, добавился свой менеджер памяти совместимый с BIOS Memory Specification, была разработана спецификация на формат и загрузку приложений, а так же ряд других полезных функций. Затем была разработана спецификация на загрузку операционной системы и все необходимые загрузчики. Так появилась DSS1. Система получилась достаточно удачной, хотя и имела некоторые недостатки, но именно она была основной системой в течении нескольких лет. Система развивалась, исправлялись ошибки, добавлялись новые возможности. Последняя версия системы вышедшая в начале года - DSS1.60. Паралельно сейчас ведется работа над новым ядром дисковой подсистемы DSS2, которая и ляжет в основу операционной системы Estex.
> Далее - инструментарий разработки (компиляторы (Asm, C и т.д.) + стандартные библиотеки). Мне кажется ключевым моментом в данном случае являются стандартные библиотеки - совокупность API и его реализации охватывающая такие области, как менеджмент памяти, управление процессами, ввод-вывод, работа с ВУ. Я думаю, такая библиотека - первое, что нужно создать, дабы это будет базой для последующих разработок. Иначе можно получить то, что и было на обычном спектруме - кто в лес, кто по дрова - каждый пишет одни и те же функции для себя. В данном случае это будет непозволительной роскошью, так как времени не так уж и много, да и программистов тоже. Если что-то подобное уже реализовано - хорошо. То, что здесь предлагается (сбор полезных функций) это тоже неплохо, но, к сожалению, движется не в том ракурсе.
> Стандарты, стандарты и еще раз стандарты, хотя бы на базовую функциональность (API OS + API стандартной библиотеки) - это нужно сделать обязательно. И в первую очередь нужно формировать API - (в первом приближении - набор вызовов функций с определенными параметрами) (реализацию можно отложить на потом). Когда это будет реализовано, мне кажется, стоит говорить о чем-то высокоуровневом (сетевые взаимодействия, графический интерфейс (где собственно, тоже хорошо бы реализовать какой-то стандартный API), прикладные программы). Вот такие мои соображения.
Важность стандартизации мы осознали еще в самом начале и здесь многое уже сделано, получен богатый опыт, есть масса наработок и идей. Стандартных библиотек как таковых нет, но очень многое может заменить уже существующее API. Или же они могут быть разработаны за достаточно недолгий срок, что возможно удастся сделать в рамках фонда процедур. Основная проблема сейчас - время, поэтомы мы всегда рады людям которые подключаются к проекту помогая нам его развивать.
Denis Parinov
email: dp@petersplus.ru
|
|