Code: Select all
; 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"