home *** CD-ROM | disk | FTP | other *** search
/ The Party 1994: Try This At Home / disk_image.bin / source / mythic / connect.asm < prev    next >
Assembly Source File  |  1994-08-26  |  7KB  |  347 lines

  1.         TITLE    'Connect'
  2.  
  3.         PAGE    66, 132
  4.  
  5.         P286
  6.         MODEL    COMPACT
  7.  
  8. INCLUDE        INCLUDE\DOS.INC
  9. INCLUDE        INCLUDE\KEYCODES.INC
  10.  
  11. STRWARN        EQU    KBLF, KBCR, '$'
  12. CBBUFFER    EQU    01000H
  13.  
  14. Data        SEGMENT    PUBLIC
  15.         ASSUME    cs:Code, ds: Data
  16.  
  17. STREXTWRT    DB    '.WRT', 0
  18. STREXTEXE    DB    '.EXE', 0
  19. STRCOPYERROR    DB    'Can''t create EXE-File entirely.', STRWARN
  20. STRCREATEERROR    DB    'Can''t create EXE-File.', STRWARN
  21. STRFINDERROR    DB    'Can''t find WRT-File.', STRWARN
  22. STROPENERROR    DB    'Can''t open WRT-File.', STRWARN
  23. STRREADERROR    DB    'Can''t read from WRT-File.', STRWARN
  24. STRWRITEERROR    DB    'Can''t write to EXE-File.', STRWARN
  25. STRUSAGE    DB    'Usage: CONNECT <FileName>', STRWARN
  26.  
  27. cbLoEXE        =    $ + 2
  28. cbHiEXE        =    $ + 4
  29.  
  30. ABFILE        LABEL
  31. INCLUDE        PLAY.INC
  32.  
  33. CBFILE        =    OFFSET $ - OFFSET ABFILE
  34.  
  35. cbLoWrite    DW    ?
  36. cbHiWrite    DW    ?
  37. hWrite        DW    ?
  38. hEXE        DW    ?
  39. segFileName    DW    ?
  40. offsFileName    DW    ?
  41. offsExt        DW    ?
  42.  
  43. abBuffer    DB    CBBUFFER DUP (?)
  44. Data        ENDS
  45.  
  46. Stack        0100H
  47.  
  48. Code        SEGMENT    PUBLIC
  49.         ASSUME    cs:Code, ds: Data
  50.  
  51. CloseEXE    PROC
  52.         pusha
  53.         mov    ah, DOS_CLOSE_FILE
  54.         mov    bx, hEXE
  55.         int    DOS_FUNCTION
  56.         popa
  57.         ret
  58. CloseEXE    ENDP
  59.  
  60. CloseWrite    PROC
  61.         pusha
  62.         mov    ah, DOS_CLOSE_FILE
  63.         mov    bx, hWrite
  64.         int    DOS_FUNCTION
  65.         popa
  66.         ret
  67. CloseWrite    ENDP
  68.  
  69. ; *****************************************************************************
  70. ; Erstellung der ausführbaren Datei
  71. ; *****************************************************************************
  72. CreateEXE    PROC
  73.         pusha
  74.  
  75. ;        Endung des Dateinamens ändern
  76. ;
  77.         mov    di, offsExt
  78.         mov    si, OFFSET STREXTEXE
  79.         mov    cx, 5
  80.         rep    movsb
  81.  
  82. ;        Datei zur Ausgabe öffnen
  83. ;
  84.         mov    ah, DOS_CREATE_FILE
  85.         xor    cx, cx
  86.         mov    dx, offsFileName
  87.         push    ds
  88.         push    es
  89.         pop    ds
  90.         int    DOS_FUNCTION
  91.         pop    ds
  92.         jc      CreateEXE_Error
  93.         mov    WORD PTR hEXE, ax
  94.  
  95. ;        Länge in EXE-Kopf ändern
  96. ;
  97.         mov    ax, WORD PTR cbLoWrite
  98.         mov    dx, ax
  99.         and    ax, 001FFH
  100.         shr    dx, 9
  101.         add    dx, WORD PTR cbHiWrite
  102.         add    WORD PTR cbLoEXE, ax
  103.         cmp    WORD PTR cbLoEXE, 00200H
  104.         jnae    CreateEXE_NoOv
  105.         sub    WORD PTR cbLoEXE, 00200H
  106.         inc    WORD PTR cbHiEXE
  107.  
  108. CreateEXE_NoOv:    add    WORD PTR cbHiEXE, dx
  109.         clc
  110.         jmp    CreateEXE_End
  111.  
  112. CreateEXE_Error:mov    dx, OFFSET STRCREATEERROR
  113.         mov    ah, DOS_WRITE_STRING
  114.         int    DOS_FUNCTION
  115.         stc
  116.  
  117. CreateEXE_End:    popa
  118.         ret
  119. CreateEXE    ENDP
  120.  
  121. ; *****************************************************************************
  122. ; Bestimmung des Dateinamens
  123. ; *****************************************************************************
  124. GetWrite    PROC
  125.         pusha
  126.  
  127. ;        Kontrolle, ob Dateiname angegeben ist
  128. ;
  129.         mov    WORD PTR segFileName, es
  130.         mov    di, 080H
  131.         mov    al, es:[di]
  132.         or    al, al
  133.         je    GetWrite_Help
  134.  
  135. ;        Nullzeichen einfügen
  136. ;
  137.         xor    ah, ah
  138.         inc    di
  139.         mov    si, di
  140.         add    di, ax
  141.         mov    es:[di], ah
  142.  
  143. ;        Führende Leerzeichen überspringen
  144. ;
  145.         mov    di, si
  146.         mov    cx, ax
  147.         mov    bx, ax
  148.         mov    al, ' '
  149.         repe    scasb
  150.         or    cx, cx
  151.         jne    GetWrite_Ok2
  152.         mov    dx, WORD
  153.         stc
  154.         jmp    GetWrite_Error
  155. GetWrite_Ok2:    dec    di
  156.         mov    WORD PTR offsFileName, di
  157.  
  158. ;        Endung suchen
  159. ;
  160.         mov    di, si
  161.         mov    cx, bx
  162.         mov    al, '.'
  163.         repne    scasb
  164.         or    cx, cx
  165.         jne    GetWrite_GetExt
  166.  
  167. ;        Endung .WRT anfügen
  168. ;
  169.         mov    WORD PTR offsExt, di
  170.         mov    si, OFFSET STREXTWRT
  171.         mov    cx, 5
  172.         rep    movsb
  173.         jmp    GetWrite_Ok
  174.  
  175. GetWrite_Error:    mov    dx, OFFSET STRFINDERROR
  176.         mov    ah, DOS_WRITE_STRING
  177.         int    DOS_FUNCTION
  178.         stc
  179.         jmp    GetWrite_End
  180.  
  181. GetWrite_GetExt:dec    di
  182.         mov    WORD PTR offsExt, di
  183.  
  184. GetWrite_Help:    mov    dx, OFFSET STRUSAGE
  185.         mov    ah, DOS_WRITE_STRING
  186.         int    DOS_FUNCTION
  187.         stc
  188.         jmp    GetWrite_End
  189.  
  190. GetWrite_Ok:    clc
  191.  
  192. GetWrite_End:    popa
  193.         ret
  194. GetWrite    ENDP
  195.  
  196. ; *****************************************************************************
  197. ; Initialisierung der Register
  198. ; *****************************************************************************
  199. Init        PROC
  200.         push    ax
  201.         mov    ax, SEG Data
  202.         mov    ds, ax
  203.         pop    ax
  204.         ret
  205. Init        ENDP
  206.  
  207. ; *****************************************************************************
  208. ; Hauptteil
  209. ; *****************************************************************************
  210. Main        PROC
  211.         call    Init
  212.         call    GetWrite
  213.         jc    Main_End
  214.         call    OpenWrite
  215.         jc    Main_End
  216.         call    CreateEXE
  217.         jc    Main_CloseWrite
  218.         call    WriteEXE
  219.         call    CloseEXE
  220. Main_CloseWrite:call    CloseWrite
  221. Main_End:    mov    al, 0
  222.         adc    al, al
  223.         mov    ah, DOS_TERMINATE_EXE
  224.         int    DOS_FUNCTION
  225. Main        ENDP
  226.  
  227. OpenWrite    PROC
  228.         pusha
  229.         mov    ah, DOS_OPEN_FILE
  230.         xor    al, al
  231.         mov    dx, WORD PTR offsFileName
  232.         push    ds
  233.         push    es
  234.         pop    ds
  235.         int    DOS_FUNCTION
  236.         pop    ds
  237.         jc    OpenWrite_Error
  238.         mov    WORD PTR hWrite, ax
  239.  
  240. ;        Dateilänge bestimmen
  241. ;
  242.         mov    ah, DOS_MOVE_FILE_POINTER
  243.         mov    al, 2
  244.         mov    bx, WORD PTR hWrite
  245.         xor    cx, cx
  246.         xor    dx, dx
  247.         int    DOS_FUNCTION
  248.         jc    OpenWrite_Error
  249.         mov    WORD PTR cbHiWrite, dx
  250.         mov    WORD PTR cbLoWrite, ax
  251.  
  252. ;        Dateizeiger an Anfang setzen
  253. ;
  254.         mov    ah, DOS_MOVE_FILE_POINTER
  255.         mov    al, 0
  256.         xor    dx, dx
  257.         int    DOS_FUNCTION
  258.         clc
  259.         jmp     OpenWrite_End
  260.  
  261. ;        Fehlermeldung ausgeben
  262. ;
  263. OpenWrite_Error:mov    dx, OFFSET STROPENERROR
  264.         mov    ah, DOS_WRITE_STRING
  265.         int    DOS_FUNCTION
  266.         stc
  267.  
  268. OpenWrite_End:    popa
  269.         ret
  270. OpenWrite    ENDP
  271.  
  272. WriteEXE    PROC
  273.         pusha
  274.  
  275. ;        Abspieler in EXE-Datei schreiben
  276. ;
  277.         mov    ah, DOS_WRITE_TO_HANDLE
  278.         mov    bx, hEXE
  279.         mov    cx, CBFILE
  280.         mov    dx, OFFSET ABFILE
  281.         int    DOS_FUNCTION
  282.         jc    WriteEXE_WErr
  283.         cmp    ax, cx
  284.         jne    WriteEXE_WErr
  285.  
  286. ;        Datenblock aus Write-Datei lesen
  287. ;
  288. WriteEXE_RNext:    mov    ah, DOS_READ_FROM_HANDLE
  289.         mov    bx, hWrite
  290.         mov    cx, CBBUFFER
  291.         mov    dx, OFFSET abBuffer
  292.         int    DOS_FUNCTION
  293.         jc    WriteEXE_RErr
  294.         or    ax, ax
  295.         je    WriteEXE_Done
  296.  
  297. ;        Restlänge vermindern
  298. ;
  299.         sub    WORD PTR cbLoWrite, ax
  300.         jnc    WriteEXE_WNext
  301.         dec    WORD PTR cbHiWrite
  302.  
  303. ;        Datenblock in EXE-Datei schreiben
  304. ;
  305. WriteEXE_WNext:    mov    bx, hEXE
  306.         mov    cx, ax
  307.         mov    ah, DOS_WRITE_TO_HANDLE
  308.         mov    dx, OFFSET abBuffer
  309.         int    DOS_FUNCTION
  310.         jc    WriteEXE_WErr
  311.         cmp    ax, cx
  312.         jne    WriteEXE_WErr
  313.         jmp    WriteEXE_RNext
  314.  
  315. ;        Kontrolle, ob die ganze Datei kopiert wurde
  316. ;
  317. WriteEXE_Done:    cmp    cbLoWrite, 0
  318.         jne    WriteEXE_CErr
  319.         cmp     cbHiWrite, 0
  320.         jne    WriteEXE_Cerr
  321.         jmp    WriteEXE_End
  322.  
  323. WriteEXE_CErr:    mov    ah, DOS_WRITE_STRING
  324.         mov    dx, OFFSET STRCOPYERROR
  325.         int    DOS_FUNCTION
  326.         stc
  327.         jmp    WriteEXE_End
  328.  
  329. WriteEXE_RErr:    mov    ah, DOS_WRITE_STRING
  330.         mov    dx, OFFSET STRREADERROR
  331.         int    DOS_FUNCTION
  332.         stc
  333.         jmp    WriteEXE_End
  334.  
  335. WriteEXE_WErr:    mov    ah, DOS_WRITE_STRING
  336.         mov    dx, OFFSET STRWRITEERROR
  337.         int    DOS_FUNCTION
  338.         stc
  339.  
  340. WriteEXE_End:    popa
  341.         ret
  342. WriteEXE    ENDP
  343.  
  344. Code        ENDS
  345.  
  346.         END    Main
  347.