' Name  :   HUKF       ( Haie und kleine Fische )
' Zweck :   Simulation eines R„uber - Beute - Systems
' Von   :   H. Pape
'
initialisieren_und_dimensionieren
begruessen
tabellen_belegen
'
DO
  '
  neustart
  parameter_holen
  anfangsbelegung
  '
  ticks%=0         ! alle 4000 Pl„tze einmal bearbeiten vergr”žert ticks% um 1
  ticks2%=0        ! fr Merkzwecke
  t%=TIMER         ! um die Zeit je Tick zu bestimmen
  ein_tick&=FALSE
  '
  reg%(3)=0                          ! Einzelschritt aus
  reg%(12)=VARPTR(par&(8))           ! zeigt auf Anfang der Fischbilder
  r_a6%=VARPTR(l%(0))                ! zeigt auf Anfang der Hauptliste
  r_a5%=VARPTR(zuf&(0))              ! zeigt auf Anfang der Zufallszahlenliste
  '
  DO
    '
    INC ticks%
    '
    reg%(14)=r_a6%
    reg%(13)=r_a5%+2*RAND(12000) ! zeigt jetzt mitten in die Zufallszahlenliste
    '
    INSERT kf&(0)=par&(0)                   ! Anzahl kleine Fische
    INSERT haie&(0)=par&(1)                 ! Anzahl Haie
    '
    IF INP?(2) OR ein_tick&=TRUE
      taste
      EXIT IF e|=225                        ! Undo  -->  Programmende
      EXIT IF e|=110                        ! N     -->  Neustart
    ENDIF
    '
    IF mode&=0                              ! Ozean darstellen
      RCALL m_mit_bild%,reg%()
    ELSE IF mode&=1                         ! Funktion darstellen
      RCALL m_ohne_bild%,reg%()
      funktion
    ELSE                                    ! Phasendiagramm darstellen
      RCALL m_ohne_bild%,reg%()
      phasendiagramm
    ENDIF
    '
  LOOP
  '
  EXIT IF e|=225                            ! Undo  -->  Programmende
  '
