#@l
#@l








h
Programmsammlung
h
           fr den
        Casio PB-1000










        H.-J. Bhling h 








































(C) H.-J. Bhling 1988
                  1990


                           - 1 - 


WInhaltsverzeichnisW 


Vorwort ............................................. 2


1. Teil:  Programme fr den "nackten" Casio PB-1000


   1.1  Breakout .................................... 5
   1.2  Soundausgabe ................................ 9
   1.3  Terminkalender ............................. 19
   1.4  Analoguhr .................................. 29
   1.5  Fehlermeldungen im Klartext ................ 32
   1.6  Alphakorelation ............................ 35
   1.7  Daten sortieren ............................ 38



2. Teil:  Programme welche ein Interface des
          Casio PB-1000 nutzen


   2.1  BASIC-Monitor .............................. 41
   2.2  Systemadressen suchen ...................... 48
   2.3  Die Cursorposition ......................... 53
   2.4  Das Directory des Casio .................... 54
   2.5  Casio Texteditor ........................... 60



3. Teil:  Programme welche fr ein Interface des
          Casio PB-1000 geschrieben wurden


   3.1  Terminal PB-1000 ........................... 69
   3.2  Kalenderausdruck ........................... 77
   3.3  Screendump ................................. 80
   3.4  Grafiken erstellen und ausdrucken .......... 83
   3.5  Das Relais der FA-7 Erweiterung ........... 102


                           - 2 - 




WVorwortW 


Als ich Anfang 1987 erneut die Schulbank drcken mute wurde
ich  zum  ersten  Mal  auf  Taschencomputer aufmerksam, dies
waren  die  Gerte  meiner Mitschler und durch die Bank weg
alles Computer der Firma Sharp! Von den Mglichkeiten meines
Homecomputer  verwhnt,  hatte  ich  selbst  an den Spitzen-
modelen  noch  einiges  auszusetzen.  Ich  beschftigte mich
deshalb ber die nchsten Wochen mit Prospekten und Produkt-
beschreibungen  aus Fachzeitschriften. Zuletzt hatte ich nur
noch zwei Ger-te ins Auge gefat: den Sharp PC 1600 und den
Casio PB 1000.

Nicht  zuletzt  dieses Buch beweist, fr welchen Rechner ich
mich  entschieden  habe. Doch dem Leser soll der Grund dafr
nicht  vorenthalten  werden.  Entscheidend  war der gnstige
Preis  des Casio PB-1000 und vor allem auch der Preis seiner
Erweiterungen, darunter auch das mit normalen 3.5" Disketten
arbeitende Laufwerk.

Ich  habe  diesen  Kauf  jedoch  bis heute nicht bereut! Die
Preise  haben  sich  mittlerweile sogar noch etwas gnstiger
entwickelt  und  man  kann  die  Gerte zu diesem Preis auch
wirklich  nicht  selber  machen!  Deshalb kann ich den Kauf,
zumindest eines Kassetten- und Schnittstellen- Interface vom
Type  FA 7 nur empfehlen. Es erweitert die Mglichkeiten des
Rechners  ungemein!  An  solch ein Interface lt sich nicht
nur ein herkmmlicher Kassettenrecorder anschlieen, sondern
z.B. auch ein Akustikkoppler (RS 232 -Schnittstelle) und ein
Drucker  (Centronics-Schnittstelle).

Wer  den  Kauf  eines  Druckers  erwgt,  dem mchte ich ein
Epson-  kompatibles Gert empfehlen, denn die Graphiksteuer-
codes  der  Firma  Epson  haben  sich  schon seit langem zum
Standart  entwickelt.  So sind auch alle Programme in diesem
Buch,  welche die besonderen Graphikdruckmglichkeiten eines
Druckers  ausnutzen,  fr  und mit einem solchen Gert (Star
NG-10) geschrieben.

Dieses  Buch "Programmsammlung Fr den Casio PB-1000" stellt
zunchst  Programme  vor die fr den "nackten" Casio PB-1000
geschrieben  wurden  und  danach Programme, welche Erweiter-
ungen  nutzen,  die  aber  zum  Ablauf  des Programmes nicht
umbedingt  erforderlich  sind.  Und  schlielich  Programme,
welche  extra  fr  Erweiterungen  geschrieben  worden sind.

Mittlerweile  wird  auch  Software  fr den Casio angeboten,
dabei  handelt  es  sich  aber  zumeist um Programme, welche
eigentlich  fr  und  auf anderen Rechnern entwickelt worden


                           - 3 - 


sind,  und  deshalb  nicht  die  besonderen  Fhigkeiten und
Anwendungsmglichkeiten des Casios ausnutzt.

Wer  aber  z.B.  ein Telekommunikationssystem fr die Akten-
tasche  besitzen  mchte,  der mu die dafr ntige Software
schon selber schreiben (oder sie aus diesem Buch eintippen).

Auf  die  Benutzung  des "Touch Screen" wurde vom mir bewut
verzichtet,  da nach meinem Geschmack dadurch die Anzeige zu
sehr verschmiert. Wem dies nach persnlichem Geschmack nicht
gefllt  der  sei  hiermit  dazu aufgefordert, die in diesem
Buch abgedruckten Programme fr seinen persnlichen Gebrauch
nach  seinem  Belieben zu ndern. Dies ist ja der groe Vor-
teil  der  einfachen und weitverbreiteten Programmiersprache
BASIC.  Darber  hinaus  mchte das Buch neben fertigen Pro-
grammen auch Tips und Anregungen fr eigene Softwareprojekte
geben.

Aber auch der Autor hat stets ein offenes Ohr fr Anregungen
oder  eventuelle Fehler in diesem Buch. Bitte richten Sie in
diesem Fall Ihre Anfragen an folgende Adresse:

                    Hans-Jrgen Bhling
                    Blowstr.         2
                    4000 Dsseldorf  30

An  dieser  Stelle mchte ich mich auch besonders bei meiner
Ehefrau  Cinzia bedanken. Nicht nur weil sie meine Computer-
manie toleriert, und so manchen Abend und so manches Wochen-
ende  auf  mich verzichten mute, sondern auch weil sie alle
in  diesem  Buch  stehenden  Texte  korrigiert  hat. Und da
obwohl  sie  nicht  das mindeste Interesse an Computern hat.
Gegenstze ziehen sich halt an!


                           - 4 - 







                h1.Teil
h




        Programme fr
        den "nackten"
        Casio PB-1000
h 


                           - 5 - 


W1.1 BreakoutW 

Die  Graphikmglichkeiten  des  Casio  PB-1000  reichen zwar
nicht  an  die  eines  Homecomputers  heran,  doch fr einen
Taschencomputer  sind sie schon recht erstaunlich! So kam es
mir  in den Sinn, doch einmal ein Spielprogramm zu schreiben
welches  unter Ausntzung dieser Mglichkeiten ber "Master-
mind"   hinausragt.  Daraufhin  entstand  das  Spielprogramm
"Breakout".


            ͻ
            * BREAKOUT 4 * ================ 
            STEINE: 2       ================
            ZEIT  : 1      =======. ======= 
            KUGELN: 3             _         
            ͼ




Interessant  ist,  da  das  Spiel in seiner Geschwindigkeit
gedrosselt  werden  mute, weil  die Flssigkeitsanzeige des
Casio  PB-1000  die  Geschwindigkeit  der "Spielkugel" nicht
mehr  darstellen  konnte. Zu diesem Zweck wurde in Zeile 690
eine FOR-NEXT- Schleife eingesetzt.


-Programmbeschreibung zu Breakout- 

Das  Programm  Breakout nutzt die Grafikfhigkeit des Casios
und  ist  dem  hinlnglich  bekannten Automatenspiel nachem-
pfunden.  Zum  "Ausbrechen"  stehen acht verschiedene Bilder
zur  Verfgung,  und zum Spielen im Unterricht lt sich die
"Soundausgabe" abschalten!

Bitte  beachten  Sie  Zeile 900 ! So lt sich von BASIC aus
wieder ins Men des CASIO springen.


                           - 6 - 



10 REM ******* BREAKOUT ********
20 REM *(C) H.Boehling 19.08.87*
30 REM *************************
40 CLS:PRINTREV"        *** BREAKOUT ***        ";NORM
50 PRINT"SOUND (J/N):";:SO$=INPUT$(1):PRINT SO$
60 IF SO$="Y" THEN SO$="J"
70 CLS:PRINT"Welche Spielvariante
(1-8) :";:P$=INPUT$(1):P=VAL(P$):PRINT P
80 IF P<1 OR P>8 THEN 70
90 CLS:PRINT"  Zur Schlaegerbewegung bitte"
100 PRINT"   <Q> u.<P> Taste benutzen !"
110 PRINT"  <Y> Taste fuer neues Spiel !"
120 SC$=INPUT$(1)
130 CLS:K=3:ST=0:TI=0:Q=0:V=1:GOSUB 970
140 REM * SPIELFELD *************
150 DRAW(90,0)-(189,0)-(189,31)-(90,31)-(90,0)
160 REM * STEINE ***************
170 IF P=5 THEN 260
180 FOR A=93 TO 184 STEP 5:DRAW(A,3)-(A+3,3):NEXT A
190 FOR A=92+P TO 184 STEP 5:DRAW(A,5)-(A+3,5):NEXT A
200 IF P=1 OR P=4 THEN FOR A=93 TO 184 STEP
5:DRAW(A,10)-(A+3,10):NEXT A
210 IF P=3 THEN FOR A=93 TO 184 STEP
5:DRAW(A,11)-(A+3,11):NEXT A
220 IF P=1 OR P=4 THEN FOR A=93 TO 184 STEP
5:DRAW(A,12)-(A+3,12):NEXT A
230 FOR A=93 TO 184 STEP 5:DRAW(A,17)-(A+3,17):NEXT A
240 FOR A=92+P TO 184 STEP 5:DRAW(A,19)-(A+3,19):NEXT A
250 GOTO 320
260 FOR LOP2 =1 TO 2
270 FOR LOP1 =3 TO 19
280 ZU1=92+(RND(-1)*92):ZU2=184-(RND(-1)*92)
290 FOR A=ZU1 TO ZU2 STEP 5:DRAW(A,LOP1)-(A+3,LOP1):NEXT A
300 NEXT LOP1
310 NEXT LOP2
320 IF P=6 THEN LOCATE 18,1:PRINT"BREAKOUT 6"
330 IF P=7 THEN LOCATE 17,1:PRINTREV" BREAKOUT
7 "NORM:DRAW(102,7)-(173,7)
340 IF P=8 THEN LOCATE 16,1:PRINT"o o o o o o o o":REM Hier
den Namen eines Lehrers einsetzen!
350 GOSUB 500
360 REM * SPIELKUGEL ************
370 DRAWC(X,Y):X=X+E:Y=Y+F:V=V*-1
380 IF POINT(X,Y)=1 THEN 430


                           - 7 - 


390 DRAW(X,Y)
400 GOSUB 650
410 GOTO 370
420 REM = ANGESTOSSEN ==========
430 IF SO$="J"THEN BEEP 1:BEEP 0
440 IF Y<1 OR Y>30 OR X>188 OR X<91 THEN 450 ELSE 550
450 IF Y<1 THEN Y=Y+1:F=F*-1
460 IF X>188 THEN X=188:E=E*-1
470 IF X<91 THEN X=91:E=E*-1
480 IF Y>30 THEN 510
490 GOTO 400
500 REM = NEUE KUGEL ===========
510 DRAWC(S,30)-(S+7,30)
520 S=91+INT(RND(-1)*90):DRAW(S,30)-(S+7,30)
:X=S+INT(RND(-1)*6)
530 Y=20:E=0:F=1:K=K-1
540 IF K=-1 THEN 850 ELSE GOSUB 970:GOTO 400
550 IF Y=30 THEN 810
560 REM = STEIN GETROFFEN ======
570 Q=Q+1:IF Q=30 THEN GOSUB 940
580 ST=ST+1:GOSUB 970
590 M=X:N=Y:FOR J=M TO M+5:IF POINT(J,N)=0 THEN B=J-1
:GOTO 610
600 NEXT J
610 R=N:DRAWC(B,R)-(B-3,R)
620 IF SO$="J"THEN BEEP 0
630 F=F*-1:GOTO 400
640 REM * SCHLAEGER STEUERUNG ***
650 SC$=INKEY$
660 IF SC$="P"THEN 730
670 IF SC$="Q"THEN 770
680 IF SC$="Y"THEN 920
690 IF V=1 THEN FOR DE=1 TO 10:NEXT DE
700 RETURN
710 REM = SCHLAEGERBEWEGUNG ====
720 REM - RECHTS ---------------
730 S=S+2:IF S>181 THEN S=181
740 DRAWC(S-2,30)-(S-1,30):DRAW(S+6,30)-(S+7,30)
750 RETURN
760 REM - LINKS ----------------
770 S=S-2:IF S<91 THEN S=91
780 DRAWC(S+9,30)-(S+8,30):DRAW(S+1,30)-(S,30)
790 RETURN
800 REM = SCHLAEGER AUFTREFFEN =
810 Y=Y-1


                           - 8 - 


820 IF X<S+3 THEN E=-1:F=-1:GOTO 400
830 IF X>S+4 THEN E=1:F=-1:GOTO 400
840 E=0:F=-1:GOTO 400
850 REM * ENDE *****************
860 CLS:PRINTREV"       B r e a k o u t ";P;"      "NORM
870 PRINT"DU HAST";ST*TI;"PUNKTE ERREICHT"
880 PRINT"noch einmal (J/N) ? ";:SC$=INPUT$(1):PRINT SC$
890 IF SC$="J" OR SC$="Y" THEN 920
900 IF SC$="N"THEN CALL &HE567: REM Ende und ins Menue
910 GOTO 880
920 GOTO 70
930 REM * BONUS ****************
940 IF SO$="J"THEN FOR M=1 TO 3:BEEP 1:FOR DE=1 TO 40:NEXT
DE:NEXT M:BEEP 0:BEEP0
950 ST=ST+10:K=K+1:Q=0
960 REM * WERTUNG *************
970 PRINT CHR$(11);
980 IF MID$(TIME$,4,2)<>MI$ THEN TI=TI+1
990 MI$=MID$(TIME$,4,2)
1000 PRINT"* BREAKOUT";P;"*"
1010 PRINT"STEINE:";ST
1020 PRINT"ZEIT  :";TI
1030 PRINT"KUGELN:";K;
1040 RETURN


                           - 9 - 




W1.2 SoundausgabeW 

Wer  das  Spiel Breakout aus diesem Buch eingetippt hat, der
wird  die "Soundausgabe" auf die Dauer doch etwas langweilig
finden. Doch zum Glck lt sie sich ja auch abschalten! Das
BASIC  des Casio PB-1000 kennt zur Tonausgabe leider nur den
Befehl BEEP mit den Parametern 0 und 1.

Wie  schn wre der aus dem Microsoft- BASIC bekannte Befehl
SOUND  mit  den  Parametern fr Tonhhe und Dauer, zumal der
Casio  PB-1000 von seiner Hardware dazu durchaus in der Lage
ist!  Der  Piezosummer  ist  direkt  am Ein-/Ausgabeport des
Mikroprozessors  HD61700 angeschlossen, und damit ber BASIC
unerreichbar.  Aber  zum  Glck bietet der Casio PB-1000 die
einfache  Mglichkeit der Assembler- Programmierung (Maschi-
nensprache).  Leider  steht  fr  ein korrektes Timeing kein
geeigneter  Interrupt  zur  Verfgung, so da neben der Fre-
quenz  auch die Dauer eines Tons ber eine Schleife program-
miert  werden  mute.  Dadurch  ndert sich leider die Dauer
eines  Tons  auch mit seiner Frequenz. Wie die nachfolgenden
BASIC- Programmbeispiele zeigen lt sich damit aber leben.

Doch  hier  zunchst das Quellisting des SOUND Programms. Es
mu  eingetippt  und anschlieend assembliert werden. Dieser
Vorgang wird im Teil 10 der Casio PB-1000 Bedienunganleitung
(S.89) ausfhrlich beschrieben.


                           - 10 - 


        ;*******************
        ;*      SOUND      *
        ;*  (C)H.Boehling  *
        ;*    01.03.88     *
        ;*******************
        ORG   &H7002
        START &H7002
        ;--------------------
        PRE IX,&H7000 ;Datenbasis
        GST PD,$0 ;Prozessorport einlesen
        AN $0,&H3F ;Maske 0011 1111
        LD $3,$0 ;und abspeichern
        LD $1,(IX+1) ;Dauer
        LD $2,(IX+0) ;Frequenz
        SBC $2,&H00 ;Frequenz 0 ?
        JP Z,PAUSE ;dann Pause
BEEP:   LD $2,(IX+0)
        LD $0,$3
        OR $0,&H80
        PST PD,$0 ;Tonausgabe
LOOP1:  SB $2,&H01;-1
        JP NZ,LOOP1
        LD $2,(IX+0)
        LD $0,$3
        OR $0,&H40
        PST PD,$0 ;Tonausgabe
LOOP2:  SB $2,&H01;-1
        JP NZ,LOOP2
        SB $1,&H01
        JP NZ,BEEP ;Ende ?
        RTN
PAUSE:  LD $2,&H60
LOOP3:  SB $2,&H01
        JP NZ,LOOP3
        SB $1,&H01
        JP NZ,PAUSE ;Ende ?
        RTN


                           - 11 - 


Nachdem  das  Programm  in  dieser  Form eingetippt und ohne
Fehler  assembliert  worden  ist,  kann Mann die entstandene
EXE-Datei  schon  aus  dem Men heraus ausprobieren und auf-
rufen,  dabei knnen jedoch keine Parameter bergeben werden
und  es  entsteht ein Ton von zuflliger Frequenz und Dauer.
Doch  richtig  interessant  wird  die  Sache  erst, wenn das
Maschinenprogramm  von  BASIC  aufgerufen wird. Davor mssen
die  Parameter  fr Frequenz und Dauer in die Speicherzellen
&H7000 und &H7001 gepoket werden. Als Beispiel soll das hier
folgende Programm dienen.


10 REM** Demo von SOUND.EXE **
20 REM*  Die Gedanken sind   *
30 REM*         Frei         *
35 REM*(C) H.Boehling 10.3.88*
40 REM************************
50 INPUT "TAKT (1-4):";T
60 IF T<1 OR T>4 THEN 50
70 PRINT"Unterbrechen durch Tastendruck!"
80 RESTORE
90 FOR I=1 TO 38
100 READ A,B
110 POKE &H7000,A:REM Fequenz
120 POKE &H7001,B*T:REM Dauer
130 CALL"SOUND.EXE"
140 NEXT I
150 FOR I=1 TO 100
160 IF INKEY$<>""THEN I=100
170 NEXT I
180 IF INKEY$<>"" THEN 50 ELSE 80
190 REM Melodiedaten ===========
200 DATA 95,15,95,15,71,31,71,31,56,15,71,15,95,61,95,31
,106,31,126,31,95,31,112,31,142,31
210 DATA 71,31,75,31,63,46,75,15,71,31,56,46,71,15,75,31
,63,46,75,15,71,31,56,31,71,31
220 DATA 84,31,84,31,71,15,84,15,95,61,71,15,56,15,56,15
,63,15,71,31,75,31,71,61


                           - 12 - 


Wird  das  Maschinenquellprogramm SOUND.SOU (Die Erweiterung
des  Dateinamens "SOU" steht fr source = Quelle und ist die
allgemein  bliche  Kennzeichnung  fr  noch  unassemblierte
Maschinenprogramme) so abgendert, da die Frequenz ber die
Dauer  des  Tons  rasch ansteigt, dann entsteht ein Ton, der
sich  am  besten  mit  "uiep"  beschreiben lt. Und deshalb
trgt  auch  das  auf  diese  Weise arbeitende Programm, den
Namen  UIEP.SOU.  Mit diesem Programm lassen sich zwar keine
Melodien  mehr  spielen,  aber  fr Spiele ganz interessante
Klnge. Das Programm erwartet natrlich nur noch einen Para-
meter fr Startfrequenz und Dauer in Adresse &H7000.


        ;*****************
        ;*  UIEP SOUND   *
        ;* (C)H.Boehling *
        ;*   01.03.88    *
        ;*****************
        ORG   &H7002
        START &H7002
        ;----------------------
        PRE IX,&H7000 ;Datenbasis
        GST PD,$0 ;Prozessorport einlesen
        AN $0,&H3F ;Maske 0011 1111
        ST $0,(IX+1) ;und abspeichern
        LD $1,(IX+0)
