ZXNet эхоконференция «code.zx»


тема: INT & RESET вопросы



от: Aleksandr Majorov
кому: Valentin Pimenov
дата: 01 Mar 1999

Пpиветствую тебя, о дpажайший(ая/ое) Valentin!

Once in morning 28-02-99 16:10:04 somebody Valentin Pimenov has
written to All about 'INT & RESET вопросы'.

[ ]
VP> Вопрос по INT:
VP> Правда ли, что при обработке INT'a прерывания запрещаются
VP> автоматически при приходе импульса прерывания. Тогда

не совсем верно.
Прерывания запрещаются в том случае если они разрешены. ;-)

VP> зачем частенько первой инструкцией ISR является DI?

для подстраховки чаще всего.
А также есть некоторые навороты, когда приходится
пропускать прерывание по каким-то причинам, а после
"наверстывать" упущенное ;-)))))

VP> Может быть на других z-80 совместимых процессорах исходное
VP> предположение неверно?

на других, "советских" z80 команда DI является NOP'ом!
После DI: HALT программа прекрасно работает дальше!
См. какой-то Hьюс

[ ]
VP> Я провел эксперимент по размещению обработчика RESET
VP> в 0 странице скорпиона в режиме замещения ПЗУ. Оказалось,
VP> что выполняется только несколько команд обработчика, после
VP> чего включается ПЗУ и дальнейшая судьба обработчика печальна.
VP> Вопрос: что происходит, и можно ли как-нибудь заставить
VP> обрабатывать RESET таким способом?

_несколько_????????????
Мне кажется ты сглючил!
При нажатии на RESET происходит _аппаратный_ сброс
регистров #1FFD и #7FFD в #00, т.е. ПЗУ-128, RAM-0 и т.д.!
Так что по сбросу комп _сразу_ должен переходить
на адрес #000 в ПЗУ-128!

VP> Если нет, то кто какой-нибудь другой предложит?

Ставится "резидент" в 8-й банке
Тебе нужен только перехват RESET'а?
вот нечто подобное, из ММД_4.00

Tnks to FK0 за подсказку.

┌────────────────────────────────────────────┐
;Подготовка - поиск адресов и т.п.

LD BC,#7FFD: LD A,#10: OUT (C),A
LD BC,#1FFD: LD A,#12: OUT (C),A

;ИЩЕМ АДРЕС, ГДЕ В 8-Й БАHКЕ HАХОДИТСЯ КУСОК КОДА
; #7B LD A,E
; #E6 #10 AND #10
; #ED #79 OUT (C),A
; #06 #1F LD B,#1F

LD IX,#E2D0
SEA_ROM INC IX
LD A,XH : CP #F0
JR NC,ERROR_RESIDENT ;ОБЛОМ, HЕ ПОСТАВИТЬ РЕЗИДЕHТ
LD A,(IX+0): CP #7B: JR NZ,SEA_ROM
LD A,(IX+1): CP #E6: JR NZ,SEA_ROM
LD A,(IX+2): CP #10: JR NZ,SEA_ROM
LD A,(IX+3): CP #ED: JR NZ,SEA_ROM
LD A,(IX+4): CP #79: JR NZ,SEA_ROM
LD A,(IX+5): CP #06: JR NZ,SEA_ROM
LD A,(IX+6): CP #1F: JR NZ,SEA_ROM
;нашли, запоминаем адреса
PUSH IX: POP HL
LD (ADR_ROM+1),HL
LD (ADR_ROM2+1),HL
INC HL: INC HL: INC HL
LD (ADR_ROM1+1),HL
METKA1
LD BC,#1FFD: XOR A: OUT (C),A
RET
;все, подготовка закончена

;****************************************************

;теперь активизируем резидент
LD BC,#7FFD: LD A,#10: OUT (C),A
LD BC,#1FFD: LD A,#10: OUT (C),A
ADR_ROM LD HL,0 ;АДРЕС РЕЗИДЕHТА
;как можно заметить вместо этой п/п
;ставим коману JP #F200, где будет наш
;обработчик
LD DE,#F200
LD (HL),#C3: INC HL
LD (HL),E: INC HL: LD (HL),D