LOOP
'
SETMOUSE 320,200
'
PROCEDURE initialisieren_und_dimensionieren
  '
  ' Zwei Listen, in denen jeweils die Anzahl von Haien und kleinen Fischen
  ' fr die letzten 608 Ticks gespeichert werden. Nach jedem Tick wird die
  ' neue Anzahl beim Index 0 eingefgt.
  '
  DIM haie&(607),kf&(607)
  '
  '
  ' Um den aus kleinen Haien zusammengesetzten grožen Hai im Titel
  ' zu zeichnen, werden zwei extra Haibilder und ein Fischbild ben”tigt.
  '
  DIM haibild1|(6),haibild2|(6),fischbild|(3)
  '
  '
  ' l%() ist die Hauptliste des Programms. Fr jeden der 4000 Bildschirmpl„tze
  ' stehen dort 10 Langworte. Diese enthalten (am Beispiel des ersten):
  '
  ' l%(0) ... Belegung des Platzes.
  ' l%(1) ... Zeiger auf das oberste Byte des Bildschirmquadrates.
  '
  ' l%(2) ... Zeiger auf das Belegungswort des linken Nachbarplatzes.
  ' l%(3) ... Zeiger auf das Belegungswort des rechten Nachbarplatzes.
  ' l%(4) ... Zeiger auf das Belegungswort des oberen Nachbarplatzes.
  ' l%(5) ... Zeiger auf das Belegungswort des unteren Nachbarplatzes.
  '
  ' Die zuf„llige Auswahl eines Nachbarplatzes wird einfacher,
  ' wenn zwei aufeinanderfolgende Listen vorhanden sind. Also:
  '
  ' l%(6) ... Zeiger auf das Belegungswort des linken Nachbarplatzes.
  ' l%(7) ... Zeiger auf das Belegungswort des rechten Nachbarplatzes.
  ' l%(8) ... Zeiger auf das Belegungswort des oberen Nachbarplatzes.
  ' l%(9) ... Zeiger auf das Belegungswort des unteren Nachbarplatzes.
  '
  DIM l%(39999)
  '
  '
  ' zuf&() enth„lt Zufallszahlen, und zwar 0, 8, 16 oder 24.
  '
  DIM zuf&(31999)
  '
  '
  ' par&() enth„lt die Programmparameter (s. PROC parameter_holen) und
  ' die Bilder von Fischen und Haien.
  '
  ' par&(0)  ... par&(7)  :  Parameter
  ' par&(8)  ... par&(23) :  Kleine Fische (4x8 Bytes)
  ' par&(24) ... par&(39) :  Haibilder (4x8 Bytes)
  '
  DIM par&(39)
  '
  '
  ' reg%() ist der an das Maschinenprogramm bergebene Registersatz.
  '
  DIM reg%(16)
  '
  '
  ' Zeiger auf das erste Byte des Bildschirms (ganz links oben):
  '
  bildanfang%=XBIOS(2)
  '
  '
  ' Dieses Langwort wird beim Linksschieben des Funktionsgraphen gebraucht:
  '
  schiebanf%=bildanfang%+389*80+78
  '
  '
  ' Zum Speichern von Bildern auf Diskette brauchen wir einen ...
  '
  pfad$=CHR$(GEMDOS(25)+65)+":"+DIR$(0)+"\*.*"
  '
  '
  ' Maschinenprogramm fr einen vollst„ndigen Durchlauf (ein Tick) ber
  ' alle 4000 Pl„tze mit Darstellung des Ozeans:
  '
  m_mit_bild$=""
  DO
    READ i%
    EXIT IF i%=-1
    m_mit_bild$=m_mit_bild$+MKI$(i%)
  LOOP
  m_mit_bild%=V:m_mit_bild$          ! Startadresse des Maschinenprogramms
  '
  ' Das Maschinenprogramm:
  '
  DATA $3C3C, $0F9F, $7000, $41EE, $0002, $1080, $41E8, $0028, $51CE, $FFF8
  DATA $3C3C, $0F9F, $3A16, $6700, $063A, $4A2E, $0002, $6600, $0632, $4A43
  DATA $674C, $7204, $226E, $0004, $7007, $4611, $43E9, $0050, $51C8, $FFF8
  DATA $51C8, $FFFE, $51C9, $FFEA, $3F3C, $0007, $4E41, $548F, $B03C, $007A
  DATA $6602, $4283, $3F3C, $0001, $3F3C, $000E, $4E4E, $588F, $2040, $42A8
  DATA $0006, $226E, $0004, $7207, $4611, $43E9, $0050, $51C9, $FFF8, $4A45
  DATA $6B00, $04DA, $5345, $6700, $0408, $BA6C, $FFFE, $6B00, $0282, $47EE
  DATA $0008, $301D, $E240, $D6C0, $245B, $3012, $6F52, $245B, $3012, $6F4C
  DATA $245B, $3012, $6F46, $2453, $3012, $6F40, $47EC, $0020, $D6DD, $226E
  DATA $0004, $129B, $43E9, $0050, $129B, $43E9, $0050, $129B, $43E9, $0050
  DATA $129B, $43E9, $0050, $129B, $43E9, $0050, $129B, $43E9, $0050, $1293
  DATA $3C85, $536E, $0002, $6604, $526E, $0002, $6000, $056C, $536E, $0002
  DATA $6700, $00EC, $3212, $6600, $0070, $3485, $356E, $0002, $0002, $462A
  DATA $0002, $4296, $226E, $0004, $4200, $1280, $43E9, $0050, $1280, $43E9
  DATA $0050, $1280, $43E9, $0050, $1280, $43E9, $0050, $1280, $43E9, $0050
  DATA $1280, $43E9, $0050, $1280, $47EC, $0020, $D6DD, $226A, $0004, $129B
  DATA $43E9, $0050, $129B, $43E9, $0050, $129B, $43E9, $0050, $129B, $43E9
  DATA $0050, $129B, $43E9, $0050, $129B, $43E9, $0050, $1293, $6000, $04F0
  DATA $3812, $3485, $356E, $0002, $0002, $462A, $0002, $3C84, $426E, $0002
  DATA $264C, $D6DD, $226E, $0004, $129B, $43E9, $0050, $129B, $43E9, $0050
  DATA $129B, $43E9, $0050, $129B, $43E9, $0050, $129B, $43E9, $0050, $129B
  DATA $43E9, $0050, $1293, $47EC, $0020, $D6DD, $226A, $0004, $129B, $43E9
  DATA $0050, $129B, $43E9, $0050, $129B, $43E9, $0050, $129B, $43E9, $0050
  DATA $129B, $43E9, $0050, $129B, $43E9, $0050, $1293, $6000, $047A, $526C
  DATA $FFF2, $47EE, $0008, $301D, $E240, $D6C0, $225B, $3011, $6B00, $0096
  DATA $225B, $3011, $6B00, $008E, $225B, $3011, $6B00, $0086, $2253, $3011
  DATA $6B00, $007E, $34AC, $FFFE, $356C, $FFFA, $0002, $462A, $0002, $3CAC
  DATA $FFFE, $3D6C, $FFFC, $0002, $47EC, $0020, $D6DD, $226E, $0004, $129B
  DATA $43E9, $0050, $129B, $43E9, $0050, $129B, $43E9, $0050, $129B, $43E9
  DATA $0050, $129B, $43E9, $0050, $129B, $43E9, $0050, $1293, $47EC, $0020
  DATA $D6DD, $226A, $0004, $129B, $43E9, $0050, $129B, $43E9, $0050, $129B
  DATA $43E9, $0050, $129B, $43E9, $0050, $129B, $43E9, $0050, $129B, $43E9
  DATA $0050, $1293, $6000, $03D0, $536C, $FFF0, $2449, $34AC, $FFF8, $356C
  DATA $FFFA, $0002, $462A, $0002, $3CAC, $FFFE, $3D6C, $FFFC, $0002, $47EC
  DATA $0020, $D6DD, $226E, $0004, $129B, $43E9, $0050, $129B, $43E9, $0050
  DATA $129B, $43E9, $0050, $129B, $43E9, $0050, $129B, $43E9, $0050, $129B
  DATA $43E9, $0050, $1293, $47EC, $0020, $D6DD, $226A, $0004, $129B, $43E9
  DATA $0050, $129B, $43E9, $0050, $129B, $43E9, $0050, $129B, $43E9, $0050
  DATA $129B, $43E9, $0050, $129B, $43E9, $0050, $1293, $6000, $034E, $47EE
  DATA $0008, $301D, $E240, $D6C0, $245B, $3012, $6B00, $00F0, $245B, $3012
  DATA $6B00, $00E8, $245B, $3012, $6B00, $00E0, $2453, $3012, $6B00, $00D8
  DATA $47EE, $0008, $301D, $E240, $D6C0, $245B, $3012, $6752, $245B, $3012
  DATA $674C, $245B, $3012, $6746, $2453, $3012, $6740, $47EC, $0020, $D6DD
  DATA $226E, $0004, $129B, $43E9, $0050, $129B, $43E9, $0050, $129B, $43E9
  DATA $0050, $129B, $43E9, $0050, $129B, $43E9, $0050, $129B, $43E9, $0050
  DATA $1293, $536E, $0002, $6604, $526E, $0002, $3C85, $6000, $02C2, $536E
  DATA $0002, $6604, $526E, $0002, $3C85, $2496, $462A, $0002, $4296, $47EC
  DATA $0020, $D6DD, $226A, $0004, $129B, $43E9, $0050, $129B, $43E9, $0050
  DATA $129B, $43E9, $0050, $129B, $43E9, $0050, $129B, $43E9, $0050, $129B
  DATA $43E9, $0050, $1293, $226E, $0004, $4200, $1280, $43E9, $0050, $1280
  DATA $43E9, $0050, $1280, $43E9, $0050, $1280, $43E9, $0050, $1280, $43E9
  DATA $0050, $1280, $43E9, $0050, $1280, $6000, $024E, $536C, $FFF0, $536E
  DATA $0002, $6604, $526E, $0002, $34AC, $FFF8, $356E, $0002, $0002, $462A
  DATA $0002, $4296, $47EC, $0020, $D6DD, $226A, $0004, $129B, $43E9, $0050
  DATA $129B, $43E9, $0050, $129B, $43E9, $0050, $129B, $43E9, $0050, $129B
  DATA $43E9, $0050, $129B, $43E9, $0050, $1293, $226E, $0004, $4200, $1280
  DATA $43E9, $0050, $1280, $43E9, $0050, $1280, $43E9, $0050, $1280, $43E9
  DATA $0050, $1280, $43E9, $0050, $1280, $43E9, $0050, $1280, $6000, $01D0
  DATA $47EE, $0008, $301D, $E240, $D6C0, $245B, $3012, $6B48, $245B, $3012
  DATA $6B42, $245B, $3012, $6B3C, $2453, $3012, $6B36, $536C, $FFF2, $4296
  DATA $226E, $0004, $4200, $1280, $43E9, $0050, $1280, $43E9, $0050, $1280
  DATA $43E9, $0050, $1280, $43E9, $0050, $1280, $43E9, $0050, $1280, $43E9
  DATA $0050, $1280, $6000, $0178, $536C, $FFF0, $34AC, $FFFE, $356E, $0002
  DATA $0002, $462A, $0002, $4296, $226E, $0004, $4200, $1280, $43E9, $0050
  DATA $1280, $43E9, $0050, $1280, $43E9, $0050, $1280, $43E9, $0050, $1280
  DATA $43E9, $0050, $1280, $43E9, $0050, $1280, $47EC, $0020, $D6DD, $226A
  DATA $0004, $129B, $43E9, $0050, $129B, $43E9, $0050, $129B, $43E9, $0050
  DATA $129B, $43E9, $0050, $129B, $43E9, $0050, $129B, $43E9, $0050, $1293
  DATA $6000, $0104, $47EE, $0008, $301D, $E240, $D6C0, $245B, $3012, $674C
  DATA $245B, $3012, $6746, $245B, $3012, $6740, $2453, $3012, $673A, $264C
  DATA $D6DD, $226E, $0004, $129B, $43E9, $0050, $129B, $43E9, $0050, $129B
  DATA $43E9, $0050, $129B, $43E9, $0050, $129B, $43E9, $0050, $129B, $43E9
  DATA $0050, $1293, $5245, $6602, $5345, $3C85, $6000, $00A8, $264C, $D6DD
  DATA $226A, $0004, $129B, $43E9, $0050, $129B, $43E9, $0050, $129B, $43E9
  DATA $0050, $129B, $43E9, $0050, $129B, $43E9, $0050, $129B, $43E9, $0050
  DATA $1293, $5245, $6640, $526C, $FFF0, $34AC, $FFF6, $462A, $0002, $3CAC
  DATA $FFF4, $264C, $D6DD, $226E, $0004, $129B, $43E9, $0050, $129B, $43E9
  DATA $0050, $129B, $43E9, $0050, $129B, $43E9, $0050, $129B, $43E9, $0050
  DATA $129B, $43E9, $0050, $1293, $6034, $3485, $462A, $0002, $4256, $226E
  DATA $0004, $4200, $1280, $43E9, $0050, $1280, $43E9, $0050, $1280, $43E9
  DATA $0050, $1280, $43E9, $0050, $1280, $43E9, $0050, $1280, $43E9, $0050
  DATA $1280, $4DEE, $0028, $51CE, $F9BC, $4E75, -1
  '
  '
  ' Maschinenprogramm fr einen Tick ohne Darstellung des Ozeans:
  '
  m_ohne_bild$=""
  DO
    READ i%
    EXIT IF i%=-1
    m_ohne_bild$=m_ohne_bild$+MKI$(i%)
  LOOP
  m_ohne_bild%=V:m_ohne_bild$
  '
  ' Das Maschinenprogramm:
  '
  DATA $3C3C, $0F9F, $7000, $41EE, $0002, $1080, $41E8, $0028, $51CE, $FFF8
  DATA $3C3C, $0F9F, $3A16, $6700, $021A, $4A2E, $0002, $6600, $0212, $4A45
  DATA $6B00, $01C0, $5345, $6700, $0176, $BA6C, $FFFE, $6B00, $00D8, $47EE
  DATA $0008, $301D, $E240, $D6C0, $245B, $3012, $6F22, $245B, $3012, $6F1C
  DATA $245B, $3012, $6F16, $2453, $3012, $6F10, $3C85, $536E, $0002, $6604
  DATA $526E, $0002, $6000, $01CC, $536E, $0002, $6700, $0032, $3212, $6600
  DATA $0014, $3485, $356E, $0002, $0002, $462A, $0002, $4296, $6000, $01AC
  DATA $3812, $3485, $356E, $0002, $0002, $462A, $0002, $3C84, $426E, $0002
  DATA $6000, $0194, $526C, $FFF2, $47EE, $0008, $301D, $E240, $D6C0, $225B
  DATA $3011, $6B00, $0036, $225B, $3011, $6B00, $002E, $225B, $3011, $6B00
  DATA $0026, $2253, $3011, $6B00, $001E, $34AC, $FFFE, $356C, $FFFA, $0002
  DATA $462A, $0002, $3CAC, $FFFE, $3D6C, $FFFC, $0002, $6000, $014A, $536C
  DATA $FFF0, $2449, $34AC, $FFF8, $356C, $FFFA, $0002, $462A, $0002, $3CAC
  DATA $FFFE, $3D6C, $FFFC, $0002, $6000, $0128, $47EE, $0008, $301D, $E240
  DATA $D6C0, $245B, $3012, $6B00, $0064, $245B, $3012, $6B00, $005C, $245B
  DATA $3012, $6B00, $0054, $2453, $3012, $6B00, $004C, $47EE, $0008, $301D
  DATA $E240, $D6C0, $245B, $3012, $6722, $245B, $3012, $671C, $245B, $3012
  DATA $6716, $2453, $3012, $6710, $536E, $0002, $6604, $526E, $0002, $3C85
  DATA $6000, $00CC, $536E, $0002, $6604, $526E, $0002, $3C85, $2496, $462A
  DATA $0002, $4296, $6000, $00B4, $536C, $FFF0, $536E, $0002, $6604, $526E
  DATA $0002, $34AC, $FFF8, $356E, $0002, $0002, $462A, $0002, $4296, $6000
  DATA $0092, $47EE, $0008, $301D, $E240, $D6C0, $245B, $3012, $6B1C, $245B
  DATA $3012, $6B16, $245B, $3012, $6B10, $2453, $3012, $6B0A, $536C, $FFF2
  DATA $4296, $6000, $0066, $536C, $FFF0, $34AC, $FFFE, $356E, $0002, $0002
  DATA $462A, $0002, $4296, $6000, $004E, $47EE, $0008, $301D, $E240, $D6C0
  DATA $245B, $3012, $671E, $245B, $3012, $6718, $245B, $3012, $6712, $2453
  DATA $3012, $670C, $5245, $6602, $5345, $3C85, $6000, $0020, $5245, $6612
  DATA $526C, $FFF0, $34AC, $FFF6, $462A, $0002, $3CAC, $FFF4, $6008, $3485
  DATA $462A, $0002, $4256, $4DEE, $0028, $51CE, $FDDC, $4E75, -1
  '
  '
  ' Maschinenprogramm zum Linksschieben des Funktionsgraphen:
  '
  m_schieb$=""
  DO
    READ i%
    EXIT IF i%=-1
    m_schieb$=m_schieb$+MKI$(i%)
  LOOP
  m_schieb%=V:m_schieb$
  '
  ' Das Maschinenprogramm:
  '
  DATA $3E3C, $016C, $44FC, $0000, $E5E3, $E5E3, $E5E3, $E5E3, $E5E3, $E5E3
  DATA $E5E3, $E5E3, $E5E3, $E5E3, $E5E3, $E5E3, $E5E3, $E5E3, $E5E3, $E5E3
  DATA $E5E3, $E5E3, $E5E3, $E5E3, $E5E3, $E5E3, $E5E3, $E5E3, $E5E3, $E5E3
  DATA $E5E3, $E5E3, $E5E3, $E5E3, $E5E3, $E5E3, $E5E3, $E5E3, $E5E3, $E5E3
  DATA $E5E3, $E5E3, $598B, $51CF, $FFAC, $4E75, -1
  '
  '
  ' Bilder fr den Titel lesen:
  '
  FOR n&=0 TO 6
    READ haibild1|(n&)
    haibild2|(n&)=haibild1|(n&)
  NEXT n&
  '
  DATA %11100000
  DATA %11111000
  DATA %11110000
  DATA %01111000
  DATA %01011000
  DATA %00000110
  DATA %00000100
  '
  FOR n&=0 TO 3
    READ fischbild|(n&)
  NEXT n&
  '
  DATA %00110000
  DATA %00110000
  DATA %00001100
  DATA %00001000
  '
  '
  ' Bilder fr das Maschinenprogramm lesen:
  '
  ' Achtung!   Sie werden als aufeinanderfolgende Bytes in der
  '            16 Bit Integerliste par&() ab par&(8) gespeichert !
  '
  tierbilder_anf%=V:par&(8)
  '
  FOR n&=0 TO 6                                    ! Fischbilder lesen
    READ byte|
    POKE tierbilder_anf%+n&,byte|
    READ byte|
    POKE tierbilder_anf%+n&+8,byte|
    READ byte|
    POKE tierbilder_anf%+n&+16,byte|
    READ byte|
    POKE tierbilder_anf%+n&+24,byte|
  NEXT n&
  '
  ' 4 Bilder von kleinen Fischen:
  '
  DATA %00000000,%00000000,%00000000,%00000000
  DATA %00000000,%00000000,%00000000,%00000000
  DATA %00110000,%00001100,%00001000,%00010000
  DATA %00110000,%00001100,%00001100,%00110000
  DATA %00001100,%00110000,%00110000,%00001100
  DATA %00001000,%00010000,%00110000,%00001100
  DATA %00000000,%00000000,%00000000,%00000000
  '
  '
  FOR n&=0 TO 6                                    ! Haibilder lesen
    READ byte|
    POKE tierbilder_anf%+n&+32,byte|
    READ byte|
    POKE tierbilder_anf%+n&+40,byte|
    READ byte|
    POKE tierbilder_anf%+n&+48,byte|
    READ byte|
    POKE tierbilder_anf%+n&+56,byte|
  NEXT n&
  '
  ' 4 Bilder von Haien:
  '
  DATA %11100000,%00001110,%00000100,%01000000
  DATA %11111000,%00111110,%00000110,%11000000
  DATA %11110000,%00011110,%01011000,%00110100
  DATA %01111000,%00111100,%01111000,%00111100
  DATA %01011000,%00110100,%11110000,%00011110
  DATA %00000110,%11000000,%11111000,%00111110
  DATA %00000100,%01000000,%11100000,%00001110
  '
