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"