Tuesday, August 05, 2003
Small RDF Stub Loader (NASM)
This little piece of assembler was something I just hacked up to load an nasm RDF file as a dos COM file.
For some strange reason I kept hacking it smaller and smaller, using it as a stub to boot an RDF file.
This was a weekends hacking I think. One wet sunday I remember looking over the RDF specifications....
1:;
2:; Title : Small RDF2 Stub Loader
3:; Author : Stuart 'Dark Fiber' George <sgeorge@mega-tokyo.com>
4:; Version : 0.4
5:; Assembler : Nasm
6:; Comments : Basic RDF Loader for .COM files.
7:;
8:; - Only loads single segment RDF files (!! .text only !!)
9:; - Relocates 16 + 32bit relocs.
10:; - i've done some size optimising on it (so may not be all that readable!)
11:; - 92bytes in size
12:;
13:; copy /b stub.com + {myfile}.rdf output.com
14:
15:%define b byte
16:%define w word
17:%define d dword
18:
19:struc RDFRELOC
20: rdfr_type: resb 1
21: rdfr_len: resb 1
22: rdfr_seg: resb 1
23: rdfr_offs: resd 1
24: rdfr_rlen: resb 1 ;; addr len 1/2/4 bytes
25: rdfr_rseg: resw 1 ;; seg to reloc in
26:endstruc
27:
28:struc RDFHEAD
29: rdfh_magic: resb 6
30: rdfh_dlen: resd 1
31: rdfh_hlen: resd 1
32:endstruc
33:
34:struc RDFSEG
35: rdfs_type: resw 1
36: rdfs_num: resw 1
37: rdfs_res: resw 1
38: rdfs_len: resd 1
39:endstruc
40:
41:struc RDFOBJ
42: rdfo_type: resb 1
43: rdfo_len: resb 1
44:endstruc
45:
46:
47:[bits 16]
48:[org 0x100]
49:
50:code:
51: mov bp,0x100 ;; reloc address
52: mov si,end_code+4 ;; code start
53:
54:relocate_rdf:
55: cmp w[si],'F2'
56: jne quit
57:
58: mov bx,RDFHEAD_size - 4
59:
60: ;; RDFSEG_size, RDFHEAD_size-4 both == 10
61:
62: mov di,si
63: add di,w[si -4 + rdfh_hlen] ;; size of headers
64: add di,bx ; RDFHEAD_size -4 ;; end of header!
65: mov cx,w[di + rdfs_len]
66: add di,bx ; RDFSEG_size
67: mov dx,w[si -4 + rdfh_hlen]
68: add si,bx ; RDFHEAD_size -4
69:
70:.k0:
71: cmp b[si + rdfo_type],0x01 ;; reloc record
72: jne .k1
73:
74:.z2:
75: push di
76: mov eax,d[si + rdfr_offs]
77: add di,ax
78:
79: ;; test reloc size
80: mov al,b[si + rdfr_rlen]
81: sub al,2 ;; 2 = 16bit
82: jz .z4
83: sub al,2 ;; 4 = 32bit
84: jnz .k1
85:
86: ;; 32bit reloc
87: db 0x66 ;; 0x66 == add d[di],dx -> add d[di],edx
88:
89: ;; 16bit reloc
90:.z4:
91: add w[di],bp
92: pop di
93:
94:.k1:
95: mov al,b[si + rdfo_len]
96: cbw
97: ;add ax,RDFOBJ_size ;; == 2
98: inc ax
99: inc ax
100:
101: add si,ax
102: sub dx,ax
103: jnz .k0
104:
105:.k99:
106: ;; end!
107: xchg di,ax
108:
109: mov di,0x100 - (k99 - k01)
110: ;lea di,[bp-(k99-k01)]
111: push di
112: push cx
113: mov si,k01
114: mov cx,(k99 - k01)
115:
116:k01:
117: rep movsb
118:
119:k99:
120: pop cx
121: xchg si,ax
122:
123:quit:
124: ret
125:
126:end_code:
127:
Posted by Stu on 08/05 at 06:22 AM Permalink to this post.
Filed Under : Computers • Development •
Comments are closed There are no comments on this entry.
Linked To by (0) blogs. Get a Trackbacks link here
Filed Under : Computers • Development •
Comments are closed There are no comments on this entry.
Linked To by (0) blogs. Get a Trackbacks link here