(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...