Deja Vu
#01
30 июня 1997 |
|
Coding - Режим IM 2 при работе в TR-DOS (вариант Loader'а).
(C)1997 CARDINAL Режим IM 2 при работе TR-DOS. __________________________________________ * * * Сегодня мы поговорим о дисковых загруз- чиках. Если вы не поняли мою мысль, я по- ясню. Кто видел INSULT MEGADEMO или BATTLE COMMAND (cracked by STALKER), те, наверно, заметили, что LOADER'ы там музыкальные, именно о таких LOADER'ах пойдет наш разго- вор. Совместить музыку, бегушку и др. на- вороты с загрузчиком не так сложно, как кажется. Надо музыку и др. навороты поса- дить на прерывания а LOADER оставить как есть. Каким же должен быть LOADER ? Он должен работать с портами ВГ напрямую и не запрещать прерывания во время работы, а дальше дело техники. Хотя есть один нюанс в этом деле. Надо правильно организовать прерывания, а как я сейчас поясню. Во вре- мя прихода очередного импульса прерывания, на стек ложится адрес возврата, если в этот момент было включено ПЗУ TR-DOS, то оно отключается, и начинает работать наша программа обработки прерывания. Когда наша программка обработки прерываний сделает свое дело, то она возвращается в основную программу по RET или RETI. А чтобы не было обломов при возврате именно в ПЗУ TR-DOS, надо вместо RET или RETI надо ставить JP #3D2F. Ниже дан приблизительный вариант LOADER'а. ORG 25000 DI LD SP,24999 CALL 49152 ;инициализируем DI ;музыку LD HL,#BE00 ;организовываем LD D,H ;прерывания LD E,L LD B,L LD C,L INC E INC B LD (HL),#BF LD A,H IM 2 LD I,A LDIR EI LD DE,#0100 ;в DE помещаем ;трек и сектор LD HL,#4000 ;в HL адрес LD B,#1B ;в B длина CALL LOADER ;запуск JOY1 LD A,#7F IN A,(254) ;после загрузки RRCA ;ожидаем нажатия JR C,JOY1 ;SPACE CALL 49152 ;гасим музыку DI RET ;возврат LOADER LD A,(#5CF6) INC E LD (PUT_DR+1),A LD A,I LD A,#F3 JP PO,INT LD A,#FB INT LD (PUT_INT),A LOOP LD A,D AND A RRA LD C,#7F CALL DOS LD A,#3C JR NC,PUT_DR LD A,#2C PUT_DR OR 0 LD C,#FF CALL DOS LD A,#18 PUSH BC PUSH DE LD BC,#011F CALL DOS LD IX,#3EF5 CALL TRDOS LD D,A LD IX,#20B1 CALL TRDOS POP DE POP BC LOOP1 PUSH BC PUSH DE LD A,E LD C,#5F CALL DOS LOOP2 PUSH HL LD C,#1F LD A,#80 CALL DOS LD C,#7F LD IX,#3FD5 CALL TRDOS JP P,REPEAT CALL CH_REG PUT_IN NOP POP HL LD A,(#5CD6) OR A JR NZ,LOOP2 LD A,#7F ;опрашиваем кла- IN A,(254) ;вишу SPACE во RRCA ;время загрузки CALL NC,KON ;вызов подпрог- ;раммы если было ;нажатие POP DE POP BC INC H BIT 4,E JR NZ,N_TR INC E DJNZ LOOP1 JR OK_QUIT N_TR LD E,#01 INC D DJNZ LOOP OK_QUIT DEC E LD (#5CF4),DE ;перед выходом ;сохраняем трек ;и сектор RET KON DI ;запрещаем преры- ;вания LD A,#F3 ;кладем байт #F3 LD (PUT_INT),A ;в ячейку PUT_INT XOR A ;восстанавливаем LD I,A ;прежний режим IM 1 ;прерываний LD C,#FD ;очищаем AY CHIP LD H,A QUIT1 LD B,#FF OUT (C),A LD B,#BF OUT (C),H INC A CP 16 RET Z JR QUIT1 RET ;вых. из подпрог- ;раммы ;вся эта бурда нужна для того, чтобы при ;нажатии SPACE во время загрузки, дальней- ;шая загрузка пошла с нормальной скоростью CH_REG XOR A ;читаем регистр LD (#5CD6),A ;состояния LD HL,#0007 PUSH HL INC A PUSH AF LD IX,#2099 JR TRDOS REPEAT POP HL POP DE POP BC JP LOOP DOS LD IX,#2A53 TRDOS PUSH IX JP #3D2F ORG #BFBF ;обработка преры- PUSH AF ;вания PUSH HL PUSH DE PUSH BC PUSH IX PUSH IY CALL 49158 ;запуск музыки POP IY POP IX POP BC POP DE POP HL POP AF EI JP #3D2F ;переход на адрес ;#3D2F где стоит ;RET А сейчас небольшой комментарий. Не ве- шайте на прерывания много прибамбасов, иначе загрузка будет проходить медленнее, чем с магнитофона. Последние дорожка и сектор сохраняется в ячейке #5CF4. Все ад- реса в листинге произвольные, и по-этому меняйте их на удобные для вас, в случае необходимости. Вообще-то LOADER может быть любым, лишь бы он не запрещал прерывания и не глючил при ошибке чтения. END...
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября