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

User Tag List

Страница 1 из 3 123 ПоследняяПоследняя
Показано с 1 по 10 из 22

Тема: Использование стека и прерывания

  1. #1
    Veteran
    Регистрация
    01.03.2005
    Адрес
    Новосибирск
    Сообщений
    1,979
    Спасибо Благодарностей отдано 
    69
    Спасибо Благодарностей получено 
    261
    Поблагодарили
    99 сообщений
    Mentioned
    6 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Использование стека и прерывания

    Почитав замечательную статью в журнале DeJa Vu #0A "Программирование - быстрая процедура печати спрайтов через стек от WoodlandStudio." - решил попробовать реализовать. В итоге получаю видеоэффекты и зависание после секунд работы.

    Суть моей задачи такова. Для примера на прерываниях висит музыка и кое какой вывод графики стеком. Всё работает.

    Eсть необходимость "читать" через стек данные из памяти в регистр DE во время прерывания... И тут наступают грабли.

    Для примера соорудил код:

    Код:
    INT_VECTOR=#BE00
    INT_HANDLER=#BFBF
    STACK_MAIN=#7FFF
    STACK_IM2=INT_HANDLER-1
    
    	ORG 	#8000
    START:
    	DI
    	LD SP,STACK_MAIN
    
               LD HL,INT_VECTOR
               LD BC,#00BF
               LD (HL),C
               INC HL
               DJNZ $-2
               LD (HL),C
    
    	LD A,INT_VECTOR/256
    	LD I,A
    	IM 2
    	EI
    
    MAIN_LOOP:
    ; тут читаем стеком данные из памяти и кидаем на экран для примера
    ; EI:HALT тут нет, т.к прерывание должно приходить во время работы чтения стеком.
    ;Если LD SP,SPR1 закоментить зависать перестает, но ясно что выводит мусор :)
    
    	LD (STK1+1),SP
    	LD SP,SPR1
    	LD HL,#4000
    	DUP 16
    	POP DE
    	LD (HL),E
    	INC HL
    	LD (HL),D
    	INC HL
    	EDUP
    STK1	LD SP,#0000
    	JP MAIN_LOOP
    
    SPR1	DS #20,#FF
    
    MAIN_ISR:
    	PUSH IX
    	PUSH HL
    	PUSH DE
    	PUSH BC
    	PUSH AF
    	EXX
    	EX AF,AF'
    	PUSH IY
    	PUSH HL
    	PUSH DE
    	PUSH BC
    	PUSH AF
    ; тут музыка и графика стеком выводится
    
    	POP AF
    	POP BC
    	POP DE
    	POP HL
    	POP IY
    	EX AF,AF'
    	EXX
    	POP AF
    	POP BC
    	POP DE
    	POP HL
    	POP IX
    	RET
    
    ; Обработчик прерываний
    	ORG INT_HANDLER
               EX DE,HL
               EX (SP),HL
               LD (SaveRET+1),HL
               EX DE,HL
               POP DE
               LD (SaveSP+1),sp
               LD SP,STACK_IM2
               CALL MAIN_ISR
    SaveSP LD SP,#0000
               EI
    SaveRET JP #0000
    В чём же может быть проблема? Что-то к вечеру совсем не соображу...
    Последний раз редактировалось drbars; 09.12.2012 в 16:49.

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

  3. #2
    Veteran
    Регистрация
    01.03.2005
    Адрес
    Новосибирск
    Сообщений
    1,979
    Спасибо Благодарностей отдано 
    69
    Спасибо Благодарностей получено 
    261
    Поблагодарили
    99 сообщений
    Mentioned
    6 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Вроде помогло...)) Шо это было?)))

  4. #3
    Veteran Аватар для TomCaT
    Регистрация
    25.06.2005
    Адрес
    Одесса
    Сообщений
    1,794
    Спасибо Благодарностей отдано 
    54
    Спасибо Благодарностей получено 
    46
    Поблагодарили
    22 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Если прерывания разрешены (EI перед Main Loop), и SP не имеет свободной области под указываемым им адресом - то гайки. Если читаемый буфер SPR1 односторонний или постоянно обновляемый в тех же прерываниях, то достаточно освободить немного места перед его началом, как сказал krt17. Кстати, там точно нужны 2 команды EX DE,HL ?
    Последний раз редактировалось TomCaT; 09.12.2012 в 17:14.
    Помни. Только на компьютере можно семь раз Cut, а один - Format. В реале все иначе. (c)
    Власть людей сильнее, чем люди у власти.
    Чем меньше мы смотрим на мир, тем больше задумываемся о нем. (c)

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

    Can you help Robin in his quest for the silver arrow? (c) Odin "Robin of the Wood"
    Мы все немного режем по дереву, а потом собираем корабли в бутылках.
    Is it the same old story you are going to tell me
    or is it the old story telling me and you we are the same?
    http://www.sky.od.ua/~ptsk
    [свернуть]


  5. #4
    Veteran
    Регистрация
    01.03.2005
    Адрес
    Новосибирск
    Сообщений
    1,979
    Спасибо Благодарностей отдано 
    69
    Спасибо Благодарностей получено 
    261
    Поблагодарили
    99 сообщений
    Mentioned
    6 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Как я понял, у каждого спрайта, который будет выводиться таким способом первые два байта нужно резервировать. так?

  6. #5
    Veteran
    Регистрация
    01.03.2005
    Адрес
    Новосибирск
    Сообщений
    1,979
    Спасибо Благодарностей отдано 
    69
    Спасибо Благодарностей получено 
    261
    Поблагодарили
    99 сообщений
    Mentioned
    6 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от TomCaT Посмотреть сообщение
    Т.к. прерывание может подпортить любые его четыре байта во время вывода на экран.
    В моём случае вроде ничего не портится, полоска выводится непрерывно. Глюков в ней нет. Два байта в начале запарываются, но там можно всегда нули держать на такой случай.

    krt17,
    Не догнал, что там это даст?

    ld hl,spr1
    ld e,(hl)
    inc hl
    ld d,(hl)
    inc hl
    ld sp,hl
    ld hl,#4000
    Последний раз редактировалось drbars; 09.12.2012 в 17:15.

  7. #6
    Veteran Аватар для TomCaT
    Регистрация
    25.06.2005
    Адрес
    Одесса
    Сообщений
    1,794
    Спасибо Благодарностей отдано 
    54
    Спасибо Благодарностей получено 
    46
    Поблагодарили
    22 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Да, я поправил свое сообщение, но написал все в общих словах, интересно все равно - не совсем понял задачу, которая была поставлена. Перечитал все еще раз - выводятся НЕ 32 байта #FF, а то, что при каждом прерывании обработчик записывает в буфер SPR1?

    И нужны ли EX DE,HL ?
    Помни. Только на компьютере можно семь раз Cut, а один - Format. В реале все иначе. (c)
    Власть людей сильнее, чем люди у власти.
    Чем меньше мы смотрим на мир, тем больше задумываемся о нем. (c)

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

    Can you help Robin in his quest for the silver arrow? (c) Odin "Robin of the Wood"
    Мы все немного режем по дереву, а потом собираем корабли в бутылках.
    Is it the same old story you are going to tell me
    or is it the old story telling me and you we are the same?
    http://www.sky.od.ua/~ptsk
    [свернуть]


  8. #7
    Veteran
    Регистрация
    01.03.2005
    Адрес
    Новосибирск
    Сообщений
    1,979
    Спасибо Благодарностей отдано 
    69
    Спасибо Благодарностей получено 
    261
    Поблагодарили
    99 сообщений
    Mentioned
    6 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от TomCaT Посмотреть сообщение
    Да, я поправил свое сообщение, но написал все в общих словах, интересно все равно - не совсем понял задачу, которая была поставлена. Перечитал все еще раз - выводятся НЕ 32 байта #FF, а то, что при каждом прерывании обработчик записывает в буфер SPR1?

    И нужны ли EX DE,HL ?
    Пример в топике - отладка алгоритма. В Main_loop будет цикл задач. Одна из которых должна рисовать локации на экране таким способом.

    Цитата Сообщение от TomCaT Посмотреть сообщение
    И нужны ли EX DE,HL ?
    Да, нужны. Без них не работает
    Последний раз редактировалось drbars; 09.12.2012 в 17:34.

  9. #8
    Guru
    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    13,552
    Спасибо Благодарностей отдано 
    1,216
    Спасибо Благодарностей получено 
    1,752
    Поблагодарили
    681 сообщений
    Mentioned
    67 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    При разрешенных прерываниях будут портится спрайты, если только не сделать синхронизацию с прерываниями так, чтобы на момент прихода прерывания, спрайты уже все были напечатаны.

    А... все понятно, у вас как бы восстановление в обработчике INT'a )
    Последний раз редактировалось Titus; 09.12.2012 в 17:33.

  10. #9
    Veteran
    Регистрация
    01.03.2005
    Адрес
    Новосибирск
    Сообщений
    1,979
    Спасибо Благодарностей отдано 
    69
    Спасибо Благодарностей получено 
    261
    Поблагодарили
    99 сообщений
    Mentioned
    6 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от krt17 Посмотреть сообщение
    для понимания процесса рекомендую разобраться самому, думать это же приятно .
    Сколько уже напридумывал, сам в шоке Суть в общем-то ясна

    Чудненько работает:

    ld hl,SPR1
    ld e,(hl)
    inc hl
    ld d,(hl)
    inc hl
    ld sp,hl
    ld hl,#4000

    DUP 16
    LD (HL),E
    INC HL
    LD (HL),D
    INC HL
    POP DE
    EDUP
    Этот способ хорош, чтобы дергать расчитанные адреса экрана из таблиц циклом)
    Последний раз редактировалось drbars; 09.12.2012 в 17:59.

  11. #10
    Guru Аватар для jerri
    Регистрация
    01.03.2005
    Адрес
    Samara
    Сообщений
    4,751
    Спасибо Благодарностей отдано 
    256
    Спасибо Благодарностей получено 
    266
    Поблагодарили
    200 сообщений
    Mentioned
    12 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    drbars,

    Код:
    interrupt
                di
                ex (sp),hl   ;забираем со стека адрес возврата
                ld (imret),hl ;сохраняем адрес возврата
                pop hl        ;забираем hl 
                ld (imstek),sp ;сохраняем стек 
                push bc ;либо push de в зависимости от того каким регистром берем спрайты
                ld sp,int_sp
                call proc_int
                
                ld sp,$
    imstek   equ $-2
                ei
                jp $
    imret     equ $-2
    
    
    ;процедура вывода спрайта
    
    ;hl откуда 
    ;de куда
    ;в bc будут данные 
    
            ld (retsp),sp        
    ;забираем первое слово
            ld c,(hl)
            inc hl
            ld b,(hl)
            inc hl
            ld sp,hl
    ;---------------
    ;манипулируем
    ;---------------
            ld sp,$
    retsp equ $-2
            ret
    как то так
    С уважением,
    Jerri / Red Triangle.

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

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

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

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

Похожие темы

  1. Использование USB FDD
    от Максагор в разделе Внешние накопители
    Ответов: 45
    Последнее: 06.05.2013, 22:30
  2. Прерывания IM 2
    от GM BIT в разделе Программирование
    Ответов: 12
    Последнее: 21.01.2011, 23:52
  3. Ответов: 1
    Последнее: 03.05.2009, 23:06
  4. IM2, вектор прерывания
    от Jukov в разделе Программирование
    Ответов: 18
    Последнее: 20.09.2006, 09:32

Ваши права

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