home *** CD-ROM | disk | FTP | other *** search
/ The Party 1994: Try This At Home / disk_image.bin / source / mythic / total.txt < prev    next >
Text File  |  1995-04-18  |  80KB  |  3,571 lines

  1. ; NOTE: This is just a compilation  of the source code files. You can not
  2. ; compile this file.
  3.  
  4. ;               (C)93 xToto
  5.  
  6.         TITLE   'Mythic-Writer V1.10'
  7.  
  8.         PAGE    66, 132
  9.  
  10.         P286
  11.         MODEL   SMALL
  12.  
  13. INCLUDE         INCLUDE\BIOS.INC
  14. INCLUDE         INCLUDE\DOS.INC
  15. INCLUDE         INCLUDE\KEYCODES.INC
  16.  
  17. STRWARN         EQU     KBLF, KBCR, '$'
  18.  
  19. PRSEQUENCER     =       03C4H
  20. PRGRAPHICS      =       03CEH
  21. PRCRT           =       03D4H
  22.  
  23. NO              =       0
  24. OFF             =       0
  25. YES             =       1
  26. ON              =       1
  27.  
  28. ENOFF           =       0
  29. ENJUSTOFF       =       1
  30. ENON            =       2
  31. ENJUSTON        =       3
  32.  
  33. CCOLOR          =       256
  34. CBASECOLOR      =       3
  35. CPATTERN        =       4
  36. MSECSPERTICK    =       54945
  37. CCHAR           =       256
  38. BOTTOMLINE      =       24
  39. LEFTCOLUMN      =       0
  40. RIGHTCOLUMN     =       39
  41. TOPLINE         =       0
  42.  
  43. CCURSET         =       2
  44. CCURSOR         =       16
  45. CCURCOLUMN      =       8
  46. CCURLINE        =       8
  47.  
  48. CITEM           =       2
  49. COBJECT         =       8
  50. COBJCOLUMN      =       16
  51. COBJLINE        =       16
  52.  
  53. CSTAR           =       200
  54. CSTARCOLOR      =       5
  55. CBITMAP         =       4
  56. CFRAME          =       2
  57. CFX             =       3
  58. CSCRCOLUMN      =       320
  59. CSCRLINE        =       200
  60. CSTONELINE      =       8
  61. CSTONECOLUMN    =       8
  62. CEXTKEY         =       128
  63. CBCHAR          =       2
  64. CBDELAY         =       2
  65. CCURPHASE       =       16
  66. SEGGFX          =       0A000H
  67.  
  68. CBATTRIBUTE     =       11
  69. CBCURBUFFER     =       CCURCOLUMN * CCURLINE
  70. CBCURSOR        =       CCURLINE * CCURCOLUMN
  71. CBOBJECT        =       COBJLINE * COBJCOLUMN
  72. CBOBJBUFFER     =       CBOBJECT * COBJECT
  73. CBOBJECTPOS     =       COBJECT * 2
  74. CBPARAGRAPH     =       16
  75. CBSCRBUFFER     =       CSCRCOLUMN * CSCRLINE
  76. CBSTACK         =       512
  77. CBCHARSET       =       CCHAR * CCURLINE
  78. CBCOLUMN        =       CCURLINE * (BOTTOMLINE - TOPLINE + 1)
  79. CBLINE          =       CCURCOLUMN * (RIGHTCOLUMN - LEFTCOLUMN + 1)
  80. CBMAP           =       CBCOLUMN * CSCRCOLUMN
  81. CBOBJMASK       =       CITEM * COBJECT * COBJLINE * COBJCOLUMN / CBITMAP
  82.  
  83. Stack           CBSTACK
  84.  
  85. Data            SEGMENT PUBLIC
  86.         ASSUME  CS:Code,        DS:Data
  87.  
  88. STREXT          DB      '.WRT', 0
  89. STR286ERROR     DB      '286-Processor required.', STRWARN
  90. STRVGAERROR     DB      'VGA-Card required.', STRWARN
  91.         IFDEF   _WRITE
  92. STRACCESSERROR  DB      'Can''t write to file.', STRWARN
  93. STRERROR        DB      'Can''t create file.', STRWARN
  94. STRUSAGE        DB      'Usage: WRITE <FileName>', STRWARN
  95.         ENDIF
  96. IFDEF   _READ
  97. STRACCESSERROR  DB      'Can''t read from file.', STRWARN
  98. STRERROR        DB      'Can''t open file.', STRWARN
  99. STRUSAGE        DB      'Usage: READ <FileName>', STRWARN
  100.         ENDIF
  101. STRHEXNUMBERS   DB      '0123456789ABCDEF', 0
  102. STRQUADNUMBERS  DB      '0123', 0
  103. STRDUALNUMBERS  DB      '01', 0
  104.  
  105. INCLUDE         INCLUDE\PALETTE.INC
  106. INCLUDE         CURSOR\CURSOR.INC
  107. INCLUDE         INCLUDE\STONE.INC
  108.  
  109. OFFSAAABFONTS   =       OFFSET  $
  110. INCLUDE         CHAR\BIG.INC
  111. INCLUDE         CHAR\SMALL.INC
  112. INCLUDE         CHAR\TINY.INC
  113. VGACHARS        =       $
  114.         DB      CCHAR * CCURLINE DUP (0)
  115. INCLUDE         INCLUDE\REQUEST.INC
  116.  
  117. AAABOBJ         =       AABSTAR
  118. INCLUDE         OBJECT\STAR.INC
  119. INCLUDE         OBJECT\HEART.INC
  120.  
  121. OFFSAAABOBJ     =       0A0H
  122. OFFSAAABCUR     =       0C8H
  123. OFFSAABCURBUF   =       0ECH
  124. OFFSAABMBOXBUF  =       0F0H
  125. OFFSAAABOBJBUF  =       CSCRCOLUMN * CITEM * COBJLINE + OFFSAAABOBJ
  126. OFFSAAABSTONE   =       OFFSAAABCUR + CSCRCOLUMN * CCURSET * CCURLINE
  127.  
  128. AOBJECTSEQ      DB      0, 1, 2, 3, 4, 5, 6, 7, 7, 6, 5, 4, 3, 2, 1, 0
  129. abObjTimer      DB      000H, 010H, 020H, 030H, 040H, 050H, 060H, 070H
  130.  
  131. offsCursor      DW      OFFSAAABCUR
  132. offsFont        DW      OFFSAAABFONTS
  133. offsPalette     DW      AABCOLOR
  134. offsPattern     DW      AAPATTERN
  135.         IFDEF   _PLAY
  136. offsText        DW      OFFSET  abText
  137.         ENDIF
  138. ynInsert        DB      YES
  139. ynLock          DB      NO
  140.         IFNDEF  _WRITE
  141. ynShowEnd       DB      YES
  142.         ENDIF
  143.  
  144. aenFXDefault    DB      ENON
  145.         DB      ENON
  146.         DB      ENON
  147.  
  148. aenFX           =       $
  149. enStars         DB      ENON
  150. enCursor        DB      ENON
  151. enObjects       DB      ENON
  152.  
  153. AENHANCEPROC    DW      OFFSET  EnhanceStars
  154.         DW      OFFSET  EnhanceCursor
  155.         DW      OFFSET  EnhanceObjects
  156.  
  157. AINITPROC       DW      OFFSET  InitStars
  158.         DW      OFFSET  InitCursor
  159.         DW      OFFSET  InitObjects
  160.  
  161. ATURNOFFPROC    DW      OFFSET  TurnOffStars
  162.         DW      OFFSET  TurnOffCursor
  163.         DW      OFFSET  TurnOffObjects
  164.  
  165. ATURNONPROC     DW      OFFSET  TurnOnStars
  166.         DW      OFFSET  TurnOnCursor
  167.         DW      OFFSET  TurnOnObjects
  168.  
  169. AJUMPPROC       DW      0
  170.         DW      0               ; !
  171.         DW      0
  172.         DW      0
  173.         DW      0
  174.         DW      0
  175.         DW      0
  176.         DW      0
  177.         DW      OFFSET  KeyBackSpace
  178.         DW      0
  179.         DW      0               ; 10
  180.         DW      0
  181.         DW      0
  182.         DW      OFFSET  KeyReturn
  183.         DW      0
  184.         DW      0
  185.         DW      0
  186.         DW      0
  187.         DW      0
  188.         IFDEF   _WRITE
  189.         DW      OFFSET  ResetFile
  190.         ELSE
  191.         DW      0
  192.         ENDIF
  193.         DW      OFFSET  AskText ; 20
  194.         DW      0
  195.         DW      0
  196.         DW      OFFSET  AskInfo
  197.         DW      OFFSET  AskObject
  198.         DW      OFFSET  AskPattern
  199.         DW      0
  200.         DW      0
  201.         DW      0
  202.         DW      0
  203.         DW      0               ; 30
  204.         DW      0
  205.         DW      0
  206.         DW      OFFSET  AskFont
  207.         DW      0
  208.         DW      OFFSET  AskHelp
  209.         DW      0
  210.         DW      0
  211.         DW      OFFSET  KeyInsLine
  212.         DW      0
  213.         DW      0               ; 40
  214.         DW      0
  215.         DW      0
  216.         DW      0
  217.         DW      OFFSET  KeyDelLine
  218.         DW      0
  219.         DW      OFFSET  AskCursor
  220.         DW      0
  221.         DW      OFFSET  AskBack
  222.         DW      0
  223.         DW      0               ; 50
  224.         DW      0
  225.         DW      0
  226.         DW      0
  227.         DW      0
  228.         DW      0
  229.         DW      0
  230.         DW      0
  231.         DW      0
  232.         DW      OFFSET  AskHelp
  233.         DW      OFFSET  SwitchStars ; 60
  234.         DW      OFFSET  SwitchCursor
  235.         DW      OFFSET  SwitchSprites
  236.         DW      OFFSET  KeyClear
  237.         DW      0
  238.         DW      0
  239.         DW      0
  240.         DW      0
  241.         DW      0
  242.         DW      0
  243.         DW      0               ; 70
  244.         DW      OFFSET  KeyToLeft
  245.         DW      OFFSET  KeyUp
  246.         DW      OFFSET  KeyToUp
  247.         DW      0
  248.         DW      OFFSET  KeyLeft
  249.         DW      0
  250.         DW      OFFSET  KeyRight
  251.         DW      0
  252.         DW      OFFSET  KeyToRight
  253.         DW      OFFSET  KeyDown ; 80
  254.         DW      OFFSET  KeyToDown
  255.         DW      OFFSET  KeyInsert
  256.         DW      OFFSET  KeyDelete
  257.         DW      0
  258.         DW      0
  259.         DW      0
  260.         DW      0
  261.         DW      0
  262.         DW      0
  263.         DW      0               ; 90
  264.         DW      0
  265.         DW      0
  266.         DW      0
  267.         DW      0
  268.         DW      0
  269.         DW      0
  270.         DW      0
  271.         DW      0
  272.         DW      0
  273.         DW      0               ; 100
  274.         DW      0
  275.         DW      0
  276.         DW      0
  277.         DW      0
  278.         DW      0
  279.         DW      0
  280.         DW      0
  281.         DW      0
  282.         DW      0
  283.         DW      0               ; 110
  284.         DW      0
  285.         DW      0
  286.         DW      0
  287.         DW      0
  288.         DW      0
  289.         DW      0
  290.         DW      0
  291.         DW      0
  292.         DW      0
  293.         DW      0               ; 120
  294.         DW      0
  295.         DW      0
  296.         DW      0
  297.         DW      0
  298.         DW      0
  299.         DW      0
  300.         DW      0
  301.  
  302. ;               Uninitialisierte Variablen werden auf 0 gesetzt
  303. ;
  304.  
  305. offsFirstVoid   =       OFFSET  $
  306.  
  307. BackColor       DB      ?
  308. BitPlane        DB      ?
  309. cRepeat         DB      ?
  310. CursorNewX      DW      ?
  311. CursorNewY      DW      ?
  312. CursorX         DW      ?
  313. CursorY         DW      ?
  314.         DW      2 * (CFRAME - 1) DUP (?)
  315. Delay           DW      ?
  316. iCursor         DW      ?
  317. iFrame          DW      ?
  318. iItem           DW      ?
  319. iObject         DW      ?
  320. iPhase          DW      ?
  321.         IFNDEF  _WRITE
  322. NextChar        DW      ?
  323.         ENDIF
  324. offs            DW      ?
  325. offsChar        DW      ?
  326. offsFileName    DW      ?
  327. offsFrame       DW      ?
  328. OldRWMode       DB      ?
  329. segFileName     DW      ?
  330.         IFDEF   _PLAY
  331. segText         DW      ?
  332.         ENDIF
  333. Random          DW      ?
  334.         IFNDEF  _PLAY
  335. skey            DW      ?
  336.         ENDIF
  337. Timer           DW      ?
  338. TimerLast       DW      ?
  339. XPos            DW      ?
  340. YPos            DW      ?
  341.         DW      2 * CFRAME DUP (?)
  342. ynError         DB      ?
  343. ynFXOn          DB      ?
  344. ynQuit          DB      ?
  345. ynSingle        DB      ?
  346. ynSkip          DB      ?
  347. Char            DW      ?
  348.  
  349. ;               Koordinaten der MessageBox in Zeichen
  350. ;
  351. MBox_Coords     =       MBox_Left
  352. MBox_Left       DW      ?
  353. MBox_Top        DW      ?
  354. MBox_Right      DW      ?
  355. MBox_Bottom     DW      ?
  356. MBox_Text       DW      ?
  357.  
  358. aoffsItem       DW      COBJECT                 DUP     (?)
  359. aoffsMask       DW      COBJECT                 DUP     (?)
  360. aoffsObj        DW      COBJECT * CFRAME        DUP     (?)
  361. aoffsObjNew     DW      COBJECT                 DUP     (?)
  362. abAttribBuffer  DB      CBATTRIBUTE             DUP     (?)
  363. aaabObjMask     DB      CBOBJMASK               DUP     (?)
  364. awStarX         DW      CSTAR * CFRAME          DUP     (?)
  365.  
  366. offsLastVoid    =       OFFSET  $
  367. cbVoid          =       offsLastVoid - offsFirstVoid
  368.  
  369.         IFDEF   _PLAY
  370. dummy           DB      0
  371.         IFDEF   _TEST
  372. abText          DW      'H', 50
  373.         DW      'a', 50
  374.         DW      'l', 50
  375.         DW      'l', 50
  376.         DW      'o', 50
  377.         DW      KBESC, 50
  378.         ELSE
  379. abText          =       $
  380.         ENDIF
  381.         ENDIF
  382. Data            ENDS
  383.  
  384. Code            SEGMENT PUBLIC
  385.         ASSUME  CS:Code,        DS:Data
  386.  
  387.  
  388. ; *****************************************************************************
  389. ; Holt das nächste Zeichen aus dem Speicher: C
  390. ; *****************************************************************************
  391.         IFDEF   _PLAY
  392. AccessFile      PROC
  393.         push    si
  394.         push    es
  395.         push    ax
  396.         mov     si, offsText
  397.         mov     es, segText
  398.         mov     ax, es:[si]
  399.         mov     NextChar, ax
  400.         mov     ax, es:[si+CBCHAR]
  401.         mov     Delay, ax
  402.         add     offsText, CBCHAR + CBDELAY
  403.         cmp     offsText, CBPARAGRAPH
  404.         jna     AccessFile_Ok
  405.         sub     offsText, CBPARAGRAPH
  406.         inc     segText
  407. AccessFile_Ok:  mov     cRepeat, CFRAME
  408.         dec     Delay
  409.         clc
  410.         pop     ax
  411.         pop     es
  412.         pop     si
  413.         ret
  414. AccessFile      ENDP
  415.         ENDIF
  416.  
  417. ; *****************************************************************************
  418. ; Liest die Informationen zum nächsten Zeichen aus der Datei: C
  419. ; *****************************************************************************
  420.         IFDEF   _READ
  421. AccessFile      PROC
  422.         pusha
  423.         mov     ah, DOS_Read_FROM_HANDLE
  424.         mov     bx, skey
  425.         mov     cx, cbChar
  426.         mov     dx, OFFSET NextChar
  427.         int     DOS_FUNCTION
  428.         jc      Access_Error
  429.         cmp     ax, cbChar
  430.         jne     Access_Error
  431.  
  432. ;               Liest die Verzügerung
  433. ;
  434.         mov     ah, DOS_Read_FROM_HANDLE
  435.         mov     bx, skey
  436.         mov     cx, cbDelay
  437.         mov     dx, OFFSET Delay
  438.         int     DOS_FUNCTION
  439.         jc      Access_Error
  440.         cmp     ax, cbDelay
  441.         jne     Access_Error
  442.         clc
  443.         mov     cRepeat, CFRAME
  444.         dec     Delay
  445.         jmp     Access_End
  446.  
  447. Access_Error:   mov     ynError, YES
  448.         stc
  449. Access_End:     popa
  450.         ret
  451. AccessFile      ENDP
  452.         ENDIF
  453.  
  454. ; *****************************************************************************
  455. ; Schreibt die Informationen zum nächsten Zeichein in die Datei: C
  456. ; *****************************************************************************
  457.         IFDEF   _WRITE
  458. AccessFile      PROC
  459.         pusha
  460.         call    GetDelay
  461.         mov     ah, DOS_WRITE_TO_HANDLE
  462.         mov     bx, skey
  463.         mov     cx, cbChar
  464.         mov     dx, OFFSET Char
  465.         int     DOS_FUNCTION
  466.         jc      Access_Error
  467.         cmp     ax, cbChar
  468.         jne     Access_Error
  469.  
  470. ;               Schreibt die Verzügerung
  471. ;
  472.         mov     ah, DOS_WRITE_TO_HANDLE
  473.         mov     bx, skey
  474.         mov     cx, cbDelay
  475.         mov     dx, OFFSET Delay
  476.         int     DOS_FUNCTION
  477.         jc      Access_Error
  478.         cmp     ax, cbDelay
  479.         jne     Access_Error
  480.         jmp     Access_End
  481. Access_Error:   mov     ynError, YES
  482.         stc
  483. Access_End:     popa
  484.         ret
  485. AccessFile      ENDP
  486.         ENDIF
  487.  
  488. ActualizeCursor PROC
  489.         push    ax
  490.         push    si
  491.         mov     si, iFrame
  492.         shl     si, 2
  493.         add     si, OFFSET CursorX
  494.         mov     ax, CursorNewX
  495.         mov     ds:[si], ax
  496.         mov     ax, CursorNewY
  497.         mov     ds:[si+2], ax
  498.         pop     si
  499.         pop     ax
  500.         ret
  501. ActualizeCursor ENDP
  502.  
  503. ; *****************************************************************************
  504. ; Dialogboxen auf dem Bildschirm darstellen
  505. ; *****************************************************************************
  506. AskBack         PROC
  507.         pusha
  508.         mov     si, OFFSET BACKREQUESTER
  509.         call    MessageBox
  510.         jc      AskBack_End
  511.         call    UpCase
  512.         mov     ax, Char
  513.         mov     di, OFFSET STRHEXNUMBERS
  514.         call    Pos
  515.         jc      AskBack_End
  516.         mov     si, OFFSET ABACKCOLOR
  517.         add     si, cx
  518.         mov     al, ds:[si]
  519.         mov     BackColor, al
  520. AskBack_End:    popa
  521.         ret
  522. AskBack         ENDP
  523.  
  524. AskCursor       PROC
  525.         pusha
  526.         mov     si, OFFSET CURSORREQUESTER
  527.         call    MessageBox
  528.         jc      AskCursor_End
  529.         mov     ax, Char
  530.         mov     di, OFFSET STRDUALNUMBERS
  531.         call    Pos
  532.         jc      AskCursor_End
  533.         mov     iCursor, cx
  534.         mov     ax, cx
  535.         mov     dx, CCURLINE * CSCRCOLUMN
  536.         mul     dx
  537.         add     ax, OFFSAAABCUR
  538.         mov     offsCursor, ax
  539. AskCursor_End:  popa
  540.         ret
  541. AskCursor       ENDP
  542.  
  543.         IFNDEF  _WRITE
  544. AskEnd          PROC
  545.         push    ax
  546.         push    si
  547.         mov     ynLock, YES
  548. AskEnd_Wait:    call    ExpectRetrace
  549.         call    ExpectPicture
  550.         call    SwitchFrame
  551.         call    TurnOffFX
  552.         mov     ax, 1
  553.         call    EnhanceTimer
  554.         cmp     ynShowEnd, YES
  555.         jne     AskEnd_NoShow
  556.         cmp     iFrame, 0
  557.         jne     AskEnd_NoShow
  558.         mov     si, OFFSET ENDREQUESTER
  559.         call    MessageBox
  560.         mov     ynShowEnd, NO
  561. AskEnd_NoShow:  call    TurnOnFX
  562.         call    GetKey
  563.         jc      AskEnd_Wait
  564.         pop     si
  565.         pop     ax
  566.         ret
  567. AskEnd          ENDP
  568.         ENDIF
  569.  
  570. AskFont         PROC
  571.         pusha
  572.         mov     si, OFFSET FONTREQUESTER
  573.         call    MessageBox
  574.         jc      AskFont_End
  575.         mov     ax, Char
  576.         mov     di, OFFSET STRQUADNUMBERS
  577.         call    Pos
  578.         jc      AskFont_End
  579.         shl     cx, 11
  580.         add     cx, OFFSAAABFONTS
  581.         mov     offsFont, cx
  582. AskFont_End:    popa
  583.         ret
  584. AskFont         ENDP
  585.  
  586. AskText         PROC
  587.         pusha
  588.         mov     si, OFFSET FRONTREQUESTER
  589.         call    MessageBox
  590.         jc      AskText_End
  591.         mov     ax, Char
  592.         mov     di, OFFSET STRHEXNUMBERS
  593.         call    Pos
  594.         jc      AskText_End
  595.         shl     cx, 4
  596.         add     cx, OFFSET AABCOLOR
  597.         mov     offsPalette, cx
  598. AskText_End:    popa
  599.         ret
  600. AskText         ENDP
  601.  
  602. AskHelp         PROC
  603.         push    si
  604.         mov     si, OFFSET HELP1REQUESTER
  605.         call    MessageBox
  606.         mov     si, OFFSET HELP2REQUESTER
  607.         call    MessageBox
  608.         pop     si
  609.         ret
  610. AskHelp         ENDP
  611.  
  612. AskInfo         PROC
  613.         push    si
  614.         mov     si, OFFSET INFOREQUESTER
  615.         call    MessageBox
  616.         pop     si
  617.         ret
  618. AskInfo         ENDP
  619.  
  620. AskObject       PROC
  621.         pusha
  622.         mov     si, OFFSET OBJECTREQUESTER
  623.         call    MessageBox
  624.         jc      AskObject_End
  625.         mov     ax, Char
  626.         mov     di, OFFSET STRDUALNUMBERS
  627.         call    Pos
  628.         jc      AskObject_End
  629.         mov     iItem, cx
  630. AskObject_End:  popa
  631.         ret
  632. AskObject       ENDP
  633.  
  634. AskPattern      PROC
  635.         pusha
  636.         mov     si, OFFSET PATTERNREQUESTER
  637.         call    MessageBox
  638.         mov     ax, Char
  639.         mov     di, OFFSET STRQUADNUMBERS
  640.         call    Pos
  641.         jc      AskPattern_End
  642.         shl     cx, 6
  643.         add     cx, OFFSET AAPATTERN
  644.         mov     offsPattern, cx
  645. AskPattern_End: popa
  646.         ret
  647. AskPattern      ENDP
  648.  
  649. ClearLatches    PROC
  650.         push    ds
  651.         push    si
  652.         mov     ax, SEGGFX
  653.         mov     ds, ax
  654.         mov     si, CSCRLINE * CSCRCOLUMN
  655.         lodsb
  656.         pop     si
  657.         pop     ds
  658.         ret
  659. ClearLatches    ENDP
  660.  
  661. ; *****************************************************************************
  662. ; Schließt die Textdatei
  663. ; *****************************************************************************
  664.         IFNDEF  _PLAY
  665. CloseFile       PROC
  666.         push    ax
  667.         push    bx
  668.         mov     ah, DOS_CLOSE_FILE
  669.         mov     bx, skey
  670.  
  671.         int     DOS_FUNCTION
  672.         pop     bx
  673.         pop     ax
  674.         ret
  675. CloseFile       ENDP
  676.         ENDIF
  677.  
  678. ; *****************************************************************************
  679. ; Konvertiert die Objekte in das Video-Format
  680. ; *****************************************************************************
  681. Convert         PROC
  682.         pusha
  683.         mov     bp, sp
  684.         add     bp, 012H
  685.         mov     dx, PRSEQUENCER
  686.         mov     al, 002H
  687.         out     dx, al
  688.         inc     dx
  689.         mov     al, 001H
  690.         mov     bx, ss:[bp]
  691.         mov     si, ss:[bp+2]
  692.         mov     di, ss:[bp+4]
  693.         mov     cx, ss:[bp+6]
  694. Convert_NextLn: push    cx
  695.         mov     cx, ss:[bp+8]
  696. Convert_NextCl: out     dx, al
  697.         mov     ah, ds:[si]
  698.         mov     es:[di], ah
  699.         or      ah, ah
  700.         je      Convert_Blank
  701.         mov     ah, 0FFH
  702.         mov     ds:[si], ah
  703. Convert_Blank:  inc     si
  704.         add     al, al
  705.         cmp     al, 010H
  706.         jne     Convert_Next
  707.         inc     di
  708.         mov     al, 001H
  709. Convert_Next:   loop    Convert_NextCl
  710.         pop     cx
  711.         sub     di, bx
  712.         add     di, CSCRCOLUMN
  713.         loop    Convert_NextLn
  714.         popa
  715.         ret     10
  716. Convert         ENDP
  717.  
  718. ConvertChars    PROC
  719.         pusha
  720.         mov     bp, OFFSET ABCPHASE
  721.         mov     ax, CCURCOLUMN
  722.         mov     dx, CCURLINE
  723.         mov     di, OFFSAAABCUR
  724.         mov     si, OFFSET AAAABCURSOR
  725.         mov     bx, CCURCOLUMN / CBITMAP
  726.         mov     cx, CCURSET + 1
  727. ConvChr_NextIt: push    cx
  728.         xor     ch, ch
  729.         mov     cl, ds:[bp]
  730. ConvChr_Next:   push    ax
  731.         push    dx
  732.         push    di
  733.         push    si
  734.         push    bx
  735.         call    Convert
  736.         add     si, CBCURSOR
  737.         add     di, CCURCOLUMN / CBITMAP
  738.         loop    ConvChr_Next
  739.         mov     cl, ds:[bp]
  740.         shl     cl, 1
  741.         sub     di, cx
  742.         add     di, CSCRCOLUMN * CCURLINE
  743.         inc     bp
  744.         pop     cx
  745.         loop    ConvChr_NextIt
  746.         popa
  747.         ret
  748. ConvertChars    ENDP
  749.  
  750. ConvertObjects  PROC
  751.         pusha
  752.         mov     ax, COBJCOLUMN
  753.         mov     dx, COBJLINE
  754.         mov     di, OFFSAAABOBJ
  755.         mov     si, OFFSET AAABOBJ
  756.         mov     bx, COBJCOLUMN / CBITMAP
  757.         mov     cx, CITEM
  758. ConvObj_NextIt: push    cx
  759.         mov     cx, COBJECT
  760. ConvObj_Next:   push    ax
  761.         push    dx
  762.         push    di
  763.         push    si
  764.         push    bx
  765.         call    Convert
  766.         add     si, CBOBJECT
  767.         add     di, COBJCOLUMN / CBITMAP
  768.         loop    ConvObj_Next
  769.         pop     cx
  770.         add     di, CSCRCOLUMN * COBJLINE - COBJCOLUMN * 2
  771.         loop    ConvObj_NextIt
  772.  
  773. ;               Bitmasken anlegen
  774. ;
  775.         mov     si, OFFSET AAABOBJ
  776.         mov     di, OFFSET aaabObjMask
  777.         push    es
  778.         push    ds
  779.         pop     es
  780.         mov     cx, CBOBJMASK
  781. ConvObj_NextMsk:push    cx
  782.         xor     ah, ah
  783.         mov     cx, CBITMAP
  784. ConvObj_NextBit:shr     ah, 1
  785.         lodsb
  786.         or      al, al
  787.         je      ConvObj_Void
  788.         or      ah, 008H
  789. ConvObj_Void:   loop    ConvObj_NextBit
  790.         mov     al, ah
  791.         stosb
  792.         pop     cx
  793.         loop    ConvObj_NextMsk
  794.         pop     es
  795.         popa
  796.         ret
  797. ConvertObjects  ENDP
  798.  
  799. ; *****************************************************************************
  800. ; Schaltet die Rahmenfarbe auf Schwarz
  801. ; *****************************************************************************
  802.         IFDEF   _TEST
  803. DarkBorder      PROC
  804.         push    ax
  805.         push    dx
  806.         mov     dx, 003C0H
  807.         mov     al, 031H
  808.         out     dx, al
  809.         mov     al, 000H
  810.         out     dx, al
  811.         pop     dx
  812.         pop     ax
  813.         ret
  814. DarkBorder      ENDP
  815.         ENDIF
  816.  
  817. ; *****************************************************************************
  818. ; Führt Aktionen auf dem Bildschirm aus
  819. ; *****************************************************************************
  820. DoABC           PROC
  821.         pusha
  822.         cmp     ynSingle, YES
  823.         je      DoABC_Single
  824.         mov     ax, Char
  825.  
  826. ;               Kontrolle auf Ende
  827. ;
  828.         cmp     ax, KBESC
  829.         jne     DoABC_NotEnd
  830.         mov     ynQuit, YES
  831.         jmp     DoABC_End
  832.  
  833. ;               Kontrolle auf Rückschritt
  834. ;
  835. DoABC_NotEnd:   cmp     ax, KBBS
  836.         jne     DoABC_NoBS
  837.         call    KeyBackSpace
  838.         jmp     DoABC_End
  839.  
  840. ;               Kontrolle auf Zeilenvorschub
  841. ;
  842. DoABC_NoBS:     cmp     ax, KBLF
  843.         je      DoABC_End
  844.         cmp     ax, KBCR
  845.         jne     DoABC_NoCR
  846.         call    KeyReturn
  847.         jmp     DoABC_End
  848.  
  849. ;               Kontrolle aus ASCII-Textzeichen
  850. ;
  851. DoABC_NoCR:     or      ah, ah
  852.         jne     DoABC_Ext
  853.         call    KeyABC
  854.         jmp     DoABC_End
  855.  
  856. ;               Ansprung einer Funktion für Steuerzeichen
  857. ;
  858. DoABC_Ext:      shr     ax, 7
  859.         mov     si, ax
  860.         add     si, OFFSET AJUMPPROC
  861.         mov     bx, ds:[si]
  862.         or      bx, bx
  863.         je      DoABC_End
  864.         call    bx
  865.         jmp     DoABC_End
  866. DoABC_Single:   mov     ynSingle, NO
  867.         mov     ynSkip, YES
  868. DoABC_End:      dec     cRepeat
  869.         call    ResetCursor
  870.         call    ActualizeCursor
  871.         popa
  872.         ret
  873. DoABC           ENDP
  874.  
  875. DoClear         PROC
  876.         pusha
  877.         call    ClearLatches
  878.         xor     di, di
  879.         mov     cx, CSCRLINE
  880. DoClear_NextLn: push    cx
  881.         mov     cx, CSCRCOLUMN / CBITMAP
  882.         rep     stosb
  883.         add     di, (CSCRCOLUMN * (CBITMAP - 1)) / CBITMAP
  884.         pop     cx
  885.         loop    DoClear_NextLn
  886.  
  887. ;               Uhr vorstellen
  888. ;
  889.         mov     ax, 2
  890.         call    EnhanceTimer
  891.         popa
  892.         ret
  893. DoClear         ENDP
  894.  
  895. DoDown          PROC
  896.  
  897. ;               Bildinhalt verschieben und neue Zeile leeren
  898. ;
  899.         pusha
  900.         std
  901.         mov     si, (CSCRLINE - CCURLINE - 1) * CSCRCOLUMN + CSCRCOLUMN / CBITMAP - 1
  902.         mov     di, (CSCRLINE - 1) * CSCRCOLUMN + CSCRCOLUMN / CBITMAP - 1
  903.         push    ds
  904.         push    es
  905.         pop     ds
  906.         mov     cx, CSCRLINE - CCURLINE
  907. DoDown_NextCpy: push    cx
  908.         mov     cx, CSCRCOLUMN / CBITMAP
  909.         rep     movsb
  910.         sub     di, (CSCRCOLUMN * (CBITMAP - 1)) / CBITMAP
  911.         sub     si, (CSCRCOLUMN * (CBITMAP - 1)) / CBITMAP
  912.         pop     cx
  913.         loop    DoDown_NextCpy
  914.         pop     ds
  915.         cld
  916.  
  917.         call    ClearLatches
  918.         xor     di, di
  919.         mov     cx, CCURLINE
  920. DoDown_NextClr: push    cx
  921.         mov     cx, CSCRCOLUMN / CBITMAP
  922.         rep     stosb
  923.         add     di, (CSCRCOLUMN * (CBITMAP - 1)) / CBITMAP
  924.         pop     cx
  925.         loop    DoDown_NextClr
  926.  
  927. ;               Uhr vorstellen
  928. ;
  929.         mov     ax, 2
  930.         call    EnhanceTimer
  931.         popa
  932.         ret
  933. DoDown          ENDP
  934.  
  935. DoInsert        PROC
  936.         pusha
  937.         call    GetCurOffset
  938.         std
  939.         mov     dx, RIGHTCOLUMN
  940.         sub     dx, xPos
  941.         add     dx, dx
  942.         mov     si, offs
  943.         add     si, (CCURLINE - 1) * CSCRCOLUMN - 1
  944.         add     si, dx
  945.         mov     di, si
  946.         add     di, CCURCOLUMN / CBITMAP
  947.         push    ds
  948.         push    es
  949.         pop     ds
  950.         mov     cx, CCURLINE
  951. DoIns_NextLn:   push    cx
  952.         mov     cx, dx
  953.         rep     movsb
  954.         call    ClearLatches
  955.         mov     cx, CCURCOLUMN / CBITMAP
  956.         rep     stosb
  957.         add     si, dx
  958.         sub     si, CSCRCOLUMN
  959.         add     di, dx
  960.         sub     di, CSCRCOLUMN - (CCURCOLUMN / CBITMAP)
  961.         pop     cx
  962.         loop    DoIns_NextLn
  963.         cld
  964.         pop     ds
  965.         popa
  966.         ret
  967. DoInsert        ENDP
  968.  
  969. DoInsLine       PROC
  970.  
  971. ;               Bildinhalt verschieben und neue Zeile leeren
  972. ;
  973.         pusha
  974.         std
  975.         mov     si, (CSCRLINE - CCURLINE - 1) * CSCRCOLUMN + CSCRCOLUMN / CBITMAP - 1
  976.         mov     di, (CSCRLINE - 1) * CSCRCOLUMN + CSCRCOLUMN / CBITMAP - 1
  977.         mov     cx, BOTTOMLINE
  978.         sub     cx, yPos
  979.         push    ds
  980.         push    es
  981.         pop     ds
  982.         je      DoInsL_Bottom
  983.         shl     cx, 3
  984. DoInsL_NextCpy: push    cx
  985.         mov     cx, CSCRCOLUMN / CBITMAP
  986.         rep     movsb
  987.         sub     di, (CSCRCOLUMN * (CBITMAP - 1)) / CBITMAP
  988.         sub     si, (CSCRCOLUMN * (CBITMAP - 1)) / CBITMAP
  989.         pop     cx
  990.         loop    DoInsL_NextCpy
  991. DoInsL_Bottom:  pop     ds
  992.         cld
  993.  
  994.         call    ClearLatches
  995.         mov     di, si
  996.         add     di, (CSCRCOLUMN * (CBITMAP - 1)) / CBITMAP + 1
  997.         mov     cx, CCURLINE
  998. DoInsL_NextClr: push    cx
  999.         mov     cx, CSCRCOLUMN / CBITMAP
  1000.         rep     stosb
  1001.         add     di, (CSCRCOLUMN * (CBITMAP - 1)) / CBITMAP
  1002.         pop     cx
  1003.         loop    DoInsL_NextClr
  1004.  
  1005. ;               Uhr vorstellen
  1006. ;
  1007.         mov     ax, 2
  1008.         call    EnhanceTimer
  1009.         popa
  1010.         ret
  1011. DoInsLine       ENDP
  1012.  
  1013. DoUp            PROC
  1014.  
  1015. ;               Bildinhalt verschieben und neue Zeile leeren
  1016. ;
  1017.         pusha
  1018.         mov     si, CCURLINE * CSCRCOLUMN
  1019.         xor     di, di
  1020.         push    ds
  1021.         push    es
  1022.         pop     ds
  1023.         mov     cx, CSCRLINE - CCURLINE
  1024. DoUp_NextCpy:   push    cx
  1025.         mov     cx, CSCRCOLUMN / CBITMAP
  1026.         rep     movsb
  1027.         add     di, (CSCRCOLUMN * (CBITMAP - 1)) / CBITMAP
  1028.         add     si, (CSCRCOLUMN * (CBITMAP - 1)) / CBITMAP
  1029.         pop     cx
  1030.         loop    DoUp_NextCpy
  1031.         pop     ds
  1032.  
  1033.         call    ClearLatches
  1034.         mov     cx, CCURLINE
  1035. DoUp_NextClr:   push    cx
  1036.         mov     cx, CSCRCOLUMN / CBITMAP
  1037.         rep     stosb
  1038.         add     di, (CSCRCOLUMN * (CBITMAP - 1)) / CBITMAP
  1039.         pop     cx
  1040.         loop    DoUp_NextClr
  1041.  
  1042. ;               Uhr vorstellen
  1043. ;
  1044.         mov     ax, 2
  1045.         call    EnhanceTimer
  1046.         popa
  1047.         ret
  1048. DoUp            ENDP
  1049.  
  1050. DoZipChar       PROC
  1051.         pusha
  1052.         call    GetCurOffset
  1053.         mov     dx, RIGHTCOLUMN
  1054.         sub     dx, xPos
  1055.         add     dx, dx
  1056.         mov     si, offs
  1057.         add     si, CCURCOLUMN / CBITMAP
  1058.         mov     di, offs
  1059.         push    ds
  1060.         push    es
  1061.         pop     ds
  1062.         mov     cx, CCURLINE
  1063. DoZipChar_Next: push    cx
  1064.         mov     cx, dx
  1065.         rep     movsb
  1066.         call    ClearLatches
  1067.         mov     cx, CCURCOLUMN / CBITMAP
  1068.         rep     stosb
  1069.         sub     si, dx
  1070.         add     si, CSCRCOLUMN
  1071.         sub     di, dx
  1072.         add     di, CSCRCOLUMN - (CCURCOLUMN / CBITMAP)
  1073.         pop     cx
  1074.         loop    DoZipChar_Next
  1075.         pop     ds
  1076.         popa
  1077.         ret
  1078. DoZipChar       ENDP
  1079.  
  1080. DoZipLine       PROC
  1081.  
  1082. ;               Bildinhalt verschieben und neue Zeile leeren
  1083. ;
  1084.         pusha
  1085.         mov     ax, yPos
  1086.         mov     dx, CSCRCOLUMN * CCURLINE
  1087.         mul     dx
  1088.         mov     di, ax
  1089.         mov     si, ax
  1090.         add     si, CSCRCOLUMN * CCURLINE
  1091.         mov     cx, BOTTOMLINE
  1092.         sub     cx, yPos
  1093.         push    ds
  1094.         push    es
  1095.         pop     ds
  1096.         je      DoZipL_Bottom
  1097.         shl     cx, 3
  1098. DoZipL_NextCpy: push    cx
  1099.         mov     cx, CSCRCOLUMN / CBITMAP
  1100.         rep     movsb
  1101.         add     di, (CSCRCOLUMN * (CBITMAP - 1)) / CBITMAP
  1102.         add     si, (CSCRCOLUMN * (CBITMAP - 1)) / CBITMAP
  1103.         pop     cx
  1104.         loop    DoZipL_NextCpy
  1105. DoZipL_Bottom:  pop     ds
  1106.  
  1107.         call    ClearLatches
  1108.         mov     cx, CCURLINE
  1109. DoZipL_NextClr: push    cx
  1110.         mov     cx, CSCRCOLUMN / CBITMAP
  1111.         rep     stosb
  1112.         add     di, (CSCRCOLUMN * (CBITMAP - 1)) / CBITMAP
  1113.         pop     cx
  1114.         loop    DoZipL_NextClr
  1115.  
  1116. ;               Uhr vorstellen
  1117. ;
  1118.         mov     ax, 2
  1119.         call    EnhanceTimer
  1120.         popa
  1121.         ret
  1122. DoZipLine       ENDP
  1123.  
  1124. ; *****************************************************************************
  1125. ; Stellt den alten Video-Modus wieder her
  1126. ; *****************************************************************************
  1127. Done            PROC
  1128.         pusha
  1129.         mov     ah, VIDEO_SET_MODE
  1130.         mov     al, VIDEO_80x25x16
  1131.         int     VIDEO_FUNCTION
  1132.  
  1133.         IFNDEF  _PLAY
  1134.         cmp     ynError, YES
  1135.         jne     Done_OK
  1136.         IFDEF   _READ
  1137.         cmp     NextChar, KBESC
  1138.         je      Done_OK
  1139.         ENDIF
  1140.         mov     dx, OFFSET STRACCESSERROR
  1141.         mov     ah, DOS_WRITE_STRING
  1142.         int     DOS_FUNCTION
  1143.         stc
  1144.         jmp     Done_End
  1145.         ENDIF
  1146.  
  1147. Done_OK:        clc
  1148. Done_End:       popa
  1149.         ret
  1150. Done            ENDP
  1151.  
  1152. DoneBlit        PROC
  1153.         push    dx
  1154.         push    ax
  1155.         mov     al, OldRWMode
  1156.         mov     ah, 005H
  1157.         xchg    al, ah
  1158.         mov     dx, PRGRAPHICS
  1159.         out     dx, ax
  1160.         pop     ax
  1161.         pop     dx
  1162.         ret
  1163. DoneBlit        ENDP
  1164.  
  1165. ; *****************************************************************************
  1166. ; Zeichnet den Block ax ab der Adresse es:di
  1167. ; *****************************************************************************
  1168. DrawBlock       PROC
  1169.  
  1170. ;               Anfangsadresse des Steins bestimmen
  1171. ;
  1172.         pusha
  1173.         mov     si, OFFSAAABSTONE
  1174.         add     si, ax
  1175.         add     si, ax
  1176.         push    ds
  1177.         mov     ax, SEGGFX
  1178.         mov     ds, ax
  1179.  
  1180.         mov     cx, CSTONELINE
  1181. DBlock_NextLn:  push    cx
  1182.         mov     cx, CSTONECOLUMN / CBITMAP
  1183.         rep     movsb
  1184.         add     di, CSCRCOLUMN - CSTONECOLUMN / CBITMAP
  1185.         add     si, CSCRCOLUMN - CSTONECOLUMN / CBITMAP
  1186.         pop     cx
  1187.         loop    DBlock_NextLn
  1188.         pop     ds
  1189.         popa
  1190.         ret
  1191. DrawBlock       ENDP
  1192.  
  1193. EnhanceTimer    PROC
  1194.         pusha
  1195.         add     Timer, ax
  1196.  
  1197. ;               Effekte weiterstellen
  1198. ;
  1199.         mov     si, OFFSET AENHANCEPROC
  1200.         mov     di, OFFSET aenFX
  1201.         mov     cx, CFX
  1202. EnhanceTimer_FX:mov     dl, ds:[di]
  1203.         inc     dl
  1204.         and     dl, 3
  1205.         cmp     dl, ENON
  1206.         jl      EnhanceTimer_No
  1207.         mov     bx, ds:[si]
  1208.         call    bx
  1209. EnhanceTimer_No:inc     di
  1210.         add     si, 2
  1211.         loop    EnhanceTimer_FX
  1212.         popa
  1213.         ret
  1214. EnhanceTimer    ENDP
  1215.  
  1216. EnhanceCursor   PROC
  1217.         pusha
  1218.         add     iPhase, ax
  1219.         mov     si, iCursor
  1220.         add     si, OFFSET ABCPHASE
  1221.         xor     dh, dh
  1222.         mov     dl, ds:[si]
  1223.         shl     dx, 2
  1224.         cmp     iPhase, dx
  1225.         jnae    EnhCur_End
  1226.         sub     iPhase, dx
  1227. EnhCur_End:     popa
  1228.         ret
  1229. EnhanceCursor   ENDP
  1230.  
  1231. EnhanceObjects  PROC
  1232.         pusha
  1233.         cmp     enObjects, ENON
  1234.         jl      EnhObj_End
  1235.         mov     si, OFFSET abObjTimer
  1236.         mov     cx, COBJECT
  1237. EnhanceTm_Obj:  add     ds:[si], al
  1238.         inc     si
  1239.         loop    EnhanceTm_Obj
  1240. EnhObj_End:     popa
  1241.         ret
  1242. EnhanceObjects  ENDP
  1243.  
  1244. EnhanceStars    PROC
  1245.         pusha
  1246.         mov     si, OFFSET awStarX
  1247.         cmp     iFrame, 0
  1248.         je      EnhStars_Frm0
  1249.         add     si, CSTAR * 2
  1250. EnhStars_Frm0:  mov     cx, CSTAR
  1251. EnhStars_Next:  mov     ax, ds:[si]
  1252.         mov     dx, cx
  1253.         and     dx, 3
  1254.         inc     dx
  1255.         sub     ax, dx
  1256.         jns     EnhStars_Ok
  1257.         add     ax, CSCRCOLUMN
  1258. EnhStars_Ok:    mov     ds:[si], ax
  1259.         add     si, 2
  1260.         loop    EnhStars_Next
  1261.         popa
  1262.         ret
  1263. EnhanceStars    ENDP
  1264.  
  1265. ; *****************************************************************************
  1266. ; Auf Rasterstrahlpositionen warten
  1267. ; *****************************************************************************
  1268. ExpectPicture   PROC
  1269.         push    dx
  1270.         push    ax
  1271.         mov     dx, 003DAH
  1272. Ray_OutFrame:   in      ax, dx
  1273.         and     ax, 00008H
  1274.         cmp     ax, 00000H
  1275.         jne     Ray_OutFrame
  1276.         pop     ax
  1277.         pop     dx
  1278.         ret
  1279. ExpectPicture   ENDP
  1280.  
  1281. ExpectRetrace   PROC
  1282.         pusha
  1283.  
  1284. ;               Bildanfangsadresse bestimmen
  1285. ;
  1286.         mov     dx, PRCRT
  1287.         mov     al, 00DH
  1288.         out     dx, al
  1289.         inc     dx
  1290.         mov     ax, offsFrame
  1291.         out     dx, al
  1292.  
  1293. ;               Auf Rücklauf warten
  1294. ;
  1295.         IFDEF   _TEST
  1296.         call    DarkBorder
  1297.         ENDIF
  1298.         mov     dx, 003DAH
  1299. Ray_InFrame:    in      ax, dx
  1300.         and     ax, 00008H
  1301.         cmp     ax, 00008H
  1302.         jne     Ray_InFrame
  1303.         IFDEF   _TEST
  1304.         call    WhiteBorder
  1305.         ENDIF
  1306.         popa
  1307.         ret
  1308. ExpectRetrace   ENDP
  1309.  
  1310. ; *****************************************************************************
  1311. ; Bestimmt die Bildschiradresse der oberen linken Cursor-Ecke: Offs
  1312. ; *****************************************************************************
  1313. GetCurOffset    PROC
  1314.         pusha
  1315.         mov     si, iFrame
  1316.         shl     si, 2
  1317.         add     si, OFFSET CursorX
  1318.         mov     ax, ds:[si+2]
  1319.         mov     dx, CCURLINE * CSCRCOLUMN
  1320.         mul     dx
  1321.         mov     dx, ds:[si]
  1322.         add     ax, dx
  1323.         add     ax, dx
  1324.         mov     offs, ax
  1325.         popa
  1326.         ret
  1327. GetCurOffset    ENDP
  1328.  
  1329. ; ****************************************************************************
  1330. ; Bestimmt die Zeit zwischen zwei Tastendrücken: Delay
  1331. ; ****************************************************************************
  1332. GetDelay        PROC
  1333.         push    ax
  1334.         mov     ax, Timer
  1335.         sub     ax, TimerLast
  1336.         mov     Delay, ax
  1337.         mov     ax, Timer
  1338.         mov     TimerLast, ax
  1339.         pop     ax
  1340.         ret
  1341. GetDelay        ENDP
  1342.  
  1343.         IFNDEF  _PLAY
  1344. GetFile         PROC
  1345.         pusha
  1346.  
  1347. ;               Kontrolle, ob Dateiname angegeben ist
  1348. ;
  1349.         mov     segFileName, es
  1350.         mov     di, 080H
  1351.         mov     al, es:[di]
  1352.         or      al, al
  1353.         je      GetFile_Error
  1354. ;               0zeichen einfügen
  1355. ;
  1356. GetFile_Ok1:    xor     ah, ah
  1357.         inc     di
  1358.         mov     si, di
  1359.         add     di, ax
  1360.         mov     es:[di], ah
  1361.  
  1362. ;               Führende Leerzeichen überspringen
  1363. ;
  1364.         mov     di, si
  1365.         mov     cx, ax
  1366.         mov     bx, ax
  1367.         mov     al, ' '
  1368.         inc     cx
  1369.         repe    scasb
  1370.         or      cx, cx
  1371.         je      GetFile_Error
  1372. GetFile_Ok2:    dec     di
  1373.         mov     offsFileName, di
  1374.  
  1375. ;               Aus Option untersuchen
  1376. ;
  1377.         mov     al, es:[di]
  1378.         cmp     al, '0'
  1379.         jl      GetFile_Error
  1380.  
  1381. ;               Endung suchen
  1382. ;
  1383.         mov     di, si
  1384.         mov     cx, bx
  1385.         mov     al, '.'
  1386.         repne   scasb
  1387.         or      cx, cx
  1388.         jne     GetFile_Ok
  1389.  
  1390. ;               Endung .WRT anfügen
  1391. ;
  1392.         mov     si, OFFSET STREXT
  1393.         mov     cx, 5
  1394.         rep     movsb
  1395. GetFile_Ok:     clc
  1396. GetFile_End:    popa
  1397.         ret
  1398.  
  1399. ;               Zeigt die Syntax ax
  1400. ;
  1401. GetFile_Error:  mov     dx, OFFSET STRUSAGE
  1402.         mov     ah, DOS_WRITE_STRING
  1403.         int     021H
  1404.         stc
  1405.         jmp     GetFile_End
  1406.  
  1407. GetFile         ENDP
  1408.         ENDIF
  1409.  
  1410.         IFDEF   _WRITE
  1411. ; ****************************************************************************
  1412. ; Liest ein Zeichen von der Tastatur: Char, C
  1413. ; ****************************************************************************
  1414. GetKey          PROC
  1415.  
  1416. ;               Kontrolle, ob ein Zeichen vorliegt
  1417. ;
  1418.         push    ax
  1419.         mov     ah, KEYBOARD_GET_STATUS
  1420.         int     KEYBOARD_FUNCTION
  1421.         jz      GKey_None
  1422.  
  1423. ;               Vorhandenes Zeichen einlesen
  1424. ;
  1425.         mov     ah, KEYBOARD_READ_CHAR
  1426.         int     KEYBOARD_FUNCTION
  1427.         cmp     al, 0
  1428.         je      GKey_Normal
  1429.         xor     ah, ah
  1430. Gkey_Normal:    mov     Char, ax
  1431.  
  1432. ;               Zeichen abspeichern
  1433. ;
  1434.         cmp     ynLock, YES
  1435.         je      GKey_Locked
  1436.         call    AccessFile
  1437.  
  1438. GKey_Locked:    clc
  1439.         jmp     GKey_End
  1440.  
  1441. GKey_None:      stc
  1442. GKey_End:       pop     ax
  1443.         ret
  1444. GetKey          ENDP
  1445.         ENDIF
  1446.  
  1447. ; *****************************************************************************
  1448. ; Liest ein Zeichen aus einer Datei oder von der Tastatur
  1449. ; *****************************************************************************
  1450.         IFNDEF  _WRITE
  1451. GetKey          PROC
  1452.         push    ax
  1453.         cmp     ynLock, YES
  1454.         je      GKey_Locked
  1455.  
  1456. ;               Verzögerung abwarten
  1457. ;
  1458.         call    MakeDelay
  1459.         jg      GKey_None
  1460.         mov     ax, NextChar
  1461.         call    AccessFile
  1462.         mov     Char, ax
  1463.         jmp     GKey_Hit
  1464.  
  1465. GKey_Locked:    mov     ah, KEYBOARD_GET_STATUS
  1466.         int     KEYBOARD_FUNCTION
  1467.         jz      GKey_None
  1468.  
  1469. ;               Vorhandenes Zeichen einlesen
  1470. ;
  1471.         mov     ah, KEYBOARD_READ_CHAR
  1472.         int     KEYBOARD_FUNCTION
  1473. GKey_Hit:       clc
  1474.         jmp     GKey_End
  1475.  
  1476. GKey_None:      stc
  1477.  
  1478. GKey_End:       pop     ax
  1479.         ret
  1480. GetKey          ENDP
  1481.         ENDIF
  1482.  
  1483.  
  1484. ; *****************************************************************************
  1485. ; Erzeugt eine Zufallszahl: Random
  1486. ; *****************************************************************************
  1487. GetRandom       PROC
  1488.         push    ax
  1489.         mov     ax, Random
  1490.         ror     ax, 1
  1491.         xor     ax, Timer
  1492.         not     ax
  1493.         add     ax, 04294
  1494.         xchg    ah, al
  1495.         mov     Random, ax
  1496.         pop     ax
  1497.         ret
  1498. GetRandom       ENDP
  1499.  
  1500. ; *****************************************************************************
  1501. ; Nimmt alle nötigen Voreinstellungen vor: C
  1502. ; *****************************************************************************
  1503. Init            PROC
  1504.  
  1505. ;               Initialisierung der Segmentregister
  1506. ;
  1507.         pusha
  1508.         mov     ax, SEG Data
  1509.         mov     ds, ax
  1510.  
  1511. ;               Uninitialisierte Variablen auf 0 setzen
  1512. ;
  1513.         push    es
  1514.         push    ds
  1515.         pop     es
  1516.         mov     di, offsFirstVoid
  1517.         xor     al, al
  1518.         mov     cx, cbVoid
  1519.         rep     stosb
  1520.         pop     es
  1521.  
  1522.         IFNDEF  _PLAY
  1523.         call    GetFile
  1524.         jnc     Init_OpenFile
  1525.         jmp     Init_End
  1526.         ENDIF
  1527.  
  1528. ;               Datei öffnen
  1529. ;
  1530. Init_OpenFile:  call    OpenFile
  1531.  
  1532.         IFNDEF  _PLAY
  1533.         jnc     Init_Opened
  1534.         mov     dx, OFFSET STRERROR
  1535.         mov     ah, DOS_WRITE_STRING
  1536.         int     021H
  1537.         stc
  1538.         jmp     Init_End
  1539.         ENDIF
  1540.  
  1541. Init_Opened:    cld
  1542.         mov     ax, SEGGFX
  1543.         mov     es, ax
  1544.  
  1545. ;               Bestimmung des Prozessortypes
  1546. ;
  1547.         xor     ax, ax
  1548.         push    ax
  1549.         popf
  1550.         pushf
  1551.         pop     ax
  1552.         and     ax, 0F0H
  1553.         cmp     ax, 0F0H
  1554.         jne     Init_286OK
  1555.         mov     dx, OFFSET STR286ERROR
  1556.         mov     ah, DOS_WRITE_STRING
  1557.         int     DOS_FUNCTION
  1558.         stc
  1559.         jmp     Init_End
  1560.  
  1561. ;               Bestimmung der Grafikkarte
  1562. ;
  1563. Init_286OK:     mov     ah, VIDEO_GET_VGA
  1564.         int     VIDEO_FUNCTION
  1565.         cmp     al, VIDEO_GET_VGA
  1566.         je      Init_VGAOK
  1567.         mov     dx, OFFSET STRVGAERROR
  1568.         mov     ah, DOS_WRITE_STRING
  1569.         int     DOS_FUNCTION
  1570.         stc
  1571.         jmp     Init_End
  1572.  
  1573. ;               VGA-Zeichensatz laden
  1574. ;
  1575. Init_VGAOK:     push    ds
  1576.         push    es
  1577.         mov     ax, 01130H
  1578.         mov     bh, 003H
  1579.         int     VIDEO_FUNCTION
  1580.         mov     ax, ds
  1581.         push    es
  1582.         pop     ds
  1583.         mov     es, ax
  1584.         mov     si, bp
  1585.         mov     di, OFFSET VGAChars
  1586.         mov     cx, CCHAR * CCURLINE
  1587.         rep     movsb
  1588.         pop     es
  1589.         pop     ds
  1590.  
  1591. ;               Sicherung des alten Bildschirmmodus und Einschaltung des neuen
  1592. ;
  1593.         mov     ah, VIDEO_SET_MODE
  1594.         mov     al, VIDEO_320x200x256
  1595.         int     VIDEO_FUNCTION
  1596.  
  1597. ;               Lineare Adressierung des Graphics-Controllers
  1598. ;
  1599.         mov     dx, 003CEH
  1600.         mov     al, 005H
  1601.         out     dx, al
  1602.         inc     dx
  1603.         in      al, dx
  1604.         and     al, 0EFH
  1605.         out     dx, al
  1606.         dec     dx
  1607.  
  1608. ;               Lineare Adressierung des Graphics-Controllers (s.o.)
  1609. ;
  1610.         mov     al, 006H
  1611.         out     dx, al
  1612.         inc     dx
  1613.         in      al, dx
  1614.         and     al, 0FDH
  1615.         out     dx, al
  1616.  
  1617. ;               Lineare Adressierung des Sequencer-Controllers
  1618. ;
  1619.         mov     dx, PRSEQUENCER
  1620.         mov     al, 004H
  1621.         out     dx, al
  1622.         inc     dx
  1623.         in      al, dx
  1624.         and     al, 0F7H
  1625.         or      al, 4
  1626.         out     dx, al
  1627.  
  1628. ;               Byteweise-Adressierung des CRT-Controllers
  1629. ;
  1630.         mov     dx, PRCRT
  1631.         mov     al, 014H
  1632.         out     dx, al
  1633.         inc     dx
  1634.         in      al, dx
  1635.         and     al, 0BFH
  1636.         out     dx, al
  1637.         dec     dx
  1638.  
  1639. ;               Byteweise-Adressierung des CRT-Controllers (s.o.)
  1640. ;
  1641.         mov     al, 017H
  1642.         out     dx, al
  1643.         inc     dx
  1644.         in      al, dx
  1645.         or      al, 040H
  1646.         out     dx, al
  1647.  
  1648. ;               Bildschirm löschen
  1649. ;
  1650.         xor     di, di
  1651.         xor     al, al
  1652.         mov     cx, CBMAP
  1653.         rep     stosb
  1654.  
  1655. ;               Initialisierung der 256 Farben
  1656. ;
  1657.         push    es
  1658.         push    ds
  1659.         pop     es
  1660.         mov     dx, OFFSET AAPALETTE
  1661.         mov     ah, VIDEO_DACS
  1662.         mov     al, VIDEO_SET_DACS
  1663.         xor     bx, bx
  1664.         mov     cx, CCOLOR
  1665.         int     VIDEO_FUNCTION
  1666.         pop     es
  1667.  
  1668. ;               Alle Bitplanes für Zugriff einschalten
  1669. ;
  1670.         mov     dx, PRSEQUENCER
  1671.         mov     al, 002H
  1672.         out     dx, al
  1673.         inc     dx
  1674.         mov     al, 00FH
  1675.         out     dx, al
  1676.  
  1677. ;               Zeilen-Abstand bestimmen
  1678. ;
  1679.         mov     dx, PRCRT
  1680.         mov     al, 013H
  1681.         out     dx, al
  1682.         inc     dx
  1683.         mov     al, CSCRCOLUMN / 2
  1684.         out     dx, al
  1685.  
  1686. ;               Effekte initialisieren
  1687. ;
  1688.         mov     si, OFFSET AINITPROC
  1689.         mov     cx, CFX
  1690. Init_NextFX:    mov     bx, ds:[si]
  1691.         call    bx
  1692.         add     si, 2
  1693.         loop    Init_NextFX
  1694.  
  1695.         call    InitBlit
  1696.         call    TurnOnFX
  1697.         call    SwitchFrame
  1698.         call    TurnOnFX
  1699.         call    SwitchFrame
  1700.         clc
  1701. Init_End:       popa
  1702.         ret
  1703. Init            ENDP
  1704.  
  1705. InitBlit        PROC
  1706.         push    dx
  1707.         push    ax
  1708.         mov     dx, PRSEQUENCER
  1709.         mov     al, 002H
  1710.         out     dx, al
  1711.         inc     dx
  1712.         mov     al, 00FH
  1713.         out     dx, al
  1714.         mov     dx, PRGRAPHICS
  1715.         mov     al, 005H
  1716.         out     dx, al
  1717.         inc     dx
  1718.         in      al, dx
  1719.         mov     OldRWMode, al
  1720.         and     al, not 3
  1721.         or      al, 1
  1722.         out     dx, al
  1723.         pop     ax
  1724.         pop     dx
  1725.         ret
  1726. InitBlit        ENDP
  1727.  
  1728. ; *****************************************************************************
  1729. ; Cursor initialisieren
  1730. ; *****************************************************************************
  1731. InitCursor      PROC
  1732.         call    ConvertChars
  1733.         ret
  1734. InitCursor      ENDP
  1735.  
  1736. ; *****************************************************************************
  1737. ; Sprites initialisieren
  1738. ; *****************************************************************************
  1739. InitObjects     PROC
  1740.         push    cx
  1741.         call    ConvertObjects
  1742.         xor     cx, cx
  1743. InitObjects_Nx: mov     iObject, cx
  1744.         call    MoveObject
  1745.         inc     cx
  1746.         cmp     cx, COBJECT
  1747.         jl      InitObjects_Nx
  1748.         pop     cx
  1749.         ret
  1750. InitObjects     ENDP
  1751.  
  1752. ; *****************************************************************************
  1753. ; Sterne initialisieren
  1754. ; *****************************************************************************
  1755. InitStars       PROC
  1756.         pusha
  1757.         mov     si, OFFSET awStarX
  1758.         mov     di, si
  1759.         add     di, CSTAR * 2
  1760.         mov     cx, CSTAR
  1761. InitStars_Next: call    GetRandom
  1762.         mov     dx, Random
  1763.         mov     ax, CSCRCOLUMN
  1764.         mul     dx
  1765.         mov     ds:[si], dx
  1766.         mov     ax, cx
  1767.         and     ax, 3
  1768.         inc     ax
  1769.         shr     ax, 1
  1770.         add     dx, ax
  1771.         mov     ds:[di], dx
  1772.         add     si, 2
  1773.         add     di, 2
  1774.         loop    InitStars_Next
  1775.         popa
  1776.         ret
  1777. InitStars       ENDP
  1778.  
  1779. ; *****************************************************************************
  1780. ; Funktionen zur Ausgabe von Tasten
  1781. ; *****************************************************************************
  1782. KeyABC          PROC
  1783.         call    GetCurOffset
  1784.         cmp     ynInsert, YES
  1785.         jne     KeyABC_NoIns
  1786.         call    DoInsert
  1787. KeyABC_NoIns:   call    MoveRight
  1788.         pushf
  1789.         call    DoneBlit
  1790.         call    Print
  1791.         call    InitBlit
  1792.         popf
  1793.         jnc     KeyABC_End
  1794.         call    DoUp
  1795. KeyABC_End:     ret
  1796. KeyABC          ENDP
  1797.  
  1798. KeyBackSpace    PROC
  1799.         call    MoveLeft
  1800.         jnc     KeyLeft_Del
  1801.         call    DoDown
  1802. KeyLeft_Del:    call    ResetCursor
  1803.         call    ActualizeCursor
  1804.         call    DoZipChar
  1805.         ret
  1806. KeyBackSpace    ENDP
  1807.  
  1808. KeyDelete       PROC
  1809.         call    DoZipChar
  1810.         ret
  1811. KeyDelete       ENDP
  1812.  
  1813. KeyDelLine      PROC
  1814.         call    DoZipLine
  1815.         ret
  1816. KeyDelLine      ENDP
  1817.  
  1818. KeyDown         PROC
  1819.         call    MoveDown
  1820.         jnc     KeyDown_End
  1821.         call    DoUp
  1822. KeyDown_End:    ret
  1823. KeyDown         ENDP
  1824.  
  1825. KeyInsert       PROC
  1826.         cmp     iFrame, 0
  1827.         jne     KeyInsert_End
  1828.         xor     ynInsert, YES
  1829. KeyInsert_End:  ret
  1830. KeyInsert       ENDP
  1831.  
  1832. KeyInsLine      PROC
  1833.         call    DoInsLine
  1834.         ret
  1835. KeyInsLine      ENDP
  1836.  
  1837. KeyClear        PROC
  1838.         call    DoClear
  1839.         ret
  1840. KeyClear        ENDP
  1841.  
  1842. KeyLeft         PROC
  1843.         call    MoveLeft
  1844.         jnc     KeyLeft_End
  1845.         call    DoDown
  1846. KeyLeft_End:    ret
  1847. KeyLeft         ENDP
  1848.  
  1849. KeyReturn       PROC
  1850.         call    MoveToNextLine
  1851.         jnc     KeyReturn_End
  1852.         call    DoUp
  1853. KeyReturn_End:  ret
  1854. KeyReturn       ENDP
  1855.  
  1856. KeyRight        PROC
  1857.         call    MoveRight
  1858.         jnc     KeyRight_End
  1859.         call    DoUp
  1860. KeyRight_End:   ret
  1861. KeyRight        ENDP
  1862.  
  1863. KeyToDown       PROC
  1864.         call    MoveToBottom
  1865.         ret
  1866. KeyToDown       ENDP
  1867.  
  1868. KeyToLeft       PROC
  1869.         call    MoveToLeft
  1870.         ret
  1871. KeyToLeft       ENDP
  1872.  
  1873. KeyToRight      PROC
  1874.         call    MoveToRight
  1875.         ret
  1876. KeyToRight      ENDP
  1877.  
  1878. KeyToUp         PROC
  1879.         call    MoveToTop
  1880.         ret
  1881. KeyToUp         ENDP
  1882.  
  1883. KeyUp           PROC
  1884.         call    MoveUp
  1885.         jnc     KeyDown_End
  1886.         call    DoDown
  1887. KeyUp_End:      ret
  1888. KeyUp           ENDP
  1889.  
  1890. ; ****************************************************************************
  1891. ; Stellt die Bildattribute wieder her
  1892. ; ****************************************************************************
  1893. LoadAttributes  PROC
  1894.         push    es
  1895.         push    si
  1896.         push    di
  1897.         mov     si, OFFSET abAttribBuffer
  1898.         mov     di, OFFSET CursorX
  1899.         push    ds
  1900.         pop     es
  1901.         movsw
  1902.         movsw
  1903.         mov     di, OFFSET BackColor
  1904.         movsb
  1905.         mov     di, OFFSET offsPalette
  1906.         movsw
  1907.         mov     di, OFFSET offsPattern
  1908.         movsw
  1909.         mov     di, OFFSET offsFont
  1910.         movsw
  1911.         pop     di
  1912.         pop     si
  1913.         pop     es
  1914.         ret
  1915. LoadAttributes  ENDP
  1916.  
  1917. ; *****************************************************************************
  1918. ; Hauptprogramm
  1919. ; *****************************************************************************
  1920. Main            PROC
  1921.         call    Init
  1922.         jc      Main_Error1
  1923.         call    Run
  1924.  
  1925.         IFNDEF  _PLAY
  1926.         call    CloseFile
  1927.         ENDIF
  1928.  
  1929.         call    Done
  1930. Main_Error1:    mov     al, 0
  1931.         adc     al, al
  1932.         mov     ah, DOS_TERMINATE_EXE
  1933.         int     DOS_FUNCTION
  1934. Main            ENDP
  1935.  
  1936. ; ****************************************************************************
  1937. ; Bestimmt, ob wieder ein Tastendruck kommt
  1938. ; ****************************************************************************
  1939. MakeDelay       PROC
  1940.         push    ax
  1941.  
  1942. ;               Kontrolle, ob eine Taste gedrückt wird
  1943. ;
  1944.         mov     ah, KEYBOARD_GET_STATUS
  1945.         int     KEYBOARD_FUNCTION
  1946.         je      MakeDelay_OK
  1947.         mov     ah, KEYBOARD_READ_CHAR
  1948.         int     KEYBOARD_FUNCTION
  1949.         cmp     al, KBESC
  1950.         jne     MakeDelay_GoOn
  1951.         mov     ynQuit, YES
  1952. MakeDelay_GoOn: mov     ax, 00001H
  1953.         mov     Delay, ax
  1954. MakeDelay_OK:   dec     Delay
  1955.         cmp     Delay, 0
  1956.         pop     ax
  1957.         ret
  1958. MakeDelay       ENDP
  1959.  
  1960. ; *****************************************************************************
  1961. ; Zeichnet einen Kasten auf den Bildschirm < ds:si
  1962. ; *****************************************************************************
  1963. MessageBox      PROC
  1964.         pusha
  1965.         call    TurnOnFX
  1966.  
  1967. ;               Koordinaten der Box und Text bestimmen
  1968. ;
  1969. MBox_Draw:      mov     di, OFFSET MBox_Coords
  1970.         push    es
  1971.         push    ds
  1972.         pop     es
  1973.         mov     cx, 4
  1974.         rep     movsw
  1975.         pop     es
  1976.         mov     MBox_Text, si
  1977.  
  1978. ;               Startadresse des Hintergrundes bestimmen: ds:si
  1979. ;
  1980.         mov     ax, MBox_Top
  1981.         shl     ax, 3
  1982.         mov     dx, CSCRCOLUMN
  1983.         mul     dx
  1984.         mov     dx, MBox_Left
  1985.         shl     dx, 1
  1986.         add     ax, dx
  1987.         mov     si, ax
  1988.  
  1989. ;               Startadresses der Puffers bestimmen
  1990.         mov     di, OFFSAABMBOXBUF
  1991.  
  1992. ;               Zahl der Bildschirmzeilen bestimmen
  1993. ;
  1994.         mov     cx, MBox_Bottom
  1995.         sub     cx, MBox_Top
  1996.         inc     cx
  1997.         shl     cx, 3
  1998.  
  1999. ;               Zahl der Bildschirmspalten bestimmen
  2000. ;
  2001.         mov     bx, MBox_Right
  2002.         sub     bx, MBox_Left
  2003.         inc     bx
  2004.         shl     bx, 1
  2005.  
  2006. ;               Daten zum Zurücklesen sichern
  2007. ;
  2008.         push    bx
  2009.         push    cx
  2010.         push    si
  2011.  
  2012. ;               Hintergrund kopieren
  2013. ;
  2014.         push    es
  2015.         push    ds
  2016.         push    es
  2017.         pop     ds
  2018.         mov     ax, SEGGFX
  2019.         mov     es, ax
  2020. MBox_SNextLn:   push    cx
  2021.         mov     cx, bx
  2022.         rep     movsb
  2023.         add     si, CSCRCOLUMN
  2024.         sub     si, bx
  2025.         add     di, CSCRCOLUMN
  2026.         sub     di, bx
  2027.         pop     cx
  2028.         loop    MBox_SNextLn
  2029.         pop     ds
  2030.         pop     es
  2031.  
  2032. ;               Obere Kante zeichnen
  2033. ;
  2034.         pop     di
  2035.         push    di
  2036.         push    di
  2037.         mov     ax, ISTONETOPLEFT
  2038.         call    DrawBlock
  2039.         add     di, CCURCOLUMN / CBITMAP
  2040.         mov     cx, MBox_Right
  2041.         sub     cx, MBox_Left
  2042.         dec     cx
  2043.         push    cx
  2044.         mov     ax, ISTONEHORIZONTAL
  2045. MBox_TopLn:     call    DrawBlock
  2046.         add     di, CCURCOLUMN / CBITMAP
  2047.         loop    MBox_TopLn
  2048.         mov     ax, ISTONETOPRIGHT
  2049.         call    DrawBlock
  2050.  
  2051. ;               Mittleren Bereich zeichnen
  2052. ;
  2053.         pop     cx
  2054.         inc     cx
  2055.         shl     cx, 1
  2056.         push    cx
  2057.         mov     cx, MBox_Bottom
  2058.         sub     cx, MBox_Top
  2059.         dec     cx
  2060. MBox_NextLn:    mov     bx, cx
  2061.         pop     cx
  2062.         pop     di
  2063.         add     di, CSCRCOLUMN * CSTONELINE
  2064.         push    di
  2065.         push    cx
  2066.         mov     ax, ISTONEVERTICAL
  2067.         call    DrawBlock
  2068.         add     di, cx
  2069.         call    DrawBlock
  2070.         mov     cx, bx
  2071.         loop    MBox_NextLn
  2072.  
  2073. ;               Untere Kante zeichnen
  2074. ;
  2075.         pop     cx
  2076.         shr     cx, 1
  2077.         dec     cx
  2078.         pop     di
  2079.         add     di, CSCRCOLUMN * CSTONELINE
  2080.         mov     ax, ISTONEBOTTOMLEFT
  2081.         call    DrawBlock
  2082.         mov     ax, ISTONEHORIZONTAL
  2083. MBox_BottomLn:  add     di, CCURCOLUMN / CBITMAP
  2084.         call    DrawBlock
  2085.         loop    MBox_BottomLn
  2086.         add     di, CCURCOLUMN / CBITMAP
  2087.         mov     ax, ISTONEBOTTOMRIGHT
  2088.         call    DrawBlock
  2089.  
  2090. ;               Hintergrund wiederherstellen
  2091. ;
  2092.         call    Write
  2093.         call    WaitKey
  2094.         mov     ynSingle, YES
  2095.         mov     ynSkip, YES
  2096.         mov     si, OFFSAABMBOXBUF
  2097.         pop     di
  2098.         pop     cx
  2099.         pop     bx
  2100.         push    ds
  2101.         mov     ax, SEGGFX
  2102.         mov     ds, ax
  2103. MBox_LNextLn:   push    cx
  2104.         mov     cx, bx
  2105.         rep     movsb
  2106.         add     di, CSCRCOLUMN
  2107.         sub     di, bx
  2108.         add     si, CSCRCOLUMN
  2109.         sub     si, bx
  2110.         pop     cx
  2111.         loop    MBox_LNextLn
  2112.         pop     ds
  2113.         clc
  2114. MBox_End:       popa
  2115.         ret
  2116. MessageBox      ENDP
  2117.  
  2118. ; ****************************************************************************
  2119. ; Funktionen zur Bewegung des Cursors: C
  2120. ; ****************************************************************************
  2121. MoveDown        PROC
  2122.         push    ax
  2123.         mov     ax, yPos
  2124.         cmp     ax, BOTTOMLINE
  2125.         je      MoveDown_Scroll
  2126.         inc     yPos
  2127.         clc
  2128.         jmp     MoveDown_End
  2129. MoveDown_Scroll:stc
  2130. MoveDown_End:   pop     ax
  2131.         ret
  2132. MoveDown        ENDP
  2133.  
  2134. MoveLeft        PROC
  2135.         push    ax
  2136.         mov     ax, xPos
  2137.         cmp     ax, LEFTCOLUMN
  2138.         je      MoveLeft_Jump
  2139.         dec     xPos
  2140.         clc
  2141.         jmp     MoveLeft_End
  2142. MoveLeft_Jump:  mov     ax, RIGHTCOLUMN
  2143.         mov     xPos, ax
  2144.         call    MoveUp
  2145. MoveLeft_End:   pop     ax
  2146.         ret
  2147. MoveLeft        ENDP
  2148.  
  2149. MoveRight       PROC
  2150.         push    ax
  2151.         mov     ax, xPos
  2152.         cmp     ax, RIGHTCOLUMN
  2153.         je      MoveRight_Jump
  2154.         inc     xPos
  2155.         clc
  2156.         jmp     MoveRight_End
  2157. MoveRight_Jump: mov     ax, LEFTCOLUMN
  2158.         mov     xPos, ax
  2159.         call    MoveDown
  2160. MoveRight_End:  pop     ax
  2161.         ret
  2162. MoveRight       ENDP
  2163.  
  2164. MoveToBottom    PROC
  2165.         push    ax
  2166.         mov     ax, BOTTOMLINE
  2167.         mov     yPos, ax
  2168.         pop     ax
  2169.         ret
  2170. MoveToBottom    ENDP
  2171.  
  2172. MoveToLeft      PROC
  2173.         push    ax
  2174.         mov     ax, LEFTCOLUMN
  2175.         mov     xPos, ax
  2176.         pop     ax
  2177.         ret
  2178. MoveToLeft      ENDP
  2179.  
  2180. MoveToNextLine  PROC
  2181.         push    ax
  2182.         mov     ax, LEFTCOLUMN
  2183.         mov     xPos, ax
  2184.         call    MoveDown
  2185.         pop     ax
  2186.         ret
  2187. MoveToNextLine  ENDP
  2188.  
  2189. MoveToRight     PROC
  2190.         push    ax
  2191.         mov     ax, RIGHTCOLUMN
  2192.         mov     xPos, ax
  2193.         pop     ax
  2194.         ret
  2195. MoveToRight     ENDP
  2196.  
  2197. MoveToTop       PROC
  2198.         push    ax
  2199.         mov     ax, TOPLINE
  2200.         mov     yPos, ax
  2201.         pop     ax
  2202.         ret
  2203. MoveToTop       ENDP
  2204.  
  2205. MoveUp          PROC
  2206.         push    ax
  2207.         mov     ax, yPos
  2208.         cmp     ax, TOPLINE
  2209.         je      MoveUp_Scroll
  2210.         dec     yPos
  2211.         clc
  2212.         jmp     MoveUp_End
  2213. MoveUp_Scroll:  stc
  2214. MoveUp_End:     pop     ax
  2215.         ret
  2216. MoveUp          ENDP
  2217.  
  2218. ; *****************************************************************************
  2219. ; Versetzt das mit iObject angegebene Objekt zufällig
  2220. ; *****************************************************************************
  2221. MoveObject      PROC
  2222.         pusha
  2223.  
  2224. ;               Adresse des Objekttypes bestimmen
  2225. ;
  2226.         mov     ax, iItem
  2227.         mov     dx, CSCRCOLUMN * COBJLINE
  2228.         mul     dx
  2229.         add     ax, 0A0H
  2230.         mov     si, OFFSET aoffsItem
  2231.         add     si, iObject
  2232.         add     si, iObject
  2233.         mov     ds:[si], ax
  2234.  
  2235. ;               Adresse der Maske bestimmen
  2236. ;
  2237.         add     si, OFFSET aoffsMask - OFFSET aoffsItem
  2238.         mov     ax, iItem
  2239.         mov     dx, CBOBJMASK / CITEM
  2240.         mul     dx
  2241.         add     ax, OFFSET aaabObjMask
  2242.         mov     ds:[si], ax
  2243.  
  2244. ;               Startadresse in Grafik bestimmen
  2245. ;
  2246.         add     si, OFFSET aoffsObjNew - OFFSET aoffsMask
  2247.  
  2248.         call    GetRandom
  2249.         mov     dx, Random
  2250.         mov     ax, (CSCRCOLUMN - COBJCOLUMN) / CBITMAP
  2251.         mul     dx
  2252.         mov     bx, dx
  2253.  
  2254.         call    GetRandom
  2255.         mov     dx, CSCRLINE - COBJLINE
  2256.         mov     ax, Random
  2257.         mul     dx
  2258.         mov     ax, CSCRCOLUMN
  2259.         mul     dx
  2260.         add     ax, bx
  2261.         mov     ds:[si], ax
  2262.         popa
  2263.         ret
  2264. MoveObject      ENDP
  2265.  
  2266. ; *****************************************************************************
  2267. ; Öffnen der Datei zum Abspielen
  2268. ; *****************************************************************************
  2269.         IFDEF   _PLAY
  2270. OpenFile        PROC
  2271.         push    ax
  2272.         push    dx
  2273.         mov     ax, offsText
  2274.         shr     ax, 4
  2275.         mov     dx, ds
  2276.         add     ax, dx
  2277.         mov     segText, ax
  2278.         and     offsText, 0000FH
  2279.         pop     dx
  2280.         pop     ax
  2281.         clc
  2282.         ret
  2283. OpenFile        ENDP
  2284.         ENDIF
  2285.  
  2286. ; *****************************************************************************
  2287. ; Öffnen der Textdatei zum lesen: C
  2288. ; *****************************************************************************
  2289.         IFDEF   _READ
  2290. OpenFile        PROC
  2291.         push    ax
  2292.         push    dx
  2293.         mov     ah, DOS_OPEN_FILE
  2294.         xor     al, al
  2295.         mov     dx, offsFileName
  2296.         push    ds
  2297.         mov     ds, segFileName
  2298.         int     DOS_FUNCTION
  2299.         pop     ds
  2300.         mov     skey, ax
  2301.         pop     dx
  2302.         pop     ax
  2303.         ret
  2304. OpenFile        ENDP
  2305.         ENDIF
  2306.  
  2307. ; *****************************************************************************
  2308. ; Öffnen der Textdatei zum schreiben: C
  2309. ; *****************************************************************************
  2310.         IFDEF   _WRITE
  2311. OpenFile        PROC
  2312.         pusha
  2313.         mov     ah, DOS_CREATE_FILE
  2314.         xor     cx, cx
  2315.         mov     dx, offsFileName
  2316.         push    ds
  2317.         mov     ds, segFileName
  2318.         int     DOS_FUNCTION
  2319.         pop     ds
  2320.         mov     skey, ax
  2321.         popa
  2322.         ret
  2323. OpenFile        ENDP
  2324.         ENDIF
  2325.  
  2326. ; ****************************************************************************
  2327. ; Bestimmt die Position eines Zeichens (> cx) in einem String (< di)
  2328. ; ****************************************************************************
  2329. Pos             PROC
  2330.         push    dx
  2331.         push    es
  2332.         push    ds
  2333.         pop     es
  2334.         xor     cx, cx
  2335.         dec     cx
  2336.         push    ax
  2337.         push    di
  2338.         xor     al, al
  2339.         repne   scasb
  2340.         not     cx
  2341.         mov     dx, cx
  2342.         pop     di
  2343.         pop     ax
  2344.         repne   scasb
  2345.         or      cx, cx
  2346.         je      Pos_Failure
  2347.         sub     dx, cx
  2348.         mov     cx, dx
  2349.         dec     cx
  2350.         clc
  2351.         jmp     Pos_End
  2352. Pos_Failure:    stc
  2353. Pos_End:        pop     es
  2354.         pop     dx
  2355.         ret
  2356. Pos             ENDP
  2357.  
  2358. ; *****************************************************************************
  2359. ; Gibt ein Zeichen auf dem Bildschirm aus
  2360. ; *****************************************************************************
  2361. Print           PROC
  2362.         pusha
  2363.  
  2364. ;               Sequencer-Controller einstellen
  2365. ;
  2366.         mov     dx, PRSEQUENCER
  2367.         mov     al, 002H
  2368.         out     dx, al
  2369.         inc     dx
  2370.         mov     al, 080H
  2371.         mov     BitPlane, al
  2372.  
  2373. ;               Bildschirmadresse bestimmen: es:[di]
  2374. ;
  2375.         mov     di, Offs
  2376.  
  2377. ;               Adresse der Zeichenmusters bestimmen: ds:[si]
  2378. ;
  2379.         mov     si, Char
  2380.         shl     si, 3
  2381.         add     si, offsFont
  2382.  
  2383. ;               Anfangsadresse der Füllmusters bestimmen: ds:[bx]
  2384. ;
  2385.         mov     bx, offsPattern
  2386.  
  2387. ;               Anfangsadresse der Füllfarben bestimmem: ds:[bp]
  2388. ;
  2389.         mov     bp, offsPalette
  2390.  
  2391.         mov     cx, CCURLINE
  2392. Print_NextLn:   push    cx
  2393.         lodsb
  2394.         mov     ah, al
  2395.         mov     cx, CCURCOLUMN
  2396. Print_NextCol:  mov     al, BitPlane
  2397.         rol     al, 1
  2398.         cmp     al, 010H
  2399.         jne     Print_NoReMap
  2400.         mov     al, 001H
  2401.         inc     di
  2402. Print_NoReMap:  out     dx, al
  2403.         mov     BitPlane, al
  2404.         push    dx
  2405.         shl     ah, 1
  2406.         jnc     Print_Back
  2407.  
  2408. ;               Pixel in der Vordergrundfarbe setzen
  2409. ;
  2410. Print_Front:    xor     dh, dh
  2411.         mov     dl, ds:[bx]
  2412.         add     bp, dx
  2413.         mov     al, ds:[bp]
  2414.         sub     bp, dx
  2415.         jmp     Print_Pixel
  2416.  
  2417. ;               Pixel in der Hintergrundfarbe setzen
  2418. ;
  2419. Print_Back:     mov     al, BackColor
  2420. Print_Pixel:    mov     es:[di], al
  2421.         inc     bx
  2422.         pop     dx
  2423.         loop    Print_NextCol
  2424.         add     di, CSCRCOLUMN - (CCURCOLUMN / CBITMAP)
  2425.         pop     cx
  2426.         loop    Print_NextLn
  2427.         popa
  2428.         ret
  2429. Print           ENDP
  2430.  
  2431. ; *****************************************************************************
  2432. ; Setzt die Schreibposition auf die Cursorposition
  2433. ; *****************************************************************************
  2434. ResetCursor     PROC
  2435.         push    ax
  2436.         mov     ax, xPos
  2437.         mov     CursorNewX, ax
  2438.         mov     ax, yPos
  2439.         mov     CursorNewY, ax
  2440.         pop     ax
  2441.         ret
  2442. ResetCursor     ENDP
  2443.  
  2444. ; *****************************************************************************
  2445. ; Springt zum Anfang der Datei
  2446. ; *****************************************************************************
  2447.         IFDEF   _WRITE
  2448. ResetFile       PROC
  2449.         pusha
  2450.  
  2451. ;               Dateizeiger an Anfang zurücksetzen
  2452. ;
  2453.         mov     ah, DOS_MOVE_FILE_POINTER
  2454.         xor     al, al
  2455.         mov     bx, sKey
  2456.         xor     cx, cx
  2457.         xor     dx, dx
  2458.         int     DOS_FUNCTION
  2459.  
  2460. ;               Bildschirm löschen und Cursor in obere linke Ecke bewegen
  2461. ;
  2462.         call    DoClear
  2463.         call    MoveToLeft
  2464.         call    MoveToTop
  2465.  
  2466. ;               Effekte auf Anfangswerte setzen
  2467. ;
  2468.         mov     si, OFFSET aenFXDefault
  2469.         mov     di, OFFSET aenFX
  2470.         mov     cx, CFX
  2471. ResetFile_FX:   mov     al, ds:[si]
  2472.         cmp     al, ds:[di]
  2473.         je      ResetFile_FXNo
  2474.         dec     BYTE PTR ds:[di]
  2475.         and     BYTE PTR ds:[di], 3
  2476. ResetFile_FXNo: inc     si
  2477.         inc     di
  2478.         loop    ResetFile_FX
  2479.  
  2480. ;               Einstellungen zurücksetzen
  2481. ;
  2482. ResetFile_SpOn: mov     iItem, 0
  2483.         mov     ynInsert, YES
  2484.         mov     BackColor, PABLACK
  2485.         mov     iCursor, 0
  2486.         mov     iPhase, 0
  2487.         mov     offsCursor, OFFSAAABCUR
  2488.         mov     offsFont, OFFSAAABFONTS
  2489.         mov     offsPalette, OFFSET AABCOLOR
  2490.         mov     offsPattern, OFFSET AAPATTERN
  2491.         popa
  2492.         ret
  2493. ResetFile       ENDP
  2494.         ENDIF
  2495.  
  2496. ResetInput      PROC
  2497.         mov     Char, 0
  2498.         mov     Timer, 0
  2499.         mov     TimerLast, 0
  2500.         mov     Delay, 0
  2501.         mov     iFrame, 0
  2502.         mov     ynLock, OFF
  2503.         mov     ynSingle, NO
  2504.         mov     ynSkip, NO
  2505.         mov     cRepeat, 0
  2506.         ret
  2507. ResetInput      ENDP
  2508.  
  2509. ; *****************************************************************************
  2510. ; Arbeitet den Ablauf synchron zum Kathodenstrahl ab
  2511. ; *****************************************************************************
  2512. Run             PROC
  2513.         push    ax
  2514.  
  2515.         IFNDEF  _WRITE
  2516.         call    AccessFile
  2517.         mov     cRepeat, 0
  2518.         jc      Run_End
  2519.         ENDIF
  2520.  
  2521. ;               Auf neuen Bildschirm warten
  2522. ;
  2523. Run_Next:       call    ExpectPicture
  2524.         call    ExpectRetrace
  2525.  
  2526. ;               Bildschirme vertauschen
  2527. ;
  2528.         call    SwitchFrame
  2529.  
  2530. ;               Zeichen auf zweitem Bildschirm wiederholen
  2531. ;
  2532.         cmp     cRepeat, 0
  2533.         jne     Run_Key
  2534.  
  2535. ;               Zeichen nur vom ersten Bildschirm annehmen
  2536. ;
  2537.         cmp     iFrame, 0
  2538.         jne     Run_NoKey
  2539.  
  2540. ;               Zeichen lesen und zwei Wiederholungen setzen
  2541. ;
  2542.         call    GetKey
  2543.         jc      Run_NoKey
  2544.         mov     cRepeat, CFRAME
  2545.  
  2546. ;               Effekte während Zeichenausgabe abschalten
  2547. ;
  2548. Run_Key:        call    TurnOffFX
  2549.         call    DoABC
  2550.         cmp     ynSkip, YES
  2551.         je      Run_Skip
  2552.  
  2553. ;               Uhr weiterstellen
  2554. ;
  2555.         mov     ax, 1
  2556.         call    EnhanceTimer
  2557. Run_Skip:       mov     ynSkip, NO
  2558.         call    TurnOnFX
  2559.  
  2560. ;               Weitermachen, solange nicht am Ende
  2561. ;
  2562.         cmp     ynQuit, YES
  2563.         jne     Run_Next
  2564.         cmp     cRepeat, 0
  2565.         jne     Run_Next
  2566.         jmp     Run_Exit
  2567.  
  2568. ;               Aktualisiert nur den Cusor und die Objekte
  2569. ;
  2570. Run_NoKey:      call    TurnOffFX
  2571.  
  2572. ;               Uhr weiterstellen
  2573. ;
  2574.         mov     ax, 1
  2575.         call    EnhanceTimer
  2576.  
  2577.         call    TurnOnFX
  2578.         jmp     Run_Next
  2579.  
  2580. Run_Exit:       IFNDEF  _WRITE
  2581.         call    AskEnd
  2582.         clc
  2583.         ENDIF
  2584.  
  2585. Run_End:        pop     ax
  2586.         ret
  2587. Run             ENDP
  2588.  
  2589. ; *****************************************************************************
  2590. ; Sichert die Bildattribute
  2591. ; *****************************************************************************
  2592. SaveAttributes  PROC
  2593.         push    es
  2594.         push    si
  2595.         push    di
  2596.         mov     di, OFFSET abAttribBuffer
  2597.         mov     si, OFFSET CursorX
  2598.         push    ds
  2599.         pop     es
  2600.         movsw
  2601.         movsw
  2602.         mov     si, OFFSET BackColor
  2603.         movsb
  2604.         mov     si, OFFSET offsPalette
  2605.         movsw
  2606.         mov     si, OFFSET offsPattern
  2607.         movsw
  2608.         mov     si, OFFSET offsFont
  2609.         movsw
  2610.         pop     di
  2611.         pop     si
  2612.         pop     es
  2613.         ret
  2614. SaveAttributes  ENDP
  2615.  
  2616. SwitchFrame     PROC
  2617.         push    ax
  2618.         push    si
  2619.  
  2620. ;               Cursor-Position sichern
  2621. ;
  2622.         mov     si, iFrame
  2623.         inc     si
  2624.         shl     si, 2
  2625.         add     si, OFFSET xPos
  2626.         mov     ax, xPos
  2627.         mov     ds:[si], ax
  2628.         mov     ax, yPos
  2629.         mov     ds:[si+2], ax
  2630.  
  2631.         mov     ax, iFrame
  2632.         xor     ax, 1
  2633.         mov     iFrame, ax
  2634.         mov     ax, offsFrame
  2635.         xor     ax, CSCRCOLUMN / CBITMAP
  2636.         mov     offsFrame, ax
  2637.         shr     ax, 4
  2638.         or      ax, SEGGFX
  2639.         mov     es, ax
  2640.  
  2641. ;               Cursor-Position restaurieren
  2642. ;
  2643.         mov     si, iFrame
  2644.         inc     si
  2645.         shl     si, 2
  2646.         add     si, OFFSET xPos
  2647.         mov     ax, ds:[si]
  2648.         mov     xPos, ax
  2649.         mov     ax, ds:[si+2]
  2650.         mov     yPos, ax
  2651.         pop     si
  2652.         pop     ax
  2653.         ret
  2654. SwitchFrame     ENDP
  2655.  
  2656. SwitchCursor    PROC
  2657.         dec     enCursor
  2658.         and     enCursor, 3
  2659.         ret
  2660. SwitchCursor    ENDP
  2661.  
  2662. SwitchSprites   PROC
  2663.         dec     enObjects
  2664.         and     enObjects, 3
  2665.         ret
  2666. SwitchSprites   ENDP
  2667.  
  2668. SwitchStars     PROC
  2669.         dec     enStars
  2670.         and     enStars, 3
  2671.         ret
  2672. SwitchStars     ENDP
  2673.  
  2674. ; ****************************************************************************
  2675. ; Stellt den Hintergrund des Cursors wieder her
  2676. ; ****************************************************************************
  2677. TurnOffCursor   PROC
  2678.         pusha
  2679.         call    GetCurOffset
  2680.         mov     di, offs
  2681.         mov     si, OFFSET OFFSAABCURBUF
  2682.         mov     ax, iFrame
  2683.         add     ax, ax
  2684.         add     si, ax
  2685.         push    ds
  2686.         mov     ax, SEGGFX
  2687.         mov     ds, ax
  2688.         mov     cx, CCURLINE
  2689. TOfCur_NextLn:  push    cx
  2690.         mov     cx, CCURCOLUMN / CBITMAP
  2691.         rep     movsb
  2692.         add     si, CSCRCOLUMN - (CCURCOLUMN / CBITMAP)
  2693.         add     di, CSCRCOLUMN - (CCURCOLUMN / CBITMAP)
  2694.         pop     cx
  2695.         loop    TOfCur_NextLn
  2696.         pop     ds
  2697.         popa
  2698.         ret
  2699. TurnOffCursor   ENDP
  2700.  
  2701. ; ****************************************************************************
  2702. ; Schaltet den Cursor ein
  2703. ; ****************************************************************************
  2704. TurnOnCursor    PROC
  2705.         pusha
  2706.  
  2707.         call    GetCurOffset
  2708.  
  2709. ;               Sicherung des Hintergrundes
  2710. ;
  2711.         mov     si, offs
  2712.         mov     di, OFFSET OFFSAABCURBUF
  2713.         mov     ax, iFrame
  2714.         add     ax, ax
  2715.         add     di, ax
  2716.         push    ds
  2717.         push    es
  2718.         push    es
  2719.         pop     ds
  2720.         mov     ax, SEGGFX
  2721.         mov     es, ax
  2722.         mov     cx, CCURLINE
  2723. TOnCur_SNextLn: push    cx
  2724.         mov     cx, CCURCOLUMN / CBITMAP
  2725.         rep     movsb
  2726.         add     si, CSCRCOLUMN - (CCURCOLUMN / CBITMAP)
  2727.         add     di, CSCRCOLUMN - (CCURCOLUMN / CBITMAP)
  2728.         pop     cx
  2729.         loop    TOnCur_SNextLn
  2730.         pop     es
  2731.         pop     ds
  2732.  
  2733. ;               Zeichnet den Cursor neu
  2734. ;
  2735.         mov     si, iPhase
  2736.         shr     si, 1
  2737.         and     si, 0FFFEH
  2738.         add     si, offsCursor
  2739.         mov     di, offs
  2740.         push    ds
  2741.         mov     ax, SEGGFX
  2742.         mov     ds, ax
  2743.         mov     cx, CCURLINE
  2744. TOnCur_CNextLn: push    cx
  2745.         mov     cx, CCURCOLUMN / CBITMAP
  2746.         rep     movsb
  2747.         add     di, CSCRCOLUMN - CCURCOLUMN / CBITMAP
  2748.         add     si, CSCRCOLUMN - CCURCOLUMN / CBITMAP
  2749.         pop     cx
  2750.         loop    TOnCur_CNextLn
  2751.         pop     ds
  2752.         popa
  2753.         ret
  2754. TurnOnCursor    ENDP
  2755.  
  2756. TurnOffFX       PROC
  2757.         pusha
  2758.  
  2759. ;               Kontrolle, ob Effekte schon aus sind
  2760. ;
  2761.         cmp     ynFXOn, OFF
  2762.         je      TurnOffFX_End
  2763.         mov     ynFXOn, OFF
  2764.  
  2765. ;               Alle gewählten Objekte einschalten
  2766. ;
  2767.         mov     si, OFFSET aenFX + (CFX - 1)
  2768.         mov     di, OFFSET ATURNOFFPROC + (CFX - 1) * 2
  2769.         mov     cx, CFX
  2770. TurnOffFX_Next: mov     al, ds:[si]
  2771.         inc     al
  2772.         and     al, 3
  2773.         cmp     al, ENON
  2774.         jl      TurnOffFX_Not
  2775.         mov     bx, ds:[di]
  2776.         call    bx
  2777. TurnOffFX_Not:  dec     si
  2778.         sub     di, 2
  2779.         loop    TurnOffFX_Next
  2780. TurnOffFX_End:  popa
  2781.         ret
  2782. TurnOffFX       ENDP
  2783.  
  2784. TurnOnFX        PROC
  2785.         pusha
  2786.  
  2787. ;               Kontrolle, ob Effekte schon an sind
  2788. ;
  2789.         cmp     ynFXOn, ON
  2790.         je      TurnOnFX_End
  2791.         mov     ynFXOn, ON
  2792.  
  2793. ;               Alle gewählten Objekte einschalten
  2794. ;
  2795.         mov     si, OFFSET aenFX
  2796.         mov     di, OFFSET ATURNONPROC
  2797.         mov     cx, CFX
  2798. TurnOnFX_Next:  cmp     BYTE PTR ds:[si], ENON
  2799.         jl      TurnOnFX_Not
  2800.         mov     bx, ds:[di]
  2801.         call    bx
  2802. TurnOnFX_Not:   inc     si
  2803.         add     di, 2
  2804.         loop    TurnOnFX_Next
  2805. TurnOnFX_End:   popa
  2806.         ret
  2807. TurnOnFX        ENDP
  2808.  
  2809. ; *****************************************************************************
  2810. ; Löschen aller Objekte
  2811. ; *****************************************************************************
  2812. TurnOffObjects  PROC
  2813.         pusha
  2814.         xor     cx, cx
  2815.  
  2816. ;               Anfangsadresse der Hintergrund-Puffers bestimmen: es:si
  2817. ;
  2818. TOfObj_Next:    mov     si, cx
  2819.         shl     si, 2
  2820.         add     si, OFFSAAABOBJBUF
  2821.         mov     ax, iFrame
  2822.         or      ax, ax
  2823.         je      TOfObj_F1
  2824.         add     si, CSCRCOLUMN * COBJLINE
  2825.  
  2826. ;               Anfangsadresse des Hintergrundes bestimmen: es:di
  2827. ;
  2828. TOfObj_F1:      mov     di, iFrame
  2829.         shl     di, 4
  2830.         add     di, OFFSET aoffsObj
  2831.         add     di, cx
  2832.         add     di, cx
  2833.         mov     di, ds:[di]
  2834.  
  2835. ;               Hintergrund wiederherstellen
  2836. ;
  2837.         push    cx
  2838.         push    ds
  2839.         mov     ax, SEGGFX
  2840.         mov     ds, ax
  2841.         mov     cx, COBJLINE
  2842. TOfObj_SNextLn: push    cx
  2843.         mov     cx, COBJCOLUMN / CBITMAP
  2844.         rep     movsb
  2845.         add     si, CSCRCOLUMN - COBJCOLUMN / CBITMAP
  2846.         add     di, CSCRCOLUMN - COBJCOLUMN / CBITMAP
  2847.         pop     cx
  2848.         loop    TOfObj_SNextLn
  2849.         pop     ds
  2850.         pop     cx
  2851.         inc     cx
  2852.         cmp     cx, COBJECT
  2853.         jne     TOfObj_Next
  2854.         popa
  2855.         ret
  2856. TurnOffObjects  ENDP
  2857.  
  2858. ; *****************************************************************************
  2859. ; Neuzeichnen der Objekte
  2860. ; *****************************************************************************
  2861. TurnOnObjects   PROC
  2862.         pusha
  2863.         mov     cx, COBJECT - 1
  2864.  
  2865. ;               Kontrolle, ob das Objekt bewegt werden muß
  2866. ;
  2867. TOnObj_Next:    xor     dh, dh
  2868.         mov     si, OFFSET abObjTimer
  2869.         add     si, cx
  2870.         mov     dl, ds:[si]
  2871.         or      dl, dl
  2872.         jns     TOnObj_NoMove
  2873.         xor     dl, dl
  2874.         mov     iObject, cx
  2875.         call    MoveObject
  2876.  
  2877. ;               Anfangsadresse des Hintergrundes bestimmen: es:si
  2878. ;
  2879. TOnObj_NoMove:  mov     ds:[si], dl
  2880.         shr     dl, 3
  2881.         mov     si, OFFSET aoffsObjNew
  2882.         add     si, cx
  2883.         add     si, cx
  2884.         mov     ax, ds:[si]
  2885.         mov     di, iFrame
  2886.         shl     di, 4
  2887.         add     di, OFFSET aoffsObj
  2888.         add     di, cx
  2889.         add     di, cx
  2890.         mov     ds:[di], ax
  2891.         mov     si, ax
  2892.  
  2893. ;               Anfangsadresse der Hintergrund-Puffers bestimmen: es:di
  2894. ;
  2895.         mov     di, cx
  2896.         shl     di, 2
  2897.         add     di, OFFSAAABOBJBUF
  2898.         mov     ax, iFrame
  2899.         or      ax, ax
  2900.         je      TOnObj_F1
  2901.         add     di, CSCRCOLUMN * COBJLINE
  2902.  
  2903. ;               Hintergrund sichern
  2904. ;
  2905. TOnObj_F1:      push    cx
  2906.         push    es
  2907.         push    ds
  2908.         push    es
  2909.         pop     ds
  2910.         mov     ax, SEGGFX
  2911.         mov     es, ax
  2912.         push    si
  2913.         mov     cx, COBJLINE
  2914. TOnObj_SNextLn: push    cx
  2915.         mov     cx, COBJCOLUMN / CBITMAP
  2916.         rep     movsb
  2917.         add     si, CSCRCOLUMN - COBJCOLUMN / CBITMAP
  2918.         add     di, CSCRCOLUMN - COBJCOLUMN / CBITMAP
  2919.         pop     cx
  2920.         loop    TOnObj_SNextLn
  2921.  
  2922. ;               Hintergrundadresse bestimmen: es:[di]
  2923. ;
  2924.         pop     di
  2925.         pop     ds
  2926.         pop     es
  2927.  
  2928. ;               Anfangsadresse des Objekts bestimmen: es:[si]
  2929. ;
  2930.         pop     cx
  2931.         push    cx
  2932.         mov     si, OFFSET AOBJECTSEQ
  2933.         add     si, dx
  2934.         mov     al, ds:[si]
  2935.         xor     ah, ah
  2936.         mov     dx, ax
  2937.         shl     ax, 2
  2938.         mov     si, OFFSET aoffsItem
  2939.         add     si, cx
  2940.         add     si, cx
  2941.         mov     si, ds:[si]
  2942.         add     si, ax
  2943.  
  2944. ;               Adresse der Maske bestimmen: ds:bx
  2945. ;
  2946.         mov     bx, OFFSET aoffsMask
  2947.         add     bx, cx
  2948.         add     bx, cx
  2949.         mov     bx, ds:[bx]
  2950.         mov     ax, COBJLINE * COBJCOLUMN / CBITMAP
  2951.         mul     dx
  2952.         add     bx, ax
  2953.  
  2954. ;               Sequencer-Controller einstellen
  2955. ;
  2956.         mov     dx, PRSEQUENCER
  2957.         mov     al, 002H
  2958.         out     dx, al
  2959.         inc     dx
  2960.  
  2961. ;               Objekt auf Hintergrund kopieren
  2962. ;
  2963.         mov     bp, ds
  2964.         mov     ax, SEGGFX
  2965.         mov     ds, ax
  2966.         mov     cx, COBJLINE
  2967. TOnObj_CNextLn: push    cx
  2968.         mov     cx, COBJCOLUMN / CBITMAP
  2969. TOnObj_CNextCl: push    ds
  2970.         mov     ds, bp
  2971.         mov     al, ds:[bx]
  2972.         pop     ds
  2973.         out     dx, al
  2974.         mov     al, ds:[si]
  2975.         mov     es:[di], al
  2976.         inc     bx
  2977.         inc     si
  2978.         inc     di
  2979.         loop    TOnObj_CNextCl
  2980.         add     si, CSCRCOLUMN - COBJCOLUMN / CBITMAP
  2981.         add     di, CSCRCOLUMN - COBJCOLUMN / CBITMAP
  2982.         pop     cx
  2983.         loop    TOnObj_CNextLn
  2984.  
  2985.         mov     ds, bp
  2986.         mov     al, 00FH
  2987.         out     dx, al
  2988.  
  2989. ;               Nächstes Objekt
  2990. ;
  2991.         pop     cx
  2992.         dec     cx
  2993.         js      TOnObj_End
  2994.         jmp     TOnObj_Next
  2995. TOnObj_End:     popa
  2996.         ret
  2997. TurnOnObjects   ENDP
  2998.  
  2999. TurnOffStars    PROC
  3000.         pusha
  3001. ;               Sequencer-Controller einstellen
  3002. ;
  3003.         call    DoneBlit
  3004.         mov     dx, PRSEQUENCER
  3005.         mov     al, 002H
  3006.         out     dx, al
  3007.         mov     dx, PRGRAPHICS
  3008.         mov     al, 004H
  3009.         out     dx, al
  3010.         mov     cx, CSTAR
  3011.         xor     di, di
  3012.         cmp     iFrame, 0
  3013.         jne     TOffStr_Page2
  3014.         mov     si, OFFSET awStarX
  3015.         jmp     TOffStr_Next
  3016. TOffStr_Page2:  mov     si, OFFSET awStarX + 2 * CSTAR
  3017. TOffStr_Next:   push    cx
  3018.         push    di
  3019.         mov     bx, ds:[si]
  3020.         mov     cl, bl
  3021.         and     cl, 3
  3022.         mov     al, 1
  3023.         shl     al, cl
  3024.         mov     dx, PRSEQUENCER + 1
  3025.         out     dx, al
  3026.         mov     al, cl
  3027.         mov     dx, PRGRAPHICS + 1
  3028.         out     dx, al
  3029.         shr     bx, 2
  3030.         add     di, bx
  3031.         mov     al, es:[di]
  3032.         cmp     al, CSTARCOLOR
  3033.         ja      TOffStr_No
  3034.         mov     BYTE PTR es:[di], 0
  3035. TOffStr_No:     add     si, 2
  3036.         pop     di
  3037.         add     di, CSCRCOLUMN
  3038.         pop     cx
  3039.         loop    TOffStr_Next
  3040.         call    InitBlit
  3041.         popa
  3042.         ret
  3043. TurnOffStars    ENDP
  3044.  
  3045. TurnOnStars     PROC
  3046.         pusha
  3047.  
  3048. ;               Sequencer-Controller einstellen
  3049. ;
  3050.         call    DoneBlit
  3051.         mov     dx, PRSEQUENCER
  3052.         mov     al, 002H
  3053.         out     dx, al
  3054.         mov     dx, PRGRAPHICS
  3055.         mov     al, 004H
  3056.         out     dx, al
  3057.         mov     cx, CSTAR
  3058.         xor     di, di
  3059.         cmp     iFrame, 0
  3060.         jne     TOnStr_Page2
  3061.         mov     si, OFFSET awStarX
  3062.         jmp     TOnStr_Next
  3063. TOnStr_Page2:   mov     si, OFFSET awStarX + 2 * CSTAR
  3064. TOnStr_Next:    push    cx
  3065.         push    di
  3066.         mov     ah, cl
  3067.         and     ah, 3
  3068.         inc     ah
  3069.         mov     bx, ds:[si]
  3070.         mov     cl, bl
  3071.         and     cl, 3
  3072.         mov     al, 1
  3073.         shl     al, cl
  3074.         mov     dx, PRSEQUENCER + 1
  3075.         out     dx, al
  3076.         mov     al, cl
  3077.         mov     dx, PRGRAPHICS + 1
  3078.         out     dx, al
  3079.         shr     bx, 2
  3080.         add     di, bx
  3081.         mov     al, es:[di]
  3082.         cmp     al, CSTARCOLOR
  3083.         ja      TOnStr_Above
  3084.         mov     es:[di], ah
  3085. TOnStr_Above:   add     si, 2
  3086.         pop     di
  3087.         add     di, CSCRCOLUMN
  3088.         pop     cx
  3089.         loop    TOnStr_Next
  3090.         call    InitBlit
  3091.         popa
  3092.         ret
  3093. TurnOnStars     ENDP
  3094.  
  3095. ; *****************************************************************************
  3096. ; Wandelt einen Buchstaben in einen Großbuchstaben um
  3097. ; *****************************************************************************
  3098. UpCase          PROC
  3099.         cmp     Char, 'a'
  3100.         jnae    UpCase_End
  3101.         cmp     Char, 'z'
  3102.         ja      UpCase_End
  3103.         add     Char, 'A' - 'a'
  3104. UpCase_End:     ret
  3105. UpCase          ENDP
  3106.  
  3107. VoidProc        PROC
  3108.         ret
  3109. VoidProc        ENDP
  3110.  
  3111. ; *****************************************************************************
  3112. ; Wartet auf einen Tastendruck
  3113. ; *****************************************************************************
  3114. WaitKey         PROC
  3115.  
  3116. ;               Auf neuen Bildschirm warten
  3117. ;
  3118. WaitKey_More:   call    ExpectPicture
  3119.         call    ExpectRetrace
  3120.  
  3121. ;               Uhr weiterstellen
  3122. ;
  3123.         cmp     ynLock, YES
  3124.         je      WaitKey_Locked
  3125.         inc     Timer
  3126.  
  3127. WaitKey_Locked: call    GetKey
  3128.         jc      WaitKey_More
  3129.         ret
  3130. WaitKey         ENDP
  3131.  
  3132. ; ****************************************************************************
  3133. ; Schaltet die Rahmenfarbe auf Weiß
  3134. ; ****************************************************************************
  3135.         IFDEF   _TEST
  3136. WhiteBorder     PROC
  3137.         push    ax
  3138.         push    dx
  3139.         mov     dx, 003C0H
  3140.         mov     al, 031H
  3141.         out     dx, al
  3142.         mov     al, 03FH
  3143.         out     dx, al
  3144.         pop     dx
  3145.         pop     ax
  3146.         ret
  3147. WhiteBorder     ENDP
  3148.         ENDIF
  3149.  
  3150. ; ****************************************************************************
  3151. ; Gibt eine Zeichenkette aus
  3152. ; ****************************************************************************
  3153. Write           PROC
  3154.         pusha
  3155.         call    SaveAttributes
  3156.         mov     si, MBox_Text
  3157.         mov     dx, MBox_Left
  3158.         inc     dx
  3159.         mov     CursorX, dx
  3160.         mov     dx, MBox_Top
  3161.         inc     dx
  3162.         mov     CursorY, dx
  3163. Write_Next:     xor     ah, ah
  3164.         lodsb
  3165.         cmp     al, CHBACK
  3166.         je      Write_Back
  3167.         cmp     al, CHTEXT
  3168.         je      Write_Front
  3169.         cmp     al, CHPATTERN
  3170.         je      Write_Pattern
  3171.         cmp     al, CHFONT
  3172.         je      Write_Font
  3173.  
  3174.         mov     Char, ax
  3175.         call    GetCurOffset
  3176.         call    DoneBlit
  3177.         call    Print
  3178.         call    InitBlit
  3179.  
  3180.         inc     CursorX
  3181.         mov     ax, CursorX
  3182.         cmp     ax, MBox_Right
  3183.         jne     Write_Next
  3184.  
  3185.         inc     CursorY
  3186.         mov     ax, CursorY
  3187.         cmp     ax, MBox_Bottom
  3188.         je      Write_End
  3189.  
  3190.         mov     ax, MBox_Left
  3191.         inc     ax
  3192.         mov     CursorX, ax
  3193.         jmp     Write_Next
  3194.  
  3195. Write_Back:     lodsb
  3196.         mov     BackColor, al
  3197.         jmp     Write_Next
  3198.  
  3199. Write_Font:     lodsb
  3200.         shl     ax, 11
  3201.         add     ax, OFFSAAABFONTS
  3202.         mov     offsFont, ax
  3203.         jmp     Write_Next
  3204.  
  3205. Write_Front:    lodsb
  3206.         shl     ax, 4
  3207.         add     ax, OFFSET AABCOLOR
  3208.         mov     offsPalette, ax
  3209.         jmp     Write_Next
  3210.  
  3211. Write_Pattern:  lodsb
  3212.         shl     ax, 6
  3213.         add     ax, OFFSET AAPATTERN
  3214.         mov     offsPattern, ax
  3215.         jmp     Write_Next
  3216.  
  3217. Write_End:      call    LoadAttributes
  3218.         popa
  3219.         ret
  3220. Write           ENDP
  3221.  
  3222. Code            ENDS
  3223.  
  3224.         END     Main
  3225.         TITLE   'Connect'
  3226.  
  3227.         PAGE    66, 132
  3228.  
  3229.         P286
  3230.         MODEL   COMPACT
  3231.  
  3232. INCLUDE         INCLUDE\DOS.INC
  3233. INCLUDE         INCLUDE\KEYCODES.INC
  3234.  
  3235. STRWARN         EQU     KBLF, KBCR, '$'
  3236. CBBUFFER        EQU     01000H
  3237.  
  3238. Data            SEGMENT PUBLIC
  3239.         ASSUME  cs:Code, ds: Data
  3240.  
  3241. STREXTWRT       DB      '.WRT', 0
  3242. STREXTEXE       DB      '.EXE', 0
  3243. STRCOPYERROR    DB      'Can''t create EXE-File entirely.', STRWARN
  3244. STRCREATEERROR  DB      'Can''t create EXE-File.', STRWARN
  3245. STRFINDERROR    DB      'Can''t find WRT-File.', STRWARN
  3246. STROPENERROR    DB      'Can''t open WRT-File.', STRWARN
  3247. STRREADERROR    DB      'Can''t read from WRT-File.', STRWARN
  3248. STRWRITEERROR   DB      'Can''t write to EXE-File.', STRWARN
  3249. STRUSAGE        DB      'Usage: CONNECT <FileName>', STRWARN
  3250.  
  3251. cbLoEXE         =       $ + 2
  3252. cbHiEXE         =       $ + 4
  3253.  
  3254. ABFILE          LABEL
  3255. INCLUDE         PLAY.INC
  3256.  
  3257. CBFILE          =       OFFSET $ - OFFSET ABFILE
  3258.  
  3259. cbLoWrite       DW      ?
  3260. cbHiWrite       DW      ?
  3261. hWrite          DW      ?
  3262. hEXE            DW      ?
  3263. segFileName     DW      ?
  3264. offsFileName    DW      ?
  3265. offsExt         DW      ?
  3266.  
  3267. abBuffer        DB      CBBUFFER DUP (?)
  3268. Data            ENDS
  3269.  
  3270. Stack           0100H
  3271.  
  3272. Code            SEGMENT PUBLIC
  3273.         ASSUME  cs:Code, ds: Data
  3274.  
  3275. CloseEXE        PROC
  3276.         pusha
  3277.         mov     ah, DOS_CLOSE_FILE
  3278.         mov     bx, hEXE
  3279.         int     DOS_FUNCTION
  3280.         popa
  3281.         ret
  3282. CloseEXE        ENDP
  3283.  
  3284. CloseWrite      PROC
  3285.         pusha
  3286.         mov     ah, DOS_CLOSE_FILE
  3287.         mov     bx, hWrite
  3288.         int     DOS_FUNCTION
  3289.         popa
  3290.         ret
  3291. CloseWrite      ENDP
  3292.  
  3293. ; *****************************************************************************
  3294. ; Erstellung der ausführbaren Datei
  3295. ; *****************************************************************************
  3296. CreateEXE       PROC
  3297.         pusha
  3298.  
  3299. ;               Endung des Dateinamens ändern
  3300. ;
  3301.         mov     di, offsExt
  3302.         mov     si, OFFSET STREXTEXE
  3303.         mov     cx, 5
  3304.         rep     movsb
  3305.  
  3306. ;               Datei zur Ausgabe öffnen
  3307. ;
  3308.         mov     ah, DOS_CREATE_FILE
  3309.         xor     cx, cx
  3310.         mov     dx, offsFileName
  3311.         push    ds
  3312.         push    es
  3313.         pop     ds
  3314.         int     DOS_FUNCTION
  3315.         pop     ds
  3316.         jc      CreateEXE_Error
  3317.         mov     WORD PTR hEXE, ax
  3318.  
  3319. ;               Länge in EXE-Kopf ändern
  3320. ;
  3321.         mov     ax, WORD PTR cbLoWrite
  3322.         mov     dx, ax
  3323.         and     ax, 001FFH
  3324.         shr     dx, 9
  3325.         add     dx, WORD PTR cbHiWrite
  3326.         add     WORD PTR cbLoEXE, ax
  3327.         cmp     WORD PTR cbLoEXE, 00200H
  3328.         jnae    CreateEXE_NoOv
  3329.         sub     WORD PTR cbLoEXE, 00200H
  3330.         inc     WORD PTR cbHiEXE
  3331.  
  3332. CreateEXE_NoOv: add     WORD PTR cbHiEXE, dx
  3333.         clc
  3334.         jmp     CreateEXE_End
  3335.  
  3336. CreateEXE_Error:mov     dx, OFFSET STRCREATEERROR
  3337.         mov     ah, DOS_WRITE_STRING
  3338.         int     DOS_FUNCTION
  3339.         stc
  3340.  
  3341. CreateEXE_End:  popa
  3342.         ret
  3343. CreateEXE       ENDP
  3344.  
  3345. ; *****************************************************************************
  3346. ; Bestimmung des Dateinamens
  3347. ; *****************************************************************************
  3348. GetWrite        PROC
  3349.         pusha
  3350.  
  3351. ;               Kontrolle, ob Dateiname angegeben ist
  3352. ;
  3353.         mov     WORD PTR segFileName, es
  3354.         mov     di, 080H
  3355.         mov     al, es:[di]
  3356.         or      al, al
  3357.         je      GetWrite_Help
  3358.  
  3359. ;               Nullzeichen einfügen
  3360. ;
  3361.         xor     ah, ah
  3362.         inc     di
  3363.         mov     si, di
  3364.         add     di, ax
  3365.         mov     es:[di], ah
  3366.  
  3367. ;               Führende Leerzeichen überspringen
  3368. ;
  3369.         mov     di, si
  3370.         mov     cx, ax
  3371.         mov     bx, ax
  3372.         mov     al, ' '
  3373.         repe    scasb
  3374.         or      cx, cx
  3375.         jne     GetWrite_Ok2
  3376.         mov     dx, WORD
  3377.         stc
  3378.         jmp     GetWrite_Error
  3379. GetWrite_Ok2:   dec     di
  3380.         mov     WORD PTR offsFileName, di
  3381.  
  3382. ;               Endung suchen
  3383. ;
  3384.         mov     di, si
  3385.         mov     cx, bx
  3386.         mov     al, '.'
  3387.         repne   scasb
  3388.         or      cx, cx
  3389.         jne     GetWrite_GetExt
  3390.  
  3391. ;               Endung .WRT anfügen
  3392. ;
  3393.         mov     WORD PTR offsExt, di
  3394.         mov     si, OFFSET STREXTWRT
  3395.         mov     cx, 5
  3396.         rep     movsb
  3397.         jmp     GetWrite_Ok
  3398.  
  3399. GetWrite_Error: mov     dx, OFFSET STRFINDERROR
  3400.         mov     ah, DOS_WRITE_STRING
  3401.         int     DOS_FUNCTION
  3402.         stc
  3403.         jmp     GetWrite_End
  3404.  
  3405. GetWrite_GetExt:dec     di
  3406.         mov     WORD PTR offsExt, di
  3407.  
  3408. GetWrite_Help:  mov     dx, OFFSET STRUSAGE
  3409.         mov     ah, DOS_WRITE_STRING
  3410.         int     DOS_FUNCTION
  3411.         stc
  3412.         jmp     GetWrite_End
  3413.  
  3414. GetWrite_Ok:    clc
  3415.  
  3416. GetWrite_End:   popa
  3417.         ret
  3418. GetWrite        ENDP
  3419.  
  3420. ; *****************************************************************************
  3421. ; Initialisierung der Register
  3422. ; *****************************************************************************
  3423. Init            PROC
  3424.         push    ax
  3425.         mov     ax, SEG Data
  3426.         mov     ds, ax
  3427.         pop     ax
  3428.         ret
  3429. Init            ENDP
  3430.  
  3431. ; *****************************************************************************
  3432. ; Hauptteil
  3433. ; *****************************************************************************
  3434. Main            PROC
  3435.         call    Init
  3436.         call    GetWrite
  3437.         jc      Main_End
  3438.         call    OpenWrite
  3439.         jc      Main_End
  3440.         call    CreateEXE
  3441.         jc      Main_CloseWrite
  3442.         call    WriteEXE
  3443.         call    CloseEXE
  3444. Main_CloseWrite:call    CloseWrite
  3445. Main_End:       mov     al, 0
  3446.         adc     al, al
  3447.         mov     ah, DOS_TERMINATE_EXE
  3448.         int     DOS_FUNCTION
  3449. Main            ENDP
  3450.  
  3451. OpenWrite       PROC
  3452.         pusha
  3453.         mov     ah, DOS_OPEN_FILE
  3454.         xor     al, al
  3455.         mov     dx, WORD PTR offsFileName
  3456.         push    ds
  3457.         push    es
  3458.         pop     ds
  3459.         int     DOS_FUNCTION
  3460.         pop     ds
  3461.         jc      OpenWrite_Error
  3462.         mov     WORD PTR hWrite, ax
  3463.  
  3464. ;               Dateilänge bestimmen
  3465. ;
  3466.         mov     ah, DOS_MOVE_FILE_POINTER
  3467.         mov     al, 2
  3468.         mov     bx, WORD PTR hWrite
  3469.         xor     cx, cx
  3470.         xor     dx, dx
  3471.         int     DOS_FUNCTION
  3472.         jc      OpenWrite_Error
  3473.         mov     WORD PTR cbHiWrite, dx
  3474.         mov     WORD PTR cbLoWrite, ax
  3475.  
  3476. ;               Dateizeiger an Anfang setzen
  3477. ;
  3478.         mov     ah, DOS_MOVE_FILE_POINTER
  3479.         mov     al, 0
  3480.         xor     dx, dx
  3481.         int     DOS_FUNCTION
  3482.         clc
  3483.         jmp     OpenWrite_End
  3484.  
  3485. ;               Fehlermeldung ausgeben
  3486. ;
  3487. OpenWrite_Error:mov     dx, OFFSET STROPENERROR
  3488.         mov     ah, DOS_WRITE_STRING
  3489.         int     DOS_FUNCTION
  3490.         stc
  3491.  
  3492. OpenWrite_End:  popa
  3493.         ret
  3494. OpenWrite       ENDP
  3495.  
  3496. WriteEXE        PROC
  3497.         pusha
  3498.  
  3499. ;               Abspieler in EXE-Datei schreiben
  3500. ;
  3501.         mov     ah, DOS_WRITE_TO_HANDLE
  3502.         mov     bx, hEXE
  3503.         mov     cx, CBFILE
  3504.         mov     dx, OFFSET ABFILE
  3505.         int     DOS_FUNCTION
  3506.         jc      WriteEXE_WErr
  3507.         cmp     ax, cx
  3508.         jne     WriteEXE_WErr
  3509.  
  3510. ;               Datenblock aus Write-Datei lesen
  3511. ;
  3512. WriteEXE_RNext: mov     ah, DOS_READ_FROM_HANDLE
  3513.         mov     bx, hWrite
  3514.         mov     cx, CBBUFFER
  3515.         mov     dx, OFFSET abBuffer
  3516.         int     DOS_FUNCTION
  3517.         jc      WriteEXE_RErr
  3518.         or      ax, ax
  3519.         je      WriteEXE_Done
  3520.  
  3521. ;               Restlänge vermindern
  3522. ;
  3523.         sub     WORD PTR cbLoWrite, ax
  3524.         jnc     WriteEXE_WNext
  3525.         dec     WORD PTR cbHiWrite
  3526.  
  3527. ;               Datenblock in EXE-Datei schreiben
  3528. ;
  3529. WriteEXE_WNext: mov     bx, hEXE
  3530.         mov     cx, ax
  3531.         mov     ah, DOS_WRITE_TO_HANDLE
  3532.         mov     dx, OFFSET abBuffer
  3533.         int     DOS_FUNCTION
  3534.         jc      WriteEXE_WErr
  3535.         cmp     ax, cx
  3536.         jne     WriteEXE_WErr
  3537.         jmp     WriteEXE_RNext
  3538.  
  3539. ;               Kontrolle, ob die ganze Datei kopiert wurde
  3540. ;
  3541. WriteEXE_Done:  cmp     cbLoWrite, 0
  3542.         jne     WriteEXE_CErr
  3543.         cmp     cbHiWrite, 0
  3544.         jne     WriteEXE_Cerr
  3545.         jmp     WriteEXE_End
  3546.  
  3547. WriteEXE_CErr:  mov     ah, DOS_WRITE_STRING
  3548.         mov     dx, OFFSET STRCOPYERROR
  3549.         int     DOS_FUNCTION
  3550.         stc
  3551.         jmp     WriteEXE_End
  3552.  
  3553. WriteEXE_RErr:  mov     ah, DOS_WRITE_STRING
  3554.         mov     dx, OFFSET STRREADERROR
  3555.         int     DOS_FUNCTION
  3556.         stc
  3557.         jmp     WriteEXE_End
  3558.  
  3559. WriteEXE_WErr:  mov     ah, DOS_WRITE_STRING
  3560.         mov     dx, OFFSET STRWRITEERROR
  3561.         int     DOS_FUNCTION
  3562.         stc
  3563.  
  3564. WriteEXE_End:   popa
  3565.         ret
  3566. WriteEXE        ENDP
  3567.  
  3568. Code            ENDS
  3569.  
  3570.         END     Main
  3571.