cr0acker (member)
2003/05/27 15:25
|
Графика
|
| |
Это покажите как работать с сабжем, а то после прочтения немалого обьема документациия я понял следущее.
1)ВидеОЗУ является теневым.
2)Цвет #FF является прозрачным.
|
uzWer (stranger
)
2003/05/27 16:24
|
|
аналогично.... НУЖНА библиотека.
|
MacBuster (Registered Developer)
2003/05/27 16:56
|
|
> НУЖНА библиотека.
Ага. Ещё художник в берете с мольбертом, палитрой и кисточкой что-бы медленнее работало.
|
uzWer (stranger
)
2003/05/27 17:06
|
|
>> Ага. Ещё художник в берете с мольбертом, палитрой и кисточкой что-бы медленнее работало.
1.c функцией вывода точки
2. произвольной линии
3. произвольного прямоугольника
и это для начала будет imho достаточно.
|
MacBuster (Registered Developer)
2003/05/27 17:44
|
|
Вывод точки и прямоугольника есть в форуме. Произвольная прямая легко модифицируется из любого исходника на ассемблере Z80 для любой платформы заменой подпрограммы вывода точки.
|
cr0acker (member)
2003/05/27 20:18
|
|
Нафиг библиотека! Вы обьясните как блин там всё рабтает! Как память организована, как синхронизировать! Какой байт пямяти отвечает за какую точку! Как к видеозу образатся если ВидеоОЗУ больше адресного простраснва?
|
Denis Parinov (Sprinter Team)
2003/05/27 21:03
|
|
Там все просто. :)
;
LD A,#50
OUT (#E2),A ;открыли видео ОЗУ в третьем окне #C000
;
LD A,y-coord ;0 - 255
OUT (#89),A ;выбрали Y-координату
;
LD HL,x_coord ;0 - 319 (320x256) или 639 (640x256)
LD A,color ;0 - 255
;
LD (HL),A ;поставили точку.
;
|
cr0acker (member)
2003/05/27 21:50
|
|
А как устроино ВидеОЗУ? Те как хранятся там Цвета и поллитра :)
|
cr0acker (member)
2003/05/27 21:51
|
|
И можно ли видео ОЗУ открыть под адересу #4000
|
Shaos (Registered Developer)
2003/05/27 22:19
|
|
> А как устроино ВидеОЗУ? Те как хранятся там Цвета и поллитра :)
Открываешь исходники SPRINT-а и внимательно изучаешь :)
Alexander Shabarshin (shaos@mail.ru)
NedoPC Project
|
cr0acker (member)
2003/05/27 22:40
|
|
>Открываешь исходники SPRINT-а и внимательно изучаешь :)
А вы батенька Недописишник:)
|
Shaos (Registered Developer)
2003/05/27 22:41
|
|
> И можно ли видео ОЗУ открыть под адересу #4000
Если я правильно понимаю политику партии, то открыть можно в любом из четырех окон
Alexander Shabarshin (shaos@mail.ru)
NedoPC Project
|
Shaos (Registered Developer)
2003/05/27 22:45
|
|
>>Открываешь исходники SPRINT-а и внимательно изучаешь :)
>А вы батенька Недописишник:)
В свое время, чтобы раскусить формат текстовой видеопамяти, мне пришлось дизассемблировать форт для спринтера :)
Дизассемблировал я его естественно с помощью SPRINT-а!
Alexander Shabarshin (shaos@mail.ru)
NedoPC Project
|
cr0acker (member)
2003/05/27 22:47
|
|
Я же не буду спрайты по точкам выводить:) Хочу с помошью акселератора спрвайтами кидаться:)
|
cr0acker (member)
2003/05/27 23:08
|
|
Чё то я ещё не понимаю. Вот в режиме 320*256 одна точка занимает оддин байт. Если умножить 320*256=81920 байт, те 81Кб, отсюда вопрос как 81Кб запихался в 16Кбйтовове окно:)
|
Shaos (Registered Developer)
2003/05/27 23:13
|
|
> вопрос как 81Кб запихался в 16Кбйтовове окно:)
а никак - одна строка только в окно запихивается
и переключается по порту 89h (см. BACK_SP.A)
Alexander Shabarshin (shaos@mail.ru)
NedoPC Project
|
cr0acker (member)
2003/05/28 00:19
|
|
Вот блин нету документацаи:( Вот как фигово:(
|
Shaos (Registered Developer)
2003/05/28 01:31
|
|
> Вот блин нету документацаи:( Вот как фигово:(
Есть она - внимательнее читать надо ;)
Alexander Shabarshin (shaos@mail.ru)
NedoPC Project
|
cr0acker (member)
2003/05/28 01:43
|
|
>Есть она - внимательнее читать надо ;)
Хде? Ткни мне ей?
|
Shaos (Registered Developer)
2003/05/28 08:06
|
|
> Ткни мне ей?
http://petersplus.ru/sprinter/arhitecture.htm
и вот еще цитата из форума:
Функции для работы с экраном:
Сейчас DOS поддерживает четыре режима экрана.
Два текстовых:
40x32 символов c 16 цветами (режим 02h);
80x32 символов c 16 цветами (режим 03h);
и два графических:
320x256 точек с 256 цветами (режим 81h);
640x256 точек с 16 цветами (режим 82h);
Основным режимом является текстовый режим 80x32 (03h), если вашапрограмма
работает в другом режиме, то вам следует перед переключением режимаполучить
номер текущего режима функцией 51h GETVMOD и сохранить его, а передзавершением
программы восстановить его.
Например:
LD C,51h ;получить режим экрана
RST 10h
LD C,A ;поместить номер режима экрана в регистр C
PUSH BC ;и сохранить на стеке (B - страница, C - режим)
.
. ;ваша программа
.
POP BC ;взять со стека режим экрана
LD A,C ;поместить номер режима экрана в регистр A
LD C,50h ;установить режим экрана
RST 10h
LD C,41h ;завершить программу.
RST 10h
DSS имеет функции вывода на текстовый экран символов и символьных строк.Для
графических режимов требуются собственные процедуры вывода на экран.Например,
при завершении программы вы можете выдать строку на текстовый экран:
LD HL,STRING ;указатель на строку символов
LD C,5Ch ;вывод строки символов
RST 10h
STRING DB "Thank you for using my program..." ;текстовая строка
DB 13,10 ;символы возврата каретки и перевода строки
DB 0 ;символ конца строки
Для вывода на графический экран, вам необходимо подключить видео память водно
из трех окон памяти 04000h-07FFFh, 08000h-0BFFFh, 0C000h-0FFFFh. Этоосуществля-
ется выводом значения 50h в соответствующий порт 0A2h, 0C2h или 0E2h в
зависимости от окна памяти. При подключении обратите внимание на то, чтобыстек
вашей программы не попадал в это адресное пространство.
Например, если вам нужно поставить точку на экране, то подпрограмма длярежима
81h будет выглядеть так:
; HL - горизонтальная координата
; DE - вертикальная координата
IN A,(0E2h) ;считать из порта номер страницы подключенной в
;третье окно памяти
LD C,A ;запомнить в регистре C
LD A,50h ;страница видео памяти
OUT (0E2h),A ;подключение видео памяти
LD A,E ;поместить вертикальную координату в регистр A.
OUT (89h),A ;выдать в порт
LD DE,0C000h ;адрес начала третьего окна памяти
ADD HL,DE ;получить адрес точки (адрес начала окна +
;горизонтальная координата)
LD A,255 ;цвет выводимой точки (от 0 до 255)
LD (HL),A ;вывод точки на экран
LD A,C ;вспомнить номер страницы памяти
OUT (0E2h) ;подключить страницу памяти вместо страницы видео
;памяти
Перед выводом точек следует установить необходимые цвета в палитре.Различные
режимы вывода на экран задаются номером видео страницы от 50h до 5Fh.Подробнее
о режимах вывода вы можете прочитать в описании архитектуры компьютера.
50h (80) SETVMOD (Выбор режима экрана)
входные данные:
A - режим экрана
02h - текстовый 40x32x16 цветов
03h - текстовый 80x32x16 цветов
81h - графический 320x256x256 цветов
82h - графический 640x256x16 цветов
B - страница экрана 0/1
C - 50h
выходные данные:
A - код ошибки, если CF=1
Функция устанавливает режим экрана. Седьмой бит режима экрана установлен
для графических режимов и сброшен для текстовых. Существуют два текстовыхрежима
и два графических.
51h (81) GETVMOD (Получить текущий режим экрана)
входные данные:
C - 51h
выходные данные:
A - текущий режим экрана
B - страница экрана 0/1
Функция возвращает текущий режим экрана и номер страницы экрана.
Alexander Shabarshin (shaos@mail.ru)
NedoPC Project
|
cr0acker (member)
2003/05/28 10:33
|
|
Вот сейчас MacBuster^xtm сказал, что мол 256 строк подрубается только оддна строка за раз по Y_Port, и с ней уже ведётся работа! Вот и всё что я хотел услышать:)
|
Anonymous (Unregistered) 2003/05/28 16:51
|
|
спрайты то рулез.... но и произвольные линии не меньший рулез... вот идея есть .CHR(borland BGI) шрифты на Спринтер перевести. Они векторные, масштабируемые и главное МАЛЕНЬКИЕ (4-20 кб). так для их реализации акселератора недостаточно.
идея как?
|
Shaos (Registered Developer)
2003/05/28 18:04
|
|
> Вот сейчас MacBuster^xtm сказал, что мол 256 строк подрубается только оддна строка за раз по Y_Port,
> и с ней уже ведётся работа! Вот и всё что я хотел услышать:)
Ну дык я то же самое и сказал :)
> одна строка только в окно запихивается
> и переключается по порту 89h (см. BACK_SP.A)
Alexander Shabarshin (shaos@mail.ru)
NedoPC Project
|
Shaos (Registered Developer)
2003/05/28 18:05
|
|
> вот идея есть .CHR(borland BGI) шрифты на Спринтер перевести
> идея как?
супергут!
Alexander Shabarshin (shaos@mail.ru)
NedoPC Project
|
cr0acker (member)
2003/05/28 19:18
|
|
Ладно верю!
|
Ivan_Mak (Sprinter Team)
2003/05/28 22:23
|
|
Вот примеры программ для акселератора и графики
(исходники для свободного использования)
;**************************
; Use Sprinter Accelerator
; for Line & Restangles.
; (c) Peters Plus Ltd.
;**************************
;
; Interrupt - enable
; Stack, Program & Data - in (8000h..BFFFh)
; Video-RAM - in (C000h..FFFFh)
; Video-Data - (0000h..BFFFh)
;
;*******************************************
; This codes is not a library
; It is illustration of Accelerator use only!
; Errors may exists
;*******************************************
Screen_offset EQU 0C000h ; or 0C140h for second graphic screen
Video_Data EQU *** ; 0000h..BFFFh
Color_for_fill EQU *** ; 0..255
Horizontal_offset EQU *** ; 0...319
Vertical_offset EQU *** ; 0...255
Horizontal_size EQU *** ; 1...256
Vertical_size EQU *** ; 1...256
;**************************
Open_video_page:
IN A,(PORT_Y)
LD (SAVE_PY),A ; save port_y
IN A,(PAGE3)
LD (SAVE_PG3),A ; save page3
LD A,50h ; Use 50h for normal mode
; 54h for "no copy in main shadow RAM" mode
; 58h for "FF is transparent" mode
; 5Ch for "no copy in main shadow RAM" and
; "FF is transparent" mode
OUT (PAGE3),A
RET
SAVE_PG3: DB 0FFh
SAVE_PY: DB 0C0h
;**************************
Close_video_page:
LD A,(SAVE_PG3)
OUT (PAGE3),A
LD A,(SAVE_PY)
OUT (PORT_Y),A
RET
;**************************
Horizontal_Line_copy:
LD HL,Video_Data
LD DE,Screen_Offset+Horizontal_Offset
LD A,Vertical_Offset
OUT (PORT_Y),A ; Set vertical offset
DI
LD D,D ; Start Accelerator to
; "Set Accelerator Length" mode
LD A,Horizontal_size ; Use direct data or (HL),(BC),(DE) only!
; !!! not ld A,C !!!
LD B,B ; Stop Accelerator
LD L,L ; Start Accelerator to
; "Copy Line" mode
LD A,(HL) ; Get data line
LD (DE),A ; Put data line
LD B,B ; Stop Accelerator
EI
RET
;**************************
Vertical_Line_copy:
LD HL,Video_Data
LD DE,Screen_Offset+Horizontal_Offset
LD A,Vertical_Offset
OUT (PORT_Y),A ; Set vertical offset
DI
LD D,D ; Start Accelerator to
; "Set Accelerator Length" mode
LD A,Vertical_size ; Use direct data or (HL),(BC),(DE) only!
; !!! not ld A,C !!!
LD B,B ; Stop Accelerator
LD A,A ; Start Accelerator to
; "Copy Vertical Line" mode
LD A,(HL) ; Get data line
LD (DE),A ; Put data line
LD B,B ; Stop Accelerator
EI
RET
;**************************
Horizontal_Line_Fill:
LD DE,Screen_Offset+Horizontal_Offset
LD A,Vertical_Offset
OUT (PORT_Y),A ; Set vertical offset
DI
LD D,D ; Start Accelerator to
; "Set Accelerator Length" mode
LD A,Horizontal_size ; Use direct data or (HL),(BC),(DE) only!
; !!! not ld A,C !!!
LD B,B ; Stop Accelerator
LD A,Color_for_fill
LD C,C ; Start Accelerator to
; "Fill Line" mode
LD (DE),A ; Put line of color
LD B,B ; Stop Accelerator
EI
RET
;**************************
Vertical_Line_Fill:
LD DE,Screen_Offset+Horizontal_Offset
LD A,Vertical_Offset
OUT (PORT_Y),A ; Set vertical offset
DI
LD D,D ; Start Accelerator to
; "Set Accelerator Length" mode
LD A,Vertical_size ; Use direct data or (HL),(BC),(DE) only!
; !!! not ld A,C !!!
LD B,B ; Stop Accelerator
LD A,Color_for_fill
LD E,E ; Start Accelerator to
; "Fill Vertical Line" mode
LD (DE),A ; Put line of color
LD B,B ; Stop Accelerator
EI
RET
;**************************
Draw_Restangle_Data:
LD HL,Video_Data
LD DE,Screen_Offset+Horizontal_Offset
LD A,Vertical_Offset
OUT (PORT_Y),A ; Set vertical offset
LD B,Vertical_size ; 0 is 256
LD C,Horizontal_Size ; 0 is 256
DI
LD D,D ; Start Accelerator to
; "Set Accelerator Length" mode
LD A,Horizontal_Size ; Use direct data or (HL),(BC),(DE) only!
; !!! not ld A,C !!!
LD B,B ; Stop Accelerator
EI
drd_loop:
DI
LD L,L ; Start Accelerator to
; "Copy Line" mode
LD A,(HL) ; Get data line
LD (DE),A ; Put data line
LD B,B ; Stop Accelerator
EI
LD A,C ; Next line data
AND A
JR Z,drd_inc
ADD A,L
LD L,A
JR NC,drd_no_inc
drd_inc:
INC H
drd_no_inc:
IN A,(PORT_Y) ; Next line
INC A
OUT (PORT_Y),A
DJNZ drd_loop ; Sycle
RET
;**************************
Draw_Restangle_Fill:
LD HL,Screen_Offset+Horizontal_Offset
LD A,Vertical_Offset
OUT (PORT_Y),A ; Set vertical offset
LD B,Vertical_size ; 0 is 256
DI
LD D,D ; Start Accelerator to
; "Set Accelerator Length" mode
LD A,Horizontal_Size ; Use direct data or (HL),(BC),(DE) only!
; !!! not ld A,C !!!
LD B,B ; Stop Accelerator
EI
LD C,Color_for_fill
IN A,(PORT_Y)
drf_loop:
DI
LD L,L ; Start Accelerator to
; "Line Line" mode
LD (HL),C ; Put data line
LD B,B ; Stop Accelerator
EI
INC A
OUT (PORT_Y),A
DJNZ drf_loop ; cycle
RET
;**************************
|
Shaos (Registered Developer)
2003/05/29 07:36
|
|
> 54h for "no copy in main shadow RAM" mode
что бы это значило?
Alexander Shabarshin (shaos@mail.ru)
NedoPC Project
|
Alex_Goryachev (Sprinter Team)
2003/05/29 14:31
|
|
Эти примеры присутствуют в доке по акселератору http://www.petersplus.com/sprinter/accel.htm
---
Sprinter Team
PETERS PLUS LTD
|
Ivan_Mak (Sprinter Team)
2003/05/29 19:46
|
|
Эти значит, что данные попадают в видео-ОЗУ,
но не попадают в основное ОЗУ, соответствующее видео-памяти.
Т.е. программа может записать на экран новые данные,
а считываться из того же адреса будут старые.
В случае работы со спрайтами, когда надо наложить спрайт, затем восстановить старое изображение, можно использовать этот режим.
Старое изображение останется в тени и его можно восстановить без предварительного сохранения...
|
cr0acker (enthusiast)
2003/07/17 21:21
|
|
Рещил я тута переделать одну софтинку с расширенного экрана GMX на расщиренный экран спринтера. И сразу же наткнулся на грабля, вот типа две фции готорые включют/выключают рсширенный экран! Чё то не пашут.
gmxon ld, a,0
out(#7c),a
ld c, #0a
ld a,1
ld b,2
call #3d13
ld a,0
in a,(#82)
ld (oldwin1),a
in a,(#a2)
ld (oldwin2),a
in a,(#c2)
ld (oldwin3),a
in a,(e2)
ld (oldwin4),a
in a,(#c9)
ld (oldmod),a
ld a,#50
out (#ea2),a
ld a,123
out (#89),a
ld hl,32
ld a,5
ld (hl),a
ld a,(#82)
out (#c9),a
ret
Вместо выполнения фции выше, нас ждёт зависонс
|
MacBuster (Registered Developer)
2003/07/18 09:13
|
|
Это что такое -> <out (#ea2),a> и <in a,(e2)> ???
|
cr0acker (enthusiast)
2003/07/18 14:44
|
|
Порт #е2, управляет 3 окном ЦП. Сначала типа оттуда читаю текущую подрубленную страницу. Потом ставлю страницу видеоОЗУ
|
Shaos (Registered Developer)
2003/07/18 15:50
|
|
> Порт #е2, управляет 3 окном ЦП
in a,(e2) или in a,(#e2) ???
Alexander Shabarshin (shaos@mail.ru)
NedoPC Project
|
cr0acker (enthusiast)
2003/07/18 17:27
|
|
in a,(#e2)
конечно:) Просто я текст с аласмовскго экрана перепичатывал:)
|