RETURN
'
PROCEDURE begruessen
  '
  SETMOUSE 639,399                          ! Maus beiseite schieben
  CLS
  SOUND 1,15,1,1
  WAVE 1,1,13,500
  DEFTEXT 1,20,0,32
  TEXT 80,40,125,"Haie"
  '
  ' grožen Hai aus 22 kleinen zeichnen:
  '
  n&=0
  REPEAT
    x&=RAND(8)
    y&=RAND(7)
    IF BTST(haibild1|(y&),x&)
      haibild1|(y&)=BCLR(haibild1|(y&),x&)
      INC n&
      PAUSE 5
      FOR b&=0 TO 6
        POKE bildanfang%+6422+640*y&-x&+b&*80,haibild2|(b&)
      NEXT b&
    ENDIF
  UNTIL n&=22
  '
  WAVE 1,1,0,3000
  DELAY 1
  DEFTEXT 1,0,0,13
  TEXT 260,40,0,"und"
  DELAY 1
  '
  ' vier Fische aus jeweils 7 kleinen Fischen zeichnen:
  '
  FOR n&=0 TO 3
    PRINT CHR$(7)
    FOR x&=0 TO 7
      FOR y&=0 TO 3
        IF BTST(fischbild|(y&),7-x&)
          FOR b&=0 TO 3
            POKE bildanfang%+n&*8+6920+640*y&+x&+b&*80,fischbild|(b&)
          NEXT b&
        ENDIF
      NEXT y&
    NEXT x&
    DELAY 0.5
  NEXT n&
  '
  DELAY 1
  DEFTEXT 1,2,0,13
  TEXT 370,40,0,"kleine Fische"
  DEFTEXT 1,1,0,13
  DELAY 2
  TEXT 245,200,150,"Simulation"
  DELAY 1
  '
  ' Umrahmung langsam zeichnen:
  '
  y&=175
  FOR x&=220 TO 420
    PAUSE 0
    PLOT x&,y&
  NEXT x&
  '
  x&=420
  FOR y&=175 TO 215
    PAUSE 0
    PLOT x&,y&
  NEXT y&
  '
  y&=215
  FOR x&=420 TO 220 STEP -1
    PAUSE 0
    PLOT x&,y&
  NEXT x&
  '
  x&=220
  FOR y&=215 TO 175 STEP -1
    PAUSE 0
    PLOT x&,y&
  NEXT y&
  '
  DELAY 1
  DEFTEXT 1,1,0,13
  LOCATE 10,17
  a$="Nach       >> Spektrum der Wissenschaft <<       Februar 1985"
  FOR n&=1 TO LEN(a$)
    PAUSE 3
    PRINT MID$(a$,n&,1);
  NEXT n&
  '
  DELAY 1
  PRINT AT(30,21);"Einen Moment bitte"
  PRINT AT(10,24);"Bedienungshinweise erhalten Sie mit der Taste"
  PRINT AT(60,23);"Help"
  BOX 465,347,545,385
  '