BEEP:   LD $0,(IX+1)
        OR $0,&H80
        PST PD,$0 ;Tonausgabe
        LD $2,$1
LOOP1:  SB $2,&H01 ;-1
        JP NZ,LOOP1
        LD $0,(IX+1)
        OR $0,&H40
        PST PD,$0 ;Tonausgabe
        LD $2,$1
LOOP2:  SB $2,&H01 ;-1
        JP NZ,LOOP2
        SB $1,&H01
        JP NZ,BEEP ;Ende ?
        RTN


                           - 13 - 


Genau  entgegengesetzt  arbeitet  das Programm PIEU.SOU. Die
nderungen  von  UIEP.SOU  nach  PIEU.SOU sind  minimal, das
Ergebnis aber maximal!


        ;*****************
        ;*  PIEU SOUND   *
        ;* (C)H.Boehling *
        ;*   01.03.88    *
        ;*****************
        ORG   &H7002
        START &H7002
        ;----------------------
        PRE IX,&H7000 ;Datenbasis
        GST PD,$0 ;Prozessorport einlesen
        AN $0,&H3F ;Maske 0011 1111
        ST $0,(IX+1) ;und abspeichern
        LD $1,(IX+0)
BEEP:   LD $0,(IX+1)
        OR $0,&H80
        PST PD,$0 ;Tonausgabe
        LD $2,$1
LOOP1:  AD $2,&H01 ;+1
        JP NC,LOOP1
        LD $0,(IX+1)
        OR $0,&H40
        PST PD,$0 ;Tonausgabe
        LD $2,$1
LOOP2:  AD $2,&H01 ;+1
        JP NC,LOOP2
        SB $1,&H01
        JP NZ,BEEP ;Ende ?
        RTN


                           - 14 - 


Die  nun  folgenden  BASIC-  Programme  sollen als Beispiele
dienen  und  geben  einen  Einblick in die vielfltigen Ver-
wndungsmglichkeiten.


10 REM**  DEMO VON UIEP.EXE  **
20 REM*(C) H.Boehling 28.02.88*
30 REM*************************
40 FOR I=0 TO 255 STEP 10
50 POKE &H7000,I:REM Fequenz u. Dauer
60 PRINT I
70 CALL"UIEP.EXE"
80 FOR H=1 TO 200:NEXT H
90 NEXT I


10 REM**  DEMO VON PIEU.EXE  **
20 REM*(C) H.Boehling 28.02.88*
30 REM*************************
40 FOR I=0 TO 255 STEP 10
50 POKE &H7000,I:REM Fequenz u. Dauer
60 PRINT I
70 CALL"PIEU.EXE"
80 FOR H= 1 TO 200:NEXT H
90 NEXT I


10 REM**  DEMO VON PIEU.EXE  **
20 REM**  UND VON  UIEP.EXE  **
30 REM*(C) H.Boehling 28.02.88*
40 REM*************************
50 FOR I=0 TO 255 STEP 10
60 POKE &H7000,I:REM Fequenz u. Dauer
70 PRINT I
80 CALL"PIEU.EXE":CALL"UIEP.EXE"
90 FOR H= 1 TO 200:NEXT H
100 NEXT I


                           - 15 - 



10 REM**       SIRENE        **
20 REM**  DEMO VON PIEU.EXE  **
30 REM**  UND VON  UIEP.EXE  **
40 REM*(C) H.Boehling 28.02.88*
50 REM*************************
60 POKE &H7000,110:REM Fequenz u. Dauer
70 FOR I=1 TO 20
80 CALL"PIEU.EXE":CALL"UIEP.EXE"
90 NEXT I



                           - 16 - 


Eine  weitere  Variante des SOUND Programms ist das Programm
PHASER.SOU.  Bei  dieser  Variante  wird stndig das Tasten-
verhltnis  der  beiden Halbwellen verndert, dadurch ndert
sich der Obertongehalt. Diese Art der Klangbeeinfluung wird
allgemein als Phasing bezeichnet.


        ;*****************
        ;* PHASER SOUND  *
        ;* (C)H.Boehling *
        ;*   01.03.88    *
        ;*****************
        ORG   &H7002
        START &H7002
        ;--------------------
        PRE IX,&H7000 ;Datenbasis
        GST PD,$0 ;Prozessorport einlesen
        AN $0,&H3F ;Maske 0011 1111
        LD $3,$0 ;und in $3 abspeichern
        LD $1,(IX+1) ;Dauer
        LD $2,(IX+0) ;Frequenz
        LD $4,$2 ;Phasing 1
        LD $5,&H00 ;Phasing 2
        SBC $2,&H00 ;Frequenz 0 ?
        JP Z,PAUSE ;dann Pause
BEEP:   LD $6,$4
        LD $0,$3
        OR $0,&H80
        PST PD,$0 ;Tonausgabe
LOOP1:  SB $6,&H01;-1
        JP NZ,LOOP1
        LD $6,$5
        LD $0,$3
        OR $0,&H40
        PST PD,$0 ;Tonausgabe
LOOP2:  SB $6,&H01;-1
        JP NZ,LOOP2
        AD $5,&H01
        SB $4,&H01
        JP NZ,TEST ;Phasing ereicht ?
        LD $4,$2 ;Phasing 1 und
        LD $5,&H00 ;Phasing 2 zuruecksetzen
TEST:   SB $1,&H01
        JP NZ,BEEP ;Ende ?
        RTN


                           - 17 - 


PAUSE:  LD $2,&H60
LOOP3:  SB $2,&H01
        JP NZ,LOOP3
        SB $1,&H01
        JP NZ,PAUSE ;Ende ?
        RTN



                           - 18 - 


Das nun folgende Demoprogramm spielt eine Tonleiter von drei
Oktaven.  Diese  Tondaten  lassen sich auch fr das Programm
SOUND.EXE  verwenden.  Die Erweiterung des Dateinamens "EXE"
steht  fr execute = ausfhren und bedeutet, da es sich bei
dieser Datei um ein direkt ausfhrbares Programm handelt.


10 REM** DEMO VON PHASER.EXE **
20 REM**      TONLEITER      **
30 REM*(C) H.Boehling 28.02.88*
40 REM*************************
50 FOR I=1 TO 38
60 READ A
70 POKE &H7000,A:REM Fequenz
80 POKE &H7001,255:REM Dauer
90 PRINT A
100 CALL"PHASER.EXE"
110 NEXT I
120 REM Tondaten fuer 3 Oktaven
130 REM Tonhoehe 0 = Pause !
140 DATA 18,20,21,22,23,25,26,28,30,31,33,35,0
150 DATA 37,40,42,44,47,50,53,56,60,63,67,71,0
160 DATA 75,79,84,89,95,100,106,112,119,126,134,142



So,  wen  das  ewige  beep, beeb jetzt immer noch strt, der
kann  nun nach Herzenslust uiepen, pieupen, Melodien spielen
und  Tne  erzeugen.  Aus dem Men heraus whlt man z.B. das
Programm  BREAKOUT.BAS mit edit aus, sucht danach alle BEEP-
Befehle  mit  search und ersetzt sie gegen einen Aufruf, der
hier vorgestellten Maschinenprogramme.


                           - 19 - 


W1.3 TerminkalenderW 

Das automatische Einschalten des Casio PB-1000 und Ausfhren
eines  Programms  ist  schon  eine  tolle  Sache, ("c.boot"-
Funktion)  aber  leider  lt  sich  nur  eine Einschaltzeit
programmieren.  Der Ausweg aus diesem Dilemma ist das Wissen
um die Speicherzellen &H6F43, &H6F44 und &H6F45, &H6F46 dort
wird  nmlich  die  Einschaltzeit dezimal abgespeichert! Und
zwar  in  der  Reihenfolge:  Tag, Monat, Minute, Stunde. Nun
kann  man  ein Programm automatisch starten, und am Ende des
Programms  wird  die nchste Einschaltzeit in diese Adressen
gepoket.

Das  Programm  TERMIN.BAS  schaltet sich jede Nacht um 00:00
Uhr  automatisch ein und sieht in der Datei TERMIN.DAT nach,
ob  fr  den kommenden Tag Termine eingetragen sind. Darber
hinaus  verwaltet  das  Programm  die  Termine  in der Datei
TERMIN.DAT, und sortiert sie der Reihe nach.

Man  braucht  brigens  keine Angst davor zu haben, da sich
durch  das stndige Einschalten die Stromaufnahme wesentlich
erhht,  denn  im  Prinzip  ist  Ihr  Casio  PB-1000 sowieso
stndig eingeschaltet! Jawohl im innersten kennt der PB-1000
Keine  Pause,  er  rennt und arbeitet, setzt die Uhrzeit neu
und  wartet  wie  ein  Flaschengeist  auf  einen  Ruf seines
Meisters.

Ein sehr interessanter Programmteil sind die Zeilen 1840 bis
1930.  Er berechnet aus einem gegebenen Datum den Wochentag.
Dieser  Programmteil lt sich nicht nur in eigene Programme
einbauen,  er  bietet  auch  eine Mglichkeit zur sinnvollen
Erweiterung  des  Programmes.  So wre z.B. die automatische
Umschaltung  des  Casio  PB-1000 von Sommer- auf Winterzeit,
und  umgekehrt  denkbar.  Beginn  und  Ende der europischen
Sommerzeit  fallen  nmlich  auf den letzten Sonntag im Mrz
und  den  letzten Sonntag im September. An diesen Sonntagen,
mte  im  Frhling zunchst von 02:00 auf 03:00 Uhr, und im
Herbst von 03:00 auf 02:00 Uhr gestellt werden. Die aktuelle
Zeit speichert das System dezimal in den Adressen &H6BAD bis
&H6BB1  in  der  Reihenfolge:  Jahr,  Tag,  Monat,  Minuten,
Stunden.


                           - 20 - 


-Programmbeschreibung zum Terminkalender- 

Mit  dem Programm lassen sich Termine mit Uhrzeit, Datum und
einer  Nachricht  abspeichern. Ist  ein  Termin erreicht, so
schaltet  sich  der  PB-1000 automatisch ein und meldet sich
mit  Wochentag,  Datum,  Uhrzeit, der betreffenden Nachricht
und einem akustichen Signal.


            ͻ
                 *** TERMINKALENDER ***      
                    Fr  24-03  21:28         
            _                                
                                             
            ͼ

            ͻ
                          Menu               
                                             
            INPUT,UHR,LIST,DELETE oder ENDE? 
             (I/U/L/D/E) ?_                  
            ͼ


Wird das Programm aus dem Men heraus gestartet, so wird nur
Tag, Datum und Uhrzeit angezeigt, danach wartet das Programm
auf  das drcken der "M"-Taste ("M"- wie Men, denn wer lt
sich  schon  gern  von  einem  Fremden  in  seinen  Kalender
kucken?).  Durch  drcken  der  "M"-Taste gelangt man in das
Men  des  Programmes, hier stehen folgende Befehle zur Ver-
fgung:  INPUT,  UHR,  LIST, DELETE oder ENDE. Diese Befehle
lassen sich duch Eingabe des betreffenden Anfangsbuchstabens
aufrufen.


                           - 21 - 



            ͻ
                    Termine eingeben         
                                             
            Uhrzeit  :?12:00                 
            Datum    :?25-03                 
            ͼ

            ͻ
            Datum    :?25-03                 
            Nachricht:                       
            ?Mittagspause!                   
            Klingel (1-100):?12_             
            ͼ


Mit INPUT lassen sich Termine eingeben, neben Uhrzeit, Datum
(kann  auch  mit  "EXE"-Taste  beantwortet  werden,  um  ein
tgliches  Ausfhren  zu  erreichen) und Nachricht fragt das
Programm  auch danach, wie oft es beim Erreichen des Termins
klingeln soll.


            ͻ
                       Uhr stellen           
                                             
                       21:45                 
            Uhrzeit   :_                     
            ͼ


Mit  UHR  lt  sich die interne Uhr des PB-1000 auf bequeme
Art und Weise stellen.


                           - 22 - 



            ͻ
                    Termine listen           
                                             
              2 Eintraege gespeichert !      
                                             
            ͼ


            ͻ
            2  12:00 25-03 Klingel: 12       
            Mittagspause!                    
            _                                
                                             
            ͼ


LIST  listet  alle Eintrge im Programmspeicher, das drcken
einer  Taste  stopt  das  listen,  erneutes drcken fhrt es
fort, drcken der "E"-Taste beendet es.


            ͻ
                     Termin loeschen         
                                             
            ZEILE oder ALLES (Z/A) ?_        
                                             
            ͼ


Mit  DELETE lt sich der gesamte Programmspeicher oder auch
nur einzelne Zeilen davon lschen.


Die  Eingabe  von  "E"  wie ENDE im Menu, bertrgt den Pro-
grammspeicher,  und  damit auch alle gemachten Eintrge oder
nderungen in das File "TERMIN.DAT" und beendet das Programm
(Vorsicht!  Wird  das  Programm  nicht  ber "E" beendet, so
werden  alle  eventuell  gemachten  nderungen  nicht in die
Datei  TERMIN.DAT  bertragen!). Sollte einmal versehentlich
der  Programmspeicher mit dem DELETE- Befehl gelscht worden
sein,  so  ist  dies  nicht schlimm, da alle nderungen, und
damit  auch die durch den "D"- Befehl, erst nach beenden des
Programmes  mit  "ENDE"  in  das  Termindatenfile bernommen
werden.


                           - 23 - 



Grundstzlich  kann in allen Menpunkten die erste Frage mit
"EXE" beantwortet werden, um in das Menu zurckzukehren.

Zur  Installation  des  Programmes braucht man dieses nur im
Hauptmen des PB-1000 mit der Sensortastenfunfktion "c.boot"
auf  eine Einschatzeit von 00:00 Uhr zu setzen (Nheres ber
"c.boot"  in  der Bedienungsanleitung des PB-1000 auf S.72).
Zur  Desaktivierung  des  Programmes  mu  nur  einfach  die
"c.boot"-Funktion  gelscht  werden.

 Die  maximale  Anzahl der Termine ist vom Speicher abhngig
und  wird  in Zeile 50 des Programmes auf 50 gesetzt. Sollte
nach  dem  Starten  des  Programmes ein "OM"-Fehler (out off
memory = zuwenig Speicher vorhanden) auftreten, so ist diese
Variable zu verkleinern!


                           - 24 - 



10 REM **** TERMINKALENDER *****
20 REM *(C) H.BOEHLING 19.08.87*
30 REM *************************
40 CLEAR:TI$=LEFT$(TIME$,5)
:DA$=MID$(DATE$,4,3)+LEFT$(DATE$,2)
50 SPM=50:REM max. Anzahl der Termine
60 ON ERROR GOTO 1990
70 DIM T$(SPM),D$(SPM),M$(SPM),KL(SPM)
80 GOSUB 1670:REM Termine Einlesen
90 IF TI$="00:00"THEN GOSUB 200:GOTO 130
100 GOSUB 1840:REM Wochentag berechnen
110 CLS:PRINTREV"     *** TERMINKALENDER ***     ";NORM;
120 PRINT"        ";A$;"  "DA$;"  ";TI$
130 REM=TERMIN ERREICHT ?========
140 FOR I=1 TO SPM
150 IF TI$=T$(I) AND (D$(I)="" OR D$(I)=DA$)THEN PRINT
M$(I);:KL=KL(I):GOSUB 1780
160 IF T$(I)=""THEN I=SPM
170 NEXT I
180 GOSUB 200
190 GOTO 340
200 REM=TERMIN POKEN============
210 FOR I=1 TO SPM
220 IF T$(I)=""THEN TT$="00:00":I=SPM:GOTO 280
230 GOSUB 1350
240 IF TIH > TH THEN 280
250 IF TIH = TH AND(TIM > TM OR TIM = TM)THEN 280
260 IF D$(I)=DA$ OR D$(I)=""THEN270 ELSE 280
270 TT$=T$(I):I=SPM:GOTO 280
280 NEXT I
290 TTH=VAL(LEFT$(TT$,1))*16+VAL(MID$(TT$,2,1))
300 TTM=VAL(MID$(TT$,4,1))*16+VAL(RIGHT$(TT$,1))
310 POKE &H6F45,TTM:POKE &H6F46,TTH:REM Naechster Termin
Uhrzeit
320 POKE &H6F43,255:POKE &H6F44,0:REM Jeden Tag einschalten
330 RETURN
340 REM=MENU====================
350 W$=INPUT$(1)
360 IF W$="M"OR W$="m" THEN 380
370 CALL &HE567
380 CLS:PRINTREV"              Menu              ";NORM
390 PRINT"INPUT,UHR,LIST,DELETE oder ENDE?";
400 PRINT" (I/U/L/D/E) ?";:W$=INPUT$(1):PRINT W$;:GOSUB 1940
410 IF W$="I"THEN 630


                           - 25 - 


420 IF W$="U"THEN 630
430 IF W$="L"THEN 470
440 IF W$="D"THEN 1100
450 IF W$="E"THEN 1510
460 GOTO 380
470 REM=LIST====================
480 CLS:PRINTREV"         Termine listen         ";NORM
490 PRINT SP;"Eintraege gespeichert !
500 FOR I=1 TO SPM
510 GOSUB 1940
520 IF T$(I)=""THEN I=SPM:GOTO 570
530 CLS:PRINTREV I;NORM;" ";T$(I);" ";D$(I)
;" Klingel:";KL(I)
540 PRINT M$(I):BEEP 1
550 GOSUB 1940
560 IF INKEY$<>""THEN 590
570 NEXT I
580 GOTO 380
590 REM-UNTERBRECHUNG-----------
600 W$=INPUT$(1)
610 IF W$="E"THEN I=SPM:GOTO 570
620 GOTO 570
630 REM=INPUT/CLOCK=============
640 IF W$="U"THEN CLS
:PRINTREV"           Uhr stellen           ";NORM
:PRINT"             ";LEFT$(TIME$,5):GOTO 670
650 IF SP<SPM THEN 660 ELSE CLS:PRINTREV" Speicher voll
!                "NORM:GOSUB 1940:GOTO 380
660 CLS:PRINTREV"        Termine eingeben        ";NORM
670 PRINT"Uhrzeit  :";:INPUT IT$
680 IF IT$=""THEN 380
690 IF VAL(LEFT$(IT$,2))>23 THENBEEP 0:GOTO 670
700 IF VAL(RIGHT$(IT$,2))>59 THEN BEEP 0:GOTO 670
710 IF MID$(IT$,3,1)<>":"THEN BEEP 0:GOTO 670
720 IF W$="U"THEN TIME$=IT$:GOTO 1510
730 PRINT"Datum    :";:INPUT ID$
740 IF ID$=""THEN 780
750 IF VAL(LEFT$(ID$,2))>31 THENBEEP 0:GOTO 730
760 IF VAL(RIGHT$(ID$,2))>12 THENBEEP 0:GOTO 730
770 IF MID$(ID$,3,1)<>"-"THEN BEEP 0:GOTO 730
780 PRINT"Nachricht:":INPUT IM$
790 FOR TE=1 TO LEN(IM$)+1
800 IF MID$(IM$,TE,1)=","THEN BEEP 0
:IM$=LEFT$(IM$,TE-1)+"'"+RIGHT$(IM$,LEN(IM$)-TE)
810 NEXT TE


                           - 26 - 


820 IKL=0:PRINT"Klingel (1-100):";:INPUT IKL
830 IF IKL<1 OR IKL>100 THEN BEEP 0:GOTO 820
840 SP=SP+1
850 REM=NEUEN TERMIN EINTRAGEN==
860 REM-PLATZ SUCHEN------------
870 FOR I=1 TO SPM
880 IF T$(I)=""THEN 1080
890 GOSUB 1350
900 IF ITH > TH THEN 990
910 IF(ITH = TH)AND(ITM > TM)THEN 990
920 IF ID$=""THEN 1010
930 IF(IT$=T$(I))AND(D$(I)="")THEN I=I+1:GOTO 930
940 IF IT$<>T$(I)THEN 1010
950 GOSUB 1430
960 IF IDM > DM THEN 990
970 IF(IDM = DM)AND(IDD > DD)THEN 990
980 GOTO 1010
990 NEXT I
1000 GOTO 380
1010 REM-PLATZ SCHAFFEN----------
1020 FOR I2=1 TO SPM
1030 IF T$(I2)=""THEN FREI=I2:I2=SPM
1040 NEXT I2
1050 FOR I3=FREI TO I+1 STEP-1
1060 T$(I3)=T$(I3-1):D$(I3)=D$(I3-1):M$(I3)=M$(I3-1)
:KL(I3)=KL(I3 -1)
1070 NEXT I3
1080 T$(I)=IT$:D$(I)=ID$:M$(I)=IM$:KL(I)=IKL
1090 I=SPM:GOTO 990
1100 REM=DELETE==================
1110 IF SP=0 THEN CLS:PRINTREV" Speicher leer
!                "NORM:GOSUB 1940:GOTO 380
1120 CLS:PRINTREV"         Termin loeschen        ";NORM
1130 PRINT"ZEILE oder ALLES (Z/A) ?";:W$=INPUT$(1):PRINT W$
1140 IF W$="Z"THEN 1170
1150 IF W$="A"THEN 1260
1160 GOTO 380
1170 REM-LINE DELETE-------------
1180 PRINT"Zeilen Nr.:";:INPUT L
1190 IF L<1 OR L>SP THEN 380
1200 SP=SP-1
1210 FOR I2=L TO SPM-1
1220
T$(I2)=T$(I2+1):D$(I2)=D$(I2+1):M$(I2)=M$(I2+1):KL(I2)=KL(I2
+1)


                           - 27 - 


1230 IF T$(I2)=""THEN I2=SPM-1
1240 NEXT I2
1250 GOTO 1290
1260 REM-DELETE ALL--------------
1270 PRINT"Alles loeschen ? (J/N) ";:INPUT W$
1280 IF W$="Y"OR W$="J"THEN I2=1:SP=0:GOTO 1290 ELSE 380
1290 FOR I=I2 TO SPM
1300 IF T$(I)=""THEN I=SPM
1310 T$(I)="":D$(I)="":M$(I)="":KL(I)=0
1320 NEXT I
1330 GOTO 380
1340 REM=STRING TO VARIABELE=====
1350 REM-TIME$-------------------
1360 ITH=VAL(LEFT$(IT$,2))
1370 ITM=VAL(RIGHT$(IT$,2))
1380 TH=VAL(LEFT$(T$(I),2))
1390 TM=VAL(RIGHT$(T$(I),2))
1400 TIH=VAL(LEFT$(TI$,2))
1410 TIM=VAL(RIGHT$(TI$,2))
1420 RETURN
1430 REM-DATE$------------------
1440 IDD=VAL(LEFT$(ID$,2))
1450 IDM=VAL(RIGHT$(ID$,2))
1460 DD=VAL(LEFT$(D$(I),2))
1470 DM=VAL(RIGHT$(D$(I),2))
1480 DAD=VAL(LEFT$(DA$,2))
1490 DAM=VAL(RIGHT$(DA$,2))
1500 RETURN
1510 REM=END====================
1520 TI$=LEFT$(TIME$,5)
1530 GOSUB 200
1540 GOSUB 1560
1550 IF W$="E"THEN CALL &HE567 ELSE 380
1560 REM=DATEN ABSPEICHERN======
1570 OPEN"TERMIN.DAT"FOR OUTPUT AS #1
1580 FOR I=1 TO SPM
1590 IF T$(I)=""THEN I=SPM:GOTO 1640
1600 PRINT #1,T$(I);",";
1610 PRINT #1,D$(I);",";
1620 PRINT #1,KL(I);",";
1630 PRINT #1,M$(I)
1640 NEXT I
1650 CLOSE #1
1660 RETURN
1670 REM=DATEN EINLESEN=========


                           - 28 - 


1680 OPEN"TERMIN.DAT"FOR INPUT AS #1
1690 FOR I=1 TO SPM:SP=I
1700 IF EOF(1)THEN I=SPM:GOTO 1750
1710 INPUT #1,T$(I)
1720 INPUT #1,D$(I)
1730 INPUT #1,KL(I)
1740 INPUT #1,M$(I)
1750 NEXT I
1760 CLOSE #1:SP=SP-1
1770 RETURN
1780 REM=KLINGELN================
1790 FOR K=1 TO KL
1800 BEEP0:BEEP1:GOSUB 1940
1810 IF INKEY$<>""THEN K=KL
1820 NEXT K
1830 RETURN
1840 REM=WOCHENTAG BERECHNEN====
1850 J=VAL(RIGHT$(DATE$,4)):M=VAL(LEFT$(DATE$,2))
:T=VAL(MID$(DATE $,4,8))
1860 A=INT((J-1900)*365.25+0.5)
1870 FOR B=1 TO M-1:READ C
1880 D=D+C+28+ABS(B=2 AND J/4=INT(J/4))
1890 NEXT B:RESTORE
1900 E=A+D+T:F=E-INT(E/7)*7
1910 FOR G=1 TO F+13:READ A$:NEXT G
1920 DATA 3,0,3,2,3,2,3,3,2,3,2,3,Sa,So,Mo,Di,Mi,Do,Fr
1930 RETURN
1940 REM=DELAY==================
1950 FOR DE=1 TO 50
1960 IF INKEY$<>""THEN DE=50
1970 NEXT DE
1980 RETURN
1990 REM=FEHLERBEHANDLUNG=======
2000 ON ERROR GOTO 1990
2010 IF ERR=10 THEN GOSUB 1560:RESUME 80
2020 PRINT"Fehler Nr.";ERR;"aufgetreten!"
2030 RESUME


                           - 29 - 


W1.4 AnaloguhrW 

Knnen Sie sich auch so schlecht an die Digitale Darstellung
der  Uhrzeit  gewhnen?  Dann  nutzen  Sie doch das Programm
Analoguhr! Oder bauen Sie es doch in den Terminkalender ein,
eventuell knnten Sie dieses Programm aber auch noch mit der
Wochentagsberechnung aus dem Terminkalender- Programm erwei-
tern. Aber sicherlich fllt Ihnen auch selbst eine Anwendung
ein.

-Programmbeschreibung zur Analoguhr- 

Das  Programm nutzt die Grafikfhigkeit des Casio und zeich-
net  eine  Zeigeruhr  in  die  Anzeige  des PB 1000. Mit der
Variabelen  "POS"  in  Zeile  40 des Programms lt sich die
Horizontalposition  der  Uhr  in  der Anzeige des Casio ver-
ndern.



                           - 30 - 


10 REM ******* ANALOGUHR *******
20 REM *(C) H.Boehling 02.06.87*
30 REM *************************
40 CLEAR:POS=110:REM max. 176 und min. 66
50 SS1=POS:SS2=16:MS1=POS:MS2=16:MS3=POS:MS4=16:MS5=POS
:MS6=16: HS1=POS:HS2=16:HS3=POS:HS4=16:HS5=POS:HS6=16
60 GOSUB 480
70 LOCATE POS/6-11,0
:PRINT MID$(DATE$,4,3);LEFT$(DATE$,3);RIGHT$(DATE$,2)
80 LOCATE POS/6-11,1:PRINT TIME$
90 A=VAL(LEFT$(TIME$,2)):B=VAL(MID$(TIME$,4,2))
:C=VAL(RIGHT$(TI ME$,2))
100 REM SEKUNDENZEIGER =========
110 SZ1=INT(COS(C*6-90)*14.5+POS)
120 SZ2=INT(SIN(C*6-90)*14.5+16)
130 DRAWC(POS,16)-(SS1,SS2)
140 DRAW(POS,16)-(SZ1,SZ2)
150 REM ZENTRUM ================
160 DRAW(POS-1,15)-(POS+1,15)-(POS+1,17)-
(POS-1,17)-(POS-1,15)
170 REM MINUTENZEIGER ==========
180 MZ1=INT(COS((B+C/60)*6-90)*14.5+POS)
190 MZ2=INT(SIN((B+C/60)*6-90)*14.5+16)
200 MZ3=INT(COS((B+C/60-0.3)*6-90)*12+POS)
210 MZ4=INT(SIN((B+C/60-0.3)*6-90)*12+16)
220 MZ5=INT(COS((B+C/60+0.3)*6-90)*12+POS)
230 MZ6=INT(SIN((B+C/60+0.3)*6-90)*12+16)
240 IF MZ1=MS1 AND MZ2=MS2 AND MZ3=MS3 AND MZ4=MS4 AND
MZ5=MS5 AND MZ6=MS6 THEN 280
250 DRAWC(POS,16)-(MS1,MS2)
260 DRAWC(POS,16)-(MS3,MS4)
270 DRAWC(POS,16)-(MS5,MS6)
280 DRAW(POS,16)-(MZ1,MZ2)
290 DRAW(POS,16)-(MZ3,MZ4)
300 DRAW(POS,16)-(MZ5,MZ6)
310 REM STUNDENZEIGER ==========
320 HZ1=INT(COS((A+B/60)*30-90)*10+POS)
330 HZ2=INT(SIN((A+B/60)*30-90)*10+16)
340 HZ3=INT(COS((A+(B-7)/60)*30-90)*8+POS)
350 HZ4=INT(SIN((A+(B-7)/60)*30-90)*8+16)
360 HZ5=INT(COS((A+(B+7)/60)*30-90)*8+POS)
370 HZ6=INT(SIN((A+(B+7)/60)*30-90)*8+16)
380 IF HZ1=HS1 AND HZ2=HS2 AND HZ3=HS3 AND HZ4=HS4 AND
HZ5=HS5 AND HZ6=HS6 THEN 420
390 DRAWC(POS,16)-(HS1,HS2)


                           - 31 - 


400 DRAWC(POS,16)-(HS3,HS4)
410 DRAWC(POS,16)-(HS5,HS6)
420 DRAW(POS,16)-(HZ1,HZ2)
430 DRAW(POS,16)-(HZ3,HZ4)
440 DRAW(POS,16)-(HZ5,HZ6)
450 REM SPEICHERN ==============
460 SS1=SZ1:SS2=SZ2:MS1=MZ1:MS2=MZ2:MS3=MZ3:MS4=MZ4
:MS5=MZ5:MS6=MZ6:HS1=HZ1:HS2=HZ2:HS3=HZ3:HS4=HZ4
:HS5=HZ5:HS6=HZ6
470 GOTO 70
480 REM= UHRENKREIS ============
490 FOR K=-90 TO 270 STEP 30
500 K1=COS(K)*16+POS
510 K2=SIN(K)*16+16
520 DRAW(K1,K2)
530 NEXT K
540 DRAW(POS,31)
550 RETURN


                           - 32 - 


W1.5 Fehlermeldungen
    im KlartextW 

Haben  Sie sich auch schon ber die unverstndlichen Fehler-
meldungen  des Casio PB-1000 gergert? Stndig mu das Hand-
buch griffbereit sein! Jetzt nicht mehr!

-Programmbeschreibung zum Programm Fehlermelungen- 

Das  Programm gibt Fehlermeldungen in deutschem Klartext, so
da  das ewige Suchen im Handbuch berflssig wird. Dazu mu
das  Programm  "FEHLER.BAS" nur wie folgt in das eigene Pro-
gramm  eingebunden  werden:

               10 ON ERROR GOTO 60000
               .
               .
               .   Platz
               .   fr das eigene
               .   Programm
               .
               .
               60000 REM = FEHLERBEHANDLUNG =
               60010 GOSUB"FEHLER.BAS"
               60020 RESUME 10


                           - 33 - 


1 REM ********* FEHLER *********
2 REM *(C)  H.BOEHLING 30.08.87*
3 REM **************************
4 REM FEHLERBEHANDLUNG =========
5 CLS:PRINT"Fehler Nr.";ERR:BEEP 0
6 IF ERR=0 THEN PRINT"Undefinierter Fehler":GOTO 500
7 ON ERR GOTO
10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,1
80,190,200,210,220,230,240,250,260,270,280,290,300,310,320
10 PRINT"Unzureichender Speicher"
18 GOTO 500
20 PRINT"Fehlerhafte Anweisung"
28 GOTO 500
30 PRINT"Zeichenfolge groesser":PRINT"als 255 Zeichen"
38 GOTO 500
40 PRINT"In Zeile";ERL;"ist die":PRINT"Formel zu komplex 
48 GOTO 520
50 PRINT"Puffer Ueberlauf"
58 GOTO 500
60 PRINT"Geraet in Zeile";ERL:PRINT"nicht betriebsbereit 
68 GOTO 520
70 PRINT"Fehler bei Geraeteoperation"
78 GOTO 500
80 REM
90 PRINT"Fehlerhafter Dateiname"
98 GOTO 500
100 PRINT"Datei in Zeile";ERL:PRINT"nicht gefunden 
108 GOTO 520
110 PRINT"In Zeile";ERL;"Baterien":PRINT"der Disk zu
schwach 
118 GOTO 520
120 PRINT"Diskette voll"
128 GOTO 500
130 PRINT"in Zeile";ERL;"Wert":PRINT"ueberm zulaessigen
Bereich 
138 GOTO 520
140 PRINT"Matematischer Fehler"
148 GOTO 500
150 PRINT"Doppelte Dimensionierung"
158 GOTO 500
160 PRINT"In Zeile";ERL;"Parameter":PRINT"ausserhalb
des":PRINT"zulaessigen Bereichs 
168 GOTO 520
170 PRINT"Falsche Verwendung eines":PRINT"Befehls ";
178 GOTO 500


                           - 34 - 


180 PRINT"Unbekannte Zeilennummer"
188 GOTO 500
190 PRINT"Falscher Variablentyp"
198 GOTO 500
200 PRINT"RESUME ohne Error"
208 GOTO 500
210 PRINT"Datei in Zeile";ERL:PRINT"geschuetzt 
218 GOTO 520
220 PRINT"Datenzuweisung ohne Daten"
228 GOTO 500
230 PRINT"NEXT ohne FOR"
238 GOTO 500
240 PRINT"FOR ohne NEXT"
248 GOTO 500
250 PRINT"RETURN ohne GOSUB"
258 GOTO 500
260 PRINT"Diskette unformatiert"
268 GOTO 500
270 PRINT"FIELD ueberschreitet":PRINT"256 Zeichen ";
278 GOTO 500
280 PRINT"OPEN - Fehler"
288 GOTO 500
290 PRINT"Befehl in Zeile";ERL:PRINT"laest sich nicht
ausfueren 
298 GOTO 520
300 REM
310 PRINT"Datenfehler vom RS-232-Port"
318 GOTO 500
320 PRINT"Fehler vom Diskettenlaufwerk"
500 REM ZEILE ==================
510 PRINT"in Zeile";ERL;"!";
520 FOR DE=1 TO 200
521 IF INKEY$<>""THEN DE=200
522 NEXT DE
530 RETURN


                           - 35 - 


W1.6 AlphakorelationW 

Dem  Menschen sagt man allgemein nach, da er Fehler weniger
bei  sich  als  bei  Anderen  (Dingen) suche. Dieser Umstand
ndert  sich  jedoch sofort, wenn es um das moderne Werkzeug
Computer geht. Hier sind wir, unverstndlicher Weise, bereit
alles kommentarlos hinzunehmen und jeden auftretenden Fehler
direkt  bei  uns  zu  suchen. Da stimmt doch was nicht! Oder
wrden  Sie, wenn ein so altes Werkzeug wie z.B. eine Schere
nicht  richtig  schneidet,  den Fehler auch bei sich suchen?
Natrlich  ist  ein  Computer auch eine schne Ausrede, denn
wenn  z.B.  die  Stromrechnung zweimal abgebucht wurde, dann
ist der Computer schuld. Doch darum geht es hier nicht. Hier
ein  Beispiel  das  jeder  kennt, der sich mit Computern be-
schftigt:  Im  BASIC  gibt  es eine Unzahl von Befehlen von
denen  viele  einen  oder  sogar mehrere Parameter erwartet.
Manche  dieser  Parameter  werden  einfach hinter den Befehl
geschrieben,  andere  wieder werden in Klammern gesetzt oder
durch  Komma,  Semikolon,  Strich, oder sonst wie vom Befehl
getrennt.  Also  ich  mu  offen  zugeben,  da  ich hierbei
stndig durcheinander komme. Dabei sollte einem der Computer
doch  gerade  bei  solchen Problemen auf das oft menschlich,
schlechte  Gedchtnis  helfen.  Oder gehren Sie auch zu den
Menschen,  denen  man  eingeredet  hat,  da  dazu knstlich
intelligente  Computer  und  parallel  arbeitende  Maschinen
ntig  wren?  Ich  glaube  hier fehlt es an der natrlichen
Intelligenz  der  Softwarehuser  zu erkennen, da zur Stei-
gerung  der  allgemeinen Akzeptanz von Computern auch intel-
ligentere  Betriebssysteme  ntig  sind. Das Problem ist von
den  Softwarehusern  schon  erkannt, jedoch wird zur Lsung
des  Problems meiner Meinung nach ein falscher Weg beschrit-
ten.  Es werden mit viel Aufwand graphische Oberflchen pro-
grammiert,  die  dann  tatschlich  sehr viel Rechenleistung
brauchen,  und deshalb auch nur sehr langsam arbeiten. Diese
Oberflchen   verhelfen   zwar  jedem  Computerneuling  sehr
schnell  zu Erfolgserlebnisen, mir jedoch ist der Umgang mit
der  Maus zu umstndlich, und ich fhle mich einfach zu sehr
eingeschrnkt,  wenn  ich  wie  ein  Zweijhriger  auf alles
zeigen  soll,  was  ich  wnsche.  Was ein moderner Computer
brauchte,  ist  eine Fehlertoleranz. Dazu ein Beispiel: Wenn
Sie  ein  Chef  wren,  und  zu ihrem Angestellten sagen, er
solle  doch  mal  das  Programm  "Alphakor-po-lation"  ber-
arbeiten, und dann nach einer Stunde nachfragen, wie weit er
mit  dem  Programm  sei,  und Sie dann die Antwort bekommen:
"Alphakorpolation  habe  ich  auf  meinem Schreibtisch nicht
gefunden,  da  lag  nur  Alphakorelation".  Dann  wrden Sie
diesen  Angestellten  sicher,  ber  kurz  oder  lang, raus-
schmeien.  Genau  das  lassen  sie sich aber tagtglich von
Computern  bieten.  Dabei  kann man einem Computer auf recht
einfache  Art  ein  anderes  Verhalten  beibringen. Wodurch?


                           - 36 - 


Natrlich  mit  der Alphakorelation! Die Alphakorelation ist
ein  mathematischer  Wert,  der  die Beziehung zwischen zwei
Worten  im  Bezug  auf ihre hnlichkeit ausdrckt. Sind z.B.
zwei   Worte  identisch  miteinander,  so  ist  ihre  Alpha-
korelation  =  1 ,  zwei  vllig verschiedene Worte dagegen,
haben  eine  Alphakorelation  = 0 . Natrlich sind auch alle
anderen  Werte  Zwischen  0 und 1 mglich. Das folgende Pro-
gramm  "Alphakorelation"  berechnet diesen Wert nach Eingabe
der  beiden Worte. Es lt sich sehr gut in eigene Programme
einbauen und zur Fehlerkorrektur verwenden. Wird es in einem
"ON  ERROR  GOTO"- Aufruf verwendet, so braucht es lediglich
Speicher aber keine permanente Rechenleistung!


                           - 37 - 


10 REM **** ALPHAKORELATION ****
20 REM *************************
30 CLS:PRINTREV"    *** ALPHAKORELATION ***     "NORM;
40 REM EINGABE =================
50 PRINT"1. Wort :";:INPUT D$
60 PRINT"2. Wort :";:INPUT F$
70 REM ALPHAKORELATION ========
80 IF D$=F$ THEN R=1:GOTO 190
90 IF LEN(F$)>LEN(D$)THEN X$=D$:D$=F$:F$=X$
100 LD=LEN(D$):LF=LEN(F$):L=0
110 FOR II=1 TO LF
120 FOR JJ=II-2 TO II+2
130 ON ERROR GOTO 220
140 IF MID$(F$,II,1)<>MID$(D$,JJ,1)THEN 160
150 L=L+1:JJ=II+2
160 NEXT JJ
170 NEXT II
180 R=L/LD
190 PRINT"ALPHAKORELATION =";R
200 GOTO 40
210 REM FEHLERFALLE ============
220 RESUME 160


                           - 38 - 


W1.7 Daten sortierenW 

