Переводы, переводы, переводы... > Тестирование

Alien 3(j) GB

<< < (6/6)

TrickZter:

--- Цитата: greengh0st от 06 Март 2013, 16:09:42 ---Вася дебажить не умеет, плюс он как появился, мы ему заданий уже надавали)))
--- Конец цитаты ---
Ну, для твое проги я как раз дебажил... ::)

greengh0st:
 :o значит теперь ты умеешь дебажить?!!! Тогда мы идем к вам))))

TrickZter:

--- Цитата: greengh0st от 07 Март 2013, 00:03:53 --- :o значит теперь ты умеешь дебажить?!!!
--- Конец цитаты ---
Ну, опыта у меня ещё не очень много, но вот этот код я разобрал:


--- Код: ---
D000: ldi a,(hl)//загрузка дополнительного флагового байта
D001: adc a     //получает 3-й флаговый бит (10X) и добавляет бит конца флагового байта
D002: jr D037   //возвращает обратно
D004: ldi a,(hl)//загрузка дополнительного флагового байта
D005: adc a     //получает 4-й флаговый бит (10XX) и добавляет бит конца флагового байта
D006: jr D03C   //возвращает обратно
D008: ldi a,(hl)//загрузка дополнительного флагового байта
D009: adc a     //получает 4-й флаговый бит (10X1Y) и добавляет бит конца флагового байта
D00A: jr D041   //возвращает обратно
D00C: ldi a,(hl)//загрузка дополнительного флагового байта
D00D: adc a     //получает флаговый бит и добавляет бит конца флагового байта
D00E: jr D050   //возврат обратно в цикл
D010: ldi a,(hl)//загрузка дополнительного флагового байта
D011: adc a     //получает флаговый бит (10111X...) и добавляет бит конца флагового байта
D012: jr D019   //возвращает обратно
D014: ld c,04   //(10111)задаёт счётчик 4 (вместо длины 9)
D016: add a     //получает флаговый бит (10111X...)
D017: jr z,D010 //если флаговые биты кончились(10111|1), то переход
D019: rl b      //вталкивает бит в b (b shl 1) + bit
D01B: dec c     //уменьшает счётчик на 1
D01C: jr nz,D016//если счётчик не = 0, то повторить цикл (цикл идёт 4 раза)
D01E: push af   //скидывает флаги в стек
D01F: ld a,03   //задаёт минимальную длину непожатого отрезка (a=3): LEN = 3
D021: add b     //a = 3 + b | LEN = 3..18
D022: add a     //a = a + a | LEN = 6..26 (только чётные)
D023: ld c,a    //скидывает a в c | LEN в байтах = 12..52 (кратно 4)
D024: ldi a,(hl)//загружает байт из рома
D025: ld (de),a //копирует байт в буфер
D026: inc de    //увеличивает адрес буфера
D027: ldi a,(hl)//загружает байт из рома
D028: ld (de),a //копирует байт в буфер
D029: inc de    //увеличивает адрес буфера
D02A: dec c     //уменьшает c
D02B: jr nz,D024//если счётчик не обнулился - повторить
D02D: pop af    //возвращает флаги
D02E: jr D089   //назад к циклу
D030: ldi a,(hl)//загрузка дополнительного флагового байта
D031: adc a     //получает 2-й флаговый бит (1X) и добавляет бит конца флагового байта
D032: jr c,D09E //если флаговые биты (11), вернуться обратно в цикл
D034: add a     //получает 3-й флаговый бит (10X)
D035: jr z,D000 //если флаговые биты кончились (10|1), то переход
D037: rl c      //третий (10X) флаговый бит становится младшим битом длины отрезка((2 shl 1) + carry) (длина 4-5), carry обнуляется
D039: add a     //получает 4-й флаговый бит (10XX)
D03A: jr z,D004 //если флаговые биты кончились (10X|1), то переход
D03C: jr nc,D04D//если последний флаговый бит был 0 (10X0), то переход
D03E: add a     //получает 5-й флаговый бит (10X1X)
D03F: jr z,D008 //если флаговые биты кончились (10X1|1), то переход
D041: dec c     //(10X1X) уменьшение длины отрезка на 1 (длина временно 3-4)
D042: push hl   //скидывает адрес в роме в стек (освобождает временно hl)
D043: ld h,a    //скидывает флаговые биты в h
D044: ld a,c    //копирует длину в a
D045: adc a     //предыдущий флаговый бит (10X1Y) идёт в длину((LEN shl 1) + Y) (длина 6-9)
D046: ld c,a    //длина скидывается обратно в c
D047: cp a,09   //сравнивает длину с 9: если LEN=9, то z=1; если LEN<9, тогда carry=1
D049: ld a,h    //возвращает флаговые биты обратно
D04A: pop hl    //возвращает адрес в роме
D04B: jr z,D014 //если LEN=9, то переход, если же LEN<9, то идём дальше
D04D: add a     //>>LEN>>получает флаговый бит (X)
D04E: jr z,D00C //если флаговые биты кончились (пример: |1), то переход
D050: jr nc,D06C//если флаговый бит = 0, то переход к копированию
D052: add a     //получает 2-й флаговый бит (1X)
D053: jr nz,D057//если флаговые биты не кончились (пример: 1|1) то перескочить
D055: ldi a,(hl)//получение дополнительного флагового байта
D056: adc a     //получает 2-й флаговый бит (1X) и добавляет +1 (флаг конца цикла)
D057: rl b      //скидывает в b последний флаговый бит
D059: add a     //получает 3-й флаговый бит (1XY)
D05A: jr nz,D05E//если флаговые биты не кончились (1X|1) то перескочить
D05C: ldi a,(hl)//получение дополнительного флагового байта
D05D: adc a     //получает 3-й флаговый бит (1XY) и добавляет +1 (флаг конца цикла)
D05E: jr c,D0C1 //если 3-й флаговый бит 1 (1X1), то переход
D060: inc b     //(1X0)\
D061: dec b     //     |проверка на 0
D062: jr nz,D06C//если b = 1 (110), то переход к копированию
D064: inc b     //если b = 0 (100), то b = 1
D065: add a     //получает 4-й (или 5-й, если пришёл с D0D1) флаговый бит (100X)
D066: jr nz,D06A//если флаговые биты не кончились (100|1), то перепрыгнуть
D068: ldi a,(hl)//получение дополнительного флагового байта
D069: adc a     //получает 4-й флаговый бит (100X)
D06A: rl b      //вталкивает последний флаговый бит в b | b = (b shl 1) + X
D06C: push af   //>>>начало копирования>>>скидывает флаги в стек
D06D: ld a,e    //копирует младшую часть адреса буфера
D06E: sub (hl)  //a-(hl) вычитает байт смещения (считывая его из рома)
D06F: push hl   //скидывает адрес в роме в стек (освобождает временно hl)
D070: ld l,a    //скидывает адрес копирования в младшую часть hl
D071: ld a,d    //копирует старшую часть адреса буфера
D072: sbc b     //a-(b+carry) считает старшую часть адреса в буфере
D073: ld h,a    //скидывает адрес копирования в старшую часть hl
D074: dec hl    //уменьшает адрес копирования на 1
D075: ldi a,(hl)//копирует из буфера повторный (сжатый) байт и увеличивает hl
D076: ld (de),a //вставяет повторный байт в буфер
D077: inc de    //увеличивает адрес буфера
D078: dec c     //уменьшает счётчик повторных байтов
D079: jr nz,D075//если счётчик не обнулился - вернуться к копированию
D07B: pop hl    //возвращает из стека адрес в роме
D07C: inc hl    //увеличение адреса в роме
D07D: pop af    //возвращает флаги из стека
D07E: jr D089   //переход обратно к циклу
D080: ldi a,(hl)//>>>загрузка следующего флагового байта, увеличение адреса в роме
D081: adc a     //получает 1-й флаговый бит (X) и добавляет +1 (флаг конца цикла)
D082: jr c,D096 //если идёт сжатие (1), то переход
D084: push af   //скидывает флаги в стек
D085: ldi a,(hl)//зарузает непожатый байт, увеличивает адрес в роме
D086: ld (de),a //копирует байт в буфер
D087: inc de    //увеличивает адрес в буфере
D088: pop af    //возвращает флаги
D089: add a     //получает 1-й флаговый бит (X)
D08A: jr c,D094 //если идёт сжатие (1), то переход
D08C: push af   //скидывает флаги в стек
D08D: ldi a,(hl)//загружает непожатый байт из адреса hl
D08E: ld (de),a //и скидывает его в буфер по адресу de
D08F: inc de    //увеличивает адрес в буфере
D090: pop af    //возвращает флаги из стека
D091: add a     //получает 1-й флаговый бит
D092: jr nc,D084//если идёт непожатый байт (флаг = 0), то переход
D094: jr z,D080 //если флаговые биты кончились, то переход
D096: ld bc,0002//задание минимальной (2) длины копируемого сегмента
D099: add a     //получает 2-й флаговый бит (1X)
D09A: jr z,D030 //если флаговый байт уже обнулился (флаг 1|1), то идём грузить слудующий благовый байт
D09C: jr nc,D034//если флаговые биты (10), то переход
D09E: add a     //получает 3-й флаговый бит (11X)
D09F: jr z,D0D3 //если флаговый байт уже обнулился (флаг 11|1), то идём грузить слудующий благовый байт
D0A1: jr nc,D06C//если флаговые биты были 110, то переход к копированию отрезка (длина: 2)
D0A3: inc c     //длина увеличивается до 3
D0A4: add a     //получает 4-й флаговый бит (111X)
D0A5: jr z,D0D7 //если флаговый байт уже обнулился (флаг 111|1), то идём грузить слудующий благовый байт
D0A7: nc,D04D   //если флаговые биты были 1110, то переход
D0A9: ld c,(hl) //загружает длину копируемого семента (флаговые биты: 1111)
D0AA: inc hl    //увеличивает адрес в роме
D0AB: inc c     //\
D0AC: dec c     //проверка на 0
D0AD: jr z,D0DB //если длина = 0, то переход (проверка на конец процедуры)
D0AF: push af   //скидывает флаги с стек
D0B0: ld a,c    //перекидывает длину в a
D0B1: add a,08  //увеличение длины на 08
D0B3: ld c,a    //байт перекидывается обратно в c
D0B4: pop af    //грузит флаги обратно
D0B5: jr D04D   //переход
D0B7: ld bc,0012//<<начало>>
D0BA: add hl,bc //пропускает h12 байт (заголовок?)
D0BB: csf       //ставит флаг С
D0BС: ldi a,(hl)//загружает флаговый байт
D0BD: adc a     //A*A+Carry - получает флаговый бит (не используется)
D0BE: add a     //A*A - получает флаговый бит (не используется)
D0BF: jr D089   //переход к циклу
D0C1: add a     //(b = X) получает 4-й флаговый бит (1X1Y)
D0C2: jr nz,D0C6//если флаговые биты не кончились (1X1|1) то перескочить
D0C4: ldi a,(hl)//получение дополнительного флагового байта
D0C5: adc a     //получает 4-й флаговый бит (1X1Y) и добавляет +1 (флаг конца цикла)
D0C6: rl b      //вталкивает последний флаговый бит в b | b = X * 2 + Y
D0C8: set 2,b   //b = 4 + X*2 + Y
D0CA: add a     //получает 5-й флаговый бит (1X1YZ)
D0CB: jr nz,D0CF//если флаговые биты не кончились (1X1Y|1), перескочить
D0CD: ldi a,(hl)//получение дополнительного флагового байта
D0CE: adc a     //получает 5-й флаговый бит (1X1YZ) и добавляет +1 (флаг конца цикла)
D0CF: jr c,D06C //если последний флаговый бит 1 (1X1Y1), то переход ккопированию
D0D1: jr D065   //если последний флаговый бит 0 (1X1Y0), то возьмём ещё бит
D0D3: ldi a,(hl)//получение дополнительного флагового байта
D0D4: adc a     //получает 3-й флаговый бит (пример: 11X) и добавляет +1 (флаг конца цикла)
D0D5: jr D0A1   //возврат обратно в цикл
D0D7: ldi a,(hl)//получение дополнительного флагового байта
D0D8: adc a     //получает 4-й флаговый бит (пример: 111X) и добавляет +1 (флаг конца цикла)
D0D9: jr D0A7   //возврат обратно в цикл
D0DB: add a     //(флаг 1111, LEN=0) получает 5-й флаговый бит (1111X)
D0DC: jr nz,D0E0//если флаговые биты не кончились, то переход
D0DE: ldi a,(hl)//получение дополнительного флагового байта
D0DF: adс a     //получает 5-й флаговый бит (1111X)
D0E0: jr c,D089 //если пятый бит единица (11111), то начать цикл сначала
D0E2: ret       //конец распаковки
--- Конец кода ---

greengh0st:
И так пока времени особо не было, но весь текст и графу удалось привести в порядок, спасибо Пауку, за то что взялся пройти игру и потестить))
[Дата добавления: 15 Март 2013, 11:28:01]Заставка по прежнему не сделана))) Времени не хватает))

Навигация

[0] Главная страница сообщений

[*] Предыдущая страница

Перейти к полной версии