RETURN
'
PROCEDURE tabellen_belegen
  '
  ' HUKF verwendet eine Tabelle von 10 * 4000 Langworten zu je 32 Bit.
  '
  ' l%(0, 10, 20, ...) enth„lt die Belegung fr einen der
  ' 8*8 Punkte grožen Pl„tze auf dem Bildschirm.
  '
  ' Dabei bedeuten:
  '
  ' l%(x) = 0 :  Platz frei        (alle 32 Bit gleich Null!)
  ' l%(x) < 0 :  kleiner Fisch
  ' l%(x) > 0 :  Hai
  '
  ' l%(1, 11, 21, ...) enth„lt einen 32 Bit Zeiger auf die zugeh”rige
  ' Stelle des Bildschirms, und zwar auf das oberste Byte des Quadrates.
  '
  ' l%(2, 3, 4, 5, 6, 7, 8, 9) enth„lt 8 Zeiger in die Liste l%(),
  ' und zwar deutet
  ' l%(2) auf den linken Nachbarn des Platzes, der in l%(0) steht.
  ' Entsprechend deutet l%(3) auf den rechten Nachbarn.
  ' Entsprechend deutet l%(4) auf den oberen Nachbarn.
  ' Entsprechend deutet l%(5) auf den unteren Nachbarn.
  ' l%(6) deutet wieder auf den linken Nachbarn,
  ' l%(7) auf den rechten, l%(8) auf den oberen
  ' und l%(9) auf den unteren.
  '
  ' Durch diese Wiederholung wird die Suche nach freien Pl„tzen
  ' bzw. kleinen Fischen einfacher und schneller.
  '
  ' Zuerst mssen alle Zeiger erzeugt werden.
  ' Damit sp„ter am Bildschirm die Bearbeitung scheinbar regellos erfolgt,
  ' sind die Bildschirmpl„tze in der Liste nicht ordentlich zeilenweise,
  ' sondern gemischt eingetragen.
  '
  ' Zun„chst wird jeder Platz mit seiner Nummer belegt:
  '
  FOR n%=0 TO 3999
    l%(10*n%)=n%
  NEXT n%
  '
  ' dann wird gemischt:
  '
  FOR n%=0 TO 39999 STEP 10
    SWAP l%(n%),l%(10*RAND(4000))
  NEXT n%
  '
  ' Jetzt tragen wir die Zeiger auf die Nachbarn ein.
  ' Dazu wird zun„chst eine Hilfsliste erzeugt, wozu die Pl„tze
  ' der sp„teren Zeiger in den Bildschirm benutzt werden:
  '
  FOR n%=0 TO 3999
    l%(10*l%(10*n%)+1)=n%
  NEXT n%
  '
  FOR n%=0 TO 39999 STEP 10
    '
    ' linker Nachbar:
    '
    p%=l%(n%)
    IF p% MOD 80=0
      p%=p%+80
    ENDIF
    l%(n%+2)=V:l%(10*l%(1+10*(p%-1)))
    l%(n%+6)=l%(n%+2)
    '
    ' rechter Nachbar:
    '
    p%=l%(n%)
    IF p% MOD 80=79
      p%=p%-80
    ENDIF
    l%(n%+3)=V:l%(10*l%(1+10*(p%+1)))
    l%(n%+7)=l%(n%+3)
    '
    ' Nachbar oben:
    '
    p%=l%(n%)
    IF p%<80
      p%=p%+4000
    ENDIF
    l%(n%+4)=V:l%(10*l%(1+10*(p%-80)))
    l%(n%+8)=l%(n%+4)
    '
    ' Nachbar unten:
    '
    p%=l%(n%)
    IF p%>3919
      p%=p%-4000
    ENDIF
    l%(n%+5)=V:l%(10*l%(1+10*(p%+80)))
    l%(n%+9)=l%(n%+5)
    '
  NEXT n%
  '
  ' Die Liste der Zeiger auf den Bildschirm erstellen:
  '
  FOR n%=0 TO 39999 STEP 10
    l%(n%+1)=INT(l%(n%)/80)*640+(l%(n%) MOD 80)+bildanfang%
  NEXT n%
  '
  ' Eine Liste von Zufallszahlen erzeugen:
  '
  FOR i%=0 TO 31999
    zuf&(i%)=8*RAND(4)
  NEXT i%
  '