;теперь переносим в 8-ю банку наш резидент
LD HL,MAGIK: LD DE,#F200
LD BC,LEN_RESIDENT
LDIR
LD BC,#1FFD: XOR A: OUT (C),A
RET
;все, резидент перенесен и активизирован,
;как только нажмем RESET, так сразу сработает
;****************************************************


;а вот и наш резидент.
;вначале проверка - если стек нахидится
;по адресу #5B??, то значит нажали RESET
MAGIK PUSH HL
LD HL,0: ADD HL,SP
LD A,H
POP HL
CP #5B: JR Z,MAGIK1

;стек не в буфере принтера, значит это
;не RESET, делаем LD A,E: AND #10,
;вместо которой щас стоит JP #F200
;и возвращаемся для продолжения
;выполнения п/п теневика
;типа ничего не произошло
LD A,E: AND #10
ADR_ROM1 JP #C3C3

;ага! Кто-то нажал на RESET!!!
;вначале делаем задержку, а то без нее
;почему-то система слетала ;-)
;наверное RESET не успевали отпустить,
;или из-за "дребезга"...
MAGIK1 DI
LD BC,0
MAG_DEL DEC BC
LD A,B: OR C: JR NZ,MAG_DEL

;теперь вместо JP #F200 восстанавливае
;LD A,E: AND #10 чтобы резидент больше
;не срабатывал по RESET'у
ADR_ROM2 LD HL,#2121
LD (HL),#7B: INC HL
LD (HL),#E6: INC HL
LD (HL),#10

;ЗДЕСЬ ИДЕТ ТВОЯ ПРОГА
;она будет где-то в 8-й банке
;по адресу #F225
;можешь делать что хочешь, я-же вначале
;скидываю код "вниз" примерно на #BE00,
;чтоб можно было щелкать банками и вперед.

LEN_RESIDENT EQU $-MAGIK
;*********************************************

└──────────────────────────────────────────────┘

Теперь пара слов:
я в ММД для экономии памяти резидент переношу
в 8-ю банку сразу после подготовки, т.е.
на "METKA1" стоит перенос резидента в #F200
А когда мне его нужно активизировать, то я просто
ставлю JP #F200 по найденому адресу.

Адрес #F200 я взял "от фонаря" - я проверил что
ни ПЗУ-2.95 ни ПрофПЗУ-4.?? там ничего не держат,
вот и заюзал.
Как показали опыты на живых верблюдах там действительно
пусто - можно играться теневиком, маунтить винт и т.д.
и только по RESET'у срабатываем.

Ессно при "холодном сбросе" со "стрелкой влево" или
при повреждении идентификатора целосности 8-й банки
комп _полностью_ сбрасывается!

Да, кстати 2All:
я тут со скуки выломал из ПЗУ как МОА считает CRC
того сектора винта, где хранятся примаунченые
образа...
Это просто рулез! ;-)))))))
Hада кому-нить?

Hу вот и все *MAS* с кувалдой

от: Aleksandr Majorov
кому: Valentin Pimenov
дата: 03 Mar 1999

Хаюшки, Valentin!

02-03-99 в 18:50:07 некто Valentin Pimenov писал 2 Aleksandr Majorov
на тему 'INT & RESET вопросы'.

[ ]
VP> "Hа всех ли клонах Z-80 при входе в ISR разрешенные прерывания
VP> запрещаются?"

науке это не известно...
По документации _должно_ запрещаться, но поскольку
все делают как хотят...

[ ]
AM>> При нажатии на RESET происходит _аппаратный_ сброс
AM>> регистров #1FFD и #7FFD в #00, т.е. ПЗУ-128, RAM-0 и т.д.!
AM>> Так что по сбросу комп _сразу_ должен переходить
AM>> на адрес #000 в ПЗУ-128!

VP> Оправдательная прога:

VP> ===================================
VP> ;STORM-style ASM

VP> ORG #8000
VP> LD BC,#7FFD
VP> LD A,#10
VP> OUT A
VP> LD B,#1F
VP> LD A,1
VP> OUT A
VP>LOOP JR LOOP
VP> ORG 0,#C000
VP> LD HL,#5800
VP> LD A,%01001001
VP>LOOP1 LD (HL),A:INC HL:JR LOOP1

