User Tag List

Страница 24 из 35 ПерваяПервая ... 202122232425262728 ... ПоследняяПоследняя
Показано с 231 по 240 из 342

Тема: Программирование на ассемблере

  1. #231

    Регистрация
    29.06.2022
    Адрес
    г. Ирвайн, США
    Сообщений
    408
    Спасибо Благодарностей отдано 
    590
    Спасибо Благодарностей получено 
    340
    Поблагодарили
    109 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Improver Посмотреть сообщение
    Если глянуть исходники МДОС Т-72, то там палитру тоже устанавливали за два раза, но между ними была небольшая задержка:
    Код:
    	...
    L_F613:	OUT     00Ch	; палитра -- установка физического цвета
    	PUSH PSW
    	POP  PSW
    	PUSH PSW
    	POP  PSW
    	DCR  E
    	DCR  D		; (счётчик -1)
    	OUT     00Ch	; палитра -- установка физического цвета, ещё раз
    	...
    Думаю, такой вариант можно считать оптимальным и по скорости, и по объёму.

    Все ПЗУ на Векторах, как правило, имели при запуске команду отключения КД. Кроме того, квази-диск отключает БЛК-СБР -- там это сделано аппаратно, таким образом, если демку будут запускать, например, загрузкой "с ленты", или из загрузочной записи дискеты, то можно этот момент пропустить, а если из под МДОСа -- то эти команды обязательны.
    Спасибо за этот сниппет. Очень класный.
    Вот мой вариант который может тищить данные с квазидиска и сетить палитру без отключения прерываний. За основу был взят приведенный тобой код.
    Код:
    ; Set palette copied from the ram-disk no blocking interruptions
    ; input: 
    ; de - the addr of the first item in the palette
    ; use: 
    ; hl, bc, a
    PALETTE_COLORS = 16
    
    SetPaletteFromRamDisk:
    			hlt
    			; store sp
    			lxi h, $0000
    			dad sp
    			shld @restoreSp+1
    			; copy unpacked data into the ram_disk
    			xchg
    			RAM_DISK_ON()
    			sphl
    
    			mvi	a, PORT0_OUT_OUT
    			out	0
    			mvi e, $00
    @loop:		
    			pop b
    			; even color
    			mov	a, e
    			out	2
    			mov a, c
    			out $0c
    			xthl ; delay 24
    			xthl ; delay 24
    			inr e ; counter plus delay 8
    			inr h ; delay 8
    			dcr h ; delay 8
    			out $0c
    			; odd color
    			mov	a, e
    			out	2
    			mov a, b
    			out $0c
    			xthl ; delay 24
    			xthl ; delay 24
    			inr e ; counter plus delay 8
    			inr h ; delay 8
    			dcr h ; delay 8		
    			out $0c
    			mov a, e
    			cpi PALETTE_COLORS
    			jnz	@loop
    
    @restoreSp: lxi sp, TEMP_ADDR
    			RAM_DISK_OFF()
    			ret
    			.closelabels
    
    ; mount the ram-disk
    .macro RAM_DISK_ON(_command = RAM_DISK0_B0_STACK)
    			mvi a, _command
    			out $10
    .endmacro
    
    ; dismount the ram-disk
    .macro RAM_DISK_OFF()
    			xra a
    			out $10
    .endmacro
    Последний раз редактировалось parallelno; 17.08.2022 в 06:04.

  2. #232

    Регистрация
    22.02.2014
    Адрес
    г. Курган
    Сообщений
    1,706
    Спасибо Благодарностей отдано 
    275
    Спасибо Благодарностей получено 
    318
    Поблагодарили
    222 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Какие алгоритмы в реальности используются, для вывода на экран спрайта (многоцветного) с маской?
    Или сначала в буфере создается микс (фона и спрайта), который потом просто копируется на экран?
    Тогда интересует алгоритм создания микса.
    Я таким ни когда не занимался, прикинул, цикл получился (если правильно посчитал) 112 тактов на байт

    Скрытый текст

    Код:
    ...
    adr:
      ldax  b
      ana  m
      xchg
      ora m
      xchg
      mov  m,a
      inx h
      inx d
      inx b
    adr_a:
      mvi a,8
      dcr a
      sta adr_a+1
      jnz adr
    ...
    [свернуть]
    Последний раз редактировалось KTSerg; 26.09.2022 в 10:53.

  3. #233

    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    8,390
    Спасибо Благодарностей отдано 
    763
    Спасибо Благодарностей получено 
    2,367
    Поблагодарили
    1,317 сообщений
    Mentioned
    38 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Вывод в одну плоскость что-то вроде

    с использованием стека

    Код:
    ;SP - маска, байт спрайта, маска, байт спрайта, ...
    ;HL - VRAM
    		pop b\ mov a,m\ ana c\ ora b\ mov m,a\ dcr l
    ;12+8+4+4+8+8=44 такта/байт
    [свернуть]

    без стека

    Код:
    ;HL - маска, байт спрайта, маска, байт спрайта, ...
    ;DE - VRAM
    		ldax d\ ana m\ inx h\ ora m\ inx h\ stax d\ dcr e
    ;8+8+8+8+8+8+8=56 тактов/байт
    [свернуть]

    Вместо dcr l и dcr e могут быть другие dcr или inr, смотря как выводим. Если две плоскости, то просто используем оставшуюся регистровую пару (DE или BC соответственно). Для 3-4 плоскостей придется добавлять переходы.

    Эти 2 пользователя(ей) поблагодарили ivagor за это полезное сообщение:

    KTSerg(26.09.2022), nzeemin(28.09.2022)

  4. #234

    Регистрация
    22.02.2014
    Адрес
    г. Курган
    Сообщений
    1,706
    Спасибо Благодарностей отдано 
    275
    Спасибо Благодарностей получено 
    318
    Поблагодарили
    222 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ivagor Посмотреть сообщение
    Вывод в одну плоскость что-то вроде
    ...
    Для 3-4 плоскостей придется добавлять переходы.
    Ясно, спасибо.
    Я посчитал, что хранить маску в спрайте слишком накладно по расходу памяти.
    Для спрайта на 3-4 плоскости, при отдельном хранении маски, спрайт будет занимать меньше памяти, но получилось, что выводится такой спрайт практически в 2-3 медленнее.

  5. #235

    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    8,390
    Спасибо Благодарностей отдано 
    763
    Спасибо Благодарностей получено 
    2,367
    Поблагодарили
    1,317 сообщений
    Mentioned
    38 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Не все так плохо.

    По битпланам без стека

    Код:
    ;HL - маска
    ;DE - спрайт
    ;BC - VRAM
    		ldax b\ ana m\ inx h\ xchg\ ora m\ inx h\ xchg\ stax b\ dcr c
    ;8+8+8+4+8+8+4+8+8=64 такта/байт
    [свернуть]

    После каждого битплана отматываем маску на начало.
    Или

    В два битплана стеком


    Код:
    ;SP - маска, байт спрайта, байт спрайта, маска, байт спрайта, байт спрайта, ...
    ;HL и DE - VRAM
    ;начало
    		pop b\ mov a,m\ ana c\ ora b\ mov m,a\ dcr l
    		ldax d\ ana c\ pop b\ ora c\ stax d\ dcr e
    ;установившийся режим
    		dcx sp\ pop b\ mov a,m\ ana c\ ora b\ mov m,a\ dcr l
    		ldax d\ ana c\ pop b\ ora c\ stax d\ dcr e
    ;(12+12+8+4+4+8+8)+(8+4+12+4+8+8)=100 тактов/2 байта=50 тактов/байт
    [свернуть]
    Последний раз редактировалось ivagor; 26.09.2022 в 12:29. Причина: убрал xchg из стека

    Эти 2 пользователя(ей) поблагодарили ivagor за это полезное сообщение:

    KTSerg(26.09.2022), nzeemin(26.09.2022)

  6. #236

    Регистрация
    22.02.2014
    Адрес
    г. Курган
    Сообщений
    1,706
    Спасибо Благодарностей отдано 
    275
    Спасибо Благодарностей получено 
    318
    Поблагодарили
    222 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ivagor Посмотреть сообщение
    Не все так плохо.
    ...
    Во, я ещё и растактовку смотрел в таблице, в которой:
    ANA M 12 4 4 4

  7. #237

    Регистрация
    20.12.2005
    Адрес
    Москва
    Сообщений
    2,048
    Спасибо Благодарностей отдано 
    1,141
    Спасибо Благодарностей получено 
    1,459
    Поблагодарили
    520 сообщений
    Mentioned
    20 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ivagor Посмотреть сообщение
    Не все так плохо.

    По битпланам без стека

    Код:
    ;HL - маска
    ;DE - спрайт
    ;BC - VRAM
    		ldax b\ ana m\ inx h\ xchg\ ora m\ inx h\ xchg\ stax b\ dcr c
    ;8+8+8+4+8+8+4+8+8=64 такта/байт
    [свернуть]

    После каждого битплана отматываем маску на начало.
    Получается, для одного битплана можно хранить парами байт пиксели+маска, и обойтись без двух xchg = 56 тактов.

  8. #238

    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    8,390
    Спасибо Благодарностей отдано 
    763
    Спасибо Благодарностей получено 
    2,367
    Поблагодарили
    1,317 сообщений
    Mentioned
    38 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от nzeemin Посмотреть сообщение
    и обойтись без двух xchg = 56 тактов
    Такой вариант я раньше привел

    Этот пользователь поблагодарил ivagor за это полезное сообщение:

    nzeemin(26.09.2022)

  9. #239

    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    8,390
    Спасибо Благодарностей отдано 
    763
    Спасибо Благодарностей получено 
    2,367
    Поблагодарили
    1,317 сообщений
    Mentioned
    38 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    У двухбитпланового стекового варианта есть серьезный недостаток - несовместимость с методом Медноногова, нельзя использовать при разрешенных прерываниях. Исправление этого недостатка + небольшое ускорение:

    Скрытый текст

    Код:
    ;SP - маска, байт спрайта, байт спрайта, маска, байт спрайта, байт спрайта, ...
    ;HL и DE - VRAM
    		pop b\ mov a,m\ ana c\ ora b\ mov m,a\ dcr l
    		ldax d\ ana c\ pop b\ ora c\ stax d\ dcr e
    ;12+8+4+4+8+8+8+4+12+4+8+8=88 тактов
    		mov a,b\ sta $+10\ ana m\ pop b\ ora c\ mov m,a\ dcr l
    		ldax d\ ani 0\ ora b\ stax d\ dcr e
    ;8+16+8+12+4+8+8+8+8+4+8+8=100 тактов
    ;(88+100)/4=47 тактов/байт
    [свернуть]

    Этот пользователь поблагодарил ivagor за это полезное сообщение:

    nzeemin(28.09.2022)

  10. #240

    Регистрация
    20.12.2005
    Адрес
    Москва
    Сообщений
    2,048
    Спасибо Благодарностей отдано 
    1,141
    Спасибо Благодарностей получено 
    1,459
    Поблагодарили
    520 сообщений
    Mentioned
    20 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    ivagor, пора книгу писать с фрагментами программ для вектора. Ну или в вики хотя бы выписывать - был бы отличный справочник, меньше затыков при разработке под Вектор.

    Можно вот тут например собирать: http://www.emuverse.ru/wiki/%D0%9A%D...D1%80-06%D0%A6

Страница 24 из 35 ПерваяПервая ... 202122232425262728 ... ПоследняяПоследняя

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

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

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

Похожие темы

  1. Вычисление числа Пи на ассемблере
    от perestoronin в разделе Разное
    Ответов: 330
    Последнее: 06.08.2025, 15:04
  2. Ответов: 275
    Последнее: 16.12.2018, 23:01
  3. try-catch на ассемблере z80
    от siril в разделе Программирование
    Ответов: 22
    Последнее: 30.10.2012, 21:17
  4. Продам книгу- AMIGA: программирование на ассемблере
    от Doctor Max в разделе Барахолка (архив)
    Ответов: 11
    Последнее: 01.03.2012, 00:35
  5. Подпрограмма на ассемблере в памяти?
    от jimled в разделе Программирование
    Ответов: 1
    Последнее: 29.11.2009, 06:46

Ваши права

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