RETURN
'
PROCEDURE hilfe
  '
  CLS
  PRINT
  PRINT " Kleine Fische: ";STR$(kf&(0),4);"     Haie: ";
  PRINT STR$(haie&(0),4);"     Ticks: ";STR$(ticks%,6);
  t%=5*INT((TIMER-t%)/(ticks%-ticks2%))
  IF t%<300
    t$=STR$(t%,4)
  ELSE
    t$="--- "
  ENDIF
  PRINT "     Zeit je Tick: ";t$;"ms";
  PRINT
  PRINT
  PRINT "    Taste:                          Wirkung:"
  PRINT
  PRINT "    Help                    Zeigt diesen Bildschirm"
  PRINT
  PRINT "     N                      Neustart des Programms"
  PRINT
  PRINT "     T                      Einzelne Ticks  ein / aus"
  PRINT
  PRINT "     Z                      Einzelschritte  ein / aus"
  PRINT
  PRINT "     P                      Phasendiagramm zeigen"
  PRINT
  PRINT "     F                      Funktionsdarstellung zeigen"
  PRINT
  PRINT "     O                      Ozean zeigen"
  PRINT
  PRINT "     E                      Eingriff vornehmen"
  PRINT
  PRINT "     S                      Speichere das jeweils dargestellte Bild"
  PRINT
  PRINT "    Undo                    Programmende"
  e|=INP(2)
  CLS
  '