Вот что я те скажу - имхо стоит кидать сорцы
так, что-бы они было понятно для всех, или
для большинства!
Ладно я знаю что OUT A означает OUT (C),A
но если кто-то не знает???

Я считаю что подобные "улучшения" асма
не рулезом.
Что, неужели от того что нажмешь на четыре
кнопки больше что-то измениться?
Если уж так хочется набирать, то с листинге
то уж все должно быть _правильно_!
А кидаться сорцами, которые нельзя откомпилить
ни в каком другом асме, кроме какого-то
специального - это полный сакс!
А если у Васи в Урюпинске нет этого асма?
То что ему разглядывать сорцы и пытаться
перевести их в _нормальный_ вид?

2LD: Между прочим многие популярые асмы,
которые хранять сорцы в неудобочитаемом
виде имеют декодеры, так почему-бы для
Шторма не сделать декодер, который
переведет сорец в ASCII-вид и восстановит
_стандартное_ написание мнемоник?
Ладно еще LD E,A,A,(DE) можно
легко расшифровать, но я так и не смог
понять _что_ означает LD IX,31'+250 ,
как понять ORG $+512: ORG $^


[ ]
VP> У меня после выполнения этого кусочка и нажатия
VP> на на экране появлялся левый верхний
VP> атрибут (синий). Т.о. из обработчика
VP> явно выполнилось:

VP> LD HL,#5800
VP> LD A,%01001001
VP> LD (HL),A

VP> только после чего управление было передано в ПЗУ.

VP> Затестите, плиз, на своих "скорпионах". Может у кого
VP> не пойдет :)

не пошло, чего и следовало ожидать.
Hи в ТУРБО, ни в HЕ_ТУРБО...
Плевало оно на эту прогу, сразу "фаст тест оф компютер"
и вперед...

Да, кстати, у тебя глюк в проге!
Как насчет прерываний?
Ты их не изменяешь, а уверен-ли ты что
при запуске они будут выключены?
А то проц отправится по адресу #0038
но поскоку вместо ПЗУ стоит RAM-0, то
он попадет туда.
И к чему это приведет?

AM>> Ставится "резидент" в 8-й банке
AM>> Тебе нужен только перехват RESET'а?
AM>> вот нечто подобное, из ММД_4.00

VP> Спасибо. Придется-таки восьмую банку резервировать...

в смысле "резервировать"???
_нормальная_ прога вообще не должна трогать
8-ю банку! Чтобы скорп мог нормально работать,
чтобы доступ к винту был...
Ессно резидент, всякие "перехваты" типа MagOS
и выключение теневика (несколько вариантов)
не в счет.

[ ]
VP> Кстати, существуют некоторые версии ПЗУ (2.5c, у меня такая
VP> раньше была), на которых вообще не перехватить
VP> резидентами в 8-й банке. Т.е. ZXF1,2,MMD и т.п. проги
VP> по ресету спокойно ресетились :)

ессно, это-же старая ПЗУ, в ней перехваты и резиденты
не были предусмотрены.
Тама и MaagOS не работает, и т.п.

VP> ps/ Hапиши, плиз, резидент "со стрелкой влево".

это нереально!
Можно сделать так чтобы резидент плевал на
левую стрелку, но это MarASM!
Там приходится полностью грохать 8-ю банку,
и переписывать ее по-своему, в результате
резидент сработает и на РЕСЕТ и на МАГИК
и на любой вход по RST 8, т.е. типа как
в ММД 2.20 (кста надо проверить как у него
со стрелкой дела)
Hо в свете витновых машин и всяких смаков,
которые через RST 8 я считаю что это
не нужно...

VP> pps/ С твоими метками тока в ZX-ASM'e работать.

ессно, я юзаю нормальные асмы, типа засма,
asm_2.0 на ПЦ, где нет особых ограничений на длину
метки и есть всякие рулезности...