Der Casio PB-1000 ist ein ausgezeichneter Reisebegleiter. Er
rechnet  Whrungen  um,  weckt  pnktlich,  sorgt fr Unter-
haltung,  und  das  alles  bereits ohne irgend ein Programm.
Darber  hinaus,  kann  man ihn aber auch als elektronisches
Wrterbuch  verwenden.  Auch dazu braucht man kein Programm.
Die Wrter und ihr fremdsprachiges Equivalent werden einfach
mit  der  "Memo  in"-  Funktion  eingegeben, und Knnen dann
spter  mit der "edit"- Funktion beliebig durchsucht werden.
Dabei  lernt  man  auch gleich etwas vom Grundwortschatz der
fremden  Sprache.  Natrlich  wird  sich  niemand  die  Mhe
machen,  alle  Worte  gleich in ihrer alphabetischen Reihen-
folge  einzugeben, aber schner wre es schon. Diese stumpf-
sinnige  Arbeit  knnen Sie aber auch getrost einem Programm
berlassen. Das Programm "Bubble sort" erledigt das fr Sie.
Natrlich  lassen  sich  hiermit  auch andere Daten wie z.B.
Telefonnummern oder Adressen sortieren. Die sortierten Daten
stehen  nach  Ablauf  des Programms in dem File "SORT.DAT" ,
wenn  Sie aus Speicherplatzgrnden die Zieldaten in der Ein-
gabedatei  wnschen,  so brauchen Sie lediglich Zeile 310 in
"310 OPEN FN$ FOR OUTPUT AS #1" zu ndern.

Da  der  CASIO Ihre Daten in ein String-Feld einliest mssen
Sie  ausreichend  Zeichenbereichsspeicher  mit der "CLEAR" -
Anweisung reservieren (Siehe Befehlssatz-Handbuch S.22) !

10 REM ***** BUBBLE-SORT ******
30 REM ************************
40 CLEAR
50 CLS:PRINTREV"       *** BUBBLE SORT ***      "NORM;
60 ON ERROR GOTO 380
70 REM EINGABE =================
80 PRINT"Welches File soll sortiert"
90 PRINT"werden?"
100 PRINT"FILENAME.EXT :";:INPUT FN$
110 REM DIM TX$(LAENGE) ========
120 OPEN FN$ FOR INPUT AS #1
130 IF EOF(1) THEN I=I-1:DIM TX$(I):CLOSE #1:GOTO 160
140 LINE INPUT #1,TX$:I=I+1
150 GOTO 130
160 REM FILE EINLESEN ==========
170 BEEP:PRINT"Laenge von ";FN$" =";I+1
180 PRINT "Datensaetze!"
190 OPEN FN$ FOR INPUT AS #1
200 FOR J=0 TO I
210 LINE INPUT #1,TX$(J)
220 NEXT J
230 CLOSE #1
240 REM BUBBLE SORT ============


                           - 39 - 


250 SW=0
260 FOR J=0 TO I-1
270 IF TX$(J)>TX$(J+1)THEN
TX$=TX$(J):TX$(J)=TX$(J+1):TX$(J+1)=TX$:SW=1
280 NEXT J
290 IF SW=1 THEN 240
300 REM SORT.DAT ABSPEICHERN ===
310 OPEN"SORT.DAT"FOR OUTPUT AS #1
320 FOR J=0 TO I
330 PRINT #1,TX$(J)
340 NEXT J
350 CLOSE #1
355 PRINT"fertig !"
360 FOR I=1 TO 5:BEEP 0:BEEP 1:NEXT I
370 END
380 REM FEHLERBEHANDLUNG========
390 GOSUB"FEHLER.BAS"
400 CLOSE
410 RESUME 40


                           - 40 - 







                 h2.Teil
h




       Programme welche
       ein Interface des
       Casio PB-1000
       nutzen
h 


                           - 41 - 


W2.1 BASIC-MonitorW 

Haben  Sie  sich  schon  gefragt, wer  dem Autor so wichtige
Speicherzellen,  wie z.B. die der "c-boot"- Funktion (findet
Verwendung  im  Programm  Terminkalender), verraten hat? Die
Antwort  lautet:  Ein  Programm! Oder besser zwei Programme,
die ich Ihnen hier vorstellen mchte.

Ein interessanter Programmteil, auf den ich hier noch einmal
besonders  aufmerksam  machen  mchte, ist das Unterprogramm
HEX/DEZ-Wandlung  in  den  Programmzeilen  1060 bis 1220. Es
bekommt  eine hexadezimale Zeichenfolge in der Variablen HX$
bergeben, und liefert den entsprechenden Dezimalwert in der
Variablen DZ zurck.

-Programmbeschreibung zum Basic-Monitor- 

Ein  Monitor  ist  ein  Programm zum Anzeigen und ndern von
einzelnen  Speicherzellen eines Computers. Der Casio PB 1000
besitzt  zwar  ein  solches  mini  Monitorprogramm  im  ROM,
welches  ber  Basic  mit  der  Eingabe  von "MON" gestartet
werden  kann,  dieser  Mini-Monitor  hat  jedoch  zwei  ent-
scheidende  Nachteile:  Zum  Einen ist die Ausgabe von Spei-
cherdaten  an  einen  Drucker nicht mglich, und zum Zweiten
lassen  sich  keine Daten suchen. Das Programm Basic-Monitor
beseitigt  diese  Nachteile.  Nach dem Starten fragt es nach
List,  Suchen  oder Monitor, List zum Speicherlisten, Suchen
zum  Suchen  von HEX- oder ASCII-Folgen im Speicher. Monitor
fhrt in den Mini- ROM- Monitor des Casio PB-1000 und zeigt,
lediglich zur Erinnerung, noch einmal die hier zur Verfgung
stehenden drei Befehle.


                           - 42 - 


            -Speicher listen:- 
            ͻ
                  *** BASIC-MONITOR ***      
                                             
            LIST,SUCHEN oder MONITOR         
             (L/S/M) ?_                      
            ͼ
            "L"- Taste

            ͻ
            LIST,SUCHEN oder MONITOR         
             (L/S/M) ?L                      
            Sollen die Daten ausgedruckt     
            werden (J/N) ?_                  
            ͼ
            Drucken natrlich nur mit
            angeschlossenem Drucker!

            ͻ
            werden (J/N) ?N                  
            STARTADRESSE     (HEX) ?9410     
            Entspricht 37940 (DEZ)           
            ENDADRESSE       (HEX) ?_        
            ͼ
            Start- und Endadresse (hexadezimal)
            eingeben

            ͻ
                     HEX/ASCII-DUMP          
            Anhalten mit <LEERTASTE>         
            Weiter   mit <-G- TASTE>         
            Abbruch  Mit <-S- TASTE>_        
            ͼ
            Beliebige Taste

            ͻ
            9410   20 20 2A 2A 2A 42 41 53   
            9410         *  *  *  B  A  S    
            9418   49 43 2D 4D 4F 4E 49 54   
            9418   I  C  -  M  O  N  I  T    
            ͼ
            Und die Daten werden Angezeigt


                           - 43 - 


            -HEX- oder ASCII- Zeichenfolgen
            suchen:- 
            ͻ
                  *** BASIC-MONITOR ***      
                                             
            LIST,SUCHEN oder MONITOR         
             (L/S/M) ?_                      
            ͼ
            Hier die "S"-Taste

            ͻ
                    HEX/ASCII-SUCHE          
                                             
            HEX  oder  ASCII (H/A) ?_        
                                             
            ͼ
            Hier z.B. "A"-Taste fr ASCII

            ͻ
                                             
            HEX  oder  ASCII (H/A) ?A        
            ASCII-Zeichenfolge ?:            
            ?MONITOR_                        
            ͼ
            Ob sich MONITOR im Speicher finden
            lt? (Es knnen bis zu 8 Zeichen
            eingegeben werden!)

            ͻ
            ASCII-Zeichenfolge  ?:           
            ?MONITOR                         
             MONITOR                         
            STARTADRESSE     (HEX) ?_        
            ͼ
            Start- und Endadresse eingeben

            ͻ
            ENDADRESSE       (HEX) ?FFFF     
            Entspricht 65535 (DEZ)           
            Gefunden ab Adresse FEA5         
            WEITER oder STOP (W/S) ?_        
            ͼ
            Und auf ein Tonsignal warten! 

                           - 44 - 



10 REM ***** BASIC-MONITOR *****
20 REM *(C) H.Boehling 02.06.87*
30 REM *************************
40 CLS:PRINTREV"      *** BASIC-MONITOR ***     ";NORM
50 CLEAR:Z$="0000":DIM S(8)
60 ON ERROR GOTO 1300
70 PRINT"LIST,SUCHEN oder MONITOR"
80 PRINT" (L/S/M) ?";:W$=INPUT$(1):PRINT W$
90 IF W$="L"THEN 130
100 IF W$="S"THEN 510
110 IF W$="M"THEN 1230
120 GOTO 70
130 REM=HEX/ASCII-DUMP===========
140 PRINT"Sollen die Daten ausgedruckt"
150 PRINT"werden (J/N) ?";:LL$=INPUT$(1):PRINT LL$
160 IF LL$<>"J" AND LL$<>"N" THEN 130
170 GOSUB 950
180 CLS:PRINTREV"         HEX/ASCII-DUMP         ";NORM;
190 PRINT"Anhalten mit <LEERTASTE>"
200 PRINT"Weiter   mit <-G- TASTE>"
210 PRINT"Abbruch  mit <-S- TASTE>";
220 W$=INPUT$(1):CLS
230 FOR AD=STAD TO EAD STEP 8
240 PRINTREV HEX$(AD);"   ";
250 IF LL$="J" THEN LPRINT"           ";HEX$(AD);"   ";
260 FOR J=0 TO 7
270 PRINT RIGHT$(HEX$(PEEK(AD+J)),2);" ";
280 IF LL$="J" THEN LPRINT RIGHT$(HEX$(PEEK(AD+J)),2);" ";
290 NEXT J
300 PRINT
310 IF LL$="J" THEN LPRINT"   ";
320 PRINTNORM HEX$(AD);"   ";
330 FOR J=0 TO 7
340 CHR=PEEK(AD+J)
350 IF CHR<32 THEN CHR=223
360 IF CHR>126 THEN CHR=223
370 PRINT CHR$(CHR);"  ";
380 IF LL$="J" THEN LPRINT CHR$(CHR);"  ";
390 NEXT J
400 PRINT
410 IF LL$="J" THEN LPRINT
420 IF INKEY$=" "THEN 470
430 IF AD+7>EAD THEN EAD=AD+7
440 NEXT AD


                           - 45 - 


450 W$=INPUT$(1):IF W$="G" THEN STAD=EAD+1:EAD=EAD+8:GOTO
230
460 GOTO 10
470 REM-UNTERBRECHUNG-----------
480 IF INKEY$="G"THEN 440
490 IF INKEY$="S"THEN 10
500 GOTO 480
510 REM=HEX/ASCII-SUCHEN========
520 CLS:PRINTREV"        HEX/ASCII-SUCHE         ";NORM
530 PRINT"HEX  oder  ASCII (H/A) ?";:W$=INPUT$(1):PRINT W$
540 IF W$="H"THEN 570
550 IF W$="A"THEN 670
560 GOTO 10
570 REM-HEX-SUCHEN--------------
580 PRINT"HEX-Zahlenfolge ?:"
590 FOR L2=1 TO 8
600 HX$=INPUT$(2):IF ASC(HX$)=13 THEN L=L2:L2=8:GOTO 640
610 GOSUB 1060
620 PRINT RIGHT$(HEX$(DZ),2);",";
630 S(L2)=DZ
640 NEXT L2:L=L-1
650 PRINT
660 GOTO 760
670 REM-ASCII-SUCHEN------------
680 PRINT"ASCII-Zeichenfolge ?:":INPUT S$
690 PRINT" ";
700 IF LEN(S$)<8 THEN L2=LEN(S$)
710 IF LEN(S$)>7 THEN L2=8
720 FOR L=1 TO L2
730 S(L)=ASC(MID$(S$,L,1)):PRINT CHR$(S(L));
740 NEXT L:L=L-1
750 PRINT
760 GOSUB 950
770 REM-SUCHEN------------------
780 FOR AD=STAD TO EAD:M=0
790 IF PEEK(AD)=S(1)THEN M=1:GOTO 850
800 NEXT AD
810 IF M=1 GOTO 10
820 FOR J=1 TO 8:BEEP 0:NEXT J
830 PRINT"Nicht Gefunden! ":FOR I=1 TO 300:NEXT I
840 GOTO 10
850 FOR J=2 TO L
860 IF PEEK(AD+J-1)<>S(J)THEN J=L:M=0
870 NEXT J
880 IF M=0 THEN 800


                           - 46 - 


890 FOR J=1 TO 4:BEEP 0:BEEP 1:NEXT J
900 IF M=1 THEN PRINT"Gefunden ab Adresse ";HEX$(AD)
910 PRINT"WEITER oder STOP (W/S) ?";:W$=INPUT$(1):PRINT W$
920 IF W$="W"THEN 800
930 IF W$="S"THEN AD=EAD:GOTO 800
940 GOTO 910
950 REM-START/END-EINGABE-------
960 PRINT"STARTADRESSE     (HEX) ";:INPUT HX$
970 IF LEN(HX$)>4 THEN 960
980 GOSUB 1060:STAD=DZ
990 PRINT"Entspricht";DZ;"(DEZ)"
1000 PRINT"ENDADRESSE       (HEX) ";:INPUT HX$
1010 IF LEN(HX$)>4 THEN 1000
1020 GOSUB 1060
1030 IF DZ<STAD THEN EAD=STAD+7 ELSE EAD=DZ
1040 PRINT"Entspricht";DZ;"(DEZ)"
1050 RETURN
1060 REM-HEX/DEZ-WANDLUNG--------
1070 DZ=0:HX$=LEFT$(Z$,4-LEN(HX$))+HX$
1080 FOR P=1 TO 4
1090 H$=MID$(HX$,P,1)
1100 IF(H$>="0")OR(H$<="9")THEN D=VAL(H$)
1110 IF H$="A"THEN D=10
1120 IF H$="B"THEN D=11
1130 IF H$="C"THEN D=12
1140 IF H$="D"THEN D=13
1150 IF H$="E"THEN D=14
1160 IF H$="F"THEN D=15
1170 IF P=1 THEN DZ=DZ+D*4096
1180 IF P=2 THEN DZ=DZ+D*256
1190 IF P=3 THEN DZ=DZ+D*16
1200 IF P=4 THEN DZ=DZ+D
1210 NEXT P
1220 RETURN
1230 REM=CACIO PB-1000 MONITOR==
1240 CLS:PRINTREV"       ***CASIO-MONITOR***      ";NORM;
1250 PRINT"BANK schalten mit B (0 oder 1)"
1260 PRINT"DUMP          mit D(HEXADR)"
1270 PRINT"EDIT          mit E(HEXADR)";
1280 W$=INPUT$(1)
1290 MON
1300 REM= FEHLERBEHANDLUNG =====
1310 CLS:PRINTREV"FEHLER Nr.";ERR;"aufgetreten !     ";NORM
1320 FOR DE=1 TO 400:NEXT DE
1330 RESUME 10


                           - 47 - 




                           - 48 - 


W2.2 Systemadressen suchenW 

Mit  dem  Programm  BASIC-Monitor  lassen  sich  zwar selbst
eingegebene  Werte  und  Zeichenfolgen,  wie  z.B.  die  der
"c-boot"-  Funktion,  im  Speicher des Casio PB-1000 wieder-
finden,  aber  was ist mit Speicherzellen, die das Betriebs-
system  benutzt? Sogenannte Systemadressen, nun dazu mu das
Programm  etwas  abgendert  werden. Dabei entsteht das Pro-
gramm "Systemadressen suchen".

-Programmbeschreibung zum Systemadressen suchen- 

Wer  eine  Systemadresse  suchen  und finden mchte, der mu
sich  zunchst einen BASIC- Befehl suchen, der diese Speich-
erzelle  beeinflut. In meinem Beispiel mchte ich die Spei-
cherzelle  des  Grafikspeichers  finden, welche  sich in der
oberen  Ecke  der  LCD- Anzeige befindet. Deshalb lautet der
entsprechende  BASIC-  Befehl  DRAW  (0,0). Aber man braucht
auch  einen Befehl, der diese Beeinfluung wieder rckgngig
macht, oder  die Speicherzelle in einer anderen Weise beein-
flut.  In  meinem Beispiel ist dies der Befehl DRAWC (0,0).
Diese  beiden  Befehle werden dann in den Programmzeilen 140
und  180 eingesetzt. Danach wird das Programm gestartet. Auf
die  Frage  nach der Startadresse kann man 6000 und als End-
adresse  6FFF  eingeben. So wird der gesamte Systemspeicher-
bereich   durchsucht  (vergleichen  Sie  mit  dem  Speicher-
belegungsplan  in  der Bedienungsanleitung des Casio PB-1000
auf  S.89).  Jedesmal, wenn  der  Casio nach Ausfhren eines
dieser  beiden  Befehle eine nderung in einer Speicherzelle
feststellt,  macht  er  mit  einem  Tonsignal  auf sich auf-
merksam.  Wenn  Sie keinen Drucker besitzen, mssen Sie sich
nun  die  angezeigten  Daten  notieren!  In unserem Beispiel
findet er 8 Adressen in denen sich etwas ndert. Aber welche
ist  die  gesuchte  Speicherzelle? Nun, das lt sich leicht
mit  8 gezielten POKE's in diese Speicherzellen feststellen!
Aber Vorsicht bei Anwendung des POKE- Befehls, dabei sollten
sich  keine  wichtigen  Daten  oder  Programme  im  Speicher
befinden, denn  hierbei  mu man immer mit einem eventuellen
Absturz des Computers rechnen! Eine, in unserem Fall bessere
Lsung, ist  das  nochmalige  durchsuchen  des Speichers mit
einem anderen DRAW- Befehl, z.B. mit DRAW (191,63) und DRAWC
(191,63).  So  finden  Sie  auch gleich das Ende des Grafik-
Speichers.


                           - 49 - 


Dies  gibt  der Casio PB-1000 beim durchsuchen des Speichers
mit DRAW (0,0) und DRAWC (0,0) aus:

Durchsuchen von Adresse 6000 bis 6FFF (HEX)

Veraenderung von Adresse 6201 (HEX) von 0 auf 128 (DEZ)
Veraenderung von Adresse 6912 (HEX) von 1 auf 2 (DEZ)
Veraenderung von Adresse 6913 (HEX) von 19 auf 45 (DEZ)
Veraenderung von Adresse 6A4A (HEX) von 0 auf 104 (DEZ)
Veraenderung von Adresse 6B43 (HEX) von 1 auf 2 (DEZ)
Veraenderung von Adresse 6B44 (HEX) von 19 auf 45 (DEZ)
Veraenderung von Adresse 6F56 (HEX) von 130 auf 150 (DEZ)
Veraenderung von Adresse 6F58 (HEX) von 18 auf 44 (DEZ)

Fertig !

Und  dies  gibt  der  Casio  PB-1000  beim  durchsuchen  des
Speichers mit DRAW (191,63) und DRAWC (191,63) aus:

Durchsuchen von Adresse 6000 bis 6FFF (HEX)

Veraenderung von Adresse 6800 (HEX) von 0 auf 1 (DEZ)
Veraenderung von Adresse 6912 (HEX) von 1 auf 2 (DEZ)
Veraenderung von Adresse 6913 (HEX) von 19 auf 48 (DEZ)
Veraenderung von Adresse 6A4A (HEX) von 0 auf 104 (DEZ)
Veraenderung von Adresse 6B43 (HEX) von 1 auf 2 (DEZ)
Veraenderung von Adresse 6B44 (HEX) von 19 auf 48 (DEZ)
Veraenderung von Adresse 6F56 (HEX) von 130 auf 150 (DEZ)
Veraenderung von Adresse 6F58 (HEX) von 18 auf 47 (DEZ)

Fertig !

Welches  nun  die  gesuchten  Speicherzellen  sind, ist doch
klar, oder? Natrlich &H6201 und &H6800!


                           - 50 - 



