[Back to TEXTFILE SWAG index]  [Back to Main SWAG index]  [Original]

{

     This is not related to the original topic ".. w/exe!!", but
     if somebody is interested, at least I found this one a bit
     excited piece of code. It makes an executable com-file from
     your text and you can easily extend it to the limits you
     need. Just remember that you can't call any pascal routines,
     you have to write it in pure assembler. (would .80xxx have been
     a better area..?) Anyway, here it is:

 --!clip!-- { Code by Kimmo Fredrikson }

  {$A+,D-,G-,I-,R-,S-}

  program txt2com;

  var
    src                 : file;
    dst                 : file;
    buff                : array [0..2047] of byte;
    bytesRead           : word;
    bytesWritten        : word;
    fSize               : word;


  function t2c: word; far; assembler;
  asm
        jmp     @tail           { 2 bytes }

  @head:mov     ax, 0003h       { -- here starts the code part of }
        int     10h             {    the txt-show-proggie.. }

        mov     cx, word ptr [@tail+100h-2]     { length of text }
        lea     si, [@tail+100h-2+2]            { address of txt }

  @nxtC:mov     dl, [si]        { read a character to dl }
        mov     ah, 2
        int     21h
        inc     si
        loop    @nxtC

        mov     ax, 4c00h
        int     21h             { terminate, back to dos }

  @tail:mov     ax, offset [@tail]              { length of t2c }
        sub     ax, offset [@head] { this returns the length of the  }
  end;                     { assembler code when called within this pascal }
                                                { program }
  begin
    if paramCount <> 2 then halt;
    assign (src, paramStr (1));
    assign (dst, paramStr (2));
    reset (src, 1);
    if ioResult <> 0 then halt;
    if fileSize (src) > 64000 then halt;
    fSize := fileSize (src) - 1;                { get rid of the ctrl-z }
    reWrite (dst, 1);
    if ioResult <> 0 then halt;
    blockWrite (dst, pointer (longint (@t2c) + 2)^, t2c);  { the code }
    blockWrite (dst, fSize, 2);                  { the length of text }
    repeat
      blockRead (src, buff, 2048, bytesRead);
      blockWrite (dst, buff, bytesRead, bytesWritten);     { the text }
    until (bytesRead = 0) or (bytesWritten <> bytesRead);
    close (src);
    close (dst);
  end.

[Back to TEXTFILE SWAG index]  [Back to Main SWAG index]  [Original]