Немного помощи по Ball Breaker:
Отключив автостарт Бейсик-загрузчика, находим в нем такой кусок:
Скрытый текст
Код:5D81 DI LD HL,(#5C53) LD DE,#005A ADD HL,DE LD DE,#5B00 PUSH DE LD BC,#0106 LDIR JP #5B00[свернуть]
как с проверкой переменной начала Бейсик-программы 5C53, так и с точкой останова в 5B00 (или логически) можно выяснить, что далее с 5B00 будет выполняться кусок кода - загрузчик,- лежащий в Бейсик-файле сразу за этим куском выше, с 5D95. Предполагаемые изменения отмечены в тексте:
Скрытый текст
Код:5B00 POP HL ; тот же адрес, куда перемещен код, #5B00 LD DE,#004E ADD HL,DE ; HL указывает на данные о грузимых блоках LD E,(HL) INC HL LD D,(HL) ; стартовый адрес первого блока INC HL LD SP,#5C80 ; стек слишком низко для DOS, еще ниже ; он снова перемещается, так что ; безболезненно поднимаем на #5E80 ; т.к. блоки грузятся намного выше PUSH DE ;1 --- 1 --- этот кусок надо переделать LD E,(HL) ;1 достаточно старшего байта INC HL ;1 только помещаемого в B, т.к. грузить LD D,(HL) ;1 будем секторами, только для длины #416A POP IX ;2 выйдет #42 сектора. Старт-ад надо в HL, PUSH HL ;1 а не IX. Еще надо LD C,5 и LD DE,(#5CF4) XOR A ;1 это все не нужно, и даст нам место DEC A ;1 SCF ;1 EX AF,AF' ;1=11 байт CALL #056C ; --- 1 --- а вызывать надо будет #3D13 DI POP HL INC HL ; хотя адрес-длина блока вынесены, и все LD E,(HL) ; похоже на подпрограмму, второй блок INC HL ; грузится уже этим местом программы LD D,(HL) INC HL PUSH DE ;1 --- 2 --- отсюда начнем переделку куска LD E,(HL) ;1 аналогично первому INC HL ;1 LD D,(HL) ;1 POP IX ;2 XOR A ;1 DEC A ;1 SCF ;1 EX AF,AF' ;1=10 байт CALL #056C ; --- 2 --- DI ; дальше все оставляем, код можно изменить LD DE,#004C ; так, чтоб даже данные старт-длины не LD HL,#5B00 ; менять (судя по копирующей процедуре ADD HL,DE ; слева, они куда-то еще переносятся, LD DE,#4000 ; вдруг нужны в неизменном виде? LD A,#06 ; :) хотя вряд ли) LD BC,#0020 LDIR INC D LD E,#00 DEC A JR NZ,$-#09 LD SP,#401F JP #4200 5B4C NOP DEC DE 5B4E JR NZ,$+#80 ; но это данные, байты DB #20, #7E, #6A, #41 LD L,D LD B,C 5B52 ADC DD ; DB #8A, #BF, #77, #40 CP A LD (HL),A LD B,B[свернуть]
Наши правки приводят к чему-то такому (изменения отмечены комментариями):
Скрытый текст
Код:5D95 POP HL LD DE,#004E ADD HL,DE LD E,(HL) INC HL LD D,(HL) INC HL LD SP,#5E80 ; стек повыше для DOS INC HL ;1 LD B,(HL) ;1 INC B ;1 LD C,#05 ;2 PUSH HL ;1 LD HL,(#5CF4) ;3 XOR A ;1 EX DE,HL ;1=11 байт CALL #3D13 ; DI POP HL INC HL LD E,(HL) INC HL LD D,(HL) INC HL INC HL ;1 LD B,(HL) ;1 INC B ;1 LD C,#05 ;2 LD HL,(#5CF4) ;3 XOR A ;1 EX DE,HL ;1=10 байт CALL #3D13 ;[свернуть]
Теперь исправленный загрузчик можно сохранить с тем же LINE-автостартом, который мы убрали. Такой метод посекторной подгрузки, естественно, работает, когда подгружаемые файлы лежат за загрузчиком всегда в одинаковом заданном порядке.
И все, что остается для получения красивой версии в едином файле - в каком-нибудь дисковом редакторе увеличить длину файла загрузчика в секторах, чтобы она была равна сумме длин в секторах всех трех файлов игры. Затем с этой дискеты можно скопировать только новый "длинный" Бейсик-файл, и кодовые блоки будут уже копироваться вместе с ним, "охваченные" его длиной. В то же время грузиться программа будет, как обычно, т.к. параметры старт-длина у Бейсик-файла не менялись. Теперь порядок файлов перепутать не удастся.
Загрузчик мог бы приложить, но думаю, что для тренировки это лучше сделать другим.
---------- Post added at 16:57 ---------- Previous post was at 16:55 ----------
(тему действительно надо бы переместить в соответствующий раздел)




Ответить с цитированием