; Код Форматилки (без ехе-заголовка) упакован Hrust v1.2 ; ; описание ds xx ; %imacro ds 1 ; times %1 db 0 ; %endmacro include './shared_includes/constants/dss_equ.inc' include './shared_includes/constants/bios_equ.inc' org #9200 - exe_begin.size exe_begin: db 'EX' ; exe ID db 'E' ; exe тип db 1 ; exe версия DWORD exe_begin.size ; смещ. кода dw 0 ; end-beg, первичный загрузчик dw 0,0 ; резерв dw 0 ; dw Packed ; адрес загрузки кода dw Start ; адрес передачи управления dw #C000 ; адрес стека ;ds 490 ; резерв .size EQU $-exe_begin org #9200 Packed: incbin 'build/format.hrs' Start: ld c,0 ; узнать версию ДОС RST ToDSS ld hl,0145h ; 1.69 and a sbc hl,de jr c,ok ; > 1.69 ; ld hl,ver_err ld c,5Ch RST ToDSS ld bc,#2641 RST ToDSS ret ver_err: db "Invalid DSS version, DSS 1.70 or higher is required.",0Dh,0Ah,0 ok: LD HL,#6200 ;!HARDCODE LD BC,Dss.AppInfo.EXE_HomeDir RST ToDSS ; ld hl,Packed ; упак. данные ld de,6400h ; куда распаковать push de ; адрес перехода ; формат упак. файла: ; +0 (word) "HR" - сигнатура ; +2 (word) - длина исходного файла ; +4 (word) - длина упакованного файла ; Распаковщик (DeHrust) ld ix,-12 add ix,sp push de ld sp,hl pop bc ex de,hl pop bc dec bc add hl,bc ex de,hl pop bc dec bc add hl,bc sbc hl,de add hl,de jr c,loc1 ld d,h ld e,l loc1: lddr ex de,hl ld d,(ix+11) ld e,(ix+10) ld sp,hl pop hl pop hl pop hl ld b,6 loc2: dec sp pop af ld (ix+6),a inc ix djnz loc2 exx ld d,0BFh ld bc,1010h pop hl loc3: dec sp pop af exx loc4: ld (de),a inc de loc5: exx loc6: add hl,hl djnz loc7 pop hl ld b,c loc7: jr c,loc3 ld e,1 loc8: ld a,80h loc9: add hl,hl djnz loc10 pop hl ld b,c loc10: rla jr c,loc9 cp 3 jr c,loc11 add a,e ld e,a xor c jr nz,loc8 loc11: add a,e cp 4 jr z,loc26 adc a,0FFh cp 2 exx loc12: ld c,a loc13: exx ld a,0BFh jr c,loc17 loc14: add hl,hl djnz loc15 pop hl ld b,c loc15: rla jr c,loc14 jr z,loc16 inc a add a,d jr nc,loc18 sub d loc16: inc a jr nz,loc20 ld a,0EFh loc17: rrca cp a loc18: add hl,hl djnz loc19 pop hl ld b,c loc19: rla jr c,loc18 loc20: exx ld h,0FFh jr z,loc21 ld h,a dec sp inc a jr z,loc24 pop af loc21: ld l,a add hl,de ldir loc22: jr loc5 ; loc23: exx rrc d jr loc6 ; loc24: pop af cp 0E0h jr c,loc21 rlca xor c inc a jr z,loc23 sub 10h loc25: ld l,a ld c,a ld h,0FFh add hl,de ldi dec sp pop af ld (de),a inc hl inc de ld a,(hl) jr loc4 ; loc26: ld a,80h loc27: add hl,hl djnz loc28 pop hl ld b,c loc28: adc a,a jr nz,loc31 jr c,loc27 ld a,0FCh jr loc32 ; loc29: dec sp pop bc ld c,b ld b,a ccf jr loc13 ; loc30: cp 0Fh jr c,loc29 jr nz,loc12 add a,0F4h ld sp,ix jr loc34 ; loc31: sbc a,a ld a,0EFh loc32: add hl,hl djnz loc33 pop hl ld b,c loc33: rla jr c,loc32 exx jr nz,loc25 bit 7,a jr z,loc30 sub 0EAh loc34: ex de,hl loc35: pop de ld (hl),e inc hl ld (hl),d inc hl dec a jr nz,loc35 ex de,hl jr nc,loc22 ret