;----------------
; UnHrip v1.xx
; (c) sinn/dtr/fdm
; 23.o4.2oo1
;----------------------
        MAIN "",134

LHEAD    EQU 29
BUF_2SEC EQU #8000      ; адрес буфера в 2 сектора

        INCLUDE "LDSVBYTE",#45

; Выдать каталог на консоль:)
; HL - трек/сектор
; A  - смещение от трека/сектора (если нет - #00)
; DE - куда поместить каталог

GET_CAT LD (ADR_CAT),DE
        LD (BEG_HRP),HL
        CALL INILD

        XOR A
        LD HL,(ADR_CAT)
        LD (HL),A

        LD HL,BUF_2SEC
        LD BC,8
        CALL LD_BYTE
        LD HL,BUF_2SEC
        LD DE,IDARCH
        LD BC,8
        LDIR 
        CALL TST_ID1
        JP NZ,ERR_ID2
        CALL GET_END

;------------------------
LOPS    LD HL,(TEK_SECB)
        LD (BEG_SECB),HL
        LD A,(TEK_BYTS)
        LD (BEG_BYTS),A
        LD HL,FHEAD
        LD DE,FHEAD+1
        LD BC,15
        LD (HL),0
        LDIR 

lops    LD HL,BUF_2SEC
        LD BC,LHEAD
        CALL LD_BYTE
        CALL TST_ID2
        JP NZ,ERR_ID2

        LD HL,BUF_2SEC+15
        LD DE,FHEAD
        LD BC,11
        LDIR 
        PUSH DE
        LD HL,(BEG_HRP)
        CALL TS2LS
        EX DE,HL
        LD HL,(BEG_SECB)
        CALL TS2LS
        AND A
        SBC HL,DE
        EX DE,HL
        POP HL
        LD (HL),E
        INC HL
        LD (HL),D
        INC HL
        LD A,(BEG_BYTS)
        LD (HL),A
        INC HL
        LD BC,(BUF_2SEC+8)
        TOSEC
        LD A,(HL)
        ADD A,B
        LD (HL),A
        INC HL
        LD BC,(BUF_2SEC+6)
        TOSEC
        LD A,(HL)
        ADD A,B
        LD (HL),A

        LD HL,BUF_2SEC+8
        BCFHL
        CALL NEXT_SECB_         ; следующий блок

        LD A,(BUF_2SEC+5)
        BIT 1,A
        JP Z,lops

        LD HL,FHEAD
        LD DE,(ADR_CAT)
        LD BC,16
        LDIR 
        LD (ADR_CAT),DE

        LD HL,(TEK_SECB)
        LD DE,(LASTE)
        AND A
        SBC HL,DE
        JP NZ,LOPS
        LD A,(SMESH)
        LD BC,(TEK_BYTS)
        SUB C
        JP NZ,LOPS
        XOR A
        LD DE,(ADR_CAT)
        LD (DE),A
        RET 

GET_END LD HL,(BEG_HRP)
        CALL TS2LS
        LD DE,(LAST)
        ADD HL,DE
        LD A,(SMESH)
        AND A
        JR Z,NODEC
        DEC HL
NODEC   CALL LS2TS
        LD (LASTE),HL
        RET 

ERR_ID1 LD A,0  ; ошибка в сигнатуре архива (не архив HRP)
        SCF 
        RET 
ERR_ID2 LD A,1
        SCF 
        RET 

FHEAD   DS #10  ; буфер для заголовка файла (для сумм. блоков)
LASTE   DW 0    ; хуйня из-под коня :(
BEG_HRP DW 0    ; начало HRiP файла
BEG_SECB DW 0   ; начало блока на диске
BEG_BYTS DB 0   ; начало блока на диске

; END_ARCH=[LAST]*256-(256-[SMESH]) bytes

ADR_CAT DW 0    ; плавающий адрес каталога
IDARCH  DB "HRi" ; индентификатор
IDALL   DB 0     ; количество файлов в архиве (используется в
                 ; Hrip'е при дополнении архива, что-бы не
                 ; было больше 255 файлов
SMESH   DB 0     ; см. далее (BYTE)
LAST    DW 0     ; см. далее (SECS)
CATF    DB 0     ; 1 - каталог присутствует в архиве
                 ; 0 - каталога отсутствует

TST_ID1 LD HL,IDARCH
        LD DE,ID1
        LD B,3
        JP TST_ID
TST_ID2 LD HL,BUF_2SEC
        LD DE,ID2
        LD B,5
        JP TST_ID

; HL - с чем сравнивать
; DE - что с сравнивать
; B  - длина сравнения
TST_ID  LD A,(DE)
        CP (HL)
        RET NZ
        INC DE
        INC HL
        DJNZ TST_ID
        RET 

ID1     DB "HRi"
ID2     DB "Hrst2"

