home *** CD-ROM | disk | FTP | other *** search
/ The Equalizer BBS / equalizer-bbs-collection_2004.zip / equalizer-bbs-collection / DEMOSCENE-STUFF / VLOAD.ZIP / VLOAD.ASM < prev    next >
Assembly Source File  |  1994-06-12  |  26KB  |  753 lines

  1.  
  2. ; MOV_ES macro
  3. ; this macro moves bytes/words/dwords from a specified segment to
  4. ; the extra segment [ES]
  5. ;
  6. ; example: mov_es word,cs        will move a WORD from CS:SI to ES:DI
  7. ;          mov_es byte,ss        will move a BYTE from SS:Si to ES:DI
  8. ;          repz mov_es byte,ss   will move CX BYTES from SS:SI to ES:DI
  9.  
  10.  
  11. mov_es          macro   size,tseg
  12.  
  13.                 ifidn   <tseg>,<ss>
  14.                   db 00110110b
  15.                 endif
  16.  
  17.                 ifidn   <tseg>,<cs>
  18.                   db 00101110b
  19.                 endif
  20.  
  21.                 ifidn   <tseg>,<ds>
  22.                   db 00111110b
  23.                 endif
  24.  
  25.                 ifidn <size>,<word>
  26.                   movsw
  27.                 endif
  28.  
  29.                 ifidn <size>,<byte>
  30.                   movsb
  31.                 endif
  32.  
  33.                 ifidn <size>,<dword>
  34.                   db 066h,0a5h
  35.                 endif
  36.  
  37.                 endm
  38.  
  39. ; Standart EXE startupcode
  40.  
  41.                 nosmart
  42.  
  43. stapel          segment para stack
  44.  
  45.                 db 128 dup (0)
  46.  
  47. stapel          ends
  48.  
  49. code            segment page 'CODE'
  50.  
  51.                 assume  cs:code ; es:code ; ss:stack ; ds:code
  52.  
  53. main            proc near
  54.  
  55. start:          xor     si,si
  56.                 test    byte ptr cs:[loadfix],0ffh
  57.                 jz      okbegin
  58.                 push    cs
  59.                 pop     ax
  60.                 mov     bx,ax
  61.                 and     bx,0f000h
  62.                 jnz     okbegin
  63.                 mov     cl,04h
  64.                 shl     ax,cl
  65.                 sub     si,ax
  66.                 shr     si,cl
  67.  
  68. okbegin:        push    es
  69.                 pop     bx
  70.                 push    cs
  71.                 pop     ax
  72.                 sub     ax,bx
  73.                 mov     cl,04h
  74.                 mov     bx,offset ecode
  75.                 mov     dx,bx
  76.                 shr     bx,cl
  77.                 and     dx,0000fh
  78.                 jz      oksize
  79.                 inc     bx
  80. oksize:         sub     si,bx
  81.                 jnl     nocorrect
  82.                 add     si,bx
  83. nocorrect:      add     bx,ax
  84.                 add     bx,si
  85.                 mov     ax,04a00h
  86.                 int     21h
  87.                 jnc     allright
  88. error_exit:     mov     ah,04ch
  89.                 int     21h
  90. allright:  
  91.  
  92. ; ************************************************************************
  93. ;
  94. ; Begin of main program
  95. ;
  96. ; ************************************************************************
  97.  
  98.                 mov     ax,ds:[02ch]
  99.                 mov     word ptr cs:[enviro],ax
  100.                 mov     word ptr cs:[lsegment],ds
  101.  
  102.                 mov     bx,ds
  103.                 sub     bx,ax
  104.                 push    bx                      ;enviro. size
  105.  
  106.                 push    ds
  107.                 xor     ax,ax
  108.                 mov     ds,ax
  109.                 mov     ax,cs
  110.  
  111.                 mov     ax,word ptr ds:[0084h]
  112.                 mov     word ptr cs:[org21],ax
  113.                 mov     ax,word ptr ds:[0086h]
  114.                 mov     word ptr cs:[org21+2],ax
  115.                 pop     ds
  116.  
  117.                 pop     bx
  118.                 mov     cx,bx
  119.                 mov     ah,048h
  120.                 int     21h
  121.                 jb      error_exit
  122.                 push    ax
  123.                 mov     es,ax
  124.                 mov     ds,word ptr cs:[enviro]
  125.                 xor     di,di
  126.                 xor     si,si
  127.                 shl     cx,1
  128.                 shl     cx,1
  129.                 shl     cx,1
  130.                 shl     cx,1
  131.                 cld
  132.                 repnz   movsb                   ;copy environment
  133.                 pop     ax
  134.                 mov     word ptr cs:[enviro],ax
  135.  
  136.                 mov     bx,0ffffh
  137. alloc:          mov     ah,048h
  138.                 int     21h
  139.                 jb      alloc
  140.                 push    ax
  141.                 mov     es,ax
  142.                 mov     ds,word ptr cs:[lsegment]
  143.                 xor     di,di
  144.                 xor     si,si
  145.                 mov     cx,0100h
  146.                 cld
  147.                 repnz   movsb
  148.                 mov     ax,word ptr cs:[enviro]
  149.                 mov     word ptr es:[02ch],ax
  150.                 pop     ax
  151.                 mov     word ptr es:[036h],ax
  152.                 mov     word ptr cs:[lsegment],ax
  153.  
  154. ; ---------------------------------------------------------------------------
  155.  
  156.                 mov     ds,word ptr cs:[enviro]
  157.                 xor     si,si
  158.                 cld
  159. no_str1:        lodsb
  160.                 cmp     al,0
  161.                 jnz     no_str1
  162.                 lodsb
  163.                 cmp     al,0h
  164.                 jnz     no_str1
  165.                 add     si,02h
  166.                 mov     dx,si
  167.                 mov     word ptr cs:[namestart],si
  168.                 mov     ax,03d40h
  169.                 int     21h
  170.                 jnc     okgo1
  171. go_errout:      jmp     error_out
  172. okgo1:          mov     word ptr cs:[handle],ax
  173.                 mov     bp,ax
  174.                 mov     bx,ax
  175.                 mov     ax,04200h                       ;seek to end of loader
  176.                 xor     cx,cx
  177.                 mov     dx,4096d                         ;FIXED OFFSET !
  178.                 int     21h
  179.                 mov     word ptr cs:[wadd+02h],00000h
  180.                 mov     word ptr cs:[wadd+06h],00000h
  181. ;               call    nextprog
  182.                 push    dx                              ;hi
  183.                 push    ax                              ;lo
  184.                 call    loadprog
  185.                 mov     bx,0ffffh
  186.                 mov     ah,048h
  187.                 int     21h
  188.                 mov     cx,word ptr cs:[lsegment]
  189.                 dec     cx
  190.                 mov     es,cx
  191.                 add     bx,word ptr es:[03h]
  192.                 inc     cx
  193.                 mov     es,cx
  194.                 mov     ah,04ah
  195.                 int     21h
  196.                 jnc     okalloc_1
  197.                 mov     ah,04ah
  198.                 int     21h
  199. okalloc_1:      mov     bp,word ptr cs:[handle]
  200.                 not     byte ptr cs:[loadflag]
  201.                 pop     dx
  202.                 pop     cx
  203.                 mov     bx,bp
  204.                 mov     byte ptr cs:[wflip+01h],0h
  205.                 call    wflip
  206.                 mov     byte ptr cs:[wflip+01h],01h
  207.                 mov     word ptr cs:[wadd+02h],01ch
  208.                 mov     word ptr cs:[wadd+06h],000h
  209.                 call    nextprog
  210.                 mov     word ptr cs:[start_hi],dx
  211.                 mov     word ptr cs:[start_lo],ax
  212.  
  213.                 call    loadprog
  214.  
  215. error_out:      mov     bx,word ptr cs:[handle]
  216.                 or      bx,bx
  217.                 jz      alreadyclosed
  218.                 mov     ah,03eh
  219.                 int     21h
  220. alreadyclosed:  cli
  221.                 xor     ax,ax
  222.                 mov     ds,ax
  223.                 mov     ax,word ptr cs:[org21]
  224.                 mov     word ptr ds:[0084h],ax
  225.                 mov     ax,word ptr cs:[org21+2]
  226.                 mov     word ptr ds:[0086h],ax
  227.                 sti
  228. errorexit:      push    ax
  229.                 push    es
  230.                 mov     es,word ptr cs:[enviro]
  231.                 mov     ah,049h
  232.                 int     21h
  233.                 mov     ax,word ptr cs:[lsegment]
  234.                 mov     es,ax
  235.                 mov     ah,049h
  236.                 int     21h
  237.                 pop     es
  238.                 pop     ax
  239.  
  240.                 mov     ah,09h
  241.                 push    cs
  242.                 pop     ds
  243.                 mov     dx,[offset text]
  244.                 int     21h
  245.  
  246.                 mov     ax,04c00h
  247.                 int     21h
  248.  
  249.  
  250. nextprog:       call    getheader
  251.                 push    dx
  252.                 pop     si
  253.                 cmp     word ptr cs:[si],'ZM'
  254.                 jnz     error_out
  255.                 mov     ax,word ptr cs:[si+04h]
  256.                 mov     bx,word ptr cs:[si+02h]
  257.                 or      bx,bx
  258.                 jz      no_dec1
  259.                 dec     ax
  260. no_dec1:        mov     cx,08h
  261.                 shl     ax,cl
  262.                 adc     ch,0
  263.                 add     ch,ch
  264.                 shl     ax,1
  265.                 xchg    ch,cl
  266.                 adc     cl,0
  267.                 xor     ch,ch
  268.                 add     ax,bx
  269.                 mov     dx,ax                           ;lo
  270.                 mov     bx,bp                           ;handle
  271. wadd:           sub     dx,0deadh
  272.                 sbb     cx,0deadh
  273. wflip:          mov     ax,04201h
  274.                 int     21h
  275.                 ret
  276.  
  277. loadprog:       push    dx
  278.                 push    ax
  279.                 call    getheader
  280.                 push    dx
  281.                 pop     si
  282.                 cmp     word ptr cs:[si],'ZM'
  283.                 jz      no_err1
  284.                 jmp     error_out
  285. no_err1:        mov     cx,0ffffh
  286.                 mov     dx,(0-1ch)
  287.                 mov     bx,bp
  288.                 mov     ax,04201h
  289.                 int     21h
  290.                 mov     dx,word ptr cs:[si+08h]
  291.                 xor     ax,ax
  292.                 mov     cx,04h
  293. shift1:         shl     dx,1
  294.                 rcl     ax,1
  295.                 loop    shift1
  296.                 mov     cx,ax
  297.                 push    dx                      ;header lo
  298.                 push    cx                      ;header hi
  299.                 mov     ax,04201h
  300.                 int     21h
  301.                 mov     cx,9
  302.                 mov     ax,[si+4]
  303.                 test    word ptr ds:[si+2],0ffffh
  304.                 jz      fullpage
  305.                 dec     ax
  306. fullpage:       xor     bx,bx
  307.                 xor     dx,dx
  308. full:           shl     ax,1                            ;*512
  309.                 rcl     bx,1
  310.                 loop    full
  311.                 add     ax,word ptr [si+2]              ;plus rest
  312.                 adc     bx,0
  313.                 pop     dx
  314.                 pop     cx
  315.                 sub     ax,cx
  316.                 sbb     bx,dx
  317.                 mov     word ptr cs:[prglength+2],bx
  318.                 mov     word ptr cs:[prglength],ax
  319.                 push    ax                                      ;save length
  320.                 push    bx                                      ;for later use
  321.  
  322.                 mov     ax,word ptr cs:[lsegment]
  323.                 add     ax,10h
  324.                 mov     ds,ax
  325.                 xor     dx,dx
  326.                 mov     word ptr cs:[_clength],dx
  327.                 mov     word ptr cs:[_clength+2],dx
  328.                 mov     word ptr cs:[_cload+2],ds
  329.                 mov     word ptr cs:[_cload],dx
  330. readloop1:      mov     ah,03fh
  331.                 mov     ds,word ptr cs:[_cload+2]
  332.                 mov     dx,word ptr cs:[_cload]
  333.                 mov     bx,bp
  334.                 mov     cx,0f000h
  335.                 int     21h
  336.                 mov     bx,ax
  337.                 mov     cl,04h
  338.                 shr     bx,cl
  339.                 add     word ptr cs:[_cload+2],bx
  340.                 mov     bx,ax
  341.                 and     bx,000fh
  342.                 add     word ptr cs:[_cload],bx
  343.                 add     ax,word ptr cs:[_clength]
  344.                 adc     word ptr cs:[_clength+2],0
  345.                 mov     word ptr cs:[_clength],ax
  346.                 mov     bx,word ptr cs:[prglength]
  347.                 cmp     ax,bx
  348.                 mov     ax,word ptr cs:[_clength+2]
  349.                 sbb     ax,word ptr cs:[prglength+2]
  350.                 jl      readloop1
  351. allread1:
  352.                 pop     word ptr cs:[prglength+2]
  353.                 pop     word ptr cs:[prglength]
  354.  
  355.                 pop     dx
  356.                 pop     cx
  357.                 push    cx
  358.                 push    dx
  359.                 mov     ax,04200h
  360.                 mov     bx,bp
  361.                 int     21h
  362.                 xor     cx,cx
  363.                 mov     dx,word ptr cs:[headerbuf+18h]
  364.                 mov     ax,04201h
  365.                 int     21h
  366. whole_reloc:    test    word ptr cs:[headerbuf+06h],0ffffh
  367.                 jz      end_reloc
  368.                 mov     ah,03fh
  369.                 mov     bx,bp
  370.                 mov     cx,04h
  371.                 push    cs
  372.                 pop     ds
  373.                 mov     dx,offset (_cload)
  374.                 int     21h
  375.                 mov     bx,word ptr cs:[_cload+2]
  376.                 mov     ax,word ptr cs:[lsegment]
  377.                 add     ax,010h
  378.                 add     bx,ax
  379.                 mov     es,bx
  380.                 mov     di,word ptr cs:[_cload]
  381.                 add     word ptr es:[di],ax
  382.                 dec     word ptr cs:[headerbuf+06h]
  383.                 jmp     short whole_reloc
  384. end_reloc:
  385.                 test    byte ptr cs:[loadflag],0ffh
  386.                 jz      noclose
  387.                 mov     bx,word ptr cs:[handle]
  388.                 mov     ah,03eh
  389.                 int     21h
  390.                 mov     word ptr cs:[handle],0h
  391. noclose:        mov     ax,word ptr cs:[lsegment]
  392.                 add     ax,010h
  393.                 cli
  394.                 mov     word ptr cs:[_cload],sp
  395.                 mov     word ptr cs:[_cload+2],ss
  396.                 xor     bx,bx
  397.                 mov     ds,bx
  398.                 mov     bx,cs
  399.                 mov     word ptr ds:[0086h],bx
  400.                 mov     word ptr ds:[0084h],(offset myint3)
  401. nomy3:          mov     sp,word ptr cs:[headerbuf+010h]
  402.                 mov     bx,word ptr cs:[headerbuf+0eh]
  403.                 add     bx,ax
  404.                 mov     ss,bx
  405.                 sti
  406.  
  407.                 mov     bx,word ptr cs:[headerbuf+016h]
  408.                 add     bx,ax
  409.                 mov     word ptr cs:[gogo+3h],bx
  410.                 mov     bx,word ptr cs:[headerbuf+014h]
  411.                 mov     word ptr cs:[gogo+1h],bx
  412.  
  413.                 sub     ax,10h
  414.                 mov     ds,ax
  415.                 mov     es,ax
  416.                 jmp     gogo_1
  417. gogo_1:         xor     ax,ax
  418.                 xor     bx,bx
  419.                 xor     cx,cx
  420.                 xor     dx,dx
  421.                 xor     si,si
  422.                 xor     di,di
  423.                 xor     bp,bp
  424.                 cld
  425. gogo:           db      0eah,0,0,0,0
  426. go_on:
  427.                 pop     ax
  428.                 pop     dx
  429.                 ret
  430.  
  431. getheader:      mov     bx,bp
  432.                 mov     ah,03fh
  433.                 mov     cx,01ch
  434.                 push    cs
  435.                 pop     ds
  436.                 mov     dx,[offset headerbuf]
  437.                 int     21h
  438.                 ret
  439.  
  440. ; file handling routines of int21h
  441.  
  442.  
  443. myint3:         test    byte ptr cs:[openflag],0ffh
  444.                 jz      notyetopen
  445.                 cmp     bx,word ptr cs:[open_handle]
  446.                 jnz     notyetopen
  447.                 cmp     ah,03eh
  448.                 jnz     check_cont1
  449.                 not     byte ptr cs:[openflag]
  450.                 mov     word ptr cs:[open_handle],0h
  451.                 jmp     go21
  452. check_cont1:    cmp     ah,03fh
  453.                 jnz     no_read
  454.                 jmp     readhandle
  455. no_read:        cmp     ah,042h
  456.                 jnz     go21
  457.                 jmp     seekhandle
  458. notyetopen:     test    byte ptr cs:[childflag],0ffh
  459.                 jz      normalcheck
  460.                 cmp     ah,04ch
  461.                 jnz     go21
  462.                 dec     byte ptr cs:[childflag]
  463.                 jmp     go21
  464. normalcheck:    test    byte ptr cs:[loadflag],0ffh
  465.                 jz      no_open
  466.                 cmp     ah,03dh
  467.                 jnz     secondend
  468.                 jmp     intercept
  469. secondend:      cmp     ah,04ch
  470.                 jz      got_end
  471.                 cmp     ax,04b00h
  472.                 jnz     check4btwo
  473.                 inc     byte ptr cs:[childflag]
  474. check4btwo:     cmp     ax,04b03h
  475.                 jnz     go21
  476.                 inc     byte ptr cs:[childflag]
  477.                 jmp     go21
  478. no_open:        cmp     ah,04ch
  479.                 jz      got_end
  480.                 cmp     ah,048h
  481.                 jz      savelist
  482. go21:           db      0eah
  483. org21:          dw      0,0
  484. got_end:        mov     sp,word ptr cs:[_cload]
  485.                 mov     ss,word ptr cs:[_cload+2]
  486.                 xor     ax,ax
  487.                 mov     ds,ax
  488.                 mov     ax,word ptr cs:[org21]
  489.                 mov     word ptr ds:[0084h],ax
  490.                 mov     ax,word ptr cs:[org21+2]
  491.                 mov     word ptr ds:[0086h],ax
  492.                 mov     di,offset memlist
  493. freeall:        mov     ah,049h
  494.                 mov     bx,word ptr cs:[di]
  495.                 mov     word ptr cs:[di],ds
  496.                 add     di,02h
  497.                 or      bx,bx
  498.                 jz      allfreed
  499.                 mov     es,bx
  500.                 int     21h
  501.                 jmp     freeall
  502. allfreed:       jmp     go_on
  503.  
  504. savelist:       cli
  505.                 mov     word ptr cs:[save_bp],bp
  506.                 mov     bp,sp
  507.                 push    word ptr [bp+4]
  508.                 push    cs
  509.                 mov     bp,word ptr cs:[save_bp]
  510.                 call    go21
  511.                 pushf
  512.                 mov     word ptr cs:[save_bp],bp
  513.                 mov     word ptr cs:[save_ax],ax
  514.                 mov     word ptr cs:[save_di],di
  515.                 pop     ax
  516.                 mov     bp,sp
  517.                 mov     word ptr [bp+4],ax
  518.                 test    ax,01h
  519.                 jnz     no_save
  520.                 mov     ax,word ptr cs:[save_ax]
  521.                 mov     di,word ptr cs:[mempnt]
  522.                 mov     word ptr cs:[di],ax
  523.                 add     di,02h
  524.                 mov     word ptr cs:[mempnt],di
  525. no_save:        mov     di,word ptr cs:[save_di]
  526.                 mov     ax,word ptr cs:[save_ax]
  527.                 mov     bp,word ptr cs:[save_bp]
  528.                 iret
  529.  
  530. ; ------------------------------------------------------------------------
  531.  
  532. intercept:      mov     word ptr cs:[save_ax],ax
  533.                 mov     word ptr cs:[save_bx],bx
  534.                 mov     word ptr cs:[save_cx],cx
  535.                 mov     word ptr cs:[save_dx],dx
  536.                 mov     word ptr cs:[save_es],es
  537.                 mov     word ptr cs:[save_ds],ds
  538.                 mov     word ptr cs:[save_si],si
  539.                 mov     word ptr cs:[save_di],di
  540.                 mov     word ptr cs:[save_bp],bp
  541.  
  542.                 push    ds
  543.                 pop     es
  544.                 mov     di,dx
  545.                 cld
  546.                 xor     ax,ax
  547.                 mov     cx,040h
  548.                 repnz   scasb
  549.                 jcxz    secondcxz
  550.                 mov     al,040h-1h
  551.                 sub     al,cl
  552.                 xchg    ax,cx
  553.                 mov     ds,word ptr cs:[enviro]
  554.                 mov     si,word ptr cs:[namestart]
  555.                 mov     di,dx
  556.                 repz    cmpsb
  557.                 jz      okname
  558.  
  559.                 push    ds
  560.                 pop     es
  561.                 mov     di,word ptr cs:[namestart]
  562.                 mov     cx,040h
  563.                 xor     al,al
  564.                 repnz   scasb
  565. secondcxz:      jcxz    no_same
  566.                 std
  567.                 mov     al,'\'
  568.                 mov     cx,0ch
  569.                 sub     di,02h
  570.                 repnz   scasb
  571.                 jcxz    no_same
  572.                 add     di,02h
  573.                 mov     ch,0ch
  574.                 sub     ch,cl
  575.                 xchg    cl,ch
  576.                 xor     ch,ch
  577.                 mov     ds,word ptr cs:[save_ds]
  578.                 mov     si,word ptr cs:[save_dx]
  579.                 cld
  580.                 repz    cmpsb
  581.                 jnz     no_same
  582.  
  583. okname:         push    es
  584.                 pop     ds
  585.                 mov     ax,word ptr cs:[save_ax]
  586.                 mov     bp,sp
  587.                 push    word ptr [bp+04h]
  588.                 push    cs
  589.                 call    go21
  590.                 pushf
  591.                 pop     word ptr [bp+04h]
  592.                 mov     word ptr cs:[save_ax],ax
  593.                 mov     word ptr cs:[open_handle],ax
  594.                 not     byte ptr cs:[openflag]
  595.                 mov     bx,ax
  596.                 mov     ax,04200h
  597.                 mov     cx,word ptr cs:[start_hi]
  598.                 mov     dx,word ptr cs:[start_lo]
  599.                 push    word ptr [bp+04h]
  600.                 push    cs
  601.                 call    go21
  602.                 pushf
  603.                 pop     word ptr [bp+04h]
  604.                 mov     word ptr cs:[real_hi],dx
  605.                 mov     word ptr cs:[real_lo],ax
  606.                 xor     ax,ax
  607.                 mov     word ptr cs:[virt_hi],ax
  608.                 mov     word ptr cs:[virt_lo],ax
  609.                 jmp     intreturn
  610.  
  611. no_same:        mov     ax,word ptr cs:[save_ax]
  612.                 mov     bx,word ptr cs:[save_bx]
  613.                 mov     cx,word ptr cs:[save_cx]
  614.                 mov     dx,word ptr cs:[save_dx]
  615.                 mov     es,word ptr cs:[save_es]
  616.                 mov     ds,word ptr cs:[save_ds]
  617.                 mov     si,word ptr cs:[save_si]
  618.                 mov     di,word ptr cs:[save_di]
  619.                 mov     bp,word ptr cs:[save_bp]
  620.                 jmp     go21
  621.  
  622. intreturn:      mov     ax,word ptr cs:[save_ax]
  623.                 mov     bx,word ptr cs:[save_bx]
  624.                 mov     cx,word ptr cs:[save_cx]
  625.                 mov     dx,word ptr cs:[save_dx]
  626.                 mov     es,word ptr cs:[save_es]
  627.                 mov     ds,word ptr cs:[save_ds]
  628.                 mov     si,word ptr cs:[save_si]
  629.                 mov     di,word ptr cs:[save_di]
  630.                 mov     bp,word ptr cs:[save_bp]
  631.                 iret
  632.  
  633. readhandle:     mov     word ptr cs:[save_ax],ax
  634.                 mov     word ptr cs:[save_bx],bx
  635.                 mov     word ptr cs:[save_cx],cx
  636.                 mov     word ptr cs:[save_dx],dx
  637.                 mov     word ptr cs:[save_es],es
  638.                 mov     word ptr cs:[save_ds],ds
  639.                 mov     word ptr cs:[save_si],si
  640.                 mov     word ptr cs:[save_di],di
  641.                 mov     word ptr cs:[save_bp],bp
  642.  
  643.                 mov     bp,sp
  644.                 push    word ptr [bp+4]
  645.                 push    cs
  646.                 call    go21
  647.                 pushf
  648.                 pop     word ptr [bp+4]
  649.                 mov     word ptr cs:[save_ax],ax
  650.                 jc      intreturn
  651.                 add     word ptr cs:[real_lo],ax
  652.                 adc     word ptr cs:[real_hi],0
  653.                 add     word ptr cs:[virt_lo],ax
  654.                 adc     word ptr cs:[virt_hi],0
  655.                 jmp     intreturn
  656.  
  657. seekhandle:     mov     word ptr cs:[save_ax],ax
  658.                 mov     word ptr cs:[save_bx],bx
  659.                 mov     word ptr cs:[save_cx],cx
  660.                 mov     word ptr cs:[save_dx],dx
  661.                 mov     word ptr cs:[save_es],es
  662.                 mov     word ptr cs:[save_ds],ds
  663.                 mov     word ptr cs:[save_si],si
  664.                 mov     word ptr cs:[save_di],di
  665.                 mov     word ptr cs:[save_bp],bp
  666.  
  667.                 cmp     al,01h
  668.                 jz      from_current
  669.                 cmp     al,02h
  670.                 jnz     not_from_end
  671. from_current:   mov     bp,sp
  672.                 push    word ptr [bp+4]
  673.                 push    cs
  674.                 call    go21
  675.                 pushf
  676.                 pop     word ptr [bp+4]
  677.                 jnc     okseek0
  678.                 jmp     intreturn
  679. okseek0:
  680.                 mov     word ptr cs:[real_lo],ax
  681.                 mov     word ptr cs:[real_hi],dx
  682.                 sub     ax,word ptr cs:[start_lo]
  683.                 sbb     dx,word ptr cs:[start_hi]
  684.                 mov     word ptr cs:[virt_lo],ax
  685.                 mov     word ptr cs:[virt_hi],dx
  686.                 mov     word ptr cs:[save_ax],ax
  687.                 mov     word ptr cs:[save_dx],dx
  688.                 jmp     intreturn
  689. not_from_end:
  690.                 cmp     al,0h
  691.                 jz      from_start
  692.                 jmp     no_same
  693. from_start:
  694.                 add     dx,word ptr cs:[start_lo]
  695.                 adc     cx,word ptr cs:[start_hi]
  696.                 jmp     from_current
  697.  
  698. ; -------------------------------------------------------------------------
  699.  
  700. loadfix:        db      0
  701.  
  702. ; -------------------------------------------------------------------------
  703.  
  704. save_bp:        dw      0
  705. save_ax:        dw      0
  706. save_bx:        dw      0
  707. save_cx:        dw      0
  708. save_dx:        dw      0
  709. save_ds:        dw      0
  710. save_es:        dw      0
  711. save_si:        dw      0
  712. save_di:        dw      0
  713.  
  714. mempnt:         dw      offset memlist
  715. memlist:        dw      10 dup (0)
  716. text:           db      0ah,0dh,'V-Load v0.9ß [June 1994]   ',0ah,0dh,'$'
  717. loadflag:       db      0
  718. prglength:      dd      0
  719. _cload:         dd      0
  720. _clength:       dd      0
  721.  
  722. handle:         dw      0
  723. lsegment:       dw      0
  724. enviro:         dw      0
  725. namestart:      dw      0
  726. headerbuf:      db      1ch dup (0)
  727.  
  728. childflag:      db      0
  729. openflag:       db      0
  730. open_handle:    dw      0
  731. start_hi:       dw      0               ;start of exefile INSIDE my-exe-file
  732. start_lo:       dw      0
  733. real_hi:        dw      0               ;real position of filepointer
  734. real_lo:        dw      0
  735. virt_hi:        dw      0               ;virtual position of filepointer
  736. virt_lo:        dw      0               ;reported to calling program
  737. end_sprog:
  738.  
  739. ecode           db      0
  740.  
  741. main            endp
  742.  
  743. code            ends
  744.  
  745. data            segment para 'DATA'
  746.  
  747.                 db      (2048-16*36) dup (0)
  748.  
  749. data            ends
  750.  
  751.                 end     start
  752.  
  753.