10 REM ***** SYSTEMADRESSEN ****
20 REM *****     SUCHEN     ****
30 REM *(C) H.Boehling 23.06.87*
40 REM *************************
50 CLS:PRINTREV"      ***ADRESSN-SUCHEN***      ";NORM
60 CLEAR:Z$="0000":DIM S(8)
70 ON ERROR GOTO 630
80 PRINT"Sollen die Daten ausgedruckt"
90 PRINT"werden (J/N) ?";:LL$=INPUT$(1):PRINT LL$
100 GOSUB 350
110 IF LL$="J"THEN LPRINT"Durchsuchen von ";HEX$(STAD);"
bis ";HEX$(EAD);" (HEX)":LPRINT:LPRINT
115 REM= SUCHEN ==============
120 FOR AD=STAD TO EAD
130 M=PEEK(AD)
140 DRAW (0,0):REM hier den Befehl einsetzen
150 M2=PEEK(AD)
160 IF M2<>M THEN GOTO 260
170 M=PEEK(AD)
180 DRAWC (0,0):REM und hier den Befehl einsetzen
190 M2=PEEK(AD)
200 IF M2<>M THEN GOTO 260
210 NEXT AD
220 FOR J=1 TO 8:BEEP 0:NEXT J
230 PRINT"Fertig ! ":FOR I=1 TO 300:NEXT I
240 IF LL$="J"THEN LPRINT:LPRINT"Fertig ! "
250 END
255 REM= GEFUNDEN ============
260 FOR J=1 TO 4:BEEP 0:BEEP 1:NEXT J
270 PRINT"Veraenderung von Adresse "
280 PRINT HEX$(AD);" (HEX) Von";M;"auf";M2;"(DEZ)"
290 IF LL$="J"THEN LPRINT"Veraenderung von
Adresse ";HEX$(AD);" (HEX)";
300 IF LL$="J"THEN LPRINT" Von";M;"auf";M2;"(DEZ)":GOTO 210
310 PRINT"WEITER oder STOP (W/S) ?";:W$=INPUT$(1):PRINT W$
320 IF W$="W"THEN 210
330 IF W$="S"THEN AD=EAD:GOTO 210
340 GOTO 310
350 REM-START/END-EINGABE-------
360 PRINT"STARTADRESSE     (HEX) ";:INPUT HX$
370 IF LEN(HX$)>4 THEN 360
380 GOSUB 460:STAD=DZ
390 PRINT"Endspricht";DZ;"(DEZ)"
400 PRINT"ENDADRESSE       (HEX) ";:INPUT HX$


                           - 51 - 


410 IF LEN(HX$)>4 THEN 400
420 GOSUB 460
430 IF DZ<STAD THEN EAD=STAD+7 ELSE EAD=DZ
440 PRINT"Endspricht";DZ;"(DEZ)"
450 RETURN
460 REM-HEX/DEZ-WANDLUNG--------
470 DZ=0:HX$=LEFT$(Z$,4-LEN(HX$))+HX$
480 FOR P=1 TO 4
490 H$=MID$(HX$,P,1)
500 IF(H$>="0")OR(H$<="9")THEN D=VAL(H$)
510 IF H$="A"THEN D=10
520 IF H$="B"THEN D=11
530 IF H$="C"THEN D=12
540 IF H$="D"THEN D=13
550 IF H$="E"THEN D=14
560 IF H$="F"THEN D=15
570 IF P=1 THEN DZ=DZ+D*4096
580 IF P=2 THEN DZ=DZ+D*256
590 IF P=3 THEN DZ=DZ+D*16
600 IF P=4 THEN DZ=DZ+D
610 NEXT P
620 RETURN
630 REM= FEHLERBEHANDLUNG =====
640 CLS:PRINTREV"FEHLER Nr.";ERR;"in";ERL;"!    ";NORM
650 FOR DE=1 TO 400:NEXT DE
660 RESUME 10


                           - 52 - 


Mit  den  beiden  Programmen  "Monitor"  und "Systemadressen
suchen" habe ich schon folgende Systemspeicherzellen gesucht
und auch gefunden! In den, in Klammern stehenden, Programmen
sind diese Adressen verwendet oder in den Texten dazu weiter
erklrt.


Grafikspeicher: &H6201 bis &H6800 (Sceendump)
c-boot Datum  : &H6F43 und &H6F44 (Terminkalender)
c-boot Zeit   : &H6F45 und &H6F46        "
aktuelle Zeit : &H6BAD dis &H6BB1        "
Cursorposition: &H68C8            (Position, Terminal)


                           - 53 - 


W2.3 Die CursorpositionW 

Die  Systemspeicherzelle  der  Cursorposition  ist besonders
interessant.  Microsoft-  BASIC  besitzt  die beiden Befehle
CSRLIN  und  POS  zur  Bestimmung der Cursorposition, andere
BASIC-Dialekte  besitzen  den  Befehl  POSITION.  Der  Casio
PB-1000 besitzt leider keinen solchen Befehl, aber das macht
ja  nun  auch  gar  nichts  mehr, denn mit der Speicherzelle
&H68C8 lt sich die Position leicht berechnen! Und weil ein
Beispiel  mehr  als  viele  Worte  sagt,  hier ein Beispiel-
programm:


10 REM ** DEMO VON ADR.&H68C8 **
20 REM *(C) H.Boehling 02.06.87*
30 REM *************************
40 FOR I=0 TO 255
50 GOSUB 100
60 LOCATE H,V:PO=PEEK(&H68C8):PRINT"*";PO;I;
70 FOR DE=1 TO 10:NEXT DE
80 NEXT I
90 END
100 REM
110 H=FRAC(I/32)*32
120 V=INT(I/32)
130 RETURN


Man  sieht  hier,  da  sich die Cursor-Position in der Adr.
&H68C8  verbirgt  (Anwendung im Programm Texteditor in Zeile
390).


                           - 54 - 


W2.4 Das Directory des CasioW 

Jedes  im  Men  des Casio PB-1000 angezeigte Programm- oder
Datenfile  wird in einem Inhaltsverzeichnis (auf gut deutsch
auch  Directory) gefhrt. Jedes File belegt in diesem Direc-
tory  32  Speicherzellen, in denen neben dem Namen des Files
auch  andere  Informationen,  wie  z.B.  Startadresse,  End-
adresse,  oder  auch  das  Passwort,  abgespeichert  werden.
Dieses  Directory  wird  immer  am  Ende  des  zur Verfgung
stehenden  Speichers angelegt. Mit der 32 k Byte-Erweiterung
ergibt sich folgender Speicherbelegungsplan:


                                
         Ĵ
FFA0                            
             3. Directory-      
                eintrag         
                                    FFBF
      -  Ĵ
FFC0                            
     32      2. Directory-      
    Byte        eintrag         
                                    FFDF
      -  Ĵ
FFE0      Status, Beginn, Ende, 
     32   Typ, Filename.Ext,    
    Byte  Passwort (BASIC),     
          Beginn, Ende, Start       FFFF (Speicherende)
      -  


                           - 55 - 


Der  Zeiger,  auf  den  ersten  Eintrag  in  diesem Inhalts-
verzeichnis  ist  in  den  Speicherzellen  &H694B und &H694C
abgelegt.  (Ein  Zeiger  ist  im  Zusammenhang mit Computer-
programmen  eine  Speicherzelle,  in  der  die Speicherzelle
abgespeichert  wird,  an der wiederum andere Daten beginnen)
Natrlich   greift  auch  das  Men  des  Casio  auf  dieses
Directory-  Datenfeld  zurck.  Leider zeigt dieses Men des
Casio  PB-1000  nicht,  wie sonst in einem Directory blich,
die Gre der im Speicher vorhandenen Files. Die Gre eines
Files lt sich aber recht einfach aus Start- und Endadresse
errechnen.  Aber  auch andere wichtige Informationen werden,
wahrscheinlich  aus Platzgrnden, nicht andezeigt. Dies kann
jedoch ab heute das Programm Directory fr Sie tun.

Ich  mchte hier noch einmal besonders auf die Programmzeile
60  aufmerksam machen. So wird festgestellt, ob an den Casio
ein Interface angeschlossen ist!


-Programmbeschreibung zum Directoryprogramm- 

Das  Programm  Directory  berechnet  nicht nur die Gre von
Files,  darber  hinaus  wird  auch  das Passwort von BASIC-
Programmen  angezeigt  (Dadurch wird es leider berflssig).
Und   von  Maschinenprogrammen  werden  Beginn-,  End-,  und
Einsprungadresse  angezeigt. Dieses bersichtliche Directory
kann  auch  auf  einen  Drucker ausgegeben werden. Beim Aus-
duck  werden  dann  auch noch die Speicherbereiche, in denen
die  Files  abgespeichert sind, aufgelistet. Dieser Ausdruck
sieht dann z.B. folgender Maen aus:


                           - 56 - 



FILENAME.EXT   LNGE PASS Gespeichert    Maschinenprogramme
                          von     bis    Beginn Ende  Start

TERMIN  .BAS#B  5446      &H93FF &HA946
MONITOR .BAS B  3378      &HA946 &HB679
DIR     .BAS*B  2214      &HB679 &HBF20
UHR     .BAS B  1917 TEST &HBF20 &HC69E
FEHLER  .BAS B  1962      &HC96E &HCE49
TERMIN  .DAT S    24      &HCE49 &HCE62
SOUND   .SOU S   927      &HCE62 &HD202
SOUND   .EXE M    81      &HD202 &HD254 &H7002 &H7053 &H7002

 15949 Byte belegt !



                           - 57 - 


Und  so  prsentiert  sich  das  Programm in der Anzeige des
Casio PB-1000:


            ͻ
                    *** DIRECTORY ***        
            FILENAME.EXT   LAENGE PASSWORT   
            TERMIN  .BAS#B   5446            
                                             
            ͼ

            ͻ
            MONITOR .BAS B   3378            
            DIR     .BAS*B   2214            
            UHR     .BAS B   1917 TEST       
                                             
            ͼ

            ͻ
            FEHLER  .BAS B   1962            
            TERMIN  .DAT S     24            
            SOUND   .SOU S    927            
                                             
            ͼ

            ͻ
            SOUND   .EXE M     81            
             &H7002 &H7053 &H7002            
             15949 Byte belegt !             
                                             
            ͼ


Damit  die angezeigten Daten nicht davonlaufen, erwartet der
Casio PB-1000 nach jeder Zeile das drcken einer Taste!


                           - 58 - 



10 REM ****** DIRECTORY ********
20 REM *(C) H.Boehling 22.03.88*
30 CLS:CLEAR:W$="N"
40 STAD=(PEEK(&H694B)+PEEK(&H694C)*256)-32
50 PRINTREV"        *** DIRECTORY ***       ";NORM;
60 IF PEEK(&H0C04)=255 THEN 90:REM KEIN INTEFACE VORHANDEN
70 PRINT"Druckerausgabe (J/N) ";:W$=INPUT$(1):PRINT W$
80 IF W$="j"OR W$="Y"OR W$="y"THEN W$="J":PRINT W$
90 PRINTREV"FILENAME.EXT   LAENGE PASSWORT  ";NORM;
100 IF W$="J"THEN LPRINT"FILENAME.EXT   LAENGE PASSWORT
Gespeichert    Maschinenprogramme"
110 IF W$="J"THEN LPRINT"                                von
bis     Beginn Ende   Start":LPRINT
120 REM=STATUS==================
130 ST$="?":ST=PEEK(STAD)
140 IF ST=0 THEN ST$=" "
150 IF ST=1 THEN ST$="*"
160 IF ST=2 THEN ST$="#"
170 REM=START/ENDADRESSE/LAENGE=
180 PST=PEEK(STAD+1)+PEEK(STAD+2)*256
190 PST$=" &H"+HEX$(PST)
200 PEND=PEEK(STAD+3)+PEEK(STAD+4)*256
210 PEND$=" &H"+HEX$(PEND)
220 LAENGE=PEND-PST-1:SUMM=SUMM+LAENGE
230 REM=DATEITYP================
240 TYP$="?":TYP=PEEK(STAD+5)
250 IF TYP=16 THEN TYP$="B"
260 IF TYP=13 THEN TYP$="M"
270 IF TYP=36 THEN TYP$="S"
280 REM=PROGRAMMNAME============
290 NAME$=""
300 FOR NAME=STAD+6 TO STAD+16
310 NAME$=NAME$+CHR$(PEEK(NAME))
320 NEXT NAME
330 NAME$=LEFT$(NAME$,8)+"."+RIGHT$(NAME$,3)
340 REM=BASICPROGRAMM==========
350 REM=PASSWORT===============
360 PASW$="        "
370 IF TYP$<>"B"THEN 450:REM KEIN BASIC
380 IF PEEK(STAD+17)=255 THEN 510:REM KEIN PASSWORT
390 PASW$=""
400 FOR PASW=STAD+17 TO STAD+24
410 PA$=CHR$(255-PEEK(PASW))
420 IF ASC(PA$)<32 THEN PA$=" "


                           - 59 - 


430 PASW$=PASW$+PA$
440 NEXT PASW
450 REM=MASCHINENPROGAMM=======
460 REM=BEGINN/ENDE/START======
470 IF TYP$<>"M"THEN 510:REM KEIN MASCH.-PROGRAMM
480 BEG$=" &H"+HEX$(PEEK(STAD+25)+PEEK(STAD+26)*256)
490 EN$=" &H"+HEX$(PEEK(STAD+27)+PEEK(STAD+28)*256)
500 STA$=" &H"+HEX$(PEEK(STAD+29)+PEEK(STAD+30)*256)
510 REM=AUSGABE=================
520 PRINT NAME$;ST$;TYP$;"  ";
530 PRINT USING"#####";LAENGE;
540 PRINT " ";PASW$
550 IF TYP$="M"THEN PRINT BEG$;EN$;STA$
560 REM-DRUCKER----------------
570 IF W$<>"J"THEN 620
580 LPRINT NAME$;ST$;TYP$;"  ";
590 LPRINT USING"#####";LAENGE;
600 LPRINT " ";PASW$;" ";PST$;PEND$;" ";
610 IF TYP$="M"THEN LPRINT BEG$;EN$;STA$ ELSE LPRINT
620 REM=ENDE?==================
630 IF W$<>"J" AND INKEY$=""THEN 630
640 STAD=STAD-32
650 IF PEEK(STAD+1)+PEEK(STAD+2)*256=PEND THEN 120
660 PRINT SUMM;"Byte belegt !
670 IF W$="J"THEN LPRINT:LPRINT SUMM;"Byte belegt !
680 CALL &HE567


                           - 60 - 


W2.5 Casio TexteditorW 

Der  Casio  PB-1000  als  komfortable  Textverarbeitung? Das
leider  nicht,  aber wer schnell mal eine Notiz in den Casio
eingeben  mchte, oder  aber ein Textadventure fr den Casio
PB-1000  schreiben  mchte,  der wird dies sicher lieber mit
diesem  Programm  tun  als mit der "edit"- Funktion. Fr die
Verwendung  in  einem Textadventure bietet sich das Programm
besonders  an.  Wird der Programmteil von Zeile 70 bis Zeile
190  in  das eigene Programm bernommen, so braucht man sich
ber die Bildschirmaufteilung keine Gedanken mehr zu machen,
die Worte werden ausgegeben, ohne zerrissen zu werden!


            ͻ
               *** TEXTEDITOR PB-1000 ***   
                                            
            So lassen sich Texte uebersicht_
                                            
            ͼ
            ͻ
               *** TEXTEDITOR PB-1000 ***   
                                            
            So lassen sich Texte            
            uebersichtl_                    
            ͼ
            ͻ
               *** TEXTEDITOR PB-1000 ***   
                                            
            So lassen sich Texte            
            uebersichtlich in den Casio ein_
            ͼ
            ͻ
                                            
            So lassen sich Texte            
            uebersichtlich in den Casio     
            eingeben!_                      
            ͼ


                           - 61 - 


-Programmbeschreibung zum Casio Texteditor- 

Das  Programm  ermglicht  das  leichte Eingeben von Texten.
Nach dem Start des Programms erfolgt die Meldung "TEXTEDITOR
PB-1000"  und  das  Programm  wartet  auf  die Eingabe eines
Textes.   Der   erste   Buchstabe   wird   automatisch  gro
geschrieben.  Zum  Editieren  und  Eingeben  stehen folgende
Tastenfunktionen zur Verfgung:

Umschaltung auf Grossbuchstaben (nur fr die folgende Taste)
nicht mit "CAPS" sondern mit "^"-Taste.

die "CLS"-Taste zeigt den bereits eingegebenen Text.

Die "BS"-Taste lscht das zuletzt eingegebene Zeichen.

Die "INS"-Tate lscht das zuletzt eingegebene Wort.

Die  "EXE"-Taste  erzeugt  einen Absatz. Dieser wird im File
"TEXTEDIT.TXT"  mit  der  Zeichenfolge  "LF!"  zum  spteren
Weiterbearbeiten gekennzeichnet.

Die  Kombination  der  Tasten  "SHIFT" und "CLS" beendet das
Programm.


Der  eingegebene  Text wird im File "TEXTEDIT.TXT" mit einer
maximalen  Datensatzlnge  von  250  Zeichen  abgespeichert,
dadurch  bleibt  dieses  File  auch fr die "edit"- Funktion
editierbar.  Der  Text steht darin zur weiteren Verarbeitung
zur  Verfgung.  Ein  groer  Vorteil  des Programms besteht
darin,  da  Wrter  bei der Eingabe nicht zerrissen werden.
Wenn  der  Cursor  den rechten Bildschirmrand erreicht, wird
das  letzte Wort dieser Zeile gelscht, und erscheint in der
neuen Zeile darunter erneut.


                           - 62 - 


10 REM ****** TEXTEDITOR ******
20 REM *(C)H.Boehling 21.09.87*
30 REM ************************
40 CLS:PRINTREV"   *** TEXTEDITOR PB-1000 ***   "NORM
50 CLEAR:CAPS=1:CU=-1
60 ON ERROR GOTO 570
70 REM = TEXT EINLESEN =========
80 OPEN"TEXTEDIT.TXT"FOR INPUT AS #1
90 IF EOF(1) THEN 190
100 A$=INPUT$(1,#1):A=ASC(A$)
110 IF A<32 THEN 90
120 C$=C$+A$:WL=WL+1
130 IF A$=" "OR A$=","OR A$=";"OR A$="."OR A$="!"OR
A$="?"THEN 150
140 GOTO 90
150 IF C$="LF!"THEN PRINT:GOTO 170
160 IF FRAC(PEEK(&H68C8)/32)*32+LEN(C$)<31 THEN PRINT
C$;ELSE PRINT:PRINT C$;
170 WL=0:C$=""
180 GOTO 90
190 CLOSE #1:PRINT C$;:C$=""
200 OPEN"TEXTEDIT.TXT"FOR APPEND AS #1
210 REM= CURSOR-BLINKEN =======
220 FOR I=1 TO 12:A$=INKEY$:A=ASC(A$):IF A>0 THEN I=12
230 NEXT I:IF A>0 THEN 260
240 CU=CU*-1:IF CU=1 THEN PRINT CHR$(128);ELSE PRINT
CHR$(8);
250 GOTO 220
260 IF CU=1 THEN PRINT CHR$(8);:CU=-1
270 IF A=28 THEN A=32:A$=" "
280 IF A=29 THEN A=8
290 IF A<32 OR A>90 THEN 480
300 REM = WORT BILDEN ==========
310 IF CAPS=-1 AND A>64 THEN A=A+32
320 CAPS=-1:GOSUB 390
330 C$=C$+CHR$(A):WL=WL+1
350 IF SL+WL>250 THEN SL=0:PRINT#1
360 IF A$=" "OR A$=","OR A$=";"OR A$="."OR A$="!"OR
A$="?"THEN GOSUB 440
370 GOTO 220
380 REM = ANZEIGE ==============
390 PO=FRAC(PEEK(&H68C8)/32)*32
400 IF PO<31 THEN 420
410 FOR I=1 TO WL:PRINT CHR$(8);:NEXT I:PRINT:PRINT C$;
420 PRINT CHR$(A);


                           - 63 - 


430 RETURN
440 REM = ABSPEICHERN ==========
450 SL=SL+LEN(C$)
460 PRINT#1,C$;:WL=0:C$=""
470 RETURN
480 REM = STEUERZEICHEN ========
490 BEEP
500 IF A=8 AND WL>0 THEN WL=WL-1:C$=LEFT$(C$,WL):PRINT
CHR$(8);
510 IF A=11 THEN PRINT#1:CALL &HE567
520 IF A=12 THEN 40
530 IF A=13 THEN C$=C$+" LF!":PRINT:GOSUB 440
540 IF A=18 AND WL>0 THEN FOR I=1 TO WL:PRINT CHR$(8);:NEXT
I:C$="":WL=0
550 IF A=94 THEN CAPS=CAPS*-1
560 GOTO 220
570 REM = FEHLERBEHANDLUNG =====
580 IF ERR=10 THEN OPEN"TEXTEDIT.TXT"FOR OUTPUT AS #1:GOTO
600
590 GOSUB"FEHLER.BAS"
600 CLOSE #1
610 RESUME 60


                           - 64 - 


-Programmbeschreibung Zum Casio Flattersatz- 

Das  Programm  "Texteditor  PB-1000"  wre,  ohne  eine Mg-
lichkeit   des   formatierten  Ausdrucks,  relativ  sinnlos.
Deshalb  hier  nun das Programm "Flattersatz". Es ermglicht
den  Ausdruck,  oder auch das Umformatieren eines Textes mit
linkem Rand und Flattersatz.


            ͻ
                  *** FLATTERSATZ ***       
                                            
            FILENAME.EXT :?_                
                                            
            ͼ

Hier  mchte der Casio wissen, welches File er umformatieren
soll.  Das Drcken der "EXE"- Taste bewirkt, da automatisch
das File "TEXTEDIT.TXT" bearbeitet wird.


            ͻ
                                            
            FILENAME.EXT :?                 
            Ausgabe an ANZEIGE,DRUCKER      
            oder SPEICHER (A/D/S):?_        
            ͼ

Wird   hier  die  "S"-  Taste  gedrckt, so  wird  das  File
"FLSATZ.TXT"  angelegt,  in  das  die  Daten formatiert aus-
gegeben werden.


            ͻ
            Ausgabe an ANZEIGE,DRUCKER      
            oder SPEICHER (A/D/S):?S        
            Zeichen pro Zeile (1-80):40     
            Zeichen linker Rand (0-80):?5_  
            ͼ


                           - 65 - 


            ͻ
             1    *** FLATTERSATZ ***       
                                            
            FILENAME.EXT :?                 
            Ausgabe an ANZEIGE,DRUCKER      
            ͼ

Die  Anzeige  springt  zurck, und in der linken oberen Ecke
wird  zur Kontrolle die Nummer der gerade bearbeiteten Zeile
ausgegeben.


            ͻ
                 So lassen sich Texte uebers
            ichtlich in                     
                 den Casio eingeben!        
            [search][next  ][delete] <    2>
            ͼ

Danach  lt  sich  der  Erfolg  der  Umformatierung im File
"FLSATZ.TXT" bewundern.


                           - 66 - 


10 REM ***** FLATTERSATZ ******
20 REM **        FUER        **
30 REM ** TEXTEDITOR PB-1000 **
40 REM *(C)H.BOEHLING 29.09.87*
50 REM ************************
60 CLEAR:FOR DE=1 TO 200:NEXT DE
70 CLS:PRINTREV"       *** FLATTERSATZ ***      "NORM
80 ON ERROR GOTO 610
90 REM EINGABE =================
110 PRINT"FILENAME.EXT :";:INPUT FN$
120 IF FN$=""THEN FN$="TEXTEDIT.TXT"
130 OPEN FN$ FOR INPUT AS #1
140 PRINT"Ausgabe an ANZEIGE,DRUCKER":PRINT"oder SPEICHER
(A/D/S):?";:W$=INPUT$(1):PRINT W$
150 IF W$="A"THEN MZ=32:LR=0:CLS:GOTO 250
160 IF W$="D" THEN GOSUB 560:GOTO 190
170 IF W$="S"THEN 190
180 GOTO 140
190 PRINT"Zeichen pro Zeile (1-80):";:INPUT MZ
200 IF MZ<1 OR MZ>80 GOTO 160
210 MZ=MZ+1
220 PRINT"Zeichen linker Rand (0-80):";:INPUT LR
230 IF LR<0 OR LR>80 GOTO 220
240 IF W$="S"THEN OPEN"FLSATZ.TXT"FOR OUTPUT AS #2
250 REM TEXT EINLESEN ===========
260 GOSUB 420:GOSUB 470
270 IF EOF(1) THEN GOSUB 420:GOTO 60
280 LINE INPUT #1,TX$:P=1:LTX=LEN(TX$)+1
290 REM WOERTER ISOLIEREN =======
300 FOR L=1 TO LTX
310 B$=MID$(TX$,L,1)
320 IF B$=" "OR B$="!"OR B$=","OR B$="."OR B$=";"OR
B$="?"THEN GOSUB 360
330 NEXT L
340 IF P<LTX THEN GOSUB 360
350 GOTO 270
360 WO$=MID$(TX$,P,L+1-P):P=L+1
370 IF WO$=" "THEN RETURN
380 IF WO$="LF!"THEN GOSUB 420:GOTO 470
390 IF ZL+LEN(WO$)=MZ AND RIGHT$(WO$,1)=" "THEN
WO$=LEFT$(WO$,LEN(WO$)-1)
400 IF ZL+LEN(WO$)<MZ GOTO 520 ELSE GOSUB 420:GOSUB 470:GOTO
520
410 REM NEUE ZEILE =============
420 IF W$="A"THEN PRINT


                           - 67 - 


430 IF W$="D"THEN LPRINT
440 IF W$="S"THEN PRINT#2
450 RETURN
460 REM RAND AUSGEBEN ==========
470 IF W$="A"THEN PRINT TAB(LR);
480 IF W$="D"THEN LPRINT TAB(LR);
490 IF W$="S"THEN PRINT#2,TAB(LR);:LF=LF+1:LOCATE
0,0:PRINTREV LF
500 ZL=0:RETURN
510 REM WORT AUSGEBEN ==========
520 IF W$="A"THEN PRINT WO$;
530 IF W$="D"THEN LPRINT WO$;
540 IF W$="S"THEN PRINT#2,WO$;
550 ZL=ZL+LEN(WO$):RETURN
560 REM DRUCKER INITIALISIEREN =
570 LPRINT CHR$(27);"@";:REM RESET
580 LPRINT CHR$(27);"A";CHR$(9);:REM ZEILENABSTAND
590 LPRINT CHR$(27);"x";CHR$(1);:REM NLQ
600 RETURN
610 REM FEHLERBEHANDLUNG========
620 GOSUB"FEHLER.BAS"
630 RESUME 60


                           - 68 - 







                  h3.Teil
h




      Programme welche fr
      ein Interface des
      Casio PB-1000
      geschrieben wurden
h 


                           - 69 - 


W3.1 Terminal PB-1000W 

Hier  ist  es  nun,  das  im  Vorwort  bereits  angekndigte
Telekommunikationsprogramm  fr den Casio PB-1000.

Im Gegensatz  zu  manchen  anderen  Computern bedarf es beim
Casio   PB-1000   keiner   umstndlichen   Maschinensprache-
Klimmzge, um  die  Seriellschnittstelle  der Erweiterung zu
nutzen.  Das im Rechner vorhandene BASIC stellt alle ntigen
Funktionen zur Verfgung!

Um  gleichzeitig Zeichen zu empfangen und zu senden, mu der
Casio  PB-1000  praktisch  zwei  Programme  gleichzeitig ab-
arbeiten,  leider geht das mit BASIC nicht! Oder er arbeitet
nur  ein  BASIC-  Programm  ab, indem er aber nicht anhalten
darf  um  z.B.  eine  Tastatureingabe  abzuwarten,  denn  in
diesem Moment knnte er ja Daten an der Seriellschnittstelle
verpassen.  Der  BASIC-  Befehl,  der  diese Mglichkeit der
Tastaturabfrage  liefert,  ist  allgemein  bekannt, er heit
"INKEY$".  Aber  was  ist  mit  den  Zeichen, welche von der
Schnittstelle  eingelesen  werden sollen? Nun, das Betriebs-
system  des  Casio  PB-1000  berwacht stndig, ob Daten zur
Seriellschnittstelle gesendet werden, in diesem Fall nmlich
werden  sie  eingelesen  und in einem Buffer  abgespeichert.
Das Anfangs angesprochene "zweite Programm", welches stndig
im   Hintergrund  arbeitet,  wird  also  vom  Betriebssystem
mundgerecht  zur Verfgung gestellt. Es fragt sich nur noch,
wie  man  diese  Funktion  in einem BASIC- Programm abfragen
kann;  natrlich  gibt  es  hierfr  einen Befehl, er lautet
"LOF(1)".  Dieser  Befehl  gibt  die Gre des noch zur Ver-
fgung stehenden Empfangsbuffers aus und damit auch indirekt
die   Anzahl   der  bereits  empfangenen  Zeichen.  Ist  der
Empfangsbuffer  leer, so liefert LOF einen Wert von 255, und
damit  ist  die  Zahl  der  empfangenen  Zeichen Null. Damit
drfte auch klar sein, da die Gre des Empfangsbuffers 255
Zeichen   betrgt.  Unser  Programm  braucht  nun  nur  noch
zwischen diesen beiden Befehlen hin und her zu springen, und
wenn sich etwas ereignet, entsprechende Manahmen ergreifen.
Empfangene   Zeichen  anzeigen  und   eingegebene  ber  die
Schnittstelle  ausgeben. Ein Miniterminal- Programm, welches
sich aber schon  durchaus zur Telekommunikation eignet, soll
uns  dies  verdeutlichen. Bitte achten Sie auf die Zeilen 80
und 120. 

                           - 70 - 


10 REM **** MINITERMINAL 1 *****
20 REM *(C) H.Boehling 02.06.87*
30 REM *************************
40 PRINTREV"     *** MINITERMINAL 1 ***     ";NORM;
50 ON ERROR GOTO 170
60 OPEN"COM0:2,N,8,2,N,N,N,N,N" AS #1
70 REM = TASTATURABFRAGE =======
80 A$=INKEY$:C$=C$+A$
90 PRINT A$;:IF A$<>""THEN FOR I=1 TO 50:NEXT I
100 REM = RS-232C AUSGABE =======
110 IF A$=CHR$(13)THEN PRINT#1,C$:C$=""
120 IF LOF(1)=255 THEN 80
130 REM = RS-232C ANZEIGE =======
140 B$=INPUT$(255-LOF(1),#1)
150 PRINT B$
160 GOTO 80
170 REM = FEHLERBEHANDLUNG =====
180 PRINTREV"- FEHLER ";ERR;" AUFGETRETEN ! -"NORM
190 CLOSE #1
200 RESUME 50


                           - 71 - 


Manchmal bentigt man ein Terminal bei dem sich die Eingaben
vor  dem  Senden zum Hostrechner noch editieren lassen, weil
dieser  nur  ganz  bestimmte Befehle kennt, und alles andere
mit  einer  Fehlermeldung beantwortet. Dies ist z.B. bei den
heute   immer   weiter  verbreiteten  Speicherprogrammierten
Steuerungen  der  Fall.  Da  hilft  dann  vielleicht  dieses
Programm weiter:


10 REM **** MINITERMINAL 2 *****
20 REM *(C) H.Boehling 02.06.87*
30 REM *************************
40 PRINTREV"     *** MINITERMINAL 2 ***     ";NORM;
50 ON ERROR GOTO 170
60 OPEN"COM0:2,N,8,2,N,N,N,N,N"AS #1
70 REM = TASTATURABFRAGE =======
80 A$=INKEY$
90 IF A$=CHR$(12)THEN 110 ELSE 120
100 REM = RS-232C AUSGABE =======
110 INPUT C$:PRINT#1,C$
120 IF LOF(1)=255 THEN 80
130 REM = RS-232C ANZEIGE =======
140 B$=INPUT$(255-LOF(1),#1)
150 PRINT" ";B$
160 GOTO 80
170 REM = FEHLERBEHANDLUNG =====
180 PRINTREV"-FEHLER ";ERR;" AUFGETRETEN -";NORM
190 CLOSE #1
200 RESUME 50


                           - 72 - 


Nach  diesen  Hintergrundinformationen und Miniterminals nun
endlich zum Terminalprogramm mit Komfort!

-Programmbeschreibung zum Terminal PB-1000- 

Terminal  PB-1000 ist ein Telekommunikationsprogramm fr den
CASIO  PB-1000  mit  FA-7  oder MD-100 Erweiterung und ange-
schlossenem  Akustikkoppler. Nach dem Starten des Programmes
meldet  es  sich mit der berschrift "TERMINAL PB-1000", und
ist damit bereit zum Senden und Empfangen von ASCII-Zeichen.
Eine  auf  dem  Casio  PB-1000 gedrckte Taste wird ber die
RS-232C- Schnittstelle ausgegeben, und ber die Schnitstelle
empfangene  Zeichen werden auf dem Display des Casio PB-1000
angezeigt.


Nach  dem Start des Programmes werden alle gedrckten Tasten
als Kleinbuchstaben ausgegeben, zum Umschalten auf Grobuch-
staben  wird  nicht  die  "CAPS"- sondern die "^"-Taste ver-
wendet! Durch drcken der "BS"- und der "EXE"-Taste wird der
betreffende  Steuercode  ausgegeben. Die Tastenkombinationen
"SHIFT-1",  "SHIFT-2",  "SHIFT-3"  und "SHIFT-Plus" sind mit
den   gebruchlichsten  Mailbox-Steuerzeichen  belegt,  dies
sind:


X-ON-Code   (11H) = Empfangsbereit
X-OFF-Code  (13H) = Nicht Empfangsbereit
SkipTX-Code (03H) = Textausgabe berspringen
EndTX-Code  (18H) = Textausgabe beenden


Alle weiteren Kontrollcodes werden durch gemeinsames drcken
der   "SHIFT"-   und  der  "^"-Taste  und  darauf  folgenden
Kontrollcodebuchstaben ausgegeben. (Kontrollcodes sind Codes
mit  einem  Wert unter dezimal 32, welche nicht zur Zeichen-
darstellung  verwendet  werden,  sondern  zur  Steuerung des
Kommunikationsablaufs. Vergleichen  Sie  hierfr die Tabelle
auf  S.196 des Befehlssatzhandbuchs) Zur Kontrolle erscheint
der  ausgegebene  Kontrollcode  invers  auf  der Anzeige des
Casio  PB-1000. Die Buchstaben, welche den Kontrollcodes den
Namen  geben,  resultieren  aus  der  Reihenfolge,  der Wert
dezimal  1  wird  hier  durch den Code "Control-A" reprsen-
tiert,  dezimal  2 durch "Control-B" und so weiter. Will man
z.B.  den  Kontrollcode  dezimal  7  ausgeben,  dies ist der


                           - 73 - 


international  allgemein  gltige  Code  zum  Erzeugen eines
Tonsignals  am  Terminal  der  Gegenstation,  so  drckt man
gleichzeitig  die  Tasten "SHIFT" und "^" und darauf folgend
die "G"- Taste.

Das  Programm bietet auch die Mglichkeit eine Kommunikation
mitzuprotokollieren,  dazu braucht lediglich die "INS"-Taste
gedrckt  werden,  und  es erscheint die Meldung "Buffer on"
auf  der  Anzeige.  Alle  gesendeten und empfangenen Zeichen
werden von nun ab in dem File "BUFFER.DAT" mitprotokolliert.
Das  drcken  der  "CLS"-Taste  schliet  den Buffer mit der
Meldung "Buffer off".


                           - 74 - 


 Zum  senden  von  Files  braucht  nur die Tastenkombination
"SHIFT-0"  gedrckt  werden,  danach  erscheint  die Meldung
"File  senden"  auf  der Anzeige und das Programm fragt nach
dem  Namen  des  zu sendenden Files. Ist die bertragung des
Files beendet, so erscheint die Meldung "fertig!".


            ͻ
             File senden                     
                                             
             FILENAME.EXT:?_                 
                                             
            ͼ


Mit  den  Cursortasten  (rauf und runter) kann der Virtuelle
Bildschirm  von  8  Zeilen  sichtbar  gemacht  werden.  Beim
Empfangen  von  Zeichen oder dem Drcken einer Taste springt
die  Anzeige  zurck, um die Ausgabe an alter Stelle fortzu-
fhren.


Die  bertragungsparameter  sind  in Zeile 10 des Programmes
auf   die   gebruchlichsten   Parameter  (300  Baud,  keine
Paritaet,  8  Bits, 1 Stoppbit) eingestellt, und lassen sich
dort auf alle anderen Werte, die der CASIO zult, ndern.


Soll  der  Casio  PB-1000  das Echo bei der Datenbertragung
liefern  (Casio als Hostrechner), so ist die Variable "ECHO"
in Zeile 20 von 0 auf 1 zu setzen.


                           - 75 - 


10 CLEAR:OPEN"COM0:2,N,8,1,N,N,N,B,N" AS #1
20 ECHO=0:CAPS=1
30 REM *** TERMINAL  PB-1000 ***
40 REM *(C) H.Boehling 27.07.87*
50 REM *************************
60 PRINTREV"    *** TERMINAL PB-1000 ***    "NORM
70 ON ERROR GOTO 630
80 REM = TASTATURABFRAGE =======
90 IF SEND=1 THEN 500
100 A$=INKEY$
110 IF A$=""THEN 560
120 BEEP 0:A=ASC(A$)
130 IF A<32 THEN 220
140 IF A>96 AND A<123 THEN A=A-32:A$=CHR$(A)
150 IF A>90 THEN 220
160 IF ROLL=1 THEN LOCATE
FRAC(PO/32)*32,INT(PO/32):ROLL=0
170 IF CTRL=1 AND A>63 THEN
PRINT#1,CHR$(A-64):PRINTREV"<CTRL-";A$;">"NORM:CTRL=0:GOTO
560
180 IF CAPS=1 AND A>64 THEN A$=CHR$(A+32)
190 IF ECHO=1 THEN PRINT A$;
200 PRINT#1,A$;:C$=C$+A$:GOTO 560
210 - STEUERZEICEN --------------
220 IF A=8 THEN 230 ELSE 250
230 PRINT #1,CHR$(8);
240 IF ECHO=1 THEN PRINT CHR$(8);
250 IF A=13 THEN 260 ELSE 290
260 IF BUFF=1 AND ECHO=1 THEN PRINT#2,C$
270 PRINT#1,CHR$(13);:C$=""
280 IF ECHO=1 THEN PRINT CHR$(13);
290 IF A=18 AND BUFF=0 THEN BUFF=1:CLS:PRINTREV" Buffer
on                      "NORM:OPEN"BUFFER.DAT" FOR APPEND AS
#2
300 IF A=12 THEN BUFF=0:CLS:PRINTREV" Buffer
off                     "NORM:CLOSE #2
310 IF A=30 THEN 320 ELSE 340
320 IF ROLL=0 THEN PO=PEEK(&H68C8)
330 PRINT CHR$(16);:ROLL=1
340 IF A=31 THEN 350 ELSE 370
350 IF ROLL=0 THEN PO=PEEK(&H68C8)
360 PRINT CHR$(1);:ROLL=1
370 IF A=94 THEN 380 ELSE 400
380 IF CAPS=0 THEN CAPS=1:GOTO 560
390 IF CAPS=1 THEN CAPS=0


                           - 76 - 


400 IF A=92 THEN CTRL=1
410 IF A=232 THEN PRINT#1,CHR$(17):PRINTREV"<X - on>"NORM
420 IF A=233 THEN PRINT#1,CHR$(19):PRINTREV"<X -off>"NORM
430 IF A=234 THEN PRINT#1,CHR$(3):PRINTREV"<SkipTX>"NORM
440 IF A=235 THEN PRINT#1,CHR$(24):PRINTREV"<End TX>"NORM
450 IF A=236 THEN 470 ELSE 560
460 REM = FILE SENDEN ==========
470 CLS:PRINTREV" File
senden                    "NORM:SEND=1
480 PRINT" FILNAME.EXT:";:INPUT FN$
490 OPEN FN$ FOR INPUT AS #3
500 IF EOF(3)THEN CLOSE #3:SEND=0:CLS:PRINTREV" fertig
!                       "NORM:GOTO 90
510 LINE INPUT #3,A$
520 PRINT #1,A$
530 IF ECHO=1 THEN PRINT A$
540 IF ECHO=1 AND BUFF=1 THEN PRINT #2,A$
550 REM = RS-232C ANZEIGE =======
560 IF LOF(1)=255 GOTO 90
570 IF ROLL=1 THEN LOCATE
FRAC(PO/32)*32,INT(PO/32):ROLL=0
580 B$=INPUT$(255-LOF(1),#1)
590 IF BUFF=1 THEN PRINT#2,B$;
600 IF ECHO=1 THEN PRINT#1,B$;
610 PRINT B$;
620 GOTO 90
630 REM = FEHLERBEHANDLUNG =====
640 IF ERR=1 THEN CLS:PRINTREV" Buffer voll
!                  "NORM:BUFF=0:CLOSE #2:GOTO 700
650 IF ERR=8 THEN CLS:PRINTREV" Dateiname unkorrekt
!          "NORM:SEND=0:GOTO 700
660 IF ERR=10 AND BUFF=1 THEN OPEN"BUFFER.DAT" FOR OUTPUT AS
#2:GOTO 700
670 IF ERR=10 AND BUFF=0 THEN CLS:PRINTREV" Datei nicht
vorhanden !        "NORM:SEND=0:GOTO 700
680 IF ERR=29 THEN CLS:PRINTREV" Datei keine Textdatei
!        "NORM:SEND=0:GOTO 700
690 PRINTREV" Fehler ";ERR;" in Zeile ";ERL;"!     "NORM
700 RESUME 70


                           - 77 - 


W3.2 KalenderausdruckW 

Nie  wieder Kalender kaufen! Na ja, ganz so ernst sollte man
diesen  Ausruf  doch  nicht nehmen. Aber als bersichtlichen
Jahreskalender  im  DIN A4- Format zur Terminplanung und zum
Abheften  in  die  Unterlagen lt sich dieser Kalender sehr
gut verwenden.

-Programmbeschreibung zum Kalenderdruck- 

Das  Programm  ermglicht den Ausdruck eines Jahreskalenders
auf  einem Epson-Kompatiblen Matrixdrucker, und verlangt als
Eingabe lediglich die Jahreszahl.

10 REM *** KALENDERAUSDRUCK ****
20 REM *** AUF EPSON-DRUCKER ***
30 REM *(C) H.Boehling 02.06.87*
40 REM *************************
50 CLS:PRINTREV"        *** KALENDER ***        "NORM
60 ON ERROR GOTO 710
70 CLEAR:DIM D(12),F(12):RESTORE 90
80 READ K:FOR I=1 TO 12:READ F:F(I)=F:NEXT I
90 DATA 6.283185,31,28,31,30,31,30,31,31,30,31,30,31
100 F$=" JANUAR   FEBRUAR   MAERZ    APRIL     MAI
JUNI   "
110 F$=F$+"  JULI    AUGUST  SEPTEMBER OKTOBER NOVEMBER
DEZEMBER  "
120 D$="    SO     MO     DI     MI     DO     FR     SA  "
130 PRINT"WELCHES JAHR: ";:INPUT Y$
140 IF LEN(Y$)=2 THEN Y$="19"+Y$:GOTO 170
150 IF LEN(Y$)=4 THEN 170
160 GOTO 130
170 Y=VAL(Y$):PRINT Y
180 IF Y/4-INT(Y/4)=0 THEN F(2)=29:REM SCHALTJAHRPRUEFUNG
190 FOR M=1 TO 12:GOSUB 550:NEXT M:REM NACH JEDER
MONATSPOSITION
200 REM = PRINTER AUSGABE ======
210 LPRINT CHR$(27);"4";:REM ITALIC
220 LPRINT CHR$(27);"xl";:REM EXPANDED
230 LPRINT CHR$(27);"h";CHR$(2);:REM 4-FACHE GROESSE
240 LPRINT"        ";Y$
250 LPRINT
260 LPRINT CHR$(27);"@";
270 GOSUB 660
280 FOR C=1 TO 12
290 IF C=7 THEN LPRINT
CHR$(27);CHR$(12);CHR$(27);CHR$(108);CHR$(75);
300 IF C<10 THEN LPRINT" ";
310 LPRINT CHR$(27);"h";CHR$(1);
320 LPRINT C;"-----";


                           - 78 - 


330 LPRINT " ";MID$(F$,C*9-8,9);" ";
340 LPRINT "-----"
350 LPRINT CHR$(27);"h";CHR$(0);
360 LPRINT
370 LPRINT D$:LPRINT
380 FOR L=1 TO 6
390 FOR M=C TO C
400 FOR P=1 TO 7
410 IF D(M)>0 AND D(M)<10 THEN LPRINT"    ";D(M);
420 IF D(M)>9 AND D(M)<=F(M) THEN LPRINT"   ";D(M);
430 IF D(M)<1 OR D(M)>F(M) THEN LPRINT"       ";
440 D(M)=D(M)+1
450 NEXT P:LPRINT
460 NEXT M
470 NEXT L
480 NEXT C
490 LPRINT CHR$(27);"@";
500 FOR LF=1 TO 6:LPRINT:NEXT LF
510 LPRINT CHR$(27);"@";
520 PRINT"NOCH EINMAL ? (J/N) ";:Z$=INPUT$(1):PRINT Z$
530 IF Z$="N"THEN END
540 GOTO 10
550 REM KALKULATION DER ========
560 REM= TAGES POSITION ========
570 N1=M+12*INT(0.6+1/M)
580 N2=Y-INT(0.6+1/M)
590 N3=INT(13*(N1+1)/5)
600 N4=INT(5*N2/4)
610 N5=INT(N2/100)
620 N6=INT(N2/400)
630 N7=N3+N4-N5+N6
640 D(M)=2-(1+INT((N7/7-INT(N7/7))*7+0.5))
650 RETURN
660 REM=EPSON AUF KLEINSCHRIFT==
670 LPRINT CHR$(27);"S0";CHR$(15);:REM SUPERSCRIPTS &
CONDENSED
680 LPRINT CHR$(27);"A";CHR$(5);:REM ZEILENABSTAND
690 LPRINT CHR$(27);"l";CHR$(10);:REM LINKER RAND
700 RETURN
710 REM= FEHLERBEHANDLUNG ======
720 PRINT"FEHLER Nr.";ERR;"aufgetreten"
730 RESUME


                           - 79 - 





                           - 80 - 




W3.3 ScreendumpW 

Unter  einem  Screendump versteht man den Ausdruck des Bild-
inhalts  eines Computerbildschirms, oder in unserem Fall das
Ausdrucken der 192 * 64 Punkte groen LCD- Anzeige des Casio
PB-1000 Punkt fr Punkt.

-Programmbeschreibung zum Screendump fr den Casio- 

Das  Programm  ermglicht  den  Ausdruck der LCD-Anzeige (ob
Text  oder  Grafik, "what  you  see is what you get"!!!) auf
einem Epson-Kompatiblen Matrixdrucker. Es lt sich sehr gut
in  eigene Programme einbinden und kann auf diese Weise z.B.
stundenlang  berechnete Kurven zu Papier bringen. Damit sich
der  Ausdruck  an eigene Wnsche anpassen lt, kann man dem
Programm  drei  verschiedene Parameter in den Variablen POS,
ZEILEN  und  RAND  bergeben,  dies  sind  im einzelnen: die
Horizontalposition, ab der ausgedruckt werden soll (Ein Wert
von  0  bis  maximal  191) ,  die Anzahl der auszudruckenden
Zeilen  (1  bis 8, denn es lassen sich natrlich auch die im
Moment  nicht  sichtbaren  Zeilen ausdrucken), und ob um das
Ganze  ein  Rand gedruckt werden soll (Rand = 0 oder 1). Wer
nur  den  linken Teil eines Bildschirms ausdrucken will, der
mu  das  Programm  in Zeile 70 STAD=&H6201:EAD=&H62C0 - POS
ndern.


                           - 81 - 


10 REM ****** SCREENDUMP *******
20 REM *(C) H.Boehling 23.06.87*
30 REM *************************
40 REM POS = Horizontal Position des Bildschirms ab dem
ausgedruckt werden soll (0 bis 191)
50 REM ZEILEN = Anzahl der Zeilen die ausgedruckt werden
sollen (1 bis 8)
60 REM RAND = Ausdruck mit oder ohne Rand (0 oder 1)
70 STAD=&H6201+POS:EAD=&H62C0
80 IF ZEILEN=0 THEN ZEILEN=8
90 LPRINT CHR$(27);CHR$(64):REM DRUCKER RESET
100 LPRINT CHR$(27);CHR$(51);CHR$(24);:REM ZEILENVORSCHUB
110 LPRINT CHR$(27);CHR$(108);CHR$(30);:REM LINKER RAND
120 IF RAND=1 THEN GOSUB 290
130 FOR I=1 TO ZEILEN
140 GOSUB 190
150 NEXT I
160 IF RAND=1 THEN GOSUB 350
170 LPRINT CHR$(27);CHR$(64):REM DRUCKER RESET
180 RETURN
190 REM= BILDSCHIRMINHALT ======
200 GOSUB 410
210 IF RAND=1 THEN LPRINT CHR$(255);CHR$(0);
220 FOR AD=STAD TO EAD
230 LPRINT CHR$(PEEK(AD));
240 NEXT AD
250 IF RAND=1 THEN LPRINT CHR$(0);CHR$(255);
260 LPRINT
270 STAD=STAD+192:EAD=EAD+192
280 RETURN
290 REM= OBERER RAND ===========
300 GOSUB 410
310 LPRINT CHR$(3);
320 FOR J=POS TO 193:LPRINT CHR$(2);:NEXT J
330 LPRINT CHR$(3);:LPRINT
340 RETURN
350 REM= UNTERER RAND ==========
360 GOSUB 410
370 LPRINT CHR$(192);
380 FOR J=POS TO 193:LPRINT CHR$(64);:NEXT J
390 LPRINT CHR$(192);:LPRINT
400 RETURN
410 REM= GRAFIG EIN ============
420  LAENGE=192-POS
430  IF RAND=1 THEN LAENGE=LAENGE +4


                           - 82 - 


440 LPRINT CHR$(27);CHR$(42);CHR$(5);
450 LPRINT CHR$(LAENGE);CHR$(0);
460 RETURN


                           - 83 - 


W3.4 Grafiken erstellen
    und ausdruckenW 

Wer  erst einmal das Programm Screendump eingetippt hat, der
wird  sich  sehr  schnell fragen, was man wohl sonst noch so
alles zu  Papier  bringen  kann.  So  ging es mir zumindest,
nachdem  ich  das Programm geschrieben hatte. Da die Anzeige
des  Casio PB-1000 fr die Darstellung von Bildern im Format
etwas  lang  ist  (192 Punkte), habe ich mir erlaubt sie fr
meine  Bilder  auf  88  Punkte  zu  krzen. Damit die PRINT-
Ausgabe  nicht beeintrchtigt wird, habe ich auch gleich die
rechte Seite zur Darstellung erwhlt, und somit habe ich den
ersten Casio PB-1000 Grafikstandart entwickelt! Oder nicht?

Zum Zeichnen in den Grafikspeicher des Casio PB-1000 gibt es
mit  BASIC zwei Mglichkeiten: Zum einen mit dem DRAW-Befehl
und  zum  anderen durch direkte POKE- Befehle. Ich habe mich
fr die zweite Methode entschieden, dafr braucht man aller-
dings  die  Speicheradressen  des  Grafikspeichers.  Was ein
Glck,  die  hatten wir doch schon mit dem Programm "System-
adressen  suchen"  gefunden! Das Zeichnen mit POKE- Befehlen
hat  aber  auch  den Vorteil, da sich die Bilddaten genauso
einfach,  durch  PEEK-  Befehle,  in  einem File abspeichern
lassen.  In  diesem Bilddatenfile stehen sie genauso wie sie
der Reihe nach im Bildspeicher liegen.

Der  gesamte  Bildspeicher  des  Casio  PB-1000  reicht  von
Adresse &H6201 bis &H6800, dies sind genau 1536 Bytes. Jedes
Byte hat 8 Bit und kann deshalb auch 8 Bildpunkte aufnehmen,
die  sind  dann nach Adam Riese 12288 Bildpunkte. Stimmt das
auch?  Vergleichen  wir  doch  einmal mit den Parametern des
DRAW-  Befehls: 192 * 64 = 12288 Stimmt! Dies ist allerdings
der  gesamte  virtuelle  Bildschirmspeicher (Vergleichen Sie
auch  S.58  und  59  des  Befehlssatzhandbuchs),  der ja aus
sichtbarem  und  unsichtbarem  Teil  besteht.  Da  es jawohl
wenig  Sinn  hat ein Bild in den unsichtbaren Teil des Bild-
schirms  zu zeichnen, begrenzt sich die Zahl der Bildpunkte,
die  ich  nutzen  mchte,  auf  88  * 32 = 2816 Punkte = 352
Bytes.  Diese  352  Bytes  mssen leider fr jedes Bild erst
einmal  berechnet  und eingetippt werden. Wie das geht? Nun,
dazu  ein  Beispiel.  Betrachten Sie dazu bitte das folgende
Bild.


                           - 84 - 





         1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3
  128   
   64    
   32    
   16    
    8  1 
    4    
    2    
    1    
  128   
   64    
   32    
   16    
    8  2 
    .    
    .    
    .    
        
         
         
         
       3 
         
         
         
        
         
 32      
Punkte   
       4 
  ^      
        
        
       
  
  
   >   88 Punkte


                           - 85 - 


Aus  Platzgrnden  sind hier nur die ersten 23 von insgesamt
88  Spalten  dargestellt,  aber  fr  ein  Beispiel soll das
reichen. In der linken oberen Ecke liegen die Bildpunkte des
ersten  Bytes,  die  Bits  dieses  Bytes liegen dabei unter-
einander, deshalb  wurde  in der Darstellung nach dem achten
Vertikalpunkt  eine  Doppellinie  gezogen. Diese Doppellinie
begrenzt  aber  auch die erste der vier Bildschirmzeilen des
Casio   PB-1000.   Darunter   liegen  drei  weitere  Zeilen,
natrlich  ebenso  durch  eine  Doppellinie  abgegrenzt. Das
erste  Byte dieser Darstellung ist natrlich Null, weil hier
kein   Punkt  dunkel  ist,  und  natrlich  sind  auch  alle
folgenden  Bytes bis Byte 13 Null. Interessant wird Byte 14,
hier beginnt der Hals der Note, und damit mu das erste Byte
berechnet  werden.  Bit eins, dieses Bytes liegt unten, sein
Wert ist 1, der Wert des zweiten Bits ist 2, der des dritten
4,  des  vierten  8,  des  fnften  16, des sechsten 32, des
siebenten  64,  und  der  Wert des achten Bytes ist 128 (die
Wertigkeit der Bits ist zur besseren bersicht an der linken
Seite  der  Darstellung notiert). In solch einem Byte knnen
auf  diese  Weise  Zahlen  von 0 bis 255 dargestellt werden,
indem Bits gesetzt oder zurckgesetzt werden. Die Wertigkeit
der  gesetzten Bits addiert sich dabei auf maximal 255, wenn
alle Bits gesetzt sind. Doch zurck zu unserem Beispiel, der
Wert  des 14. Bytes errechnet sich aus der Summe der Wertig-
keiten  aller  gesetzten  Bits, dies ist in unserem Beispiel
63.  Ebenso Byte 15 und 16, Byte 17 und 18 = 31, 19 und 20 =
15,  21  =  7,  22  =  3  und  Byte 23 = 0. Fr Ihre eigenen
Grafiken  erstellen  Sie am besten eine entsprechende Zeich-
nung  auf  Millimeterpapier  bei  dem  sie vorher jede achte
Zeile  verstrkt  nachgezogen  haben. Oder Sie verwenden das
folgende   BASIC-  Programm  mit  Namen  Casio  -  Draw  zum
erstellen  des  Bildes.  Wenn Sie sich fr die erste Methode
entschieden  haben,  mssen Sie nach dieser Fleiarbeit noch
alle  errechneten  Werte  in den Casio eingeben, dazu knnen
sie  die  "Memo  in"-  Funktion  (Nheres  dazu in der Casio
PB-1000 Bedienungsanleitung auf S.41 bis 45) verwenden. Nach
der Eingabe eines jeden Wertes mssen Sie die Datenzeile mit
dem  Drcken  der "EXE"- Taste abschlieen bis sie auf diese
Weise  den  352.  Wert  eingegeben haben. Als Kontrolle dazu
dient  die  Datensatznummer  in der rechten unteren Ecke der
Anzeige. Danach benennen Sie das File "MEMO" mit der "name"-
Funktion des Casio in ein File mit der Filename- Erweiterung
"PIC" wie Picture (Bild) um. 

                           - 86 - 






-Hier die Bilddaten fr das Bild eines Casio PB-1000:
- 
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,240,216,191,218,191,218,
191,219,190,218,190,218,190,218,190,218,190,218,190,218,190,
218,190,218,190,218,190,218,190,218,190,218,190,218,190,218,
190,218,190,218,190,218,190,218,190,218,190,218,190,218,191,
218,191,218,191,218,191,218,191,250,255,255,255,127,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,171,86,171,
86,255,2,3,2,115,250,139,138,219,82,3,2,123,250,163,162,163,
250,123,2,3,66,235,170,171,170,187,50,3,2,251,250,3,2,115,
250,139,138,139,250,115,2,3,254,171,86,171,86,171,86,171,86
171,86,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,1,3,7,255,255,183,255,189,253,189,247,189,189,189,255,
181,189,189,255,189,189,189,255,189,189,189,255,189,181,189,
255,189,189,181,255,189,189,189,247,189,189,189,255,191,191,
191,253,189,191,189,245,191,189,189,255,181,189,191,255,190,
245,187,254,240,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,7,13,
31,53,119,245,247,221,223,93,127,93,223,85,119,85,87,85,247,
85,87,85,247,85,87,85,247,85,87,93,255,93,95,93,255,85,87,
85,247,117,127,125,,255,125,127,117,247,253,215,213,127,85,
215,125,87,213,127,93,223,123,118,236,216,176,96,192,128,0,
0,0,0,0,0,0,0,0,0,0,0


                           - 87 - 


-Programmbeschreibung zu Casio - Draw- 

Das  Programm  Casio  - Draw ist ein kleines Zeichenprogramm
zum  Erstellen  von Bildern. Nach dem Starten teilt sich der
Bildschirm  in zwei Hlften, links die Menhlfte und rechts
die 88 * 32 Punkte groe Zeichenflche.


           ͻ
           **DRAW-M 150 16**               
            MOVE,POINT,            .       
            UN/DRAW,CIRCLE,                
            LOAD,SAVE                      
           ͼ

In der ersten Zeile des Mens steht Nach dem Wort "DRAW" der
Befehlsmodus, in  dem  gerade  gearbeitet wird (hier M - fr
Move)  und dahinter die Horizontal- und Vertikalposition des
Cursors.  Darunter  sind die zur Verfgung stehenden Befehle
aufgelistet.  Sie  werden  durch  drcken  der  betreffenden
Anfangsbuchstabentaste  aufgerufen,  und  haben im einzelnen
folgende Bedeutungen:

Im  Move-  Modus  lt  sich der Cursor mit den Pfeiltasten
ber den Bildschirm bewegen, er hinterlt dabei keine Spur.
Mit der "P"-Taste (wie Point) knnen jedoch einzelne Punkte
gesetzt oder zurckgesetzt werden.


           ͻ
           **DRAW-D 173 26**     Ŀ     
            MOVE,POINT,          Ŀ  
            UN/DRAW,CIRCLE,        
            LOAD,SAVE                 
           ͼ

Auch  im  Draw- Modus lt sich der Cursor ber die Zeichen-
flche bewegen, er hinterlt jedoch eine Spur dabei.

Genau entgegengesetzt arbeitet Undraw, hier wird in der Spur
gelscht.


                           - 88 - 



            ͻ
            **DRAW-C 150 16**               
                                            
              RADIUS:?_                     
                                            
            ͼ

Mit  Circle  lassen sich Kreise ziehen, dazu wird der Cursor
an  den  Mittelpunkt  des  zu ziehenden Kreises gefhrt, und
danach  die  "C"-  Taste gedrckt. Das Programm fragt danach
nach  dem  Radius des Kreises in Bildpunkten. Doch Vorsicht,
dazu  mu  das  Programm  "KREISE.BAS" im Speicher des Casio
stehen. Dazu spter mehr.


            ͻ
            **DRAW-L 150 16**               
              FILENAME.PIC                  
             ?                              
                                            
            ͼ

Mit  Load  lt  sich  ein  Bild  einladen, und mit Save ab-
speichern.


                           - 89 - 


10 REM ****** CASIO-DRAW ******
20 REM *(C)H.Boehling 20.03.88*
30 REM ************************
40 CLS:CLEAR
50 HMIN=191-88:HMAX=191:VMIN=0:VMAX=31
60 H=150:V=16
70 REM = MENUE =================
80 MO$="M"
90 DRAW(102,0)-(102,31)
100 LOCATE 0,0:PRINT"**DRAW-        **"
110 PRINT" MOVE,POINT,     "
120 PRINT" UN/DRAW,CIRCLE, "
130 PRINT" LOAD,SAVE       ";
140 REM = TASTATURABFRAGE =======
150 K=ASC(INKEY$):IF K>31 THEN BEEP
160 IF K=28 AND H<HMAX THEN H=H+1
170 IF K=29 AND H>HMIN THEN H=H-1
180 IF K=30 AND V>VMIN THEN V=V-1
190 IF K=31 AND V<VMAX THEN V=V+1
200 IF POINT(H,V)=1 THEN DRAWC(H,V):S=1:GOTO 220
210 IF POINT(H,V)=0 THEN DRAW(H,V):S=0
220 IF K=67 THEN MO$="C"
230 IF K=68 THEN MO$="D"
240 IF K=76 THEN MO$="L"
250 IF K=77 THEN MO$="M"
260 IF K=83 THEN MO$="S"
270 IF K=85 THEN MO$="U"
280 IF S=1 THEN DRAW(H,V)
290 IF S=0 THEN DRAWC(H,V)
300 IF K=80 AND POINT(H,V)=0 THEN DRAW(H,V):GOTO 140
310 IF K=80 AND POINT(H,V)=1 THEN DRAWC(H,V):GOTO 140
320 REM = MODUS ================
330 VE$=STR$(V):IF LEN(VE$)=2 THEN VE$=VE$+" "
340 LOCATE 7,0:PRINT MO$;STR$(H);VE$
350 IF MO$="D"THEN DRAW(H,V)
360 IF MO$="U"THEN DRAWC(H,V)
370 IF MO$="C"THEN GOSUB"KREIS.BAS":GOTO 70
380 IF MO$="L"THEN 410
390 IF MO$="S"THEN 410
400 GOTO 150
410 REM = EINGABE FN$ ==========
420 FN$="":LOCATE 0,1
430 PRINT"  FILENAME.PIC   "
440 PRINT" ?               "
450 PRINT"                 ";


                           - 90 - 


460 K$=INKEY$
470 IF K$=CHR$(13)THEN 530
480 IF ASC(K$)>32 THEN BEEP ELSE 460
490 GOSUB 1030
500 FN$=FN$+K$
510 LOCATE 2,2:PRINT FN$
520 GOTO 460
530 IF FN$=""THEN 60
540 IF RIGHT$(FN$,4)=".PIC"THEN 570
550 FN$=FN$+".PIC"
560 IF MO$="S"THEN 750
570 REM = BILD LADEN ===========
580 ON ERROR GOTO 710
590 OPEN FN$ FOR INPUT AS #1
600 LOCATE 2,3:PRINT"Ich lade!";
610 STAD=&H6201+104:EAD=&H6201+191
620 FOR ZEILEN=1 TO 4
630 FOR AD=STAD TO EAD
640 INPUT #1,DAT
650 POKE AD,DAT
660 NEXT AD
670 STAD=STAD+192:EAD=EAD+192
680 NEXT ZEILEN
690 CLOSE #1
700 GOTO 60
710 REM - FEHLER LOAD ----------
720 CLOSE #1
730 IF ERR=10 THEN LOCATE 2,3:PRINT"Datei
fehlt!";:BEEP:GOSUB 1030:RESUME 410
740 IF ERR=22 THEN LOCATE 2,3:PRINT"Daten
fehlen!";:BEEP:GOSUB 1030:RESUME 60
750 REM = BILD SPEICHERN =======
760 ON ERROR GOTO 980
770 OPEN FN$ FOR INPUT AS #1:REM Test ob schon vorhanden
780 CLOSE #1
790 LOCATE 0,1:PRINT"                "
800 LOCATE 2,1:PRINT FN$;
810 LOCATE 0,2:PRINT"schon vorhanden!";
820 LOCATE 0,3:PRINT"uebersch.(J/N)?";:BEEP
830 JN$=INPUT$(1)
840 IF JN$="J"THEN 860
850 GOTO 410
860 ON ERROR GOTO 980
870 LOCATE 0,3:PRINT"  Ich speichere!";
880 OPEN FN$ FOR OUTPUT AS #1


                           - 91 - 


890 STAD=&H6201+104:EAD=&H6201+191
900 FOR ZEILEN=1 TO 4
910 FOR AD=STAD TO EAD
920 PRINT #1,PEEK(AD)
930 NEXT AD
940 STAD=STAD+192:EAD=EAD+192
950 NEXT ZEILEN
960 CLOSE #1
970 GOTO 60
980 REM - FEHLER SAVE ---------
990 CLOSE #1
1000 IF ERR=10 THEN RESUME 860
1010 LOCATE 2,3:PRINT"kein Speicher!";:GOSUB 1030:BEEP
1020 RESUME 60
1030 REM = DELAY ===============
1040 FOR DE =1 TO 30:NEXT DE
1050 RETURN


                           - 92 - 


Mit  der  "Circle"-  Funktion  lassen  sich  Kreise an einer
beliebigen  Stelle  und  mit  beliebigen Radius ziehen, doch
dazu  mu  erst  einmal  ein entsprechendes Unterprogramm im
Speicher des Casio PB-1000 stehen. Dieses Unterprogramm wird
dann in Programmzeile 370 des "Draw"- Programmes aufgerufen.
Auf  hnliche  Weise knnten, zur Erweiterung des Programms,
auch  Maschinenprogramme  mit dem "CALL"- Befehl  aufgerufen
werden.  Dazu lieen sich z.B. die im Casio PB-1000 Befehls-
satzhandbuch auf S.188 und 189 abgedruckten Programme "Shift
left"  und  "Rev  display" gut verwenden. Doch hier zunchst
das  Kreis-  Programm.  Das  Programm "Kreise zeichnen" lt
sich  auch  allein  verwenden,  dazu  mu  Zeile 80 entfernt
werden,  und  alle "RETURN"- Befehle gegen "GOTO 20" ersetzt
werden.


10 REM *** KREISE ZEICNNEN ****
20 REM *(C)H.Boehling 05.04.88*
30 REM ************************
40 LOCATE 0,1
50 PRINT"                 "
60 PRINT"                 "
70 PRINT"                 ";
80 LOCATE 2,2:GOTO 160:REM FUER DRAW.BAS
90 LOCATE 0,0:PRINT" *** KREISE ***"
100 HMIN=0:HMAX=191:VMIN=0:VMAX=63:REM BEI GANZEM
BILDSCHIRM
110 REM=EINGABE==================
120 INPUT "MITTELPUNKT X:";H
130 IF H<HMIN OR H>HMAX THEN 120
140 INPUT "MITTELPUNKT Y:";V
150 IF V<VMIN OR V>VMAX THEN 140
160 R=0:INPUT "RADIUS:";R
170 IF R=0 THEN RETURN:REM GOTO 40
180 REM=PUNKTE BERECHNEN=========
190 NR=-R:Y=0
200 VY=V+Y:HR=H+R:HNR=H-R
210 VR=V+R:HY=H+Y:HNY=H-Y
220 VNY=V-Y:VNR=V-R
230 REM=KREIS ZEICHNEN==========
240 IF VY>VMAX THEN 290
250 IF HR>HMAX THEN 270
260 DRAW(HR,VY)
270 IF HNR<HMIN THEN 290
280 DRAW(HNR,VY)


                           - 93 - 


290 IF VR>VMAX THEN 340
300 IF HY>HMAX THEN 320
310 DRAW(HY,VR)
320 IF HNY<VMIN THEN 340
330 DRAW(HNY,VR)
340 IF VNY<VMIN THEN 390
350 IF HR>HMAX THEN 370
360 DRAW(HR,VNY)
370 IF HNR<HMIN THEN 390
380 DRAW(HNR,VNY)
390 IF VNR<VMIN THEN 440
400 IF HY>HMAX THEN 420
410 DRAW(HY,VNR)
420 IF HNY<HMIN THEN 440
430 DRAW(HNY,VNR)
440 IF R<=Y THEN RETURN:REM GOTO 40
450 NR=NR+2*Y+1:Y=Y+1
460 IF NR>=0 THEN NR=NR-2*R+1:R=R-1
470 GOTO 200


                           - 94 - 


Wer die Maschinenprogramme "Shift left" und "Rev display" in
das "Draw"- Programm aufnehmen mchte, der bentigt noch ein
"Shift right"- Programm. Hier ist es:



       ;******************
       ;*  SHIFT RIGHT   *
       ;* (C) H.Boehling *
       ;*   10.04.1988   *
       ;******************
       ORG &H7000
       START &H7000
DOTDI: EQU &H022C
;---------------------------
       PRE IX,&H67FF
       PRE IY,&H6201
       PRE IZ,&H6800
       LD $0,(IZ+0)
       BDN
       ST $0,(IX+0)
       CAL DOTDI
       RTN


                           - 95 - 


Jetzt  sind  die  ersten Bilddaten eingegeben, aber was kann
man  damit  anfangen?  Nun,  man  kann  damit  seine eigenen
Visitenkarten   drucken,  oder  Briefkpfe  mit  einem  Logo
versehen,  schnell ist auch die eigene Unterschrift digital-
isiert.   Zwei   Beispiele   liefern  die  folgenden  BASIC-
Programme.


-Programmbeschreibung zum Bilderload- 

Das  Programm Bilderload ld Bilddaten in den Grafikspeicher
des  Casio  PB-1000  und  fragt  danach, ob dieses Bild aus-
gedruckt  werden  soll,  dazu  wird  das Programm Screendump
verwendet.  Es  mu  sich deshalb auch im Speicher des Casio
befinden.


10 REM *******BILDERLOAD********
20 REM *(C) H.Boehling 23.06.87*
30 REM *************************
40 CLS:CLEAR
50 PRINT"Welches Bild soll geladen werden"
60 PRINT"FILENAME.PIC ";:INPUT FN$
70 IF RIGHT$(FN$,4)=".PIC"THEN 90
80 FN$=FN$+".PIC"
90 REM = EINLESEN =============
100 CLS
110 STAD=&H6201+104:EAD=&H6201+191
120 OPEN FN$ FOR INPUT AS #2
130 FOR ZEILEN=1 TO 4
140 FOR AD=STAD TO EAD
150 INPUT #2,DAT
160 POKE AD,DAT
170 NEXT AD
180 STAD=STAD+192:EAD=EAD+192
190 NEXT ZEILEN
195 REM = AUSDRUCKEN ==========
200 DRAW(100,0)-(100,31)-(0,31)
210 PRINT"soll das Bild"
220 PRINT"ausgedruckt"
230 PRINT"werden (J/N) ? ";:W$=INPUT$(1):PRINT W$:IF
W$="J"THEN 250 ELSE 10
240 GOTO 230
250 ZEILEN=4:RAND=1:POS=104
260 GOSUB"SCREEN.BAS"


                           - 96 - 


270 GOTO 40


                           - 97 - 


-Programmbeschreibung zum Kassettenhllendruck- 

Mit  diesem  Programm bringen Sie Ordnung in Ihre Kassetten.
Es  ermglicht  nmlich  den  Ausdruck  von  bersichtlichen
Kassettenhllen  auf einem EPSON- kompatiblen Grafikdrucker.
Wird  bei  der Frage nach dem zu druckenden Bild einfach die
"EXE"- Taste gedrckt, so wird das Bild des Casio gewhlt.

In  den  Zeilen  430 bis 460 sollten Sie Ihre eigene Adresse
eintragen!


10 REM **** KASSETTENHUELLEN ***
20 REM ********* DRUCK *********
30 REM *(C) H.Boehling 07.09.87*
40 REM *************************
50 CLS:PRINTREV" *** KASSETTENHUELLENDRUCK ***  "NORM;
60 ON ERROR GOTO 1280
70 PRINT"Welches Bild soll auf der"
80 PRINT"Huelle ausgedruckt werden"
90 PRINT"(FILENAME.PIC) :";:INPUT FN$
100 IF FN$=""THEN FN$="CASIO"
110 IF RIGHT$(FN$,4)=".PIC"THEN 130
120 FN$=FN$+".PIC"
130 OPEN FN$ FOR INPUT AS #1:CLOSE #1:REM TEST
140 PRINT"Kassettenname (max.20 Zeichen):":INPUT KN$
150 PRINT"Kassettennummer (1 - 999):";:INPUT K
160 IF K<1 OR K>999 THEN 150
170 REM AUSDRUCK ===============
180 LPRINT CHR$(27);CHR$(64):REM DRUCKER RESET
190 LPRINT CHR$(27);CHR$(51);CHR$(24):REM ZEILENVORSCHUB
200 LPRINT CHR$(27);CHR$(108);CHR$(30):REM LINKER RAND
210 REM 1 KASTEN ---------------
220 GOSUB 760
230 FOR I=1 TO 4
240 GOSUB 700
250 NEXT I
260 GOSUB 820
270 REM 2 KASTEN --------------
280 GOSUB 760
290 FOR I=1 TO 2
300 GOSUB 700
310 NEXT I
320 GOSUB 820
330 REM TABELLE ---------------


                           - 98 - 


340 GOSUB 760:GOSUB 700:GOSUB 820
350 GOSUB 880:REM TABELLE 1
360 GOSUB 760:GOSUB 700:GOSUB 820
370 GOSUB 880:REM TABELLE 2
380 GOSUB 1060:REM BILD
390 REM TEXT ------------------
400 LPRINT CHR$(27);CHR$(12);:REM ZUM ANFANG
410 LPRINT CHR$(27);CHR$(83);CHR$(0);:REM SUPERSCRIPT
420 FOR I=1 TO 5:LPRINT:NEXT I
430 LPRINT"          (C) H.-J.
Boehling ";MID$(DATE$,4,3);LEFT$(DATE$,3);RIGHT$(DATE$,2)
440 LPRINT"              Buelowstr.    2"
450 LPRINT"              4000 D-dorf  30"
460 LPRINT"              Tel.0211/462482"
470 LPRINT CHR$(27);CHR$(84);:REM  SUPERSCRIPT AUS
480 FOR I=1 TO 2:LPRINT:NEXT I
490 LPRINT CHR$(27);CHR$(83);CHR$(1);CHR$(15);:REM SCHMAL
500 LPRINT CHR$(27);CHR$(104);CHR$(1);:REM GROESSER
510 LPRINT"   CASIO PB-1000  ";
520 LPRINT CHR$(27);CHR$(104);CHR$(0);:REM GROESSER AUS
530 LPRINT CHR$(27);CHR$(10);:REM 1 ZEILE ZURUECK
540 LPRINT"                                    ";KN$
550 LPRINT"                                    Kassette
Nr."
560 FOR I=1 TO 2:LPRINT CHR$(27);CHR$(10);:NEXT I:REM 4
ZEILEN ZURUECK
570 LPRINT CHR$(27);CHR$(104);CHR$(1);:REM GROESSER
580 LPRINT"                             ";K
590 LPRINT CHR$(27);CHR$(104);CHR$(0);:REM GROESSER AUS
600 FOR I=1 TO 1:LPRINT:NEXT I
610 LPRINT CHR$(27);CHR$(83);CHR$(0);:REM SUPERSCRIPT
620 GOSUB 1240
630 FOR I=1 TO 22:LPRINT:NEXT I
640 GOSUB 1240
650 REM ENDE ===================
660 LPRINT CHR$(12);:REM NEUE SEITE
670 LPRINT CHR$(27);CHR$(64);:REM DRUCKER RESET
680 PRINT"Noch einmal (J/N):":W$=INPUT$(1):PRINT W$
690 IF W$="J"OR W$="j"OR W$="Y" THEN 170 ELSE END
700 REM= LINKER/RECHTER RAND ===
710 GOSUB 1020
720 LPRINT CHR$(255);
730 FOR J=1 TO 288:LPRINT CHR$(0);:NEXT J
740 LPRINT CHR$(255);:LPRINT
750 RETURN


                           - 99 - 


760 REM= OBERER RAND ===========
770 GOSUB 1020
780 LPRINT CHR$(255);
790 FOR J=1 TO 288:LPRINT CHR$(128);:NEXT J
800 LPRINT CHR$(255);:LPRINT
810 RETURN
820 REM= UNTERER RAND ==========
830 GOSUB 1020
840 LPRINT CHR$(255);
850 FOR J=1 TO 288:LPRINT CHR$(1);:NEXT J
860 LPRINT CHR$(255);:LPRINT
870 RETURN
880 REM= TABELLE ===============
890 FOR I=1 TO 20
900 GOSUB 1020
910 GOSUB 970
920 GOSUB 970
930 LPRINT
940 NEXT I
950 GOSUB 820
960 RETURN
970 REM ------------------------
980 LPRINT CHR$(255);
990 FOR J=1 TO 100:LPRINT CHR$(1);:NEXT J:LPRINT CHR$(255);
1000 FOR J=1 TO 42:LPRINT CHR$(1);:NEXT J:LPRINT CHR$(255);
1010 RETURN
1020 REM= GRAFIG EIN ============
1030 LPRINT CHR$(27);CHR$(42);CHR$(5);
1040 LPRINT CHR$(34);CHR$(1);
1050 RETURN
1060 REM BILD ===================
1070 OPEN FN$ FOR INPUT AS #1
1080 LPRINT CHR$(27);CHR$(12);:REM ZUM ANFANG
1090 FOR I=1 TO 4:LPRINT:NEXT I
1100 FOR ZEILEN=1 TO 4
1110 LPRINT:LPRINT"  ";
1120 GOSUB 1200
1130 FOR PATERN=1 TO 88
1140 INPUT #1,DAT
1150 LPRINT CHR$(DAT);
1160 NEXT PATERN
1170 NEXT ZEILEN
1180 CLOSE #1
1190 RETURN
1200 REM BILD GRAFIG EIN -------


                           - 100 - 


1210 LPRINT CHR$(27);CHR$(42);CHR$(1);
1220 LPRINT CHR$(87);CHR$(0);
1230 RETURN
1240 REM TABELLENTEXT ==========
1250 LPRINT"  Seite 1                           Seite 2"
1260 LPRINT"  FILENAME.EXT             Count    FILENAME.EXT
Count"
1270 RETURN
1280 REM ERROR =================
1290 PRINT"Fehler Nr.";ERR;"in";ERL
1300 RESUME 60


                           - 101 - 





                           - 102 - 




W3.5 Das Relais der
    FA-7 ErweiterungW 

Die  FA-7 Schnittstelleneinheit  ist  mit  einer Centronics-
Druckerschnittstelle, einer RS-232C- Schnittstelle und einer
Kassettenrecorder- Schnittstelle recht gut ausgestattet, und
gerade   letztere  bietet  durch  ihre  Fernbedienungsbuchse
interessante   Erweiterungsmglichkeiten.  Damit  lt  sich
nmlich  nicht  nur  ein  Kassettenrecorder  ein-  und  aus-
schalten.  Der  Phantasie sind hier sicherlich keine Grenzen
gesetzt,  z.B.  ist  ein  Belichtungszeit-  Computer fr das
Fotolabor denkbar. Hinter der Fernschaltbuchse verbirgt sich
ein  Relais  mit  potentialfreien  Kontakten, mit denen sich
laut  Bedienungsanleitung  maximal  24  Volt  bis  1  Ampere
schalten  lassen.  Das  ist  schon  allerhand,  aber fr das
Schalten  von 220 V Wechselstrom reicht das natrlich nicht!
Dazu kann man aber auch ein zweites Relais nachschalten. Zum
Experimentieren  mit der Fernschaltbuchse (An der Interface-
Einheit mit REM gekennzeichnet) bentigt man zunchst einmal
den  passenden  Stecker,  dieser ist im Fachhandel unter der
Bezeichnung "2,5 mm  Klinkenstecker" berall erhltlich. Ein
Relais wird dann wie im folgendem Beispiel angeschlossen.


                            
                                                      
                             ^                        
                              max.                   
                              1 A                    
                                                      
                        Ŀ      o   o           
                                 Ĵ  Ĵ          
                              o   o           
                                                      
                                                      
                                                      
                  ڿ        
                  ===                          max. 24 V
 Ŀ         Ŀ
O  ;                           
 Ŀ                    
                  ===                              
                                                    
                                


                           - 103 - 


Natrlich  mu  die  verwendete  Spannung  mit der Betriebs-
spannung  des  Relais  bereinstimmen.  Beim  verwenden  von
Gleichspannung  sollte  parallel  zu  den Klemmen des Relais
eine  Freilaufdiode  vom  Typ  1N  4007  mit  der Kathode am
Pluspol und der Anode am Minuspol angeschlossen werden. (Die
Kathode ist mit einem Ring gekennzeichnet!)

Noch  eleganter ist natrlich die Verwendung eines elektron-
ischen  Lastrelais,  einige  dieser Typen schalten bis zu 90
Ampere !  Klapperfrei ! Damit lieen sich dann sogar riesige
Motoren  schalten.  Solche  Halbleiterrelais lassen sich zB.
bei der Firma Conrad Elektronik beziehen.

Nun  fehlt  eigentlich  nur  noch die Adresse, unter der das
Relais  angesprochen  werden  kann. Es ist Bit 8 von Adresse
&H0C04,  doch  auch  hierzu  wieder  ein  kleines  Beispiel-
programm:


10 REM** DEMO VON ADR.&H0C04 **
20 REM*(C) H.Boehling 28.02.88*
30 REM*************************
40 POKE &H0C04,0:REM Relais ein
50 FOR I=1 TO 200:NEXT I
60 POKE &H0C04,128:REM Relais aus
70 FOR I=1 TO 200:NEXT I
80 GOTO 40


                           - 104 - 