RETURN
'
PROCEDURE parameter_holen
  '
  PRINT "    Mit  Return  k”nnen Sie die voreingestellten Werte bernehmen"
  PRINT
  PRINT " Wieviele kleine Fische         ( max.  4000";
  PRINT "     jetzt: ";STR$(par&(0),5);" ) ";
  INPUT e$
  IF e$<>""
    par&(0)=MIN(INT(ABS(VAL(e$))),4000)
  ENDIF
  '
  par&(1)=MIN(par&(1),4000-par&(0))
  PRINT
  PRINT " Wieviele Haie                  ( max. ";STR$(4000-par&(0),5);
  PRINT "     jetzt: ";STR$(par&(1),5);" ) ";
  INPUT e$
  IF e$<>""
    par&(1)=MIN(INT(ABS(VAL(e$))),4000-par&(0))
  ENDIF
  '
  PRINT
  PRINT " Wie lange dauert es, bis sich ein kleiner Fisch"
  PRINT " zum erstenmal vermehrt         ( max.    99     jet";
  PRINT "zt: ";STR$(-par&(2)-1,5);" ) ";
  INPUT e$
  IF e$<>""
    par&(2)=-(MIN(INT(ABS(VAL(e$))),99)+1)
  ENDIF
  '
  PRINT
  PRINT " In welchem zeitlichen Abstand vermehrt sich"
  PRINT " ein kleiner Fisch              ( max.    99     jet";
  PRINT "zt: ";STR$(-par&(3)-1,5);" ) ";
  INPUT e$
  IF e$<>""
    par&(3)=-(MIN(INT(ABS(VAL(e$))),99)+1)
  ENDIF
  '
  PRINT
  PRINT " Wie lange dauert es, bis sich ein Hai"
  PRINT " zum erstenmal vermehrt         ( max.    99     jet";
  PRINT "zt: ";STR$(par&(6)-1,5);" ) ";
  INPUT e$
  IF e$<>""
    par&(6)=MIN(INT(ABS(VAL(e$))),99)+1
  ENDIF
  '
  PRINT
  PRINT " In welchem zeitlichen Abstand"
  PRINT " vermehrt sich ein Hai          ( max.    99     jet";
  PRINT "zt: ";STR$(par&(5)-1,5);" ) ";
  INPUT e$
  IF e$<>""
    par&(5)=MIN(INT(ABS(VAL(e$))),99)+1
  ENDIF
  '
  PRINT
  PRINT " Wie lange ist ein Hai satt"
  PRINT " und frižt nichts               ( max.    99     jet";
  PRINT "zt: ";STR$(satt&,5);" ) ";
  INPUT e$
  IF e$<>""
    satt&=MIN(INT(ABS(VAL(e$))),99)
  ENDIF
  '
  PRINT
  PRINT " Wie lange kann ein Hai"
  PRINT " hungern                        ( max.    99     jet";
  PRINT "zt: ";STR$(par&(7)-1,5);" ) ";
  INPUT e$
  IF e$<>""
    par&(7)=MIN(INT(ABS(VAL(e$))),99)+1
  ENDIF
  CLS
  '
  par&(4)=par&(7)+satt&
  '
