| Code: ; Disassembled LD.EXE from Solid C for Sprinter
ORG 0A400h-512
;EXE-file header: dw 5845h ; EXE Signature db 45h ; Reserved (EXE type) db 00h ; Version of EXE file dw 0200h ; Code offset dw 0000h dw 0280h ; Primary loader size or 0 (no primary loader) dw 0000h ; Reserved dw 0000h ; Reserved dw 0000h ; Reserved dw START ; Loading address dw START ; Starting address (register PC) dw 0BF00h ; Stack address (register SP) ds 490 ; Reserved
PORT_PAGE0 equ 082h PORT_PAGE1 equ 0A2h PORT_PAGE2 equ 0C2h PORT_PAGE3 equ 0E2h
PORT_Y equ 089h
;code of program
START:
push ix ; push pointer to command line arguments ; K_CLEAR (Flush the console input buffer and execute other function) - function #31 ld bc, 03135h rst 10h ; SYSTIME (Return the current system time and date) ld c, 021h rst 10h ; Output: ; D - day [1..31] ; E - month [1..12] ; IX - year [0000..1999.2000..9999] ; H - hour [0..23] ; L - minute [0..59] ; B - second [0..59] ; C - day of week [1..7] ld a, d ld (A4CD), a ld a, e ld (A4CE), a ld (A4CF), ix pop ix ; pop pointer to command line arguments in a, (PORT_PAGE0) ld (A4C5), a in a, (PORT_PAGE1) ld (A4CB), a in a, (PORT_PAGE3) ld (A4CC), a in a, (PORT_Y) ld (A4CA), a ld (LARGS+1), ix ld a, (ix-3) ld (A4C3), a ld hl, msg ; PCHARS (Write the null-terminated string pointed to by string directly to the console) ld c, 05ch rst 10h ; GETMEM (Allocate a memory block) ld bc, 033dh ; 3 pages rst 10h jr nc, NOERR1 ; ERR1 (can't allocate memory) ld a, (A4C3) ; CLOSE (Close file) ld c, 012h rst 10h ld hl, err1 LEND: ; PCHARS (Write the null-terminated string pointed to by string directly to the console) ld c, 05ch rst 10h ; EXIT (Terminate a program) ld bc, 0ff41h ; exit code FF rst 10h NOERR1: ld (A4C4), a ld hl, A4C6 ; EMM_FN5 Get list of physical page numbers ld c, 0c5h rst 8 ; BIOS ld a, (A4C6) ; page A out (PORT_PAGE3), a ; clean window 3 (page A) <<< TODO: use accelerator ld hl, 0c000h LOOP1: xor a ld (hl), a inc hl or h jr nz, LOOP1 ld hl, 04dedh ; ??? ld (0c038h), hl ; ??? ld a, (A4C8) ; page C out (PORT_PAGE3), a ld hl, 0c000h ld de, 01b0ah ; byte count <<< TODO: read all ld a, (A4C3) ; READ (Read data from a file) ld c, 013h rst 10h jp c, LERR2 ld a, (A4C3) ; CLOSE (Close file) ld c, 012h rst 10h di ld a, 0c0h out (PORT_Y), a ld a, (A4C7) ; page B out (PORT_PAGE1), a ld hl, 0c000h ld de, 04100h call DECODE ld a, (A4C6) ; page A out (PORT_PAGE0), a ld hl, A4C4 ld de, 06d39h ; move 13 variables there ld bc, 13 ldir LARGS: ld hl, 0 ; at this point here will be a pointer to command line arguments (#A380) jp 04100h
LERR2: ld a, (A4C4) ; FREEMEM (Deallocate a memory block that was previously allocated by GETMEM) ld c, 03eh rst 10h ld a, (A4C3) ; CLOSE (Close file) ld c, 012h rst 10h ld hl, err2 jp LEND
A4C3 db #00 ; file handle A4C4 db #FF ; memory handle A4C5 db #FF ; old page0 A4C6 db #FF ; Physical identifier of page A A4C7 db #FF ; Physical identifier of page B A4C8 db #FF ; Physical identifier of page C A4C9 db #FF A4CA db #FF ; old port_y A4CB db #FF ; old page1 A4CC db #FF ; old page3 A4CD db #00 ; day A4CE db #00 ; month A4CF dw #0000 ; year
msg db 13,10,"SOLID Linkage Editor Version 0.04b Ported by Vasil Ivanov" db 13,10,"Based on linkage editor v4.60 (c) 1997, SOLiD Inc.",13,10,0 err1 db "Not enough memory to load program !",13,10,0 err2 db "Disk loading error !",13,10,0
DECODE: ;UnHrust di 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
INCBIN "ld_compr.bin"
| |