!!!ACTION! Timer Programming

{{{

; PROGRAM : EASY INTERUPT
    
; 1. KEINE ACTION! PROC BENUTZEN
;    ALSO : KEIN PRINT, U.S.W.

; 2. PARAMETERUEBERGABE MIT NICHT 
;    MEHR ALS 3 BYTES

; 3. KEINE MULTIPLIKATION,DIVISION

; 4. SCHIEBEOPERATION RSH/LSH NUR
;    NOCH BEI BYTE ZAHLEN


BYTE COL4=712,MARGIN=82,CURSOR=752,
     RAINMEM=203,RAINMEM2=[0],
     WAITSYNC=$D40A,HARDCOL1=53271,
     KEYCODE=764,COL2=710,KEY,
     FRAME=[0],Effekt,TIMERSPEED=[1]

CARD TIMER2_COUNTER=538,
     TIMER2_VEKTOR=552

BYTE TIMER2_COUNTER_LO=538 

CARD SCREENADR=88
BYTE POINTER SCREEN 
BYTE MOVEFLAG=[0]

PROC INCCOL()
   
   RAINMEM=RAINMEM2 ; FARBEN FUER 
                    ; RAINBOW EFFEKT
                    ; NEU SETZEN UND
   RAINMEM2==+1     ; WEITERZAEHLEN

  IF FRAME>10 AND FRAME<20 THEN 

    COL4=$20        ; RAHMEN-FLASH
    FRAME==+1 IF FRAME =19 THEN FRAME=0 FI
   ELSE 
    COL4=$10
    FRAME==+1
  FI
; AB HIER BEWEGUNG DES "Balls"

   SCREEN^=0        ; ALTE POSITION 
                    ; LOESCHEN
                      

IF MOVEFLAG=0 THEN    
   SCREEN==+1
   IF SCREEN=SCREENADR+39 THEN MOVEFLAG==+1 FI
FI

IF MOVEFLAG=1 THEN
   SCREEN==+40
   IF SCREEN>SCREENADR+919 THEN MOVEFLAG==+1 FI
FI

IF MOVEFLAG=2 THEN
   SCREEN==-1
   IF SCREEN<SCREENADR+921 THEN MOVEFLAG==+1 FI
FI

IF MOVEFLAG=3 THEN
   SCREEN==-40
   IF SCREEN=SCREENADR THEN MOVEFLAG=0 FI
FI


   SCREEN^=84        ; UND SETZEN

 TIMER2_COUNTER_LO=TIMERSPEED
                     ; COUNTER NEU
                     ; SETZEN, DAMIT
                     ; DER TIMER IM
                     ; NAECHSTEN VBI
                     ; AUCH AUSGE-
                     ; FUEHRT WIRD!
RETURN



PROC INIT_TIMER() 

 TIMER2_COUNTER=0

 TIMER2_VEKTOR=INCCOL

 TIMER2_COUNTER_LO=1
 
RETURN

PROC WAIT_FOR_KEY()
IF EFFEKT=0 THEN
 DO
 WAITSYNC=1 HARDCOL1=RAINMEM
 RAINMEM==+1 
 UNTIL KEYCODE<>255
 OD
ELSE
 DO
 WAITSYNC=1 
 UNTIL KEYCODE<>255
 OD
FI
RETURN

PROC INFO_WINDOW()
 POSITION(2,2)
 MARGIN=2
 PRINTE("----------------------")
 PRINTE("|  der Ball wird im  |")
 PRINTE("|    Timer bewegt    |")
 PRINTE("| ------------------ |")
 PRINTE("|Fuer einfache Timer-|")
 PRINTE("|programmierung  in  |")
 PRINTE("|Action! bitte fol-  |")
 PRINTE("|gendes beachten:    |")
 PRINTE("|                    |")
 PRINTE("|1.Keine Action PROCs|")
 PRINTE("|  benutzen          |")
 PRINTE("|                    |")
 PRINTE("| weiter mit <Return>|")
 PRINTE("----------------------")

WAIT_FOR_KEY() KEYCODE=255

 POSITION(19,1)
 MARGIN=19
 PRINTE("----------------------")
 PRINTE("|Parameteruebergabe|")
 PRINTE("|nur mit maximal 3 |")
 PRINTE("|Byte (oder 1 Card |")
 PRINTE("|und 1 Byte).      |")
 PRINTE("|Intern gesehen    |")
 PRINTE("|werden die 3 Bytes|")
 PRINTE("|in die 6502 Regis-|")
 PRINTE("|ter gespeichert.  |")
 PRINTE("|alle anderen in   |")
 PRINTE("|Zero-Page Register|")
 PRINTE("|Das wuerde aber   |")
 PRINTE("|Konflikte mit dem |")
 PRINTE("|jeweiligen Haupt- |")
 PRINTE("|programm zur Folge|")
 PRINTE("|haben.            |")
 PRINTE("|                  |")
 PRINTE("|weiter mit<Return>|")
 PRINTE("----------------------")
WAIT_FOR_KEY() KEYCODE=255
 POSITION(5,13)
 MARGIN=5 
 PRINTE("------------------------")
 PRINTE("|Keine Multiplikationen|")
 PRINTE("|und Divisionen !!!    |")
 PRINTE("|                      |")
 PRINTE("|  weiter mit <Return> |")
 PRINTE("------------------------")
WAIT_FOR_KEY() KEYCODE=255
 POSITION(21,10)
 MARGIN=21
 PRINTE("----------------")
 PRINTE("|Schieben (RSH |")
 PRINTE("|und LSH) nur  |")
 PRINTE("|noch bei BYTE |")
 PRINTE("|Werten !!!    |")
 PRINTE("|              |")
 PRINTE("|   <Return>   |")
 PRINTE("----------------")
WAIT_FOR_KEY() KEYCODE=255

return

proc newspeed()
 POSITION(12,9)
 MARGIN=12
 PRINTE("----------------")
 PRINTE("|Bitte Neue Ge-|")
 PRINTE("|schwindigkeit |")
 PRINTE("|eingeben.     |")
 PRINTE("|Tasten 1 - 9  |")
 PRINTE("----------------")
WAIT_FOR_KEY() 

 key=getd(1) key==-48

 if key>=1 and KEY<=9 then
    timerspeed=key
    IF KEY>2 THEN EFFEKT=1
     ELSE EFFEKT=0
    FI
 fi 
RETURN

PROC WARMSTART=$E474()
RETURN

proc QUIT()
 POSITION(12,9)
 MARGIN=12
 PRINTE("----------------")
 PRINTE("|QUIT fuehrt   |")
 PRINTE("|Warmstart aus |")
 PRINTE("|(System Reset)|")
 PRINTE("|ausfuehren ?? |")
 PRINTE("|    (J/N)     |")
 PRINTE("----------------")
WAIT_FOR_KEY() 
 IF KEYCODE=1 THEN 
 KEYCODE=255
 WARMSTART() FI
 KEYCODE=255

RETURN


PROC HAUPTPROGRAMM()
 EFFEKT=0
 CLOSE(1) OPEN(1,"K:",4,0)
 GRAPHICS(0) COL2=0

 SCREEN=SCREENADR ;=SCREEN=PEEKC(88)

 INIT_TIMER()
DO
 CURSOR=1
 POSITION(9,7)
 MARGIN=9
 PRINTE("----------------------")
 PRINTE("| Action! User Group |")
 PRINTE("|                    |")
 PRINTE("|   'Easy Timers!'   |")
 PRINTE("|                    |")
 PRINTE("| I>nformation       |")
 PRINTE("| G>eschwindigkeit   |")
 PRINTE("| E>ffekt            |")
 PRINTE("| Q>uit              |")
 PRINTE("----------------------")

 WAIT_FOR_KEY()
 KEY=GETD(1)
 IF KEY='I OR KEY='i THEN INFO_WINDOW() FI
 IF KEY='E OR KEY='e THEN effekt==XOR 255 FI
 IF KEY='G OR KEY='g THEN newspeed() FI
 IF KEY='Q OR KEY='q THEN QUIT() FI
OD
RETURN
}}}