Важная информация

User Tag List

Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 11

Тема: Расчет адреса точки на экране

  1. #1
    Member Аватар для Ares
    Регистрация
    04.01.2011
    Адрес
    Москва
    Сообщений
    88
    Благодарностей: 62
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Расчет адреса точки на экране

    Добрый день уважаемые программисты.Я новичок в машинных кодах,как мне рассчитать где будет какая точка на экране.Помогите пожалуста
    ZX Evolution REV.B
    ZX SPECTRUM 48k

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Veteran
    Регистрация
    29.12.2010
    Адрес
    Москва
    Сообщений
    1,497
    Благодарностей: 668
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Процедура ПЗУ по адресу 8880 (дес.). Входные параметры: a=вертик.координата точки (0..191), c=гориз.координата точки (0..255). Отсчет с верхнего левого угла экрана. Выходные параметры: hl=адрес байта экрана, a=номер бита от левого края байта.
    Формально всё правильно, а по существу - издевательство (В.И.Ленин)

  4. Эти 2 пользователя(ей) поблагодарили Andrew771 за это полезное сообщение:
    Ares (01.05.2012), VNN_KCS (27.04.2012)

  5. #3
    Veteran Аватар для AER
    Регистрация
    18.11.2009
    Адрес
    пгт.Малиновка
    Сообщений
    1,255
    Благодарностей: 804
    Записей в дневнике
    1
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Ares Посмотреть сообщение
    Добрый день уважаемые программисты.Я новичок в машинных кодах,как мне рассчитать где будет какая точка на экране.Помогите пожалуста
    Вот где всё узнавать надо!

  6. Этот пользователь поблагодарил AER за это полезное сообщение:
    Ares (01.05.2012)

  7. #4
    Veteran Аватар для GriV
    Регистрация
    18.02.2005
    Адрес
    Набережные Челны
    Сообщений
    1,574
    Благодарностей: 104
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Ares Посмотреть сообщение
    Добрый день уважаемые программисты.Я новичок в машинных кодах,как мне рассчитать где будет какая точка на экране.Помогите пожалуста
    Вы хотите сами вычислять по координате адрес и править область экрана или использовать готовое решение из ПЗУ?
    Биты рулят лучше байтов, байты рулят шустрее!
    View, Звук, Цвет

  8. #5
    Member Аватар для Ares
    Регистрация
    04.01.2011
    Адрес
    Москва
    Сообщений
    88
    Благодарностей: 62
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от GriV Посмотреть сообщение
    Вы хотите сами вычислять по координате адрес и править область экрана или использовать готовое решение из ПЗУ?
    Выставлять точки,а потом полученный рисунок что бы двигался
    ZX Evolution REV.B
    ZX SPECTRUM 48k

  9. #6
    Veteran Аватар для GriV
    Регистрация
    18.02.2005
    Адрес
    Набережные Челны
    Сообщений
    1,574
    Благодарностей: 104
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Вы ставите задачи с очень неконкретными условиями.
    Вероятно Вам хватит пакета supercode20 или процедур из ПЗУ - там есть и выставление точек и печать символов и прорисовка линий, в принципе - всё что надо.

    Если же вам что-то более конкретное нужно, то здесь только Вы и сможете себе написать то, что надо.
    Если у Вас не хватает понимания архитектуры экрана и способов работы, то советую прочитать сборники книг "как написать игру для ZX-Spectrum" - их можно скачать на виртуал-тырдосе, по этому адресу. Там чётко и популярно описаны адреса экрана и как с ними обращаться
    Биты рулят лучше байтов, байты рулят шустрее!
    View, Звук, Цвет

  10. #7
    Veteran Аватар для AER
    Регистрация
    18.11.2009
    Адрес
    пгт.Малиновка
    Сообщений
    1,255
    Благодарностей: 804
    Записей в дневнике
    1
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Ares Посмотреть сообщение
    Выставлять точки,а потом полученный рисунок что бы двигался
    какие точки выставлять? файл картинки надо запихать в адресс 16384 (длина 6912) и он появится на экране.

    Цитата Сообщение от Ares Посмотреть сообщение
    полученный рисунок что бы двигался
    скролл? иначе, спрайт?


    Цитата Сообщение от Ares Посмотреть сообщение
    Выставлять точки
    Размер экрана в нашем Speccy составляет ни много, ни мало, а 256 точек/пиксел/бит по горизонтали и 192 по вертикали. Каждые 8x8 пикселов - это одно знакоместо. Таким образом, экран делится на 24 символьные строки по 32 знакоместа в каждой.
    Экранная область в целом делится на две части:
    основной экран.......[#4000-#57FF] (6144b)
    атрибуты.............[#5800-#5AFF] (768b).

    Сумма битов, помноженных на двойку в степени их номеров, даст значение байта.
    Основной экран делится на три абсолютно равных сегмента (по 2048 байт каждый):
    первый сегмент...............[#4000-#47FF]
    второй сегмент...............[#4800-#4FFF]
    третий сегмент...............[#5000-#57FF]

    Жми и я тебе расскажу что-то

    ---------- Post added at 17:26 ---------- Previous post was at 17:19 ----------

    расчет адреса знакоместа -

    Цитата Сообщение от Ares Посмотреть сообщение
    как мне рассчитать
    ld B,y
    ld C,x
    ld A,B
    rrca
    rrca
    rrca
    and #e0
    ld L,A
    ld A,B
    and #18
    or #40
    LD H,A
    ld B,#00
    add HL,BC

    адресс указанных координат будет в HL

    ld a, точка
    ld (HL),a
    ура! точка в указанных наших координатах!

  11. Эти 5 пользователя(ей) поблагодарили AER за это полезное сообщение:
    alone (05.05.2012), Ares (09.05.2012), GriV (01.05.2012), ViThor (08.05.2012), Vladson (08.05.2012)

  12. #8
    Veteran Аватар для Destr
    Регистрация
    26.03.2008
    Адрес
    Питкяранта
    Сообщений
    1,426
    Благодарностей: 643
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Ares Посмотреть сообщение
    Выставлять точки,а потом полученный рисунок что бы двигался
    Круто!
    Прям ностальжи.
    По молодости я тоже писал на бэйсике подобное.
    PLOT 10,10:PLOT 10,11 ... - в общем куча команд PLOT (вывод точки по координатам) и сами координаты,
    Получались маленькие картинки
    Ломал голову как заставить двигатся. И однажды догадался прибавлять к каждой координате некую переменную!
    Офигел конечно когда увидел с какой УЖАСНОЙ скоростью это всё работает. Да и экран чистить приходится (командой CLS, конечно).
    Потом решил - надо изучать ассемблер! Там быстрей всё будет.
    (принцип думал такой-же, по точкам строить спрайт).
    И только благодаря инфоркомовскому трехтомнику понял как я сильно заблуждался...

  13. #9
    Member
    Регистрация
    25.04.2009
    Адрес
    Gomel, Belarus
    Сообщений
    32
    Благодарностей: 16
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Andrew771 Посмотреть сообщение
    Процедура ПЗУ по адресу 8880 (дес.). Входные параметры: a=вертик.координата точки (0..191), c=гориз.координата точки (0..255). Отсчет с верхнего левого угла экрана. Выходные параметры: hl=адрес байта экрана, a=номер бита от левого края байта.
    Если мне не изменяет память, эта процедура ест более 500 тактов на точку.

    Цитата Сообщение от AER Посмотреть сообщение
    ld A,B
    rrca
    rrca
    rrca
    and #e0
    ld L,A
    ld A,B
    and #18
    or #40
    LD H,A
    ld B,#00
    add HL,BC
    Здесь - поиск адреса первого байта знакоместа. 17 байт, 67 тактов.

    Цитата Сообщение от AER Посмотреть сообщение
    Вот где всё узнавать надо!
    Узнавать можно.

    Когда-то прочитал процедурах поиска координаты первого байта знакоместа и процедуры рисования точки на экране в "Инфорком Прикладная графика". Как оказалось, там процедура для знакоместа требовала 61 такт времени и 16 байт реализации (лучше, чем у AER). Процедура рисования точки - порядка 100 байт и более 300 тактов времени. Это - далеко не предельные характеристики. Представляю вашему вниманию свои реализации.

    Поиск знакоместа:

    Код:
    	;на входе bc - координаты (xy, в знакоместах 0..31, 0..23)
    	;на выходе hl - адрес.
    
    koorp	ld a,c
    	and #18
    	or #40
    	ld h,a
    	ld a,c
    	and #07
    	rrca
    	rrca
    	rrca
    	add a,b
    	ld l,a
    
    	; 14 байт, 53 такта
    И процедура рисования точки:

    Код:
    	;bc - координаты точки (x 0..255, y 0..191)
    plot	push bc
    	srl b
    	srl b
    	srl b
    	srl c
    	srl c
    	srl c
    	call koorp
    	pop bc
    	ld a,c
    	and #07
    	add a,h
    	ld h,a
    	ld de,table
    	ld a,b
    	and #07
    	add a,e	; (*)
    	ld e,a
    	ld a,(de)
    	xor (hl)	; это операция рисования. 
    			; если хотите OR (рисовать наверх) или AND (стирать точку), 
    			; то меняете эту команду (на or (hl) или xor #ff; and (hl) соответственно)
    	ld (hl),a
    	ret
    table	defb 128,64,32,16,8,4,2,1 
    			; в данной реализации table не должна попасть на стык адресов младшего байта. 
    			; Т.е. младший адрес байта (table) должен быть менее #f9, 
    			; чтобы корректно сработал в программе add a,e (*)
    
    	; 191 такт (+27 на call и 10 на ret если необходимо)
    	; 41 байт памяти
    Последний раз редактировалось bsivko; 25.06.2012 в 09:23.

  14. Эти 5 пользователя(ей) поблагодарили bsivko за это полезное сообщение:
    Andrew771 (25.06.2012), GriV (26.07.2012), John North (25.06.2012), moroz1999 (25.06.2012), Oleg N. Cher (06.09.2016)

  15. #10
    Veteran Аватар для GriV
    Регистрация
    18.02.2005
    Адрес
    Набережные Челны
    Сообщений
    1,574
    Благодарностей: 104
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Скорость прорисовки можно увеличить, если заменить финальную часть поиска начала таблицы на простое ld d,'tab; ld e,b и чтобы таблице tab была выровнена по 256 байтам + содержала все смещения от 0 до 255, даст выигрыш (10+4+7+4+4) - (7+4) = 18 тактов.
    Ещё можно ускорить для случаев, когда надо только выставлять точку или только стирать точку - использованием команд Res <num>,(HL) и Set <num>,(HL). В этом случае используется самомодифицирующийся код: ld a,b; add a,a; add a,a; add a,a; or %01000101; ld (set_+1),a; set_: set 0,(hl)

    ---------- Post added at 13:03 ---------- Previous post was at 13:01 ----------

    Цитата Сообщение от bsivko Посмотреть сообщение
    Если мне не изменяет память, эта процедура ест более 500 тактов на точку.
    Зато выставляет цвет, проверяет положение точки в экране, чего не делает Ваша процедура
    Биты рулят лучше байтов, байты рулят шустрее!
    View, Звук, Цвет

Страница 1 из 2 12 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Адреса 00H-100H
    от Helloween в разделе Оси
    Ответов: 14
    Последнее: 10.05.2011, 12:26
  2. Ответов: 52
    Последнее: 24.05.2009, 08:40
  3. FDD - адреса
    от AlexBel в разделе MSX
    Ответов: 1
    Последнее: 11.05.2009, 08:45
  4. Ответов: 8
    Последнее: 22.08.2006, 20:36

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •