8(A;EED.SYSSYS038 SPEED c}E q0 \C)CC8`DCeECiD` RP h1$E ȍ @y b Y)hܭ]L]` q  DMD   u j)`0  ,p0i2 &28jJ1f02 9 g iJf0i1)xԍӭ232002XԦ`  *'  } *(L `(  L l pL[,L] C i0 } p  gފދLh ( LD 0  C  C  \i +$+0'}; $(%)  b L[C `D P^߰")(݃   $DD}G@НL]S")M T H0 G$Ș݃ b 8$}$%8(() T `$E0(0)8`$GE` P} Li 8GD }L[ PH >iJ ;  yyB } ' |L[ "E( % H$ H#`L]B  0 G LO<  ( d lH۪!A3 A }jA !B EIC Y$E0 F  < 7 JN8Ndâ!,P h0ʠJd,6 } ' r/ $ ɛ ` '  L[  l }-     }    L[L  }  '  L[   p  ` g  l }) g ' }L[) ̠,L]T-0 |LM N݃:ː6UV LM N L(TU N,)M}LL[IL3GDIɛ ɜ DI  , JȊGм  G I) GȦ=}*GG ȄI1200820I H1E 1h0hIGI2ȢI`FE 0ɛ rɛ$ l '}蚦TTUVD`M L$:;Pyȱ$` r  iȱ$/:ȱ$VWyA**⩀ / }`$***? mL]-+ȱ$ɛ m* ? g. $0f.?'@BrAsTt[ }0: gL  `$0`j`& CpCi s L0JCܢj? I#}𴽎F ގМގ& & 0 C4 08L`0   | 레L] EGȽGȽ}G | E` 8,  }EG)݀G)ȱGȱG`"!L] l!i}栠$8  (IƭIp  h,g+j? 8 ii(Lq)! }S S0$}) E9`H)N,L]8GH Lq`gNgfj****8jHi h` } 2J  &e2i`"%?&;^$IM ! ! <u hh`$}Ev옝^! 1EHFHjm GHm H`u$Ev`L=? +`!,pFE ȄD8 }q D&E`I0` i`+DOS SYSMOC.I  J ٍ = ) F)}8`Ll T!U<; Ln <JM -18    HH =}D 1 :  /1[F:M #.! 0`>C #   #`>   e}L'>/b;\I\o@ @LK~ L  % /e  L ; H}H0S0N:;=91D,1ɛK$ɛ`:;ʾ  ,ɛ}`XYȄ #`DTDRLUFFFCICLRSJ==CIYEEONSMDLNOOUAOOOARPLNCL#####PANVBNFR*),-PQORa/%<}) j ө  RES L%-, # 3 0 %   4(H 4(` }( 3  #  ZOiۨ L4RE 3 =F S Z +8!} 0+  FF % 4 4& 4(X)Y    # 4 ʤ Ȅ L"}F F LH hL4`*J 0 B B 0a   8#}    Lkl  );<  : ` 0 } T T 7̀΀$}LIl <;`<L 3   #/ ! R( 7 7   7 89i L7 ,(&  %} L480  ` Ln    `   HJJJJ h) ii0HI B V`0  ,BLV&}[J  B Vso Fhh` GH ,H hɐɀɡ)HDCȱCɛeCD먥D h'}N MSп` ED` OIH`hhXhh  nL Free FilesBreakI/O-Error 128Disk f(}ullWrite protectedFile MismatchBad FilenameAction! D O S RUN: File lock)}edDevice doneDirectory fullFile not foundBad Load FileNot DOS II+Bad HexAbort-> Source-> DestinationD1:+DOS SY}; ACTION! RUNTIME-PACKAGE TEIL 1PROC RUDIV2=*()[$85 $86 $87 $38 $A9 $00 $E5 $86 $A8 $A9 $00 $E5 $87 $AA $98 $60]PROC R+}UMLT0=*()[$F0 $1B $CA $86 $C1 $AA $F0 $15 $86 $C0 $A9 $00 $A2 $08 $0A $06 $C0 $90 $02 $65 $C1 $CA $D0 $F6 $18 $65 $87 $85 $8,}7 $A5 $86$A6 $87 $60] PROC RUMLT1=*()[$86 $C2 $E0 $00 $10 $03 $20 RUDIV2 $85 $82 $86 $83 $A5 $85 $10 $0E $AA $45 $C2 $85 -}$C2 $A5 $84 $20 RUDIV2 $85 $84 $86 $85$A9 $00 $85 $87 $60]PROC MULT=*()[$20 RUMLT1 $A6 $82 $F0 $1B $86 $C0 $A6 $84 $F0 $1.}5 $CA $86 $C1 $A2 $08 $0A $26 $87 $06 $C0 $90 $06 $65 $C1 $90 $02 $E6 $87 $CA $D0 $F0 $85 $86 $A5 $82 $A6 $85 $20 RUMLT0 $A/}5 $83 $A6 $84 $20 RUMLT0]PROC RUDIV=*() [$A4 $C2 $10 $03 $4C RUDIV2 $60]PROC DIV=*()[$20 RUMLT1 $A5 $85 $F0 $27 $A2 $080} $26 $82 $26 $83 $26 $87 $38 $A5 $83 $E5 $84 $A8 $A5 $87 $E5 $85 $90 $04 $85 $87 $84 $83 $CA $D0 $E7 $A5 $82 $2A $A2 $00 1}$A4 $83 $84 $86 $18 $90 $1D $A2 $10 $26 $82 $26 $83 $2A $B0 $04 $C5 $84 $90 $03 $E5 $84 $38 $CA $D0 $EF $26 $82 $26 $83 $852} $86 $A5 $82 $A6 $83 $A4 $C2 $10 $10 $85 $84 $86 $85 $38 $A9 $00 $E5 $84 $A8 $A9 $00 $E5 $85 $AA $98 $60]PROC MODULO=*()3}[$20 DIV $A5 $86 $A6 $87 $60] PROC RRSH=*()[$A4 $84 $F0 $0A $86 $85 $46 $85 $6A $88 $D0 $FA $A6 $85 $60]PROC RLSH=*()[$4}A4 $84 $F0 $0A $86 $85 $0A $26 $85 $88 $D0 $FA $A6 $85 $60] PROC PAR=*()[$85 $A0 $86 $A1 $84 $A2 $18 $68 $85 $84 $69 $03 $5}A8 $68 $85 $85 $69 $00 $48 $98 $48 $A0 $01 $B1 $84 $85 $82 $C8 $B1 $84 $85 $83 $C8 $B1 $84 $A8 $B9 $A0 $00 $91 $82 $88 $106} $F8 $A5 $11 $D0 $05 $E6 $11 $6C $0A $00 $60]SET $4E4=RLSHSET $4E6=RRSHSET $4E8=MULTSET $4EA=DIVSET $4EC=MODULOSET $4E7}E=PAR; ACTION! RTP2MODULEDEFINE DEV="0"BYTE ARRAY EOF(7)=$5C0BYTE IOERR PROC CIOL=*(BYTE CHN,CMD, 8}CARD BUFFER,LENGTH)[$85 $A0 $86 $A1 $0A $0A $0A $0A $AA $A5 $A1 $9D $42 $03 $98 $9D $44 $03 $A5 $A3 $9D $45 $03 $A5 $A4 $9D 9}$48 $03 $A5 $A5 $9D $49 $03]PROC CIO=*()[$20 $56 $E4 $A6 $A0 $85 $A0 $C0 $88 $D0 $09 $A9 $01 $9D $C0 $05 $8D IOERR $60 $A:}9 $00 $9D $C0 $05 $8C $FF $06 $60]BYTE FUNC CIOS =*(BYTE CHN,CMD,DATA)[$85 $A0 $86 $A1 $0A $0A $0A $0A $AA $A5 $A1 $9D $42;} $03 $A9 $00 $9D $48 $03 $9D $49 $03 $98 $4C CIO]PROC SETAUX =*(BYTE CHN,AUX1,AUX2)[$86 $A1 $84 $A2 $0A $0A $0A $0A $AA $A<}5 $A1 $9D $4A $03 $A5 $A2 $9D $4B $03 $60]PROC OPEN (BYTE CHN, BYTE POINTER FNAME, BYTE AUX1,AUX=}2)BYTE ARRAY FSTR(17)BYTE POINTER BPTRBYTE ZBPTR=FNAME+1 FOR Z=0 TO FNAME^-1 DO FSTR(Z)=BPTR^ BPTR==+1 ODFSTR(Z)>}=$9B SETAUX(CHN,AUX1,AUX2)CIOL(CHN,3,FSTR,0)RETURNPROC CLOSE(BYTE CHN)CIOS(CHN,$0C,0)RETURNPROC GRAPHICS(BYTE GR)C?}LOSE (6)OPEN(6,"S:",(GR&$F0)!$1C,GR)RETURN RETURNPROC CLOSE(BYTE CHN)CIOS(CHN,$0C,0)RETURNPROC GRAPHICS(BYTE GR)C0jj0uu B VBLFuE:DDuE JK V BLuLoading Action! Cardridge LibrarygDuE"HI V`A}0u lʆ &e J JJ8冨凪`ʆ ee`B} 9E…¥ 9` l'&&&8儨児祂*L2&&*ń8&&L2 ` FjC}`hihiHHȱȱLݧ`膥ɠQ-ĮȐ`此į۠ŲLlD}Ȅ.70Q- Ġ7`eޠ Ȅ e _ 嘠ƍ iť +иE} +У +Ж+` +ȑȑȑɦȘ 9`5h{DObFIcIFPODdORTOeANDFORTINT"LSHMOD RSHSETF}DXORBYTE!CARD#CHAR ELSEaEXITSFUNCAPROCBSTEPfTHEN`TYPEFARRAY@UNTILXWHILEQDEFINE&ELSEIFjMODULEWRETURNRINCLUDECPOINTEREG}iI^I^Lࢠ]I^+ 8+ _0)?П =Ж d кƍL " L k}"줩L󳤙UČF0F !LƘꤑ ²Ǧ ӵ ʰȄȱ``ōl}` 昩 T L :  :ȑLL LL g L`m}`)ͳ+  @ȳ >B>A>WRCD~ &` `in}膡`U[W'pxOɈm  g ee + cн^ ȱL2ƍ` L* HH L*o}]5 Ș M c gȱթ  L'LhhL* ɁɅɦ` HHɑɑ Mhh`eHp}eh`Ȋ`ѡl ) 00:0`H ha0{0`e澥ž=Le܍ cLq}ɤ e8q膉ȱ``deldErrorEOFcolorLISTdeviceTRAr}CEL Hըh(` h L# HL {թ {LL L Ks}L# # ` h `L# LLn #L Hթ {h  ȱʝL L hl t}a\( (EȄĠ(((Ġ ӵ ²͍ Ѱ ²R 8` 2` not fou}undFind? a})H h  ` }8(ee(Čv}ȱĢeL Substitute? for? m9; L200`@  gw};` g9D` 8JJJ)0`BA`W i8 c  9 9 x}I Ң  c c c !LH c !h0A u L i 0y} LBL ` 5 砧  M  u M KLɐmLɪez}M࢐^ > L/ 5 c cNQȝP / Λ0B࣐ .ɣɢɡ{} ǽ > L j j jLHL L L >*LH 0h L^hLL L^c !#3|}3^/ɘ L5ɘ F  ` * $^ kgH .+L2H,ɾ,ƾ,Ⱦh,ǾQ Rbh L)}L,Ǿ eɠ/ɰ+P&H ͽh Rh Lh LȱhLлh LHLHL}H L @ʈ0PPQ`L`qȩq`ȑ`` Ɉ}``ȱ` >L Feȱi` L`  l ҿȘLM橠  ) l} ҿȑ l ҿȑHee8宨 h` l ҿȘLM橠  ) lO9E8冨凪`ʆ ee` 9E…¥ 9` 9ʆ &e } 9 9L9` 9'&&&8儨児祂*&&*ń8&&8儨兪` T: }` Fj` &`hihiHHȱȱl ` BDEHI V } ;`` BHIL2; JK` L;;{;z;8xL; :};~;i;;i; };~;;8;;͕;L;;;;;;;;L;;;;;}; i;;}; ;`;L$< < < }O;`L6<2< !N==`9L#>8L> :> }>>8>> =>>> æ8>> =>8>> =>>> æ8>> =>>> æ> }m> =>8>> =>>> æ>m> =>>> æ>m> =>>m> =>>> æ }>m> =>>> æ8>> =>>m> =>>> æ>8 񦥠> >  񦥠> }>>  y<>IL/> !`L? JbA\ ja<`< >}ALA`LA ?a<`< b lП =Ж d кƍL " L }"줩L󳤙UČF0F !LƘꤑ ²Ǧ ӵ ʰȄȱ``ō}` 昩 T L :  :ȑLL LL g L`}`)ͳ+  @ȳ >B>A>WRCD~ &` `i}膡`U[W'pxOɈm  g ee + cн^ ȱL2ƍ` L* HH L*}]5 Ș M c gȱթ  L'LhhL* ɁɅɦ` HHɑɑ Mhh`eH}eh`Ȋ`ѡl ) 00:0`H ha0{0`e澥ž=Le܍ cL}ɤ e8q膉ȱ``deldErrorEOFcolorLISTdeviceTRA}CEL Hըh(` h L# HL {թ {LL L K}L# # ` h `L# LLn #L Hթ {h  ȱʝL L hl }a\( (EȄĠ(((Ġ ӵ ²͍ Ѱ ²R 8` 2` not fo}undFind? a})H h  ` }8(ee(Č}ȱĢeL Substitute? for? m9; L200`@  g};` g9D` 8JJJ)0`BA`W i8 c  9 9 }I Ң  c c c !LH c !h0A u L i 0} LBL ` 5 砧  M  u M KLɐmLɪe}M࢐^ > L/ 5 c cNQȝP / Λ0B࣐ .ɣɢɡ} ǽ > L j j jLHL L L >*LH 0h L^hLL L^c !#3}3^/ɘ L5ɘ F  ` * $^ kgH .+L2H,ɾ,ƾ,Ⱦh,ǾQ Rbh L)}L,Ǿ eɠ/ɰ+P&H ͽh Rh Lh LȱhLлh LHLHL}H L @ʈ0PPQ`L`qȩq`ȑ`` Ɉ}``ȱ` >L Feȱi` L`  l ҿȘLM橠  ) l} ҿȑ l ҿȑHee8宨 h`$hL'0u0u0u0u0u0u0u0u'} l()` S` ˹̠` |` ` ˹̹͹μ!Ͻ }Ͻ!%&&ͬ%%&& `&=8冨凪`ʆ ee` &}E…¥ &` :&ʆ &e & &L&` :&'&&&8儨児祂*}&&*ń8&&8儨兪` &` Fj` &`hihiHHȱ}l ` BDEHI V䦠 T'`` BHILv' J}K` BLEN ; =$348L' '''i''i''''8(('L9( '''''''L (}''''' ''Ƣ' U'`TLh(d( d( '` Lz(v( e(L(S:v()Iv(( '`OM==+CHANNEL`]J4}L( '((((((B((m(((i(((((D((m(((i((((ȑ((H}((m(((i((((ȑ(( V`=LENGLn) 'f)j)i) h)g)f) (`REL) '))))})) (`NNEL(]>L) ')))))(B((m)((i((()(D((m)((i((()ȑ})(J((m)((i((()(K((m)((i((()) V`2(]d2XPROC X(BYTE}(]@[@=*]A2  ICCOM=}$*L-+)+(+(+`NNL>+:+9+:+`LM+ w( z**** `NELL+++ e(L+P:}+ 'ͣ*L++*++͊+L++L+ +ԩ +L+ Ѥ9 Ѥ ѤA Ѥ++ *+*+ ;+** }* Ѥ` L0,,,+,,,+, +**+,d,,,e,d,͔*e,*L,*m**m* Ѥ**LS, e(`*L, }+,**?͔**L-,*m**m* Ѥ,IL-*m**m* Ѥ,*О*L, e(`L}- +**͔**L-*m**m* Ѥ*m**m* Ѥ*а*L+- e(`L-*͝*Lj}.**?͖**L@.*****i--͜*L.L* &*͜*L.*** **IL.*m*}**L-*m**m****L-*ILQ.? -,*IL^. ,*i*L-`OLo.k.*͝*Le/**(}* ^&eȱe(k. ^&*e*e( **(* ^&eȱ}ei(i(k. ^&*e*e( k.*i*Lw. -`k.*͝*L`0**(}* ^&eȱe(k. ^&*e*e( **(* ^&e}ei(i(k. ^&*e*e( k.*i*Lr/ -`Lg0*?***Lm1*}͝*L;1******8***Ů*L1* &***L 1*** **IL 1}*m**8****L0*m**i**L08*****IL]1 -,*ILj1 -Lq0` L|1o1}n1q1'p1o1s1n1r1q1u1p1t1x1x1L)3*mr1*ms1 j*v1w1*)**IL1v1*)**I}L 2v1i v1*)**IL%2v1i0v1*)**IL@2v1iv1*)**ILW2w1*) **I Lr2w1i w1*)@*}*I@L2w1i0w1*)**IL2w1iw1**mt1ȱmu1v1 z**mt1ȱmu18}w1 zr1i(r1s1is1t1i(t1u1iu1x1L18n1n1o1o18p1p1q1q1p1q10L1`L^3 J+' y1 d0 y1 d}0`Ly3 J+*L3*IL3 -*IL3 l.L3*IL3 d0*IL3 [3 e(`)@]8)L38/ ^&338/} ^&i 3i3838 i33**3L-583333ii +3*3}*34344͖*4*L5p(3*****i44͜*L 5I* &*͜*L53͜*L5*** }**IL5*m***L4* Ѥ**L{4*i* e(L34`L15*m m*   `La5 e(Ll}5K:5i 'o zТ jIL}5 **IL5 3*IL5`*I-L58Ů}L58*I=L6 iؐL6*I+L,6/L,68*I*LC6ɐLC6*I<Lh6*Lh6*Lh68}***I>L6*L6ɐL6**I}L6*L6*L68***IL6*L6 iؐL6*`CL6j} j8(++ԩ zЩ z>/ z+ ^&+++i ++i!++i"++i#++i$++i%++i&++}i'+ jIhL7L7ML_PROGRAMM NOT IN MEMORY7t l ݧ*͍**+ !+ +#+"+}%+$+'+&+      66LA8/6666L8* *o z`L}X8 J+ 6o z .5 ^5**IL8L8Lg8`L8} ΤL8 File laden!8 l ̤L8Filespec?/ '*' fuer Directory8 l}* *I*L-9 e(L8D:*.*8 '* * lIL 9LY9 e(* '* }* )L\9L8`L`9*4͢*L9**I1L9Ȍ****I2L9***I3L9****I4L9**L:Ȍ* }**I5L9***I6L9***I7L:***I8L:**`EN L": ':  L8: :4    }: 䤩 **I<Lv:::Lv:8::*I>L:::L::*IL::`L(::`STL::: Τ::  }l  : Τ`L:R} ΤL;(: lLC;(򠧾 }; lLw;)Ϊ;M lL;Format; :8*0 :**i0* ]9*IL;L;Vo}rschub; :*O :*`1L; e(L;K:; ' R w(L <Ҡ < lL@<㩠}ᠢ<* lL`<>Prozedure&}n ** ** und ** '} ** Funktionen<< ** ** (} ** (C)1987 by Action! User Group ** Lueneburg ** *********)}*****************************Jeder wird wohl den Begriff "Unter-programm" schon mal gehoert haben.Das sind (sollen ma*}nchmal sein) in der Regel universelle Programmteile,die von verschiedenen Stellen im Programm aus angesprungen werdenkoen+}nen.(z.B.: Ein Soundeffekt, der oft ver-wendet wird ,schreibt man lieber alsUnterprogramm als jedesmal neu... spart ja ,}schliesslich auch Speicher.Der PROC Befehl sollte aus den vor-angegangenen Kurs-teilen ja schonbekannt sein. Innerhalb ei-}nes ganzenProgrammes kann man nun mehrerePROCs schreiben(Das Action! Programmbesteht ja sowieso nur aus PROCs undFUNCs (F.}unktionen). Die PROCs koennenauch andere PROCs und FUNCs auf-rufen und diese wiederum wieder welche...solange der Stack re/}icht.Aber was hat das nun mit Unterpro-grammen zu tun. Nun ja: Jede PROCoder FUNC ist als Unterprogramm an-zusehen, da j0}ede PROC ja auch vonjeder anderen PROC aus angesprungenwerden kann.Da gibt es jedoch einen Haken: Mankann in Action! nich1}t eine PROC auf-rufen, die erst weiter unten im Pro-grammtext definiert wird. Also nicht: PROC ZAPPER() POWER() ; 2}Aufruf einer PROC ; die aber erst spaeter ; folgt. RETURN PROC POWER() RETURN Wuerde man3} dieses Programm so ver-suchen zu compilieren, wuerde manERROR-8 vom Compiler bekommen(Var-iable not declared).(Auch die 4}Prozedurnamen werden alsVariable angesehen(Sie enthaltendie Speicherstelle, ab der die PROCsteht).So darf man also nur P5}rozeduren auf-rufen, die vorher schon definiertwurden.>>>Wir erinnern uns: Die letzte PROC>>>wird nach dem Compilieren u6}nd dem>>>RUN Kommando als erstes aufgerufen.In einer PROC kann nun stehen, wasgefaellt. Also Schleifen,Bedingungen,ander7}e Prozeduraufruefe u.s.w...Nun gibt aber noch Parameter:Was ist den das??? Das sind Variablenoder konstante Werte ,die an8} PROcsuebergeben werden koennen. Dazu zu-naechst ein Beispiel:BYTE NUM,I PROC PRINTNUMBER(BYTE PARAMETER) PRINTBE(PA9}RAMETER) RETURN PROC DEMO() PRINTNUMBER(100) ; KONSTANTER PARA- ; METER FOR I=1 TO 10 ; HIER :}WERDEN VAR- ; IABLE PARAMETER DO ; UEBERGEBEN PRINTNUMBER(I) OD RETURNNun wird;} endlich auch die Bedeutung der KLAMMERN hinter dem Prozedurnamenklar. Vorher wurde immer nur "()"geschrieben, um dem Com<}piler mitzu-teilen, dass keine Parameter ueber-geben werden.Der Aufruf der PROC PRINTNUMBER ist dann ganz logisch. Aufpa=}ssen mussman nur, dass auch dieselben Var- iablenTYPEN uebergeben werden, alsonicht statt einer BYTE eine CARDVariable ue>}bergeben. Das kommt zuschlechten Ergebnissen...........Man kann natuerlich auch mehrere Parameter uebergeben. Die Paramet?}erkoennen auch von unterschiedlichenTypen sein. z.B.: PROC PRINTNUMBERS(BYTE P1,CARD P2) Aufgerufen wird dann entsprech@}end: PRINTNUMBERS(100,2000)Oder eben auch Variablen (TYPENnicht verwechseln. Wie die Parameter innerhalb der PROCbenA}utzt werden koennen wurde jaschon im obigen Beispiel gezeigt:Die Parameter koennen wie ganznormale Variablen in der PROC bB}e-nutzt werden. Aber auch nur innerhalbdieser PROC.Und damit sind wir gleich beim naechsten Thema angelangt: GLOBALE uC}nd LOKALE VAriablenbevor wir uns den FUNCtionen zu-wenden.Der Kurs geht weiter mit: GLOBAL.KRS: GLOBALE upGLOBAL.KRS************************************** ** GLOBALE *E}* und ** LOKALE ** Variablen ** F} **************************************Globale Variablen sind die Variablen,die von jeder PRG}OC und FUNC auserreichbar sind. Die globalen werdenganz normal am Anfang eines Pro- grammes definiert oder nach einemH}MODULE Befehl, doch dazu spaetermehr.Lokale sind Variablen die innerhalbeiner PROC oder FUNC definiertsind. Diese sind dI}ann auch nur in dieser PROC erreichbar.Die Parameter sind auch lokale V.,denn sie sind ja auch nur inner-halb der jeweiliJ}gen PROC erreichbar.Wie die Parameter definiert werden,ist aus den obigen Beispielen (PROCs)ersichtbar.Die lokalen VariaK}blen werden direkthinter dem PROC+name mit Parameter-definition vereinbart: z.B.: PROC ZAPPER(BYTE NUM,CARD ATARI) BYTE L}LOKALE CARD XE ; hier lokale ; Variablen . . . . RETURNDie lokalen V. dienen der Uebersicht-lichM}keit, denn sie werden nur dortdefiniert, wo sie auch wirklichgebraucht werden. Man koennte stattder LOKALEN ja auch GLOBALN}E nehmen.PROCeduren intern:Die Proceduren werden (compiliert)mit "JSR" aufgerufen. "JSR" ist der "GOSUB" Befehl in MascO}hinen-sprache.(Jump to SubRoutine) ^ ^ ^Wie man weiss, muss ein Unterprogrammmit einem "RETURN" enden.ZufP}aelliglautet auch in Action! diese Anweis-ung "RETURN". Compiliert ist diesein einfaches "RTS" (ReTurn fromSubroutine) Q} ^ ^^PARAMETER intern:Die Parameter werden BYTE-weiseuebertragen:BYTE benoetigt 1 BYTE,CARD und INT 2 Byte.HatR} eine Prozedur z.B: eine BYTE undeine danache eine CARD Variable undwerden bei dem Prozedur-aufruf zu-erst die CARD und daS}nn die BYTEVariable uebergeben, so hat dasBYTE Parameter nach dem Aufruf dasLSB (Das 1. BYTE der CARD V.) unddas CARD ParT}ameter die anderen Bytesin Reihenfolge.z.B: PROC P_DEMO(BYTE B,CARD C) PRINTBE(B) PRINTCE(C) RETUU}RN PROC AUFRUF() P_DEMO(1,256) P_DEMO(256,1) RETURNDer MODULE Befehl:Der allgemeine Programmaufbau V}istschon einmal erklaert worden.Hiernochmal:1. Variablenvereinbarung (globale)2. Prozduren . . .MW}an erkennt, dass man nur einmalin einem Programm GLOBALE Variablendefinieren kann. Mit MODULE ist esaber mehrmals moeglichX}:z.B.: Variablenvereinbarung (globale) Prozeduren MODULE Variablenvereinbarung (globale) Prozeduren MODULE Y}dient also dazu, um Beispiels-weise zwei Programme zu einem zumachen oder Programmteile, wenn mehrere Programmierer zusammZ}en-arbeiten, zusammenzufuegen.Die globalen Variablen ,die nacheinem MODULE definiert werden,koennen natuerlich nicht in [}PROCsverwendet werden, die VOR demMODULE stehen.MODULE ist eine sogenannte COMPILERDIREKTIVE.So eine COMPIL\}ERDIREKTIVE hat nichtauf den Programmlauf Auswirkungen,sondern nur waehrend des CompilierensMODULE verannlasst den Compile]}r alsonur neue globale Variablen zu ver-einbaren.Ein Beispiel:BYTE XPOS,YPOSPROC LINE(BYTE X0,Y0,X1,Y1) PLOT (X0,Y0^}) DRAWTO (X1,Y1)RETURNMODULE ; ***************************BYTE IPROC MAKE_DEMO()FOR I=0 TO 79 STEP 2 DO LINE(0,0_},159,I) ODRETURNMODULE ; ***************************BYTE KEYPROC MAIN() GRAPHICS(7) COLOR=1 MAKE_DEMO()`} PRINTE ("Bitte Taste druecken") KEY=GETD(7)RETURNDie einzelnen Befehle (PLOT,DRAWTO)duerften dem aufmerksamen Leser nia}chtentgangen sein. Sie funktionierengenauso wie in Basic. Nur ist dieSyntax anders... Aber das sieht manja.Der Kurs gehb}t weiter mit : FUNC.KRSenauso wie in Basic. Nur ist dieSyntax anders... Aber das sieht manja.Der Kurs geh'FUNC.KRS************************************** ** ** !d} Die F u n k t i o n ** ** **************!e}************************So. Da waeren wir also bei den Funktionen.Wer erinnert sich denn noch an denMathe-Unterricht. Da!f} war ja auch immer von Funktionen u.s.w. die Rede.Action! kenn sie auch...Funktionen werden ja immer dann ein-setzt, we!q})?#Cb#+9Gcdi6^b&DOS SYSb*RTP ACTbC@CLIB COMbGAME AC bvDUMP1029COMbDUMP1029ACTb $PROC KRSbDGLOBAL KRSbcFUNC KRSbDIREKT KRSbBEF1 KRSbSCROLL OBJbASSKURS1TXTbASSKURS2TXTb ASSKURS3TXTb$ADDRESS TXTbVERZWEIGTXTb$IMMMADR TXTb,ABSADR TXTb:BSP1 TXTbHASSKURS BASbdMENUE BASbeMOVIE WSBbjPARIS007MOVb?FGAME ACTb(7FGAME AC b!_KMENUE WSBnn irgendwelche Ergebnisseherauskommen sollen.z.B.:X=P*PNehmen wir an, dass 'P' irgendeinebeliebige Zahl ist. Nach X=P!r}*P istX also immer das Quadrat von 'P'.Um die Funktionen zu erklaeren dasBeispiel:CARD FUNC QUADRAT(CARD P1)RETURN (P1*!s}P1)PROC MAIN()CARD II=QUADRAT(2)PRINTCE(I)RETURNSehen wir uns zunaechst nur die PROC MAIN an:Nach dem Vereinbarung!t}steil PROC MAIN() wird 'I' als lokaleVariable definiert.Danach steht I=QUADTRAT(2), d.h.dass die Funktion Quadra!u}t mit Para-meter '2' aufgerufen wird. Den Wert,die diese FUNC ergibt, wird in 'I'gespeichert. 'I' ist also gleichdas QUAD!v}RAT von '2'.In der FUNC passiert nun folgendes:hier nocheinmal die 'FUNC': CARD FUNC QUADRAT(CARD P1) RETURN (P1*P!w}1)Zunaechst muss vereinbart werden, wasfuer einen Wert die FUNC herausgeben-soll. In diesem Fall ist das ein Wertvom Typ!x} 'CARD'. Dann steht 'FUNC', umdem Compiler mitzuteilen, dass eineFUNCtion vereinbart wird. Dann folgtder Functionsname und!y} dann schliess-lich der Parameter-Teil.Auch die FUNC wird wie in einer PROCmit RETURN abgeschlossen. Dabei mussaber hinte!z}r RETURN in Klammern stehenwas rausgegeben werden soll. Im Bei-spiel also P1*P1. Die Parameterwerden also quadriert.Das B!{}eispiel ist aber kein gutes.Ausser Werte rauszugeben kann ineiner FUNC alles stehen, wie auchin einer PROC. z.B:CARD FUN!|}C QUADRAT(CARD P1) IF P1>255 THEN PRINTE("ZAHL ZU GROSS") RETURN (0) FI RETURN (P1*P1)Sollte das Parameter g!}}roesser als 255sein, so wird eine '0' zurueckge-geben, da 256*256 nicht mehr miteiner CARD Variable darzustellen sind.Ans!~}onsten wird das Quadrat zurueckge-geben.Anderes Beispiel: BYTE FUNC LOBYTE(CARD P1) ; >>>*** !}CARD UEBERGEBEN * RETURN (P1)BYTE FUNC HIBYTE(BYTE P1,P2) ; >>>*** TROTZDEM CARD UEBERGEBEN * RETURN (P2) PROC MAIN()!}BYTE LO,HI CARD IDO PUTE() PRINTE("GEBE ZAHL EIN") I=INPUTC() LO=LOBYTE(I) HI=HIBYTE(I) PRINTB(LO) PRINT(" , ") !} PRINTBE(HI)ODRETURNDa Programm fragt nach einer Zahl,die dann in Lo-und Hi-byte Wertenausgegeben wird. Die!} Funktionen scheinen etwas wider-spruechlich zu sein, da jedesmal einBYTE Wert rausgegeben werden soll,aber z.B.: bei der !}LOBYTE FUNC eineCARD als Parameter uebergeben werdenmuss. Da die Function aber als BYTEFUNC vereinbartwurde, wird auch nur!}ein BYTE Wert ausgegeben. Man kannhinter RETURN auch einfach die CARDschreiben. Nur die ersten acht Bytes,also der BYTE W!}ert wird dann rausge-geben.Bei HIBYTE muss auch eine CARD alsParameter uebergeben werden. DieseCARD wird dann aber in zw!}ei BYTEParameter eingelesen. Das 2. BYTEParameter ist dabei das Hibyte undkann daher als Funktionswert zu-rueckgegeben we!}rden.Selbstverstaendlich koennen auch konstante Werte an die FUNC Para-meter uebergeben werden.z.B.so: LO=LOBYTE(256)!} HI=HIBYTE(256) ^ ^ konstante Werte.Als Parameter kann man aber auch Aus-druecke nehmen:!} z.B.: LO=LOBYTE(10*10)oder HI=HIBYTE(10*I) Es gibt eine Reihe 'eingebauter'FUNCs im Action! System.z.B.: INPU!}TC()Schreibt man : I=INPUTC()so wird in der FUNC INPUT eine zahlvon der Tastatur eingelesen und in'I' gespeichert.D!}er Kurs geht weiter mit: ARRAYS.KRSNC INPUT eine zahlvon der Tastatur eingelesen und in'I' gespeichert.D 3DIREKT.KRS************************************** ** *%}* C O M P I L E R - ** ** D I R E K T I V E N ** %} **************************************Dieses Kapitel zaehlt eigentlichnicht mit zum RICHTIGEN %}Sprachkurs,da es Befehle erklaert, die mitdem eigentlichen Action! Programmnichts zu tun haben.Compilerdirektiven sind B%}efehle,dienur waehren des Compilierens vonBedeutung sind, nicht aber waehrenddes Programmablaufs.1. DEFINE definiert%} Zeichenketten oder Konstanten Beispiel: DEFINE ACTION="PRINTE" Nun schreiben wir in einem Pro- gramm z.B.:%} ACTION("HALLO") Jedesmal wenn der Compiler also auf 'ACTION' stoesst, wandelt er es in 'PRINTE' um, da es %}mit DEFINE definiert wurde. Natuerlich koennen so auch Konstante Zahlen definiert werden. DEFINE ZAHL="10" %} Jedesmal, wenn im Programm 'ZAHL' steht, setzt der Compiler '10' dafuer ein. Man sieht, man kann damit also ga%}nz nette Spaesse treiben. So z.B. "neue" Befehle definieren. Die DEFINES stehen am Anfang des Programms. DEFINE%} PR="PRINTE",IN="INPUTMD"2. INCLUDE Mit INCLUDE kann man waehrend des Compilierens andere Action- programme (Sour%}ce) hinzuladen (einbinden). Man stelle sich vor , dass man schon eine ganze Reihe eigener Proceduren entwickelt %}hat, die von verschiedenen Programmen aus genutzt werden koennen. Nun kann man ein Programm schreiben das diese P%}roceduren auch benutzt, die aber nicht im Quelltext extra erscheinen sollen. Dazu kann man sie mit INCLUDE beim Comp%}ilieren einfach hinzuladen. Das Programm wurde dann so aus- sehen: INCLUDE "D:MYPROCS.ACT" PROC MAIN() .%} . . u.s.w. Hat man das Hauptprogramm im Speicher, so kann auch ein Pro- grammteil INCLUDEn, der bereits %} INCLUDEt wird. Ist das nicht der Fall, so kann man nur auf einer Ebene INCLUDEN, was ja auch eigentlich reicht. %} Natuerlich kann ein Programm mehrmals hintereinander INCLUDEN. INCLUDE "D:TEIL1.ACT" INCLUDE "D:TEIL2.ACT" I%}NCLUDE "D:TEIL3.ACT" 3. MODULE Diese Direktive ist im Zusammen- hang mit INCLUDE sehr wichtig,da man nach ein%}em INCLUDE meistens ein MODULE setzten muss (s. Runtime - Cardridge - Library) Diese Direktive wurde ja schon in %} dem Kapitel "GLOBAL.KRS" erklaert.4. SET Set kann man sich wie ein POKE Befehl vorstellen, der aber NUR waehr%}end des Compilerens wirksam ist. z.B.: SET 710=0 **************************************waehr$x*************************************** ** ** >>> )}Befehle T e i l 1 <<< ** ** (PRINT/INPUT) ** )} ***************************************Hier eine Zusammenstellung der Be-fehle, die man in Action!)} benutzenkann.1.Strings drucken:------------------Befehl | FunktionPRINT ohne >RETURNRETU)}RNRETURNRETURNRETURN< 'D' steht immer dafuer, dass ein Kanal angegeben)} werden muss. 2. BYTE Zahlen drucken----------------------Befehl BeispielPRINTB PRINTB(zahl)PRINTBE PR)}INTBE(zahl)PRINTBD PRINTBD(6,zahl)PRINTBDE PRINTBDE(2,zahl)wenn zahl als BYTE definiert wurde3. CARD Zahlen drucke)}n----------------------PRINTCPRINTCEPRINTCDPRINTCDESyntax: PRINTC(zahl)wenn zahl als CARD definiert wurde4. INT)} Zahlen drucken----------------------PRINTIPRINTIEPRINTIDPRINTIDESyntax: PRINTI(zahl)wenn zahl als INT definiert )}wurde5. Ein Zeichen ausgeben----------------------- (wie Basic PUT)PUTSyntax: PUT(65) gibt 'A' an Kanal 0PUTESynta)}x: PUT() gibt ein >RETURN< (155) an Kanal 0 (ist also ein Zeilenvorschub)PUTDPUTDEDie letzten beiden si)}nd wie dieoberen beiden, jedoch mit speziellemKanal: PUTD(6,'A) gibt ein 'A' aus an Kanal6PUTDE(6) nur ein >RETURN< )} 6. Eingabe----------(Basic Input)a). BYTE FUNC INPUTB() Syntax: A=INPUTB() liesst den eingege)}benen Wert in A ein (wie INPUT A)Wichtig die INPUT Befehle fuer Zahlensind Funktionen, keine Prozeduren.Fuer CARD und )}INT Variablen giltentsprechend:fuer CARD: A=INPUTC()fuer INT : A=INPUTI()A muss natuerlich entsprechend def-iniert wer)}den.b). von einem anderen Kanal:INPUTBD()INPUTCD()INPUTID()z.B.:A=INPUTID(2) liesst von Kanal 2 eineINTeger Zahl e)}in.b). von einem anderen Kanal:INPUTBD()INPUTCD()INPUTID()z.B.:A=INPUTID(2) liesst von Kanal 2 eineINTeger Zahl e(pphLspppGNppbbbbbbbbbbbbbbbbbbbbBAp!#4)/.53%2'2/5002/'2!-- !.,%)45.'%.-}ϑ˥ LxpLp`rrst s t s0p1!&t'pps ԍ-}ssLs`pqpi@pqiq`',4s tss``Μs jtL6tΜsΜs tL6ts-}`ppLtpppp pȽq p?tu쭕p`ΕppLtpΖpLtr˩̩ͩΩ vp0 B V-}rz{tu0 V(0BDrEHI V9 muLu BLEuI/O FEHLER...6DuEHI VLt-} mu0 B V`rp˽q̠rɛ uL|ur` uu`ɀɠ`i@`8 `D:*.TXT uEHI VLt,gHallo und Willkommen zur 2. Folge desAssembler Kurses.Heute wollen wir uns naeher mit demAssembler beschaeftigen.Was is1}t ein Assembler ? : Ein Assemblerist ein Uebersetzungsprogramm. Esuebersetzt ein vorher eingegebenes odergeladenes Program1}m (in Mnenonics) in den ML Code. Einige der Mnenonics habenwir ja schon auf der letzten Clubdiskerklaert. Der Assembler be1}steht aus folgenden Teilen:1. Der Editor : Hier kann man Pro- gramme erstellen und redigie1}ren.2. Der Assembler : Er uebersetzt den Quelltext aus dem Editor in ML Code3. Der 1}Debugger : Der Debugger ist ein wichtiger Bestandteil eines Assemblers. Mit ihm kann man Programme auf Fehler pr1}uefen und testen. Leider koennen wir nicht auf jeden Debugger eingehen, den es fuer Atari Computer gibt. Da wir fuer1} Anfaenger in Maschinensprache aber den Atari Assembler empfehlen, da dieser am Anfang einfacher zu verstehen ist 1} als der Mac65, werden wir auch nur diesen beschreiben. Spaeter werden wir auf die Vorzuege des Mac65 eingehen.De1}r Editor:Nach dem Laden des Atari Assemblersoder der Initialisation des Moduls,erscheint "EDIT" auf dem Bildschirm.Nun k1}oennen wir unser Programm ein-geben:10 *=$0600 ; STARTADRESSE=153620 LDA #030 STA 71040 BRK ; BREAK(=STOP)Ae1}hnlich wie in Basic muessen auch hierZeilennummern eingegeben werden.Es ist aber darauf zu achten, dass zwischen Zeilennum1}mer und Befehl immer2 Leerraeume sind.In der 1.Folge haben wir ja schon ge-lernt , was Labels (Marken) sind.Das Programm 1}koennte so abgeaendertwerden:10 *=$060020 LDX #030 LOOP STX 71040 INX50 BNE LOOP60 BRKHier sehen wir, dass zwis1}chen Zeilen-nummer und Label nur 1 Leerraum ist.Ausserdem muss darauf geachtet werden,dass ein weiterer Leerraum den Befeh1}lvom Label trennt, da der Assemblersonst "durcheinander" kommen koennte...Es folgt ein Demozeile:10 LABEL LDA #$FF ; KO1}MMENTAR ^ ^ ^ ^Die "^" bedeuten, dass dort ein Leer-raum sein muss.Das ";" ist uebrigens ein Trennzeichen.All1}es was nach diesem Zeichen in derZeile steht, wird nicht assembliert.Es waere also aehnlich dem "REM" Befehlin Basic.Der1} Label kann auch weggelassen werden.Dann muessen jedoch, wie schon gesagt,2 Leerreaume den Befehl von der Zeilen-nummer tr1}ennen.Fuer den Label kann man beliebige Nameneinsetzen (z.B.:ZAP,MARKUS,DAVID,ATARI1, ATARI123 u.s.w....)Editiert werden1} kann natuerlich genausowie in Atari Basic.Der Editor hat natuerlich noch vieleandere Funktionen, die wir aber nocherleu1}tern werden@ich genausowie in Atari Basic.Der Editor hat natuerlich noch vieleandere Funktionen, die wir aber nocherleu0 Der Assembler:Der Assembler wird mit dem Kommando"ASM" aufgerufen.Durch "ASM" wird das Quellprogramm aufFehler ueberpr5}ueft. Alle Fehler werdennicht mit assembliert. Sollte einFehler auftreten, so ist es ratsam, dasQuellprogramm zu korrigier5}en, da derComputer sonst beim Probelauf ab-stuerzen koennte.Alle Fehler werden gezeigt und es wirddie entsprechende Fehle5}rkennnummerangegeben.Will man nun den ML Code auf Diskspeichern, so schreibt man: "ASM ,,#D:FILE.OBJ"Der Quell5}text muss sich im Speicherbefinden.Bei "ASM" wird der ML Code in denSpeicher geschrieben.------------------------------5}---------Wie speichert man Programme:SPEICHERN: LIST #D:FILE.EXTLADEN : ENTER #D:FILE.EXTBei ENTER wird vor dem Lad5}en der ge-samte Speicher geloescht!---------------------------------------Steuerkommandos fuer den Assembler:(Directive5}n)Zwischen Zeilennummer und Directivemuessen 2 Leerstellen stehen."*=adr" : Teilt dem Assembler die Startadres5}se des Programms mit: Achtung: Das Programm sollte nicht in belegte Speicherbereiche (z.B.: DOS5}, Quellprogramm...) assembliert werden.".OPT LIST" bzw. ".OPT NO LIST" : schaltet die Ausgab5}e beim Assemblieren ein / aus.".OPT OBJ " bzw. ".OPT NO OBJ" Gibt an, ob der ML Code in den5} Speicher geschrieben werden soll oder nicht. Dies kann nuetzlich sein, wenn man ein Programm i5}n schon belegte Speicher- bereiche schreiben moechte.Dies sind ersteinmal grundlegendeKommandos. Weit5}ere folgen...@n belegte Speicher- bereiche schreiben moechte.Dies sind ersteinmal grundlegendeKommandos. Weit4Der Debugger:Der Debugger wird mit "BUG" augerufen.Danach erschein statt "EDIT" > "DEBUG".Der Debugger wird mit "X" ver9}lassen.Danach erscheint wieder "EDIT".Im Debug Modus muessen alle Eingabenuebrigens in HEX gegeben werden.Die Kommando9}s:"G" + HEX Zahl : Startet ein Programm ab der angegebenen Adresse. Der Computer 9} prueft nicht, ob sich das PRG schon ab dieser Adresse im Speiche9}r befindet."S" + HEX Zahl : Fuehrt nur ein Befehl ab der Adresse aus."D" + HEX Zahl, HEX Zahl2 : 9} Gibt die Speicher- inhalte von der 1. Zahl bis zur 2.Zahl in HE9}X aus."L" + HEX Zahl, Hex Zahl2 : Disassembliert von HEX Zahl1 bis HEX 9} Zahl2"C" +Hex ADR. "<" HEX Zahl,n Hex Zahlen Schreibt ab Hex ADR alle weiteren Zahlen 9} in den Speicher. z.B: "C0600<0,1,2" Schreibt ab $600(1536)9} die Werte 0,1,2 in den Speicher. "C2C6<0" Faerbt den Bil9}dschirm schwarz.Weitere Befehle folgen...Dies sollte aber ersteinmal genuegen.-------------------------9}-------------- schwarz.Weitere Befehle folgen...Dies sollte aber ersteinmal genuegen.-------------------------8--------------------------------------- Assembler Kurs Folge II, Teil II (C) 1986 by C.C. Damata---------------=}------------------------Das eigentliche Programm:1. Unmittelbare Addressierung: (immediate addressing)Diese Addres=}sierungsart wird immer be-nutzt, wenn konstante Werte verarbeitetwerden muessen.z.B: LDA #0Dieser Befehl veranlasst den C=}omputerden Wert 0 in den Akkumulator zu laden.Gegenbeispiel : LDA 0Dieser B. (Befehl) veranlasst den C.(Computer) den Wer=}t, der in der Adresse0 steht,in den Akkumulator zu laden.Das "#" ist also das Erkennungszeichenfuer die unmittelbare Adres=}sierung.Folgende Befehle sind fuer unmittelbareAdressierung zulaessig:LDALDXLDYADC (addiere mit Carry-Flag=})SBC (subtrahiere)CMP (Vergleiche (Compare)CPXCPYsowie die logischen Operatoren AND,ORA,EORAu=}f die Rechen-,Vergleichs und Logic-befehle werden wir spaeter genauer ein-gehen. Die absolute Adressierung: =} (absolute adressing) ---------------------------------z.B: LDA 710Hier wird der Wert, der in 710 ge-speichert ist in =}den Akkumulator ueber-tragen.Die Werte , die mit der absoluten Adr.verarbeitet werden muessen immergroesser als 255 sein.=}Alle Werte , die kleiner oder gleich255 sind werden mit der ZERO PAGE Adressierungverarbeitet (z.B LDA 82).Nu=}n werden sich einige fragen, was derUnterschied nun soll. Der Unterschiedliegt einfach darin, dass fuer dieabsolute Adress=}ierung 3 Byte und fuerdie Zero Page Adr. nur 2 Byte benoetigtwerden:Assembler MaschinencodeBefehlLDA 256 =} $AD $00 $01LDA 255 $A5 $FFWenn wir mit einem Assembler pro-grammieren, ist dieses nicht ganz so wichtig,=} da der Assembler die unter-schiedlichen Adressierungsmodi selbst-staendig erkennt.!------------------------------------=}---In der naechsten Ausgabe werden wir eine Uebersicht ueber saemtlicheBefehle und deren Adressierungsmodibringen.------=}---------------------------------Natuerlich gibt es wesentlich mehrAdressierungsmodi. Aber wir glauben,dass es wenig Zwec=}k hat, gleich allevorzustellen.Wir werden speziellere Adressierungs-modi spaeter immer gleich ampraktischen Beispiel zeig=}en.Moegliche Befehle fuer absolute Adr.und Zero Page Adr.LDALDXLDYSTASTXSTYADCSBCINCDECalle Vergleichs- un=}d LogicbefehleJMP ( absolute Adr)JSR ( " " " )alle SHIFT Befehle, die spaeter er-klaert werden.Wi>}r sehen, dass sehr viele Befehle fuer die absolute Adr. und Zero PageAdr. ausgelegt sind.Diese Adressierungsarten und wie >}auchdie unmittelbare sind ersteinmal diegrundlegenden Arten der Adr.Es folgen Beispiele...Anwendungsbeispiele fuer die>} absolute und Zero Page Adressierung und dieBenutzung des DEBUGers:Aufg.: Die Bildschirmfarbe ist auf weiss (Wert >}15) zu setzen. Der linke Rand im Editor soll 2 Zeichen nach links geschoben werden, so dass 40 Zeichen p>}ro Zeile erreichbar sind. 5 .OPT OBJ ; IN DEN SPEICHER10 *=$5000 ; Startadr.20 ;30 LDA #15 ; UNMITTELBAR>}40 STA 710 ; ABSOLUT50 ;60 LDA #0 ; UNMITTELBAR70 STA 82 ; ZERO PAGE80 ;90 BRK ; = STOPIst das >}Prg. eingegeben, so soll esmit 'ASM' assemblieren.Danach gehe man mit 'BUG' in den De-bugger und starte das PRG mit: >} G5000Nun sollte der Bildschrm weiss und derCursor links sein (wie in Basicnach POKE 82,0).Wenn man jetz>}t eine andere Farbewuenscht, so muesste man jetzt wiederzurueck in den Editor, den ent-sprechenden Bef. (LDA #15) auf z.B.> }LDA #16 aendern und das gesamte Prg.noch einmal assemblieren.Aber eigentlich ist ja nur eine Zahlim gesamten Prg. geaende> }rt worden. Hierhilft uns dann der Debugger.Wir schreibrn also:C5001<10Die 10 ist HEXadecimal und hat den DECimalen Wer> }t 16.(Beachte: Im DEBUGGER muessen alle Ein-gaben in HEX gemacht werden.)Wieso muss eigentlich Adr $5001 ge-aendert werd> }en ???:Im Quelltext ist angegeben, dass $5000Startadr ist.LDA #16 als unmittelbarer Bef. belegtzwei Bytes.Also steht in> } $5000 der Bef. LDA ($A9).In $5001 steht dann der Wert 16. So muss also $5001 geaendert werden.Anderfalls muesste die Aend>}erung imDEBUGGER so lauten:C5000}nd DEBUGer sinnvoll arbeitenkann.9,10Wir hoffen, dass durch dieses Beispieldeutlich geworden ist, wie man mitEDITor u<%******** Verzweigungen ********Was waere ein Computer, wenn es keineIF...THEN Bef. geben wuerde...??"#$?!In dieB}sem Teil besprechen wir , wieVerzweigungen in die Prg. bauen koennen(CMP, CPX , CPY).Nun soll ein Prg. geschrieben werdeB}n,welches aus dem Zufallsregister RANDOM(53770 = $D20A) solange liest , bisdieses der Wert 50 hat.Der Bildschirm soll sicB}h dann jeweilsanders faerben.Das Prg.:10 *=$500020 .OPT OBJ 30 LDA #0 ; BILDSCHIRM40 STA 710 ; SCHB}WARZ50 LOOP LDA 53770 ; IF PEEK(RANDOM) 60 CMP #50 ; =50?70 BNE LOOP ; <> 5080 ; THEN90 LDA #50 B} ; BILDSCHIRM91 STA 710 ; ROT92 BRK ; = STOPWas bewirkt CMP im Computer ?:Wenn der Wert hinter CMP B}gleich demdes Akkumulators dann setzt dieser Bef.das ZERO FLAG. Ist der Wert ungleichdem des Akkus, dann wird das ZERO FLAB}Gauf 0 gesetzt.Der Bef. BNE verzweigt nun immer dannzu dem angegebenen LABEL, wenn das ZERO FLAG 0 ist.Im obigen Prg. isB}t das Zero Flag ja solange auf 0 bisder RANDOM Wert gleich 50 ist.So ist koennte man das obige Prg.in Basic so schreibenB}:10 IF PEEK(53770)<>50 THEN 1020 POKE 710,50Der Bef. BEQ + Label ist genau dasGegenteil zu BNE. Dieser verzweigtnaemlB}ich immer dann, wenn das ZERO FLAGgesetzt ist.Mit dem BEQ koennte das Prg. folgender-massen aussehen:100 *=$5000110 .B}OPT OBJ120 LDA #0130 STA 710140 LOOP LDA 53770150 CMP #50160 BEQ GLEICH170 JMP LOOP180 GLEICH LDA #50190 STA 71B}0 200 BRKMit JMP (JuMP) wird immer zum LABELoder Adr. gesprungen. (Waere alsoungefaehr identisch mit GOTO)Die ArbeitsB}weise der Bef. BNE & BEQ:Wichtig ist , dass BNE & BEQ keineSprungbefehle sind. BNE & BEQ sind2 Byte Befehle:Im 1. Byte sB}teht der Befehl und im2. Byte in welche Richtung ver-zweigt werden soll.Steht im 2. Byte also 10, so wirdder Befehl als nB}aechstes ausgefuehrt,der 10 Bytes weiter steht.Mit BNE & BEQ kann man vorwaerts als auch rueckwaerts maximal 128 Bytes(inB }jeder Richtung) verzweigen.Wir wollen an diser Stelle nicht weiterin diese Bef. eingehen, da dieses nurVerwirrung schaffeB!}n wuerde.Sollte eine Verzweigung ueber diese128 Bytes hinausgehen, so wird derAssembler einen Fehler ausgeben.Alle ompB"}are Befehle arbeiten natuer-lich identisch, so das auch das X, so-wie Y-Register mit einem bestimmtenWert verglichen werdeB#}n kann:CPXCPY@ natuer-lich identisch, so das auch das X, so-wie Y-Register mit einem bestimmtenWert verglichen werde@--------------------------------------- Assembler Kurs Folge II, Teil II (C) 1986 by C.C. Damata---------------F%}------------------------Das eigentliche Programm:1. Unmittelbare Addressierung: (immediate addressing)Diese AddresF&}sierungsart wird immer be-nutzt, wenn konstante Werte verarbeitetwerden muessen.z.B: LDA #0Dieser Befehl veranlasst den CF'}omputerden Wert 0 in den Akkumulator zu laden.Gegenbeispiel : LDA 0Dieser B. (Befehl) veranlasst den C.(Computer) den WerF(}t, der in der Adresse0 steht,in den Akkumulator zu laden.Das "#" ist also das Erkennungszeichenfuer die unmittelbare AdresF)}sierung.Folgende Befehle sind fuer unmittelbareAdressierung zulaessig:LDALDXLDYADC (addiere mit Carry-FlagF*})SBC (subtrahiere)CMP (Vergleiche (Compare)CPXCPYsowie die logischen Operatoren AND,ORA,EORAuF+}f die Rechen-,Vergleichs und Logic-befehle werden wir spaeter genauer ein-gehen.@e logischen Operatoren AND,ORA,EORAuDVDie absolute Adressierung: (absolute adressing)z.B: LDA 710Hier wird der Wert, der in 710 ge-speichert ist in denJ-} Akkumulator ueber-tragen.Die Werte , die mit der absoluten Adr.verarbeitet werden muessen immergroesser als 255 sein.AlJ.}le Werte , die kleiner oder gleich255 sind werden mit der ZERO PAGE Adressierungverarbeitet (z.B LDA 82).Nun wJ/}erden sich einige fragen, was derUnterschied nun soll. Der Unterschiedliegt einfach darin, dass fuer dieabsolute AdressierJ0}ung 3 Byte und fuerdie Zero Page Adr. nur 2 Byte benoetigtwerden:Assembler MaschinencodeBefehlLDA 256 J1} $AD $00 $01LDA 255 $A5 $FFWenn wir mit einem Assembler pro-grammieren, ist dieses nicht ganz so wichtig, daJ2} der Assembler die unter-schiedlichen Adressierungsmodi selbst-staendig erkennt.!---------------------------------------J3}In der naechsten Ausgabe werden wir eine Uebersicht ueber saemtlicheBefehle und deren Adressierungsmodibringen.---------J4}------------------------------Natuerlich gibt es wesentlich mehrAdressierungsmodi. Aber wir glauben,dass es wenig Zweck hJ5}at, gleich allevorzustellen.Wir werden speziellere Adressierungs-modi spaeter immer gleich ampraktischen Beispiel zeigen.J6}Moegliche Befehle fuer absolute Adr.und Zero Page Adr.LDALDXLDYSTASTXSTYADCSBCINCDECalle Vergleichs- und LJ7}ogicbefehleJMP ( absolute Adr)JSR ( " " " )alle SHIFT Befehle, die spaeter er-klaert werden.Wir sJ8}ehen, dass sehr viele Befehle fuer die absolute Adr. und Zero PageAdr. ausgelegt sind.Diese Adressierungsarten und wie aucJ9}hdie unmittelbare sind ersteinmal diegrundlegenden Arten der Adr.Es folgen gleich Beispiele...@ssierungsarten und wie aucHcAnwendungsbeispiele fuer die absolute und Zero Page Adressierung und dieBenutzung des DEBUGers:Aufg.: Die BildschirmfarbN;}e ist auf weiss (Wert 15) zu setzen. Der linke Rand im Editor soll 2 Zeichen nach links geschoben N<} werden, so dass 40 Zeichen pro Zeile erreichbar sind. 5 .OPT OBJ ; IN DEN SPEICHER10 *=$5000 ; Startadr.20 ;N=}30 LDA #15 ; UNMITTELBAR40 STA 710 ; ABSOLUT50 ;60 LDA #0 ; UNMITTELBAR70 STA 82 ; ZERO PAGE80 ;90 BN>}RK ; = STOPIst das Prg. eingegeben, so soll esmit 'ASM' assemblieren.Danach gehe man mit 'BUG' in den De-bugger N?}und starte das PRG mit: G5000Nun sollte der Bildschrm weiss und derCursor links sein (wie in BasicnaN@}ch POKE 82,0).Wenn man jetzt eine andere Farbewuenscht, so muesste man jetzt wiederzurueck in den Editor, den ent-sprechNA}enden Bef. (LDA #15) auf z.B.LDA #16 aendern und das gesamte Prg.noch einmal assemblieren.Aber eigentlich ist ja nur eine NB}Zahlim gesamten Prg. geaendert worden. Hierhilft uns dann der Debugger.Wir schreibrn also:C5001<10Die 10 ist HEXadecimNC}al und hat den DECimalen Wert 16.(Beachte: Im DEBUGGER muessen alle Ein-gaben in HEX gemacht werden.)Wieso muss eigentliND}ch Adr $5001 ge-aendert werden ???:Im Quelltext ist angegeben, dass $5000Startadr ist.LDA #16 als unmittelbarer Bef. belNE}egtzwei Bytes.Also steht in $5000 der Bef. LDA ($A9).In $5001 steht dann der Wert 16. So muss also $5001 geaendert werdenNF}.Anderfalls muesste die Aenderung imDEBUGGER so lauten:C5000>157,73,3,104,157,72,3,32,86,228,132,212,169,0,133,213,96$($( ŠҠǠ)@(RM}}$ +A@4@@(}$$(****************************$$(* Der AssemblerRN} - Kurs *$$(* *$$(* (c) 1986 / C.C. Damata *$$(* *$$(RO}* Folge II - Teil I *$$(* *"$$(****************************,@RP}((611(( Bitte gebe das Ausgabegeraet ein :E:@J+@+@@T-@RQ}'A@4-(}UZ.(&} Drueckeum BildschirmscrollenZ(' zu halten bzw. um weiter zu ScrollenV00((----RR}------------------------------------Y A^ SUBh+@+@@m Ar6-?:RS}//('Zero - Page bzR^}w. Absolute adressierungH (von der unmittelbaren ?R(1. ueberhaupt nicht\..(&2. die unmittelbare Adr. beziehtR_} sichf,,($nicht auf Adressen, sondern auf kon-p( stante Wertez))(!3. die unmittelbare Adressierung++(#beziehtR`} sich nur auf eine bestimmte('Page')@6-&@H1@('(F A L S C H ....1 ARa}//('}O.k. , deine Antwort war Richtig... AP6. D:BSP1.TXT AP AP6.D:VERZWEIGRb}.TXT AP AP..(&}Wieviele Bytes koennen die Verzeig-&&(ungbefehle max. verzweigen :$.(Rc}A(( Falsch....( A8(}O.k.B AP% D:MENUE.BAS D:ASSKURS.BASverzweigen :$.(Pe( % D:KMENUE.WSB D:MENUE.BASor hat natuerlich noch vieleandere Funktionen, die wir aber nocherleuT67+>AIZAPPEKEDDAA@8 MOVIEP ;Bv%,//@@Zf}D:PARIS007.MOV @@C@C:,Bv%(67Bv%<Bv%,. -' +'0@Zg}2*@@'AR@*`<-@Bv%F (7<,G-@  P Z..(Zh}&Rueckseite einlegen und Taste drueckend!) @!% D:MENUE.WSBnOx' +'0@@EZi}AR@'-@@E(Bitte einen Moment wartenQ D:MOVIE.WSB'0@@EXX} ^k}   ^l}   ~^m}     ^n}         ~~~~^o}^p} * * * * * * * * * * * * * * * ** ^q}***THE PARISFILES^r}  * * * * * * * * * * * * * * * ***********^s}} ^t}~ SWITZERLAND^u}      AMERICAN SPYMIK^v}E THOMPSON ~~~~~~~~~~~~~~           ^w} ~~~~~~^x}~~~~~where is^y}the money   I HAVE IT  ^z} th~~good!  THE THE PLANS^{}  of course  GOOD!^|}  let us ~~~~~~se~witch! ^}}    thank you ^~}  than~~~~THANKS        ^}JAMES BOND ~- CHRIS  ^}-- - -*********#         ^}#~#LOOK OUT!  ~#~#what?^}   # # # # # # # ~~# #**^}*******~        I'LL GET JAME^}S BOND~~~~~~~~~~~~~~~~~~~        ^}           ^}}^}     ^}        ^}           ^}   ^}||Π^}~~~~~~~~~~~ ^}OҠš~~~~~~~~~~~^}AH HELLO CHRIST~TOFF! ~~~~~~~~~~~~~  Ϡ^}̡  I'VE DECIDED ON1 MILLIONDOLLARS!^}~~~~~~~~~~ ~~~~~~~~~~~~~~~ OK BUT I WANT THE^}PLANS TODAYIN NEW YOUR~~RK!~~~~~~~~~~~~~ ~~~~~~~^}~~~~~~~~~~ OK SIX OCLOCKAT THE EMPIRESTATE BUILDING^}~~~~~~~~~~~~~~~ -~~~~~~~~~~~~~~~~~ š^}~~~~~~YES, BYE!   &^}WHEN AND WHERE?^}~~~~~~~~~~~~~~~ SE~IX OCLOCK EMPIRESTATE BUILDING!~~~~~~~~~~~~~~~~~~^}~ MY MONEY!~~~~~~~~~ DON'T SPEND IT ALL^}IN ONE PLACE!  ~~~~~~~~~~~~~~~~~~^}Χԡ  BY ~E MR. BOND!~~~~~~~~~^}~~~~ GOOD BYE!~~~~~~~~~   O ^}O^}OHA HA!  BUT WHAT HEDOE'S NOT^}KNOW IS THAT,THERE S~IS ABOMBIN THE SUITA~CASE!^} ~~~~~~~~~~^}~ ~~~~~~~~~~~~~~~ ***********************   ^}                      ^}}^} ^}   EMP^}IRE STATE BUILDING!~~~~~~~~~~~~~~~~~~~~~~~NEW YOU~RK CITY^}~~~~~~~~~~~~~~&HE WON'T REGOG~~~^}GOGN~~NIA~ZEME IF I LOOK LIKECR~HRISTOFF THE RUSS^}IANO~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~^}~~6 O'CLOCK WHERE IS HE!~~~~~~~~~~~~~^}~~~~~~~~~~YOU ARE LATE!~~~~~~~~~~~~~~HAVE YOU GOT IM!^}  YES!~~~~~BUT YOU ARE NOTCR^}~HRISTOFF!~~~~~~~~~~~~~~~  GIVE I ~M HERE OR I'LL^}SHOOT!~~~~~~~~~~~~~~~~~~~~~~~~~~ NO!^}~~~~~    I GOT THEM ~!^}~~~~~~~~~~~~~ BUT HE'S NOT DEAD!~~~~~~~~~~~~~~~~~~~ I ~'LL SPEAR H^}E~IS LIFETHIS I~TIME!*~~~~~~~~~~~~~~~  ^}I GET JAMES BOND!^}}^} 0^}F~^}Ҡ^}Ԡ ^} ~~~~~~~~~~~~O O O O O O O  O O O ^}OCAN YO ~U READ ME!~~~~~~~~~~~~~~~~~^}LOUD AN ~D CLEAR JAMES!~~~~~~~~~~~~~~~~~~~~~~ THEN HEAR THIS!^}  I WILL GIVE PLANS ^}BACK TO PARISTONIGHT! ~~~~~~~~~~~~~~~ ^} O O O             O O^}HE WON'T FIND ME HERE!~~~~~~~~~~~~~~~~~~~~~~~     ^}+ + + + + + + + +*********           : ^}HE GOT AWAY AGAIN!~~~~~~~~~~~~~~~~~~~ O O O^}   + + + +  O  ***************^} O       *** **          :   ^}        O O PO O O^}OW!   O O O O PO O O O ^}}^}  ^}  ^}  + ^}  EIFEL TOW^}ER ~~~~~~~~~~~NOTRE DAME! ^} PARIS, FRANCE~~~~~~~~~~~~~~^}&PICK UP!~~~~~~~~ ^}   |||| & & & & ^}           ********^}*        &GERONIMO!    & &~&~&~&~&~^}&~&~&~&~&~&~&~&~&~& Z~&~& &+ ^}&#I GONNA KILL YOU!^}              ^}         *#  #~#~#~# #~#~#****^}** *               ^}             HA HA YOU MISSED! ^}  + + + + + + + + +**********        ^}              CLOSE!^}         ^} + + + + + + + + +| S+ | | +**^}*******         CRACK!    ^}            & &  ^}  WHOA!          ^}   + + + + + + + +************~~~~~     ^}   CRACK!     & & &^} & & & & & & & &  &~~~~ &~~~~^} ~~~~~~&          THAT'S ^} JUST TO  MUCH!   ^}}^}^}^}ҠԠ~~ԡ^}&  & & & ^} &                ******^}**         ^}^}       *****    ^}GOD~OD BYE!  &^}           &   ~  & + + + +^} + -+*********                 ^}  & & & & & & & & & & ^} ӠĠӠϠ^}Π٠ŠΠ~~Ƞ٠~~~ŠԠƠ Π^}ϠҠΠҠԠΠԠΠӠŠ͠^}^} ^} ^} ^} ^} ^} \e; ---------------------------------; FRAGE-ANTWORT SPIEL ; (C) 1987 BY ACTION USER GROUP; WRITTEN BY Mb}ARKUS KRETZER; ---------------------------------; BINARY I/O ; EQUATESDEFINE IOCB="$340", IOCBNR="16" ; Ab}LWAYS CH#1BYTE POINTER ICCOM, ; =$342 ICSTA, ; =$343 ICAUX1, ; =$34A ICAUX2 ; b}=$34BCARD POINTER ICBADR, ; =$344 ICBLEN ; =$348PROC CIOMYMY=$E456(BYTE AKKU,XREG) RETURNPROC BIO(BYTE Cb}HANNEL CARD ADRESS,LENGHTH BYTE COMMAND) CHANNEL==LSH 4 ICCOM=$342 ICCOM==+CHANNEL b} ICCOM^=COMMAND ICBADR=$344 ICBADR==+CHANNEL ICBADR^=ADRESS ICBLEN=$348 ICBLEN==+CHANNEL ICBLb}EN^=LENGHTH CIOMYMY(0,CHANNEL)RETURNPROC BPUT(BYTE CHANNEL CARD ADRESS,LENGHTH) BIO(CHANNEL,ADRESS,LENGHTH,11b})RETURNPROC BGET(BYTE CHANNEL CARD ADRESS,LENGHTH) BIO(CHANNEL,ADRESS,LENGHTH,7)RETURNPROC XIO(BYTE CHANNEL,c}DUMMY, COMMAND,AUX1,AUX2 CARD FILADR) CHANNEL==LSH 4 ICCOM=$342 ICCOM==+CHANNEL ICc}COM^=COMMAND ICBADR=$344 ICBADR==+CHANNEL ICBADR^=FILADR ICAUX1=$34A ICAUX1==+CHANNEL ICAUX1^=Ac}UX1 ICAUX2=$34B ICAUX2==+CHANNEL ICAUX2^=AUX2 CIOMYMY(0,CHANNEL)RETURN; ---------------------------------c} MODULE; ---------------------------------TYPE QUEST=[BYTE ANSWER, FRAGEN] c}DEFINE QUESTSIZE="241", FRAGENSIZE="1",MAXSPACE="5000", RICHTIG="1",FALSCH="0"BYTE ARRAY QUESTIONS(MAXSPACE),c} C_QUESTION(240), cc_quest(60), filespec(20) CARD RECCOUNT=[0]BYTE REPLY, RICHTIG_ZAEc}HLER,FALSCH_ZAEHLERbyte array farbe(0)=708PROC CLR(byte acol) PUT(125) farbe(2)=acolRETURNPROC TITLE() PRINTE("c} ------------------------------------") PRINTE(" | Frage-Antwort Spiel Version 1.00 |") PRINTE(" | (C) 1987 by Action Uc}ser Group |");Printe(" | written in Action! |") Printe(" | written in Action! by M.K |") PRINTE("c } ------------------------------------")RETURNPROC Wait_KEY() PRINTe("Druecke eine Taste") reply=getd(7)returnBYTE FUc }NC FRAGEN_OUT(byte whichrec) byte I,I2,I3,start,STOP,right_answer, DIE_ANTWORTQUEST POINTER NEWRECORDBYTE POINTER FRc }AGENPTR CLR() Farbe(2)=0 newrecord=questions+(whichrec*questsize) right_answer=newrecord.answer fragenptr=newrecord+fc }ragensize moveblock(c_question,fragenptr,240) start=1 STOP=START+59 PRINTE("Frage :") I3=START DO PUT(C_QUESc }TION(I3)) I3==+1 UNTIL I3=STOP OR C_QUESTION(I3)=155 OD PUTE() PUTE() START==+60 STOP==+60 PRINTE("moeglic}che Antworten :") FOR I=2 TO 4 DO PRINT("Antwort :") PRINTBE(I-1) I3=START DO PUT(C_QUESTION(I3)) c} I3==+1 UNTIL I3=STOP OR C_QUESTION(I3)=155 OD PUTE() PUTE() START==+60 STOP==+60 OD PUTE() Printe("Wec}lche Antwort ist richtig") reply=getd(7) if reply=right_answer then PUTE() PRINTE("***** ŠԠ ***c}**") DIE_ANTWORT=RICHTIG else PRINTE("***** ŠԠ *****") PUTE() PRint("Die richtige Antwort wac}r :") put(right_answer) DIE_ANTWORT=FALSCH fi PUTE() wait_key() RETURN (DIE_ANTWORT)PROC EINGABE()byte I,c}I2,I3,start,STOPQUEST POINTER NEWRECORDBYTE POINTER FRAGENPTR CLR() FARBE(2)=$60 FOR I= 0 TO 240 DO C_QUESTION(I)=' c} OD PRINT("Frage Nr.:") PRINTce(reccount+1)PRINTE("Gebe Frage ein. (max. 60 Zeichen)")start=1 STOP=START+59 inputmd(c}0,cc_quest,60) PUTE() PUTE() SASSIGN(c_question,cc_quest,start,stOP) start==+60 STOP==+60PRINTE("Gebe 3 Antworc}ten ein. (max. 60 Zeichen pro Antwort)") for i=2 to 4 do PRINT("Antwort :") PRINTbE(i-1) inputmd(0,cc_quest,6c}0) PUTE() PUTE() SASSIGN(c_question,cc_quest,start,stOP) start==+60 STOP==+60 oddo do PRINTE("Welche Antwc}ort ist richtig???") newrecord=questions+(reccount*questsize) newrecord.answer=getd(7) until newrecord.answer>='1 and nec}wrecord.answer<='3 od PUTE() PRINT("Ist Frage ") put(newrecord.answer) PRINTE(" richtig?") reply=getd(7)uc}ntil reply='J or reply='jodfragenptr=newrecord+fragensizemoveblock(fragenptr,c_question,240)reccount==+1returnPROC AUSc}GABE()BYTE Iif reccount>0 thendo clr($80) PRINT("Welche Frage (1 bis ") PRINTc(reccount) PRINT(") ?") I=inputb() i==-c}1 until I>=0 and I") INPUTMD(0,filespec,15) close(3) open(3,filespec,8,0) PRINTE("Schreiben...bitte c}warten...") ; Fileformat : ; 1. Reccount ; 2. Datenstring von 0 bis MAXSPACE printcde(3,reccount) BPUT(3,QUESTIONSc},MAXSPACE) close(3)returnPROC LADEN()CARD i BYTE ak clr($A0) PRINTE("LADEN der Daten...") PRINT("Geraet+filenamec }n >") INPUTMD(0,filespec,15) close(3) open(3,filespec,4,0) PRINTE("Laden...bitte warten...") reccount=inputcd(3) BGETc!}(3,QUESTIONS,MAXSPACE) close(3)returnPROC WHOLE_DIRECTORY() DO INPUTMD(2,FILESPEC,20) PRINTE(FILESPEC) UNTIL EOF(2)=c"}136 ODCLOSE (2) Wait_key()RETURNPROC DIR1() CLR($FE) CLOSE (2) OPEN (2,("D:*.*"),6,0) WHOLE_DIRECTORY()RETURNPROC Dc#}IR_RAMDISK() CLR($DE) CLOSE (2) OPEN (2,("D8:*.*"),6,0) WHOLE_DIRECTORY()RETURNPROC AUSWERTUNG()CLR($E0) TITLE() PUTE(c$}) PUTE() PUTE() PRINT("Richtige Antworten :")PRINTBE(RICHTIG_ZAEHLER)PRINT(" Falsche Antworten :")PRINTBE(FALSCH_ZAEc%}HLER) PUTE()WAIT_KEY()RETURNPROC ZUFALL() BYTE I,WIEVIEL,WHICH PUTE() PRINT("Wieviele Fragen ??? (1 bis c&}255)") WIEVIEL=INPUTB() FOR I =1 TO WIEVIEL DO WHICH=RAND(RECCOUNT) REPLY=FRAGEN_OUT(WHICH) IF REPLY=1 THEN RICc'}HTIG_ZAEHLER==+1 ELSE FALSCH_ZAEHLER==+1 FI ODAUSWERTUNG()RETURNPROC REIHE_RUECK() BYTE IRICHTIG_ZAEHLER=0 Fc(}ALSCH_ZAEHLER=0 I=RECCOUNT-1 DO REPLY=FRAGEN_OUT(I) IF REPLY=1 THEN RICHTIG_ZAEHLER==+1 ELSE FALSCH_ZAEHLER==+1c)} FI I==-1 UNTIL I=255 ODAUSWERTUNG()RETURNPROC REIHE_NACH() BYTE IRICHTIG_ZAEHLER=0 FALSCH_ZAEHLER=0 FORc*} I=0 TO RECCOUNT-1 DO REPLY=FRAGEN_OUT(I) IF REPLY=1 THEN RICHTIG_ZAEHLER==+1 ELSE FALSCH_ZAEHLER==+1 FI ODc+}AUSWERTUNG()RETURNPROC GAME_INIT()IF RECCOUNT>0 THEN CLR($F0) TITLE() PUTE() PUTE() PUTE() PRINTE("1. zuf llig Ac,}bfragen") PRINTE("2. der Reihe nach") PRINTE("3. der Reihe nach, aber r ckwaerts") PRINTE("M. Hauptmen ") REPLY=GETD(7)c-} IF REPLY='1 THEN ZUFALL() ELSE IF REPLY='2 THEN REIHE_NACH() ELSE IF REPLY='3 THEN REIHE_RUECK() FI c.} FI FIFIRETURNPROC LOESCHEN() CLR($30) TITLE() PUTE() PUTE() PUTE() PRINTE("Letzte Frage lschen ?") REPLc/}Y=GETD(7) IF REPLY='J or REPLY='j THEN IF RECCOUNT>0 THEN RECCOUNT==-1 FI FIRETURNPROC MAIN() close(7) opc0}en(7,"K:",4,0)POKE (82,0) graphics(0) poke (756,204) ; int.Zeichen(nur XL,XE)do clr($10) TITLE() PUTE() PRINTE("1. c1}EINGABE von Fragen") PRINTE("2. AUSGABE von bestimmten Fragen") PRINTE("3. Das Spiel") PRINTE("L. Laden") PRINTE("S. Spc2}eichern") PRINTE("D. Directory") PRINTE("R. Directory RAMDISK (D8:)") PRINTE("E. Letzte Frage lschen") PRINTE("X. Prograc3}mm verlassen...") PUTE() PRINT("Fragen im Speicher :") PRINTce(reccount)REPLY=GETD(7)IF REPLY='1 THEN EINGABE() FIIF Rc4}EPLY='2 THEN AUSGABE() FIIF REPLY='3 THEN GAME_INIT() FIIF REPLY='S or REPLY='s THEN SPEICHERN() FIIF REPLY='L or REPLY='lc5} THEN LADEN() FIIF REPLY='D or REPLY='d THEN DIR1() FIIF REPLY='R or REPLY='r THEN DIR_RAMDISK() FIIF REPLY='E or REPLY='ec6} THEN LOESCHEN() FIIF REPLY='X or REPLY='x THEN EXIT FIODRETURNor REPLY='r THEN DIR_RAMDISK() FIIF REPLY='E or REPLY='e`DOqb8冨凪`ʆ ee` OE…¥ O` 9Oʆ &eg8} O OLO` 9O'&&&8儨児祂*&&*ń8&&8儨兪` Og9}` Fj` &`hihiHHȱȱl ` BDEHI Vg:} SP`` BHILuP JK` O OmP OOiLP PPPiPPiPg;}PPP8QQPL8Q PPPPPPPL QPPPPP PPŢP TP` LgQcQ cQ g<}P`}R PeRiRhR gRfReR Q`rage-LR PRRRRRR Q`R& | LR PRRRRRQBQQmRQg?}QiQQQRQDQQmRQQiQQQRȑRQJQQmRQQiQQQRQKg@}QQmRQQiQQQRR V`rbSS Pe}SPe~S}S~S{S}SiS~SiSSgA}SP ySySi;zSLTFrage :S lySxSxSP ΤxSxSMzS xSPILT ̤ ̤ySi[ T  dQT PL\Schreiben...bitte warten...\ lTT gR}SS jR dQ`;RILN\ TLk\LADEN der Daten...\V lL\Geraet+filenamen >\u T  dQTgS} PL\Laden...bitte warten...\ l TTSS R dQ`L]T T lIL] dQ U`L*]gT} T dQL=]D:*.*]7 P \`LU] T dQLi]D8:*.*]b P \`L] T T ̤ ̤ ̤L]Richtige AntwortegU}n :] T L] Falsche Antworten :] T ̤ U` L] ̤L^Wieviele Fragen ??? (1 bis 255)]  ]gV}]]6^6^]Lf^T 񦥠]] VTTIL]^TL`^T]L+^ ~]`.Ln^TT8Tj^j^ VTTIL^TL^T8j^gW}j^j^IL^ ~]`L^TT^8T^^ʹ^L^ ^ VTTIL^TL^T^L^ ~]`L_TTL_ T T ̤ gX}̤ ̤L;_1. zuf llig Abfragen_& lLW_2. der Reihe nach_E lL_"3. der Reihe nach, aber r ckwaerts_a lL_ M. Hauptmen gY}_ l TTI1L_ ]L_TI2L_ ^L_TI3L_ k^`L_0 T T ̤ ̤ ̤L`Letzte Frage lschen ?_ l gZ}TTIJ TIjLJ`TTLJ`8TTTT`LN` dQLY`K:`V PR z vQ̢ z T T ̤L`1. EIg[}NGABE von Fragen` lL` 2. AUSGABE von bestimmten Fragen` lL` 3. Das Spiel` lL`L. Laden` lLa S. Speicherng\}a lL(a D. Directorya lLMaR. Directory RAMDISK (D8:)a2 lLoaE. Letzte Frage lschenaW lLaX. Programm verlasseng]}...ay l ̤LaFragen im Speicher :a TT  TTI1La oXTI2La [TI3La _TIS TIsL b [Tg^}IL TIlLb K\TID TIdL1b ']TIR TIrLEb R]TIE TIeLYb _TIX TIxLmbLpbL```K` TIsL b [TdlPyzDDAIALOADER_INFCLUB_MAGTEST_FILFILE_NOT_EXISKEACT_KURACT_KURS_INFACT_KURS_FORANL_THE_FINDEANL_Zk`}S_EDIANL_SEG_CRSEG_CRBUGANL_COPANL_LIANL_DOANL_RAMCOPSUBMENUBACKSIDSPSPIFTHELOOPINFOERRCODEMLMLPRINT_OUDIRka}EDIREKBEFEHLEPROGLOBAFUNML_KUREDIASDEBUABCMBUAS@@@@VEkb} C C kc}C !"#$A%A&.Akd}'ZA(A)A*(B+UB,B-.B/0BACTION USER GROUP MENUE;@0, ke}1 +@1AR@ G%2A@@G2@A@@)kf}-@5")A6%& &@@K(++112,112,71,64,188,7,6,6,112,2,48,2,482--2,48kg},2,48,2,48,2,48,2,48,2,48,2,48,2,48<2,48,2,48,65,48,6F'A`'Aa@PSA@'Akh} AC9AS0@@ @ZD(} ACTION! USER GROUPD(# dki}.( 1. Prozeduren.(2. Globale variablenn0( 3. Funktionen0(4. Compiler_Direktivenx##(5. Action! Befehle Teil 1kj} z(6. >>> Der ML-Kurs <<<(7. ML-Kurs :Der Editor!!(8. ML-Kurs :Der Assembler (9. ML-Kurs :Der Debuggkk}er++(#A. ML-Kurs :Absolut und unmittelbar(B. Der Vergleich( X. Hauptmenue((? :? " Bitte waehlekl} aus"#-AU#AM-@32@@@I2@@M &F:km}Ad,"AU & A/2)@/"@:X,)"@:x,AP"@:A,)"@:a,A`"@:B,)"kn}@:b,Ap6-&@H A +OOA`ApAAAAA A0ko}A@ ( %\\\"\,\6\@\J\T\^\h\r\1 +Akp}@P1A@PL0((Lege Clubdisk in Laufwerk 1 und drueckeL( )@%kq}'AA'AAG%2G2@M-(% Lege bkr}itte die Rueckseite ein.....0(M( dann druecken F:Ad,"AUA0AdAU Aks}]6. D:PROC.KRSP B]6. D:GLOBAL.KRSP B]6. D:FUNC.KRS P Bkt}]6. D:ASSKURS.BAS P % ]6. D:DIREKT.KRS*P B4]6. D:BEF1.KRS>P BHku}]6.D:ASSKURS1.TXTRP B\]6.D:ASSKURS2.TXTfP Bp]6.D:ASSKURS3.TXTzPkv} B{]6. D:ADDRESS.TXT|P B}]6.D:VERZWEIG.TXT~P Bf]++0@kw}@S(#Bitte A-SEITE einlegen und >RETURN<b( druecken.f)6. D:MENUE.WSBP% NO*N 4N+kx}@+@@>NQHN]RN +'0@@@A0@@D(d(Bitky}te Clubdiskette einlegen(und nochmal versuchen!\N( >Return<)%0uP:uZ D:SCROLL.OBJDuINPUT A$EuIkz}B:, @+0(SYSTEM ERROR...F(BEI MARKUS MELDENI&Nu-@B:,XuA5%@:7<,,bu3 -k{}@/A%3 lu6-?: Br,u%uOu[ +@'0@A0@@k|}@[0@@@uu-@@0(@ LOADER_2_INFOB-@c(@ zumk}} scrollenu-@uL#(@ rueckwaertsA(@ schnellerL(@u$$(@k~}Π fuers menueu MAQ D:KMENUE.WSBA@==@=k}rs menueu MAQ D:KMENUE.WSBA@==@=h