'
' SHOW.LST
'
' Dies ist ein kleines Demo-Programm, mit welchem Sie sich im Speicher
' reservierte Bilder ansehen k馬nen. Sie k馬nen es als Programm starten
' (mit der Endung "PRG" oder vom GFABASIC-Interpreter aus) oder als
' Accessory, wobei Sie es dann mit einem gepatchtem Compiler ｜ersetzen
' m《sen (siehe ACCPATCH.LST).
'
' Haben Sie das Programm gestartet, k馬nen Sie mit den Zifferntasten
' "1" - "9" jeweils das 1. - 9. reservierte Bild ansehen, vorrausgesetzt
' es wurden welche reserviert. Mit der "Esc"-Taste verlassen Sie das
' Programm wieder.
'
' Ich w］sche Ihnen hiermit noch viel Spa und Erfolg beim experimentieren
' mit diesem Programm.
'
'                                       Ihr Alexander Stork
'                                                   (Autor)
'
If @Menu_acc                                    !Als ACC geladen?
  Reserve 35000                                 !Speicher reservieren
  @Menu_register(@Menu_ap.id,"  Show me something") !ACC eintragen
Endif
'
Repeat
  If @Menu_acc                                  !ACC?
    Repeat                                      !Dann auf Message ...
      @Evnt_mesag                               !warten.
    Until @Evnt_mesag(0)=40                     !Verlasse bei '40'
  Endif
  '
  @Memo_getadr(*Adresse%,*Anzahl%,*Ext%)        !Bildadresse etc. ermitteln
  '
  If Adresse%>0                                 !Schon Bilder angemeldet?
    Sget Hgr$                                   !Hintergrund retten
    Cls                                         !Clear Screen
    Print At(10,4);"Dr…ken Sie eine Ziffer!"   !Eine kleine ...
    Print At(10,5);"'Esc' = Ende ..."           !Info ausgeben
    '
    Do
      I$=Inkey$                                 !Zeichen von Tastatur lesen ...
      I%=Val(I$)                                !und Zahlwert ermitteln
      '
      Exit If I$=Chr$(27)                       !Verlasse DO-LOOP mit "Esc"
      '
      If Len(I$)                                !Ist ein Zeichen da?
        If I%>=1 And I%<=Anzahl%                !Nur zulгsige Werte
          Dec I%
          Bmove Adresse%+I%*32000,Xbios(3),32000  !Bild anzeigen
        Else
          Out 2,7                               !Fehleingabe: Klingel
        Endif
      Endif
    Loop
    '
    Sput Hgr$                                   !Hintergrund restaurieren
  Else
    Alert 1,"Es sind momentan keine|Bilder im Speicher!",1,"   OK   ",Erg%
  Endif
Until @Menu_acc=0                               !Kein ACC -> zum Desktop
'
' =============================================================================
'                                 M E M O R Y                          12.05.89
' =============================================================================
'
' Wollen Sie mit eigenen Programmen an die reservierten Bilder herankommen,
' k馬nen Sie dies mit folgenden Routinen ganz einfach tun.
' Diese Routinen wurden in GFABASIC 2.0 geschrieben, sollten aber in der
' Version 3.0 ebenfalls laufen.
'
' Hier werden zunchst die einzelnen Routinen kurz dargestellt. Anschlie枡nd
' folgt dann deren Programmtext.
'
' Bsp.1: @Memo_getadr(*Adresse%,*Anzahl%,*Ext%)
'        Man erhlt die Startadresse und die Anzahl der Bilder sowie
'        eine Zusatzinformation (Integer, 2 Byte).
'
' Bsp.2: @Memo_putadr(Adresse%,5,0)
'        Falls Bilder reserviert wurden, k馬nen diese hier angemeldet werden.
'        In diesem Fall befinden sich 5 Bilder ab Adresse 'Adresse%'.
'        Als Zusatzinformation wird eine '0' ｜ergeben.
'
' Bsp.3: @Memo_putadr(Adresse%,12,-1)
'        Es werden neue Werte f〉 Adresse und Anzahl der Bilder gesetzt.
'        Die Zusatzinfo bleibt unverndert. Wenn negative Werte ｜ergeben
'        werden, bleibt der jeweilige Parameter unverndert.
'
' Bsp.4: @Memo_clradr
'        So werden die Informationen des Infospeichers gel敗cht, d.h. es
'        werden die ersten zwei Bytes der Kennung gel敗cht, so da die
'        restlichen Informationen von der Procedure Memo_getadr() nicht
'        mehr erkannt werden.
'
' So sieht das Format des 16 Byte langen Informationsspeichers aus. Er liegt
' hinter dem (phys.) Bildspeicher, also ab Xbios(2)+32000.
'
' PICTUREvaaaannee = 16Bytes
' |      ||   | |
' |      ||   | erweiterte Information (z.Zt.=0): Wort/14
' |      ||   Anzahl der Bilder: Wort/12
' |      |Adresse des 1. Bildes: Langwort/8
' |      Format-Version (=0): Byte/7
' Kennung: 7 Byte String/0
'
' Hier sind die Routinen zur Abfrage des Speichers:
'
Procedure Memo_getadr(Aptr.%,Nptr.%,Eptr.%)
  Local Adresse.%,Info$,Adr.%,Num.%,Ext.%       !Lokale Variablen
  '
  Info$=Space$(7)                               !7-Byte-String vorbereiten
  Adresse.%=Xbios(2)+32000                      !Adresse ermitteln
  Bmove Adresse.%,Varptr(Info$),7               !Kennung in String kopieren
  '
  If Info$="PICTURE" And Peek(Adresse.%+7)=0    !Kennung und Version abfragen
    Adr.%=Lpeek(Adresse.%+8)                    !Bildadresse ...
    Num.%=Dpeek(Adresse.%+12)                   !Anzahl der Bilder ...
    Ext.%=Dpeek(Adresse.%+14)                   !und Zusatzinformationen holen
    '                                           !(-> ist zur Zeit unbenutzt)
  Else
    Adr.%=-1                                    !Bei falscher Kennung ...
    Num.%=-1                                    !wird jeder Variable ...
    Ext.%=-1                                    !'-1' ｜ergeben
    '
  Endif
  '
  *Aptr.%=Adr.%                                 !Und nun alle ...
  *Nptr.%=Num.%                                 !Werte ｜er die Pointer ...
  *Eptr.%=Ext.%                                 !zur…kgeben
Return
Procedure Memo_putadr(Adr%,Num%,Ext%)
  Local Adresse%,Kennung$                       !Lokale Variablen
  '
  Kennung$="PICTURE"                            !Kennungs-String definieren
  Adresse%=Xbios(2)+32000                       !Adresse ermitteln
  '
  Bmove Varptr(Kennung$),Adresse%,7             !Kennung ｜ertragen
  '
  If Adr%>=0
    Lpoke Adresse%+8,Adr%                       !Adresse, ...
  Endif
  If Num%>=0
    Dpoke Adresse%+12,Num%                      !Anzahl und ...
  Endif
  If Ext%>=0
    Dpoke Adresse%+14,Ext%                      !Zusatzinfo setzen
  Endif
Return
Procedure Memo_clradr
  Local Adresse%                                !Lokale Variable
  '
  Adresse%=Xbios(2)+32000                       !Adresse ermitteln
  '
  Dpoke Adresse%,0                              !Kennung l敗chen
Return
' =============================================================================
'                                   M E N                             12.05.89
' =============================================================================
Deffn Menu_acc=(Lpeek(Basepage+&H24)=0)         !Ist '-1' wenn als ACC geladen
Deffn Menu_ap.id=Dpeek(Lpeek(Gb+4)+4)           !Applikations-ID
Procedure Menu_register(Ap.id%,Nam$)            !Appl.-ID und ACC-Name ｜ergeben
  Nam$=Nam$+Chr$(0)                             !Nullbyte anhngen
  Bmove Varptr(Nam$),Basepage+192,Len(Nam$)     !String auf freien Speicher
  '                                             !der Basepage schieben
  '
  Dpoke Gintin,Ap.id%                           !Appl.-ID ｜ergeben
  Lpoke Addrin,Basepage+192                     !String-Adresse ｜ergeben
  '
  Gemsys 35                                     !AES-Routine ausf”ren
Return
' =============================================================================
'                                  E V E N T                           12.05.89
' =============================================================================
Deffn Evnt_mesag(N%)=Dpeek(Evnt_buffer%+N%*2)   !Liest Event-Message-Buffer
Procedure Evnt_mesag                            !Wartet auf ein "Event"
  Erase Evnt_buffer%()                          !Eventbuffer ...
  Dim Evnt_buffer%(3)                           !initialisieren (16 Bytes)
  '
  Evnt_buffer%=Varptr(Evnt_buffer%(0))          !Buffer-Adresse ermitteln ...
  Lpoke Addrin,Evnt_buffer%                     !und an das AES ｜ergeben
  '
  Gemsys 23                                     !AES-Routine ausf”ren
Return