RETURN
'
PROCEDURE funktion
  '
  PRINT AT(34,1);STR$(haie&(0),4);
  PRINT AT(54,1);STR$(kf&(0),4);
  PRINT AT(73,1);STR$(ticks%,7);
  '
  reg%(11)=schiebanf%                ! Prozessorregister A3
  RCALL m_schieb%,reg%()
  '
  DRAW 621,389-haie&(1)/11 TO 622,389-haie&(0)/11
  DRAW 621,389-kf&(1)/11 TO 622,389-kf&(0)/11
  '
RETURN
'
PROCEDURE phasendiagramm
  '
  x1&=kf&(1)/11
  x0&=kf&(0)/11
  y1&=haie&(1)/11
  y0&=haie&(0)/11
  '
  DRAW x1&+101,389-y1& TO x0&+101,389-y0&
  '
  PRINT AT(5,4);STR$(haie&(0),4)
  PRINT AT(68,24);STR$(kf&(0),4)
  PRINT AT(66,4);STR$(ticks%,7)
  '
RETURN
'
PROCEDURE bild_speichern
  '
  SETMOUSE 460,320
  b$="Bild im Screenformat schreiben"
  FILESELECT #b$,pfad$,"BILD",file$
  IF file$<>"" AND RIGHT$(file$)<>"\"
    BSAVE file$,bildanfang%,32000
    pos=RINSTR(file$,"\")
    pfad$=LEFT$(file$,pos)+"*.*"
  ENDIF
  '
RETURN
'
PROCEDURE phasendiagramm_beginnen
  '
  CLS
  DEFLINE 1,1,0,1
  DRAW 100,390 TO 100,5
  DRAW 100,390 TO 500,390
  PRINT AT(65,22);"kleine Fische"
  PRINT AT(5,2);"Haie"
  PRINT AT(69,2);"Ticks"
  DEFLINE 1,1,0,0
  '
  FOR n&=0 TO 4000 STEP 1000
    DRAW 95,389-n&/11 TO 99,389-n&/11       ! Kleine Striche auf der Hochachse
    DRAW 101+n&/11,391 TO 101+n&/11,395     ! dito auf der Rechtsachse
  NEXT n&
  '
  y&=haie&(0)/11                            ! Kurve der bisherigen
  x&=kf&(0)/11                              ! Werte zeichnen
  DRAW x&+101,389-y&
  FOR grafzeiger&=1 TO 500
    y&=haie&(grafzeiger&)/11
    x&=kf&(grafzeiger&)/11
    DRAW  TO x&+101,389-y&
  NEXT grafzeiger&
  '
RETURN
'
PROCEDURE funktionsdarstellung_beginnen
  '
  CLS
  DEFLINE 1,1,0,1
  DRAW 15,390 TO 15,5
  DRAW 15,390 TO 635,390
  DEFLINE 1,1,0,0
  '
  FOR n&=0 TO 4000 STEP 1000                ! kleine Striche auf der Hochachse
    DRAW 10,389-n&/11 TO 14,389-n&/11
  NEXT n&
  '
  PRINT AT(4,1);"Haie / k.F.             Haie:               k.F.:     ";
  PRINT "        Ticks:"
  PRINT AT(79,24);"t";
  '
  PRINT AT(34,1);STR$(haie&(0),4);
  PRINT AT(54,1);STR$(kf&(0),4);
  PRINT AT(73,1);STR$(ticks%,7);
  '
  DRAW 622,389-haie&(1)/11
  FOR grafzeiger&=2 TO 607
    DRAW  TO 623-grafzeiger&,389-haie&(grafzeiger&)/11
  NEXT grafzeiger&
  '
  DRAW 622,389-kf&(1)/11
  FOR grafzeiger&=2 TO 607
    DRAW  TO 623-grafzeiger&,389-kf&(grafzeiger&)/11
  NEXT grafzeiger&
  '
RETURN
'
PROCEDURE anfangsbelegung
  '
  ' Tabellen entsprechend den Eingabedaten belegen:
  '
  ' Kleine Fische:
  ' Eine negative Zahl in das linke 16-Bit Wort, deren Betrag die Zeit
  ' (gemessen in Ticks) bis zur Vermehrung angibt.
  '
  FOR n&=0 TO par&(0)-1
    DPOKE V:l%(10*n&),-RAND(-par&(2))-1
  NEXT n&
  '
  ' Haie:
  ' Die Zeit bis zum Verhungern in das linke 16-Bit Wort.
  ' Die Zeit bis zur Vermehrung in das rechte 16-Bit Wort.
  '
  FOR n&=par&(0) TO par&(0)+par&(1)-1
    h%=(RAND(par&(4))+1)
    h%=SWAP(h%)
    l%(10*n&)=h%+RAND(par&(6))+1
  NEXT n&
  '
  ' Freie Pl„tze:
  '
  FOR n&=par&(0)+par&(1) TO 3999
    l%(10*n&)=0
  NEXT n&
  '
RETURN
'
PROCEDURE belegung_aendern
  '
  freie_plaetze&=4000-kf&(0)-haie&(0)
  '
  ' Kleine Fische:
  '
  IF par&(0)>kf&(0)                  ! Es sollen mehr werden
    '
    diff&=par&(0)-kf&(0)
    diff&=MIN(diff&,freie_plaetze&)
    '
    n&=0
    WHILE diff&>0 AND n&<4000
      IF l%(10*n&)=0
        DPOKE V:l%(10*n&),-RAND(-par&(2))-1
        DEC diff&
      ENDIF
      INC n&
    WEND
    '
  ENDIF
  '
  IF par&(0)<kf&(0)                  ! Es sollen weniger werden
    '
    diff&=kf&(0)-par&(0)
    '
    n&=0
    WHILE diff&>0 AND n&<4000
      IF l%(10*n&)<0
        l%(10*n&)=0
        DEC diff&
      ENDIF
      INC n&
    WEND
    '
  ENDIF
  '
  par&(0)=0                          ! Wieviele kleine Fische haben wir jetzt ?
  FOR n&=0 TO 3999
    IF l%(10*n&)<0
      INC par&(0)
    ENDIF
  NEXT n&
  '
  freie_plaetze&=4000-par&(0)-haie&(0)
  '
  ' Haie:
  ' Vermehrung: h”herwertiges Byte
  ' Hunger: geringerwertiges Byte
  '
  IF par&(1)>haie&(0)                ! Es sollen mehr werden
    '
    diff&=par&(1)-haie&(0)
    diff&=MIN(diff&,freie_plaetze&)
    '
    n&=0
    WHILE diff&>0 AND n&<4000
      IF l%(10*n&)=0
        h%=(RAND(par&(4))+1)
        h%=SWAP(h%)
        l%(10*n&)=h%+RAND(par&(6))+1
        DEC diff&
      ENDIF
      INC n&
    WEND
    '
  ENDIF
  '
  IF par&(1)<haie&(0)                ! Es sollen weniger werden
    '
    diff&=haie&(0)-par&(1)
    '
    n&=0
    WHILE diff&>0 AND n&<4000
      IF l%(10*n&)>0
        l%(10*n&)=0
        DEC diff&
      ENDIF
      INC n&
    WEND
    '
  ENDIF
  '
  par&(1)=0                          ! Wieviele Haie haben wir jetzt ?
  FOR n&=0 TO 3999
    IF l%(10*n&)>0
      INC par&(1)
    ENDIF
  NEXT n&
  '
RETURN
'
PROCEDURE taste
  '
  e|=INP(2)                          ! Zeichen von Tastatur holen
  '
  REPEAT                             ! Tastaturpuffer leeren, um
  UNTIL INKEY$=""                    ! Nachlaufen zu verhindern
  '
  IF e|=226                          ! Help --> Bedienungshinweise
    hilfe
    bildneuaufbau&=TRUE
    IF e|=104 OR e|=115              ! Wenn der "hilfe" - bildschirm mit
      e|=32                          ! H oder S verlassen wird, soll das
    ENDIF                            ! nichts bewirken
  ENDIF
  '
  IF e|=116                          ! T --> Ein Tick bitte
    ein_tick&=NOT ein_tick&
  ENDIF
  '
  IF e|=122                          ! Z --> Einzelschritt ein
    reg%(3)=1                        ! d3 <> 0 setzen
  ENDIF
  '
  IF e|=101                          ! E --> Eingriff
    CLS
    PRINT
    parameter_holen
    belegung_aendern
    bildneuaufbau&=TRUE
  ENDIF
  '
  IF e|=112                          ! P --> Phasendiagramm
    mode&=2
    bildneuaufbau&=TRUE
  ENDIF
  '
  IF e|=102                          ! F --> Funktionsdarstellung
    mode&=1
    bildneuaufbau&=TRUE
  ENDIF
  '
  IF e|=111                          ! O --> Ozean darstellen
    CLS
    mode&=0
  ENDIF
  '
  IF e|=115                          ! S --> Bild speichern
    bild_speichern
  ENDIF
  '
  IF mode&=2 AND bildneuaufbau&=TRUE
    phasendiagramm_beginnen
    bildneuaufbau&=FALSE
  ENDIF
  '
  IF mode&=1 AND bildneuaufbau&=TRUE
    funktionsdarstellung_beginnen
    bildneuaufbau&=FALSE
  ENDIF
  '
  t%=TIMER
  ticks2%=ticks%
  '
RETURN
'
PROCEDURE neustart
  '
  anfangswerte
  CLS
  PRINT "                      Neustart des Programms"
  PRINT
  '
RETURN
'
PROCEDURE anfangswerte
  '
  mode&=0                             ! Ozean zeigen
  ARRAYFILL kf&(),0
  ARRAYFILL haie&(),0
  par&(0)=1000
  par&(1)=10
  par&(2)=-3
  par&(3)=-3
  par&(6)=10
  par&(5)=6
  par&(4)=8
  par&(7)=3
  satt&=5
  '
RETURN