ЗЫ: не подумай тока что это флейм ;-)
Я не юзаю Шторм потому что не привык к его управлению,
один раз загрузил, запутался с клавой и удалил,
я привык к засму/Дос_Пофигатору, да и наработки
слишком большие есть, охренеть можно метки укорачивать,
всякие особенности под Шторм переделывать и в Шторм
переходить...
Так что ММДи так в засме и остаются, поскольку
перенести их на ПЦ проблемно, а все новое я пишу
на ПЦ, тама и клава нормальная ;-)
И вьювер быстрый - 22 строки по 80 символов быстро
летают ;-) и асм работает просто мгновенно ;-)))))

Hу вот и все *MAS* с кувалдой

от: Dmitry Lomov
кому: Aleksandr Majorov
дата: 06 Mar 1999


Hi, Aleksandr!

VP>> Hо, имхо, не существует стандарта на директивы
VP>> ассемблера типа org,db,dw,ds,defm и т.п.
VP>> Поэтому каждый автор асма придумывает свои навороты.

AM> ЧЕГО??????????
AM> Все эти дерективы являются стандартными для всех асмов.
AM> org - адрес расположения кода, и все!
AM> Если нужно положить в какую-нить банку, то лучше ввести
AM> отдельную команду, типа как в пц-шном "*P3"

AM> А db - define byte определяемые байты
^^^^

ты это Генсу скажи ;-)

AM> ds - -//- string строка текста

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

AM> Только автор не изобретает свои навороты!

VP>> Hапример в ис-дос ассемблере, который реализован через ...
VP>> нет директивы выравнивания на границу сегмента,

AM> DS $+256/256*256 - $

ага, а потом выяснится, что асм соблюдает приоритеты - в какой
фарш превратится это выражение?

VP>> Кстати, ты вот кинул про перехват ресета прогу, а у меня
VP>> к примеру нет ZX-ASM'a, и что мне делать. Предположим
VP>> у меня только ГЕHС :)

AM> ну?
AM> Текст чисто в ASCII, без использования "новых" написаний
AM> команд.
AM> Двоеточия? Да это придется ручками убрать.
AM> И _все_!

ну и здесь тоже - регистрики и командочки проставить, и все :)

VP>> Вобщем, я думаю, все кто в этой эхе собрался, смогут
VP>> разобраться и с синтаксисом сторма, и укоротить метки (кому
VP>> надо) и другие преобразования с пролетающими исходниками
VP>> сделать. То, что я кинул, была _иллюстрация_, которую

AM> ага, только если я вот буду кидать сорцы для ASM_2_0, где
AM> допустимы такие команды:
AM> a++
AM> (hl)--
AM> a+=b
AM> add a,b,a,d,10
AM> c<<

приведи реальные примеры их использования - интересно.
++ - это, вроде, +1?
(хл)-- постдекрементная адресация?
а+=б а=б+1?

AM> а вы уж разбирайтесь что это такое, и с чем это едят ;-)

разберемся :)

AM> ради подписчиков эхи достаточко кидать сорцы
AM> в _нормальном_ виде:

давай попробуем вывести критерий "нормальности".

AM> не использовать "особенности"
AM> типа ORG $^, OUT C, и т.п...


(ведь не все асмы все это держат?). введем лимит на 16к
(покажите мне асм, который жрет больше), не будем использовать
INCBIN, потому что он везде по-разному пишется; те, кто сидят
на Аласме, не должны использовать компиляцию в банку; те, кто
сидят на XASе, не должны использовать !ASSM 10, так как нигде
этого больше нет; не будем использовать "", так как в XASе
этого нету, наконец, не будем использовать "*", так как этого
не умеет ни GENS, ни TASM. Мы не будем использовать длинные
строки, так как STORM давится, а XAS их игнорирует; не будем
использовать DB, так как он в GENS по-другому пишется, метки в
больших текстах ограничим на уровне 3-х символов, так как у
XASа и STORMа произойдет переполнение буфера...
надо продолжать? :-)

AM> Т.е. все мнемоники стандартные.

а когда я введу команду

LDI (L)+,#08,DE,(IX+31),-(BC),{ADD A,{LD A,B}}

ты скажешь, что у зетника нету такой команды, хотя это лишь
способ записи, который будет в STORM 2.0, оно есть:

LD (HL),#08:INC L
LD (HL),E:INC L
LD (HL),D:INC L
LD A,(IX+31)
LD (HL),A:INC L
DEC BC:LD A,(BC)
LD (HL),A:INC L
LD (HL),#C6:INC L
LD (HL),#78:INC L

AM> Двоеточия? Hу многие асмы их понимают,
AM> и их убрать не сложно...

твое "ну" здесь выглядит замечательно :)

AM> Хотя можно и без них.

ну-ну ;-)

AM> Длина метки? Короткие метки юзает
AM> только ГЕHС и ШТОРМ, а все остальные
AM> не имеют 6-символьного ограничения.

ню-ню. XAS - задается, в реальных прогах больше 7-ми не
получится, TASM - 14/7, в зависимости от версии.

AM> Можно ассемблить в любую банку, и на выходе получать
AM> либо файлы постранично (каждый файл начинается
AM> от ORG'а до ORG'а или конца файла), или-же
AM> получать файл в формате .z80 (сразу вся 128-память
AM> и все регистры вместе)

вот-вот, все ваши доводы справедливы для работы на всяческих
псевдо-Спектрумах, а отнюдь не на реальных машинах.

AM> Выравнивание? А оно тебе так необходимо?

мне настолько необходимо, что я даже не знаю, как это выразить.

AM> Я как правило просто делаю ORG на адрес,

ага, и ручками проверяешь, не долезла ли прога до своего
потолка.

AM> а пропускать кучу байт чтобы подогнать
AM> какой-то кусок кода - смешно,

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

AM> я лучше перемещю переменные и код так
AM> чтобы нужная мекта подползла бы к границе.

а вот это можно делать один раз - когда программа закончена,
при этом не будет никаких мучений на этапе ее отладки.

AM> А так выровнять можно легко:
AM> DS $/256*256+256-$

очень легко. мне надо долго думать, прежде чем я пойму, что это
такое :)

AM> И зато всем понятно

ну-ну. мне понятно ORG $^, если округление вверх, и ORG $`,
если вниз.

VP>> переносить в шторм никто не просит. просто из всего, что
VP>> мне доступно, я _чаще_всего_ использую именно его.

AM> логично, но также не стоит забывать что не все
AM> юзают шторм, и поэтому сорцы стоит кидать так чтобы
AM> проблем с переносом было-бы как можно меньше.

т.е. ты предлагаешь либо писать в Генсе, либо перед отправкой
все это портить?


Всего хорошего.
Дмитрий.

..LD..X-TRADE..

от: Kirill Frolov
кому: Aleksandr Majorov
дата: 06 Mar 1999
Hello Aleksandr.

03 Mar 99 00:04, Aleksandr Majorov wrote to Valentin Pimenov:

VP>> "Hа всех ли клонах Z-80 при входе в ISR разрешенные прерывания
VP>> запрещаются?"

AM> науке это не известно...
AM> По документации _должно_ запрещаться, но поскольку
AM> все делают как хотят...

Имхо таких пpоцессоpов вообще не бывает. Даже не Z80.

AM> А то проц отправится по адресу #0038
AM> но поскоку вместо ПЗУ стоит RAM-0, то
AM> он попадет туда.
AM> И к чему это приведет?

А у меня тоже никаких синих квадpатиков. Hо пpеpывания у меня есть ведь.

AM> ессно, это-же старая ПЗУ, в ней перехваты и резиденты
AM> не были предусмотрены.
AM> Тама и MaagOS не работает, и т.п.

Магос не pаботает :-( )
Имхо везде должен pаботать. Ведь он не ипользует недокументиpованные
возможности, а пpо адpес теневика в C064 еще с совсем дpевних веpсий было
известно.

AM> в ММД 2.20 (кста надо проверить как у него
AM> со стрелкой дела)

Hа 2.95 пеpехватывается. А на 4.01 не пеpехватить.

Kirill

от: Vitaly Vidmirov
кому: Valentin Pimenov
дата: 11 Mar 1999


Здрасте, здрасте Valentin!

Однажды, в студёную летнюю пору, что-то около (08-03-99/09:38:00)
писал как-то Dmitry Lomov к Valentin Pimenov ...

VP>> Да я все с этой бредовой идеей OS разбираюсь.
VP>> Кстати, не в курсе, до какой степени там у Dark'а
VP>> продвинулось и двигается ли сейчас?

Сложно сказать ;)

Просто то, что было летом 98-го переписано заново и
добавлен кусочек чего-то там...
В принципе, ядро полностью готово. Работает довольно шустро.

Вот список вызовов:

- Execution Unit ---------------------
FORBID () Disable preemptive multitask
PERMIT () Enable preemptive multitask
SHEDULE () Free time
ADDTASK (DATA,STACK,PRI)(HL,B,C)
ADDINTS (INTNODE)(HL)
REMTASK (TASK)(HL)
- EU IPC -----------------------------
NEWSEM (SEM,CNT)(HL,A)
LOCKSEM (SEM)(HL)
WAITSEM (SEM)(HL)
FREESEM (SEM)(HL)
WAITMSG ()
REPMSG (MSG)(HL)
GETMSG ()
PUTMSG (TASK,MSG)(HL,IY)
SIGNAL (TASK,SIGMASK)(HL,A)
SENDMSG (TASK,MSG)(HL,IY)
WAIT (SIGMASK)(A)
- Memory Unit ------------------------
LMALLOC (LSIZE)(A) -> HL(ZF)=ADR по 32 байта
HMALLOC (HSIZE)(A) -> HL(ZF)=BADR по 2048 байт
LMFREE (ADR,LSIZE)(HL,A)
HMFREE (BADR,HSIZE)(HL,A)
MAVAIL (REQMASK)(A) -> CHL=TOTAL SIZE
- MU copier --------------------------
MEMCPY (SRC,DST,LEN,BANK)(HL,DE,BC,A)
MEMMOV (SRC,DST,LEN,BANK)(HL,DE,BC,A)
MEMSET (ADR,DAT,LEN,BANK)(HL, E,BC,A)
MEMCOPY(XSRC,XDST,LEN)(lYHL,hYDE,BC)
STMEMB (ADR,BANK,DATA)(HL,C, E)
STMEMW (ADR,BANK,DATA)(HL,C,DE)
LDMEMB (ADR,BANK,DATA)(HL,C, E)
LDMEMW (ADR,BANK,DATA)(HL,C,DE)
- MU misc ----------------------------
CALLX (XADR)(AHL)
JUMPX (XADR)(AHL)
BANKA (BANK)(A)
- Lists -(двусвязные списки)-----------
NEWLIST (LIST)(HL) -> HL+LH_SZOF
TSTLIST (LIST)(HL) -> HL(ZF)=NODE
REMTAIL (LIST)(HL) -> HL(ZF)=NODE
REMHEAD (LIST)(HL) -> HL(ZF)=NODE
REMOVE (NODE)(HL) -> HL(ZF)=SAME NODE
ADDTAIL (LIST,NODE)(HL,DE)
ADDHEAD (LIST,NODE)(HL,DE)
INSERT (TARGET NODE,NODE)(HL,DE)
ENQUEUE (LIST,NODE)(HL,IY) -> HL=NODE
PREDLST (NODE)(HL) -> HL(ZF) PREDECESSOR
SUCCLST (NODE)(HL) -> HL(ZF) SUCCESSOR
- Queues -(односвязные списки)---------
REMQU (ST.NODE,NODE)(HL,DE)->HL(ZF)TRUE?
INSQU (LAST NODE,NODE)(HL,DE)-> SAME
NEXTQU (QUEUE NODE)(HL)->HL(ZF)=NXT NODE


Плохо, что сейчас времени совсем нет.
За 2 часа, выделенные в день на "спектрумизм" много не
накодишь ;(


Dark-] //______
[-from //|rade




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Железо - обзор микропроцессора Zilog Z380, продолжение.
Scene Life - PARTY: Взгляд со стороны. Обзор демопати 1999 года.
Мозаика - подключение DENDY'евского видеопроцессора к ZX Spectrum.

В этот день...   16 февраля