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 : ComputersDevelopment
Comments are closed There are no comments on this entry.
Linked To by (0) blogs. Get a Trackbacks link here

Page 1 of 1 pages