Запустил и даже немного поиграл. Итак, защита была не по цвету, а по байту в копирайте строки "МДОС 1.0 ". После версии стоит пробел, вот в этой ячейке и хранилось что-то нужное. Что именно - я пока не разобрался. Вообще складывается ощущение, что игрушка уже была кем то покоцана, либо попорчена. Например такой фрагмент:
Говорит о том, что здесь забили нопами запись в какой-то порт.Код:RAM:F007 mvi a, 82h RAM:F009 nop RAM:F00A nop RAM:F00B mvi a, 0FCh RAM:F00D out 80h
Или:
Собственно сам подозрительный код:Код:RAM:917E do_GAME: RAM:917E mvi a, ' ' RAM:9180 lxi bc, 768 ; 32*24 RAM:9183 lxi hl, 0 RAM:9186 call sv_FILLCHAR ; clear screen RAM:9189 call sub_9E74 ; clear variables RAM:918C ei RAM:918D nop RAM:918E nop RAM:918F nop RAM:9190 nop RAM:9191 nop RAM:9192 nop RAM:9193 nop RAM:9194 nop RAM:9195 nop RAM:9196 nop RAM:9197 nop RAM:9198 nop RAM:9199 nop RAM:919A nop RAM:919B nop RAM:919C nop RAM:919D nop RAM:919E nop RAM:919F nop RAM:91A0 nop RAM:91A1 nop RAM:91A2 nop RAM:91A3 nop RAM:91A4 nop RAM:91A5 nop RAM:91A6 nop RAM:91A7 nop RAM:91A8 nop RAM:91A9 nop RAM:91AA nop RAM:91AB nop RAM:91AC nop RAM:91AD nop RAM:91AE nop RAM:91AF nop RAM:91B0 nop RAM:91B1 nop RAM:91B2 nop RAM:91B3 nop RAM:91B4 nop RAM:91B5 nop RAM:91B6 nop RAM:91B7 nop RAM:91B8 nop RAM:91B9 nop RAM:91BA nop RAM:91BB nop RAM:91BC nop RAM:91BD nop RAM:91BE nop RAM:91BF nop RAM:91C0 nop RAM:91C1 nop RAM:91C2 nop RAM:91C3 nop RAM:91C4 nop RAM:91C5 nop RAM:91C6 nop RAM:91C7 nop RAM:91C8 nop RAM:91C9 nop RAM:91CA nop RAM:91CB nop RAM:91CC nop RAM:91CD nop RAM:91CE nop RAM:91CF nop RAM:91D0 nop RAM:91D1 nop RAM:91D2 nop RAM:91D3 nop RAM:91D4 nop RAM:91D5 nop RAM:91D6 nop RAM:91D7 nop RAM:91D8 nop RAM:91D9 nop RAM:91DA nop RAM:91DB lxi bc, 64 RAM:91DE lxi de, word_8F80 RAM:91E1 lxi hl, word_8FC0 RAM:91E4 call sv_MEMCOPY RAM:91E7 nop RAM:91E8 nop RAM:91E9 nop RAM:91EA mvi a, 26 RAM:91EC sta tmpData RAM:91EF lxi de, 0 RAM:91F2 RAM:91F2 loc_91F2: RAM:91F2 lxi bc, 32 ; bc = screen width RAM:91F5 lxi hl, screenBuffer ; 832 bytes RAM:91F8 call sv_MEMCOPY RAM:91FB lda tmpData RAM:91FE dcr a RAM:91FF sta tmpData RAM:9202 jnz loc_91F2 RAM:9205 ; put sprite Heroes
По адресу DA82h как раз тот самый пробел в копирайте МДОС. Если заменить 0 на 3, то игра запускается. В файле CAS это смещение 011Eh. Одно но, на экране лезут какие-то артефактыКод:RAM:F07F mvi a, 0 RAM:F081 sta byte_DA82![]()
В принципе можно дальше поковыряться, да попробовать подправить код. Но это после праздников. Ну или заново написать, таблицы знакогенераторов и цветов сохранились и я могу их легко вытянуть.
PS: определять оставшуюся жизнь игрока по цвету его корабля - это оригинально
- - - Добавлено - - -
Вот теперь полностью разобрался в защите.
Защита в следующем. Из ячейки 0DA82h берется байт. К нему прибавляется 7Fh и полученный результат пишется на адрес 9BC8h. В этом адресе находится старший байт параметра команды CALL (младший байт постоянный и равен 1Bh). То есть, происходит вызов подпрограммы по адресу (([0DA82]+7Fh) << 8) | 1Bh.
Пробежался по все адресам XX1Bh, начиная с 7F1Bh. По адресу 9B1Bh весьма "подозрительная" подпрограмма. Поставил в ячейку DA82h значение 9Bh-7Fh = 1Ch. И все, работает![]()
Для не программистов. В файле SWING.CAS нужно в ячейку по адресу 011Eh прописать значение 1Ch.





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