|
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...
Другие статьи номера:
Похожие статьи:
В этот день... 1 января
SibNews #08,
Woot! #01,
Spectrum Magazine #01,
ACNews #25,
Psychoz #14,
ACNews #14,
Last 128 #08,
Last 128 #06,
Last 128 #05,
Last 128 #04,
Last 128 #03,
Last 128 #02,
Last 128 #09,
Last 128 #3.5,
Last 128 #8.025,
Sinclair Club #05,
Last 128 #M!R 01,
Fantadrom #01,
Buzz #20,
Last 128 #01,
DonNews #13,
Nicron #120,
Promised Land #01,
Inferno #01,
Marazm #25,
Ultimathum #01,
Marazm #21,
Hooy Mag #02,
KrNews #11,
Marazm #22,
Marazm #23,
ZX Football 2000 #01,
Codemania #01,
Always #03,
Bugs #02,
IzhNews #08,
Virtual Worlds #01,
Listok #04,
Scenergy #02,
Flash Info #18,
Marazm #16,
Marazm #17,
Zed #01,
Balagan #02,
ZX Format #08,
ZX Power #03,
Shock #01,
Impulse #02,
Deja Vu #03,
ZX Club #08,
ZX Club #06,
Numberology #01,
Marazm #13,
Marazm #12,
Marazm #14,
Gorodok #02,
Zodiac #01,
Marazm #15,
Deja Vu #07,
Marazm #11,
Deja Vu #07,
Playboy #03,
Crazy News #2,
Crazy News #4,
ZX Light #01,
Crazy News #5,
Playboy #02,
ZX News #03,
ZX Review #1-2,
Read Me #02,
Crazy News #3,
Nicron #13,
Read Me #01,
Public Spirit #01,
Faultless #06,
Faultless #05,
ZX Software #01,
Stump #04,
Speccy #07,
Возраждение #0,
Speccy #03,
On-Line #17,
Scene+ #01,
Welcome Press #01,
ZX Konig #04,
Adventurer #01,
Faultless #05,
Faultless #04,
Di Halt #01,
Faultless #01,
Playboy #01,
Crazy News #1,
Faultless #03,
Pioneer #03,
Sinclair Town #02,
ZX Magazine #01,
Eldorado #01,
ZX Magazine #02,
Spectron #01,
ZX News #01,
ZX Konig #02,
200 #W,
Welcome Press #00,
Dune #07,
Subliminal Extacy #01,
Subliminal Extacy #02,
ZX Konig #01,
Subliminal Extacy #00,
Muchomor #01,
Spectrofon #01,
ZX Revija #02,
Outlet #01,
Outlet #1-3