home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Exec 3 / CD_Magazyn_EXEC_nr_3.iso / Recent / game / wb / Klotz.lha / Klotz / src / Klotz.asm < prev    next >
Assembly Source File  |  2000-07-19  |  34KB  |  1,652 lines

  1. *
  2. * $VER: Klotz.asm  2.10 (18.2.98)   - Need for speed
  3. *           2.8    (27.12.97)  - Hard-Coded Randgrößen rausgeschmissen
  4. *           2.6    (1.1.97)    - Hier spielt die Musik
  5. *           2.4    (2.4.96)    - Keyboard ohne Lowlevel
  6. *           2.3    (23.12.95)  - Pausenende
  7. *           2.2    (29.8.95)   - Keyboard mit Lowlevellib
  8. *           2.0    (23.8.95)   - Lowlevel-Support
  9. *           1.90 (25.7.95)   - mehr Farben
  10. *           1.88 (27.2.95)   - "Dynamische Klötze"
  11. *           1.86 (7.2.95)
  12. *           1.84 (27.12.94)  - Keine hüpfende Fenster mehr
  13. *           1.70 (16.10.94)
  14. *    __        1.46 (21.10.93)
  15. *   //_)
  16. *  //__) WARE  Game
  17. *
  18. ; lowlevel.library benutzen ?
  19. USELL    equ    1
  20. ; Soundeffekte ?
  21. USESFX    equ    1
  22. ; BltBitMap Aufrufe ?
  23. NEEDFORSPEED equ 0
  24.     include "exec/types.i"
  25.     include "exec/interrupts.i"
  26.     include "exec/tasks.i"
  27.     include "exec/memory.i"
  28.     include "dos/dos.i"
  29.     include "dos/dosextens.i"
  30.     include "dos/var.i"
  31.     include "graphics/rastport.i"
  32.     include "graphics/displayinfo.i"
  33.     include "workbench/startup.i"
  34.     include "workbench/workbench.i"
  35.     include "mymacros.i"
  36. GZZ macro
  37.     add.w   TSize(a4),d1
  38.     add.w   BSize(a4),d0
  39.     endm
  40. GZZ2 macro
  41.     add.w   TSize(a4),d3
  42.     add.w   BSize(a4),d2
  43.     endm
  44.  
  45.     locinit
  46. *    include "protos.i"   ; debugging
  47.     include "EntryExit.asm"
  48. *   Offsets für globale Datenstruktur
  49.  loc.l DOSBase
  50.  loc.l IntBase
  51.  loc.l GfxBase
  52.  loc.l UtlBase
  53.  ifne USELL
  54.  loc.l     LowLevelBase
  55.  endc
  56.  loc.b     KeyMovL
  57.  loc.b     KeyMovR
  58.  loc.b     KeyMovD
  59.  loc.b     KeyRotL
  60.  loc.b     KeyRotR
  61.  loc.b     KeyPause
  62.  loc.w CLine
  63.  loc.w CPos
  64.  loc.w CLineOld
  65.  loc.w CPosOld
  66.  loc.b IsDrawn
  67.  loc.b CSpin
  68.  loc.b CSpinOld
  69.  loc.b CNXStein
  70.  loc.b SmallFlag
  71.  loc.b IsPause
  72.  loc.b IsOver
  73.  loc.b IsBW        ; 2 Farben
  74.  loc.b IsImage
  75.  loc.b NewHi
  76.  loc.w DropLine
  77.  loc.l CStein
  78.  loc.l CImage        ; Bitmap
  79.  loc.b IsHigh
  80.  loc.b IsSetup
  81.  loc.b IsLace
  82.  loc.b IsColor
  83.  loc.b IsColor7
  84.  loc.b CKey        ; pad-byte (für lowlevel.lib)
  85.  loc.l Colormap
  86.  loc.l Level
  87.  loc.l Lines
  88.  loc.l Score
  89.  loc.l HiScore
  90.  loc.l SelLevel
  91.  loc.l Kisten
  92.  loc.w SteinWidth
  93.  loc.w SteinHeight
  94.  bloc  Pens,7*3+1     ; Vorsicht Offset <125 !
  95.  loc.l ArgPubScreen
  96.  loc.l ArgKeys
  97.  loc.l ArgLaceOn
  98.  loc.l ArgLaceOff
  99.  loc.l ArgUseKeys
  100.  loc.l ArgMono
  101.  loc.l ArgNoSound
  102.  loc.l ArgsGB
  103.  ifne USESFX
  104.  
  105. smp_Data    equ 0  ; l
  106. smp_Length  equ 4  ; l
  107. smp_Period  equ 8  ; w
  108. smp_LEN     equ 10
  109.  
  110.  bloc  smp_bumm,smp_LEN
  111.  bloc  smp_boing,smp_LEN
  112.  bloc  smp_bili,smp_LEN
  113.  bloc  smp_uettel,smp_LEN
  114.  bloc  smp_bang,smp_LEN
  115.  endc
  116. VersionID
  117.     dc.b    "$VER: Klotz 2.10 (18.2.98) by Bware",10,0
  118.     cnop    0,4
  119.     include "ArgumUtils.asm"
  120.  ifne    USESFX
  121.     include "AudioUtils.asm"
  122.  endc
  123.     include "RandUtils.asm"
  124.     include "MathUtils.asm"
  125.     include "Effects.asm"
  126.     include "TimerUtils.asm"
  127.  ifne    USELL
  128.     include "JoyUtilsLL.asm"
  129.  endc
  130.  ifeq    USELL
  131.     include "JoyUtils.asm"
  132.  endc
  133. *    include "DebugUtils.asm"
  134.     include "GfxUtils.asm"
  135.     include "Colors.asm"
  136.     include "Image.asm"
  137.     include "Stein.asm"
  138. main
  139.     lea     DOSName(pc),a1          ; Libs öffnen
  140.     moveq   #37,d0
  141.     CSYS    OpenLibrary
  142.     reloc.l d0,DOSBase
  143.     beq     CleanExitNDOS
  144.     lea     IntName(pc),a1
  145.     moveq   #37,d0
  146.     CALL    OpenLibrary
  147.     reloc.l d0,IntBase
  148.     beq     CleanExitNInt
  149.     lea     GfxName(pc),a1
  150.     moveq   #37,d0
  151.     CALL    OpenLibrary
  152.     reloc.l d0,GfxBase
  153.     beq     CleanExitNGfx
  154.     lea     UtlName(pc),a1
  155.     moveq   #37,d0
  156.     CALL    OpenLibrary
  157.     reloc.l d0,UtlBase
  158.     beq     CleanExitNUtl
  159.  
  160.     copy.l  WBenchMsg,d0
  161.     lea     ArgTemplate(pc),a0
  162.     move.l  a0,d1
  163.     lea     ArgPubScreen(a4),a0
  164.     move.l  a0,d2
  165.     bsr     Argum            CLI & WB - Parsing
  166.  
  167.  ifne USELL
  168.     bsr     InitJoy
  169.     tst.l   d0
  170.     beq     .continue
  171.     pea     ERKlotzOk(pc)
  172.     pea     ERLLibLauft(pc)
  173.     pea     ERKlotzTitel(pc)
  174.     pea     0
  175.     pea     20    ; es_SIZEOF
  176.     move.l  sp,a1
  177.     clra.l  a0
  178.     clra.l  a2
  179.     clra.l  a3
  180.     CINT    EasyRequestArgs
  181.     lea     20(sp),sp
  182.  
  183.     bra     CleanExitNTimer
  184.  endc
  185. .continue
  186.     copy.l  ArgKeys,d0            ; neue Tasten setzen
  187.     beq.b   DefaultKeys
  188.     move.l  d0,a0
  189.     bsr     StrLen
  190.     cmpi.w  #17,d0
  191.     bne.b   DefaultKeys
  192.     lea     KeyMovL(a4),a1
  193.     moveq   #5,d2
  194. KeyLoop
  195.     bsr.b   ConvHex
  196.     move.b  d0,(a1)+
  197.     bmi.b   DefaultKeys
  198.     adda.w  #1,a0
  199.     dbra    d2,KeyLoop
  200.     bra.b   EndKeys
  201. ConvHex
  202. * => a0: Zeichenkette in Hex z.b '4e'
  203. * <= d0: Wert (oder -1)
  204. *    a0: a0+2
  205.     moveq   #0,d1
  206.     bsr.b   ConvNibble
  207.     move.b  d0,d1
  208.     bmi.b   nogood
  209.     lsl.b   #4,d1
  210. ConvNibble
  211.     move.b  (a0)+,d0
  212.     subi.b  #'0',d0
  213.     bmi.b   nogood
  214.     cmpi.b  #9,d0
  215.     bls.b   .ok
  216.     subi.b  #'A'-'0'-10,d0
  217.     bmi.b   nogood
  218.     cmpi.b  #15,d0
  219.     bls.b   .ok
  220.     subi.b  #'a'-'A',d0
  221.     bmi.b   nogood
  222.     cmpi.b  #15,d0
  223.     bgt.b   nogood
  224. .ok
  225.     add.b   d1,d0
  226.     rts
  227. nogood
  228.     moveq   #-1,d0
  229.     rts
  230. DefaultKeys
  231.     reloc.l #$4f4e4d40,KeyMovL
  232.     reloc.w #$4619,KeyRotR
  233. EndKeys
  234. * endc
  235.  ifne USESFX
  236.     bsr     InitAudio
  237.     tst.l   d0
  238.     bne     .noaudio
  239.     tst.l   ArgNoSound(a4)
  240.     bne     .noaudio
  241.     lea     .sfxdir(pc),a0
  242.     move.l  a0,d1
  243.     move.l  #ACCESS_READ,d2
  244.     CDOS    Lock
  245.     move.l  d0,d1
  246.     beq     .noaudio
  247.     CALL    CurrentDir
  248.     move.l  d0,d2
  249.     lea     LoadSample(pc),a5
  250.     lea     smp_bumm(a4),a1
  251.     lea     .bumm(pc),a0
  252.     jsr     (a5)                ;bsr     LoadSample
  253.     lea     smp_boing(a4),a1
  254.     lea     .boing(pc),a0
  255.     jsr     (a5)                ;bsr     LoadSample
  256.     lea     smp_bili(a4),a1
  257.     lea     .bili(pc),a0
  258.     jsr     (a5)                ;bsr     LoadSample
  259.     lea     smp_uettel(a4),a1
  260.     lea     .uettel(pc),a0
  261.     jsr     (a5)                ;bsr     LoadSample
  262.     lea     smp_bang(a4),a1
  263.     lea     .bang(pc),a0
  264.     jsr     (a5)                ;bsr     LoadSample
  265.     move.l  d2,d1
  266.     CALL    CurrentDir
  267.     move.l  d0,d1
  268.     CALL    UnLock
  269.     bra     .noaudio
  270. .sfxdir dc.b 'PROGDIR:sfx',0
  271. .bumm    dc.b 'Drop',0
  272. .boing    dc.b 'OneLine',0
  273. .bili    dc.b 'GameOver',0
  274. .uettel dc.b 'SpeedUp',0
  275. .bang    dc.b 'FourLines',0
  276.     even
  277. .noaudio
  278.  endc
  279.     bsr     InitTimer
  280.     bne     CleanExitNTimer
  281.     bsr     WindowOpen
  282.     bsr     InitFeld
  283.  
  284.     copy.l  WBenchMsg,d0
  285.     bsr     ArgumFree
  286.     bsr     GetHi
  287.     copy.l  CRastPort,a1
  288.     bsr     ScoresOut
  289.  
  290.     bsr     Randomize
  291.     moveq   #6,d0            ; Ersten Stein
  292.     bsr     RangeRand
  293. *    moveq   #0,d0
  294.     reloc.b d0,CNXStein
  295.  
  296.     move.l  #10000,d0            ; Timer an
  297.     bsr     StartTimer
  298.  
  299.     bsr     DrawSetUp
  300.     on.b    IsPause
  301.     on.b    IsSetup
  302.  
  303. waitloop
  304.     copy.l  CWindow,a2
  305.     move.l  wd_UserPort(a2),a0
  306.     moveq   #0,d1
  307.     move.b  MP_SIGBIT(a0),d1
  308.     moveq   #1,d0
  309.     lsl.l   d1,d0
  310.  ifne    USESFX
  311.     copy.l  AudioPort,a0        ; auf Sound-Ende warten
  312.     move.b  MP_SIGBIT(a0),d1
  313.     moveq   #1,d2
  314.     lsl.l   d1,d2
  315.     or.l    d2,d0
  316.  endc
  317.     or.l    WUMsk(a4),d0                ; auf UserPort- & meine Signale warten
  318.     or.l    #SIGBREAKF_CTRL_C,d0    ; und auf Break
  319.  
  320.     CSYS    Wait
  321.  ifne    USESFX
  322.     and.l   d0,d2            ; Sound ist am Ende
  323.     beq.s   .skip
  324.     bsr     FreeAudio
  325. .skip
  326.  endc
  327.     btst    #SIGBREAKB_CTRL_C,d0    ; CTRL-C bearbeiten
  328.     bne     cleanup
  329.  
  330.     move.l  d0,d4
  331.     move.l  wd_UserPort(a2),a0
  332.     CALL    GetMsg
  333.     tst.l   d0                ; Signal
  334.     beq.s   waitchain1            ; ist von mir
  335.     move.l  d0,a1
  336.     pea     waitloop(pc)
  337.     bra     ProcessIDCMP        ; Intui-message abarbeiten
  338.  
  339. waitchain1
  340.     tst.b   IsPause(a4)
  341.     bne     pausedGame
  342.  
  343.     move.l  d4,d0
  344.     and.l   WUMoveMsk(a4),d0
  345.     beq.s   waitchain3
  346.  
  347.     copy.b  QDrop,d0            ; Schneller Fall ?
  348.     beq.s   .NoDrop
  349.     tst.w   DropLine(a4)
  350.     bne.s   .DropWeiter
  351.     copy.w  CLine,DropLine(a4)          ; Dann aktuelle Zeile speichern
  352. .DropWeiter
  353.     bra.s    DropDown             ; und plumps ...
  354. .NoDrop
  355.     moveq   #0,d5
  356.     off.w   DropLine            ; Sonst Zusatzpunkte löschen
  357.     copy.w  StickX,d5            ; Bewegung ist ...
  358.     tst.w   d5
  359.     beq.s   waitchain3
  360.     add.w   CPos(a4),d5
  361.     move.w  d5,d0
  362.     copy.l  CStein,a0
  363.     copy.w  CLine,d1
  364.     copy.b  CSpin,d2
  365.     bsr     CheckPosMove
  366.     tst.b   d0
  367.     bmi.s   .outofBounds
  368.  
  369.     bsr     DeleteStein         ; ... möglich, Stein löschen
  370.     reloc.w d5,CPos            ; Neue Position setzen
  371. *    bsr     DrawStein             ; und Stein zeichnen (erst später)
  372.  
  373. .outofBounds
  374. ;    bra     waitchain3          ; Auf Drehung überprüfen
  375. waitchain3
  376.     move.l  d4,d0
  377.     and.l   WUSpinMsk(a4),d0
  378.     beq.s   waitchain2
  379.  
  380.     on.b    FirePressed         Flag für Interrupt
  381.  
  382.     copy.w  Fire,d3
  383.     tst.w   d3
  384. ;    beq     waitback
  385.     beq.s   waitchain2            Wenn Feuer ...
  386.     off.w   DropLine
  387.     copy.b  CSpin,d2
  388.     add.w   d3,d2            Stein drehen
  389.     moveq   #3,d3
  390.     and.b   d3,d2
  391.     move.b  d2,d5
  392.     copy.l  CStein,a0
  393.     copy.w  CLine,d1
  394.     copy.w  CPos,d0
  395.     bsr     CheckPosMove        Paßt noch ?
  396.     bmi.s   .outofBounds
  397.     bsr     DeleteStein
  398.     reloc.b d5,CSpin
  399. *    bsr     DrawStein
  400. .outofBounds
  401. * mehr Signale gibt es (noch) nicht
  402. ;waitchain4
  403. ;    bra     waitloop
  404. ;    bra     waitback
  405.  
  406. waitchain2
  407.     move.l  d4,d0
  408.     and.l   WUTimeMsk(a4),d0
  409.     beq     waitndraw               ; Zeit abgelaufen ?
  410.  
  411.     off.w   DropLine
  412. DropDown
  413.     copy.w  CLine,d1            ; Schauen, ob Stein noch paßt.
  414.     subq.w  #1,d1
  415.     copy.w  CPos,d0
  416.     copy.l  CStein,a0
  417.     copy.b  CSpin,d2
  418.     bsr     CheckPosDrop
  419.     tst.b   d0
  420.     bmi.s   xBottom            ; Wenn nicht, dann verzweigen.
  421.  
  422.     bsr     DeleteStein         ; Stein löschen
  423.  
  424.     subq.w  #1,CLine(a4)                ; und tiefer setzen
  425. waitndraw
  426.     tst.b   IsDrawn(a4)
  427. *    bne.s   .skip
  428.     bsr     DrawStein
  429. *.skip
  430.     bra     waitloop            ; zurück zum Wait
  431. xBottom
  432.     bsr     DrawStein            ; Zeichnen, da Feld möglicherweise schon besetzt ( für letzten Stein)
  433.  
  434.  ifne USESFX
  435.     lea     smp_bumm(a4),a0
  436.     bsr     PlayAudio
  437.  endc
  438.     copy.w  CLine,d1            ; Wenn's nicht weiter geht
  439.     copy.w  CPos,d0
  440.     copy.l  CStein,a0
  441.     copy.b  CSpin,d2
  442.     bsr     SetFeld            ; Stein ins Merkfeld eintragen
  443.     bsr     CheckLines            ; Gibt's 'ne volle Linie ?
  444.     tst.b   d0
  445.     bpl.s   .cont            ; negativ => Stein in Zeile 19
  446.  
  447.     bsr     GameOver
  448.     bra     waitloop
  449. .cont
  450.  ifne USESFX
  451.     tst.b   d0
  452.     beq.s   .cont3
  453.     push    d0-d1/a0-a1
  454.     subq.w  #4,d0
  455.     beq.s   .tetris
  456.     lea     smp_boing(a4),a0
  457.     bra.s   .cont2
  458. .tetris
  459.     lea     smp_bang(a4),a0
  460. .cont2
  461.     bsr     PlayAudio
  462.     pop     d0-d1/a0-a1
  463. .cont3
  464.  endc
  465.     push    a1/d1
  466.     copy.w  DropLine,d1
  467.     bsr     CalcScores            ; Neue Punktzahl
  468.     copy.l  CRastPort,a1
  469.     bsr     ScoresOut
  470.     off.w   DropLine
  471.     pop     a1/d1
  472.     tst.b   d0                ; Keine Linie ?
  473.     beq.s   Bottom2
  474.  
  475.     bsr     HiLiteLines         ; Volle Zeile aufblinken lassen
  476.     push    d0-d1/a0-a1
  477.     moveq   #8,d1
  478.     CDOS    Delay
  479.     pop     d0-d1/a0-a1
  480.     bsr     HiLiteLines
  481.     push    d0-d1/a0-a1
  482.     moveq   #8,d1
  483.     CDOS    Delay
  484.     pop     d0-d1/a0-a1
  485.     bsr     HiLiteLines
  486.     push    d0-d1/a0-a1
  487.     moveq   #8,d1
  488.     CDOS    Delay
  489.     pop     d0-d1/a0-a1
  490.     bsr     HiLiteLines
  491. Bottom3                 ; Einsprung mit Löschen
  492.     bsr     AufbauFeld            ; Spielfeld neu zeichnen
  493. Bottom2                 ; Einsprung für neues Spiel
  494. *    off.b   IsDrawn             ; Neuen Stein vorbereiten
  495.     off.w   DropLine
  496.     reloc.w #19,CLine
  497.     reloc.w #4,CPos
  498.     clr.b   CSpin(a4)
  499.     moveq   #6,d0
  500.     bsr     RangeRand
  501. *    moveq   #0,d0
  502.  
  503.     copy.b  CNXStein,d1
  504.     reloc.b d0,CNXStein
  505. *    cmp.b   d1,d0             ; Wenn nächster Stein genauso
  506. *    bne     .nonewseed
  507. *    bsr     Randomize             ; dann mal neuen Zufall
  508. *.nonewseed
  509.     copy.b  SmallFlag,d4
  510.     bne.s   .issmall
  511.  
  512.     bsr     GetSteinAdr         ; Next zeichnen bei großem Fenster
  513.     bsr     SetNXStein
  514. .issmall
  515.     off.b   IsImage
  516.     move.b  d1,d0
  517.     bsr     GetSteinAdr
  518.     reloc.l d0,CStein
  519.     addq.l  #4,Kisten(a4)
  520.     moveq   #5,d0            ; Schaun'mer'mal ob GameOver
  521.     moveq   #18,d1
  522.     bsr     GetFeld
  523.     beq.s   waitback
  524.  
  525.     bsr     GameOver
  526. waitback
  527.     bra     waitloop
  528. DrawStein
  529. *
  530. *
  531.     tst.b   IsDrawn(a4)
  532.     bne.s   .skip
  533.     CGFX    WaitTOF            ; Synchonisieren
  534.     copy.w  CLineOld,d1
  535.     copy.w  CPosOld,d0
  536.     copy.b  CSpinOld,d2
  537.     copy.l  CStein,a0
  538.     bsr     ClearStein
  539. .skip
  540.     copy.w  CLine,d1
  541.     copy.w  CPos,d0
  542.     copy.b  CSpin,d2
  543.     copy.l  CStein,a0
  544.     bsr     SetStein
  545.     on.b    IsDrawn
  546.     rts
  547. DeleteStein
  548. *
  549. *
  550.     tst.b   IsDrawn(a4)
  551.     beq     .noimg
  552. *    copy.w  CLine,d1
  553. *    copy.w  CPos,d0
  554. *    copy.b  CSpin,d2
  555.     copy.l  CStein,a0
  556. *    bsr     ClearStein
  557.     copy.w   CLine,CLineOld(a4)
  558.     copy.w   CPos,CPosOld(a4)
  559.     copy.b   CSpin,CSpinOld(a4)
  560.     off.b   IsDrawn
  561. .noimg
  562.     rts
  563. pausedGame
  564. *
  565. *   =>       d4  :   SigMask
  566. *
  567.  
  568.     tst.b   IsSetup(a4)
  569.     bne     DoSetUp            Ins Setup-Menü verzweigen
  570.  
  571.     tst.b   IsOver(a4)
  572.     bne.s   .skipthis
  573.     push    a0-a2/a6/d0/d1
  574.     copy.l  CWindow,a0
  575.     lea     KlotzPaused(pc),a1
  576.     moveq   #-1,d0
  577.     move.l  d0,a2
  578.     CINT    SetWindowTitles
  579.     pop     a0-a2/a6/d0/d1
  580. .skipthis
  581.     move.l  d4,d0
  582.     and.l   WUSpinMsk(a4),d0
  583.     beq.s   .ende
  584.  
  585.     on.b    FirePressed
  586.  
  587.     copy.w  Fire,d0
  588.     beq.s   .ende
  589.     tst.b   IsOver(a4)                  Feuer und GameOver:
  590.     beq.s   .pauseende
  591.     moveq   #1,d0
  592.     moveq   #1,d1
  593.     bsr     GetFeld
  594.     moveq   #94,d0    ; 19 * 10/2 -1
  595. .loop
  596.     clr.w   (a0)+                       Spielfeld löschen
  597.     dbra    d0,.loop
  598.     off.b   IsOver
  599.     off.b   IsHigh
  600.     on.b    IsSetup
  601.     bsr     DrawSetUp            Setup-Menü aufbauen
  602. .weiter
  603.     bra     Bottom2
  604. .pauseende
  605.     push    a0-a2/a6/d0/d1
  606.     copy.l  CWindow,a0
  607.     lea     Klotz(pc),a1
  608.     moveq   #-1,d0
  609.     move.l  d0,a2
  610.     CINT    SetWindowTitles
  611.     pop     a0-a2/a6/d0/d1
  612.  
  613.     off.b   IsPause
  614.     tst.b   IsHigh(a4)     Feld ist vielleicht HiLighted ?
  615.     beq.s   .nofx
  616.     bsr.s   .dofx
  617.     off.b   IsHigh
  618.     bra.s   .nofx
  619. .ende
  620.     tst.b   IsOver(a4)          ; Blinken nur bei GameOver ._  ab Level 9 wird's
  621.     beq.s   .nofx        ;               /   sonst zu schnell
  622.     and.l   WUTimeMsk(a4),d4
  623.     beq.s   .nofx
  624.     tst.b   IsHigh(a4)
  625.     seq     IsHigh(a4)
  626.     bsr.s   .dofx
  627. .nofx
  628.     bra     waitback
  629. .dofx
  630. *   Kleiner Effekt - Invertiert gesamte Spielfläche
  631.     moveq   #8,d1
  632.     swap    d1
  633.     subq.l  #2,d1    Bit 1 bis 18 setzen
  634.     bra     HiLiteLines
  635.  
  636. ADDLACE     equ 68    ; Text-Offset für Interlace
  637. GameOver
  638. *    Text anzeigen ( vielleicht Effekte ?)
  639. *
  640.  ifne USESFX
  641.     lea     smp_bili(a4),a0
  642.     bsr     PlayAudio
  643.  endc
  644.     on.b    IsPause
  645.     on.b    IsOver
  646.     off.l   Level
  647.     off.l   Lines
  648.     off.l   Score
  649.     off.l   Kisten        ; Steine draußen
  650.     subq.l  #4,Kisten(a4)       ; Next bleibt erhalten ? Pfusch!
  651.     copy.l  CRastPort,a1
  652.     moveq   #GrauBlauKLOTZ,d2
  653.     bsr     DoRNDFX
  654.  
  655.     move.l  a1,a2        ; Game Over Text
  656.     moveq   #RP_JAM1,d0     ; mit Schatten
  657.     CGFX    SetDrMd
  658.     moveq   #0,d0
  659.     move.l  a2,a1
  660.     CALL    SetAPen
  661.     move.l  a2,a1
  662.     moveq   #51,d0
  663.     moveq   #74,d1
  664. *    add.l   TSize(a4),d1
  665.     GZZ
  666.     tst.b   IsLace(a4)
  667.     beq.s   .nolace3
  668.     addi.w  #ADDLACE,d1
  669. .nolace3
  670.     CALL    Move
  671.     lea     GOTxt1(pc),a0
  672.     bsr     StrLen
  673.     move.l  a2,a1
  674.     CALL    Text
  675.     move.l  a2,a1
  676.     moveq   #27,d0
  677.     moveq   #90,d1
  678. *    add.l   TSize(a4),d1
  679.     GZZ
  680.     tst.b   IsLace(a4)
  681.     beq.s   .nolace4
  682.     addi.w  #ADDLACE,d1
  683. .nolace4
  684.     CALL    Move
  685.     lea     GOTxt2(pc),a0
  686.     bsr     StrLen
  687.     move.l  a2,a1
  688.     CALL    Text
  689.     move.l  a2,a1
  690.     moveq   #47,d0
  691.     moveq   #74,d1
  692. *    add.l   TSize(a4),d1
  693.     GZZ
  694.     tst.b   IsLace(a4)
  695.     beq.s   .nolace5
  696.     addi.w  #ADDLACE,d1
  697. .nolace5
  698.     CALL    Move
  699.     lea     GOTxt1(pc),a0
  700.     bsr     StrLen
  701.     move.l  a2,a1
  702.     CALL    Text
  703.     move.l  a2,a1
  704.  
  705.     moveq   #23,d0
  706.     moveq   #90,d1
  707. *    add.l   TSize(a4),d1
  708.     GZZ
  709.     tst.b   IsLace(a4)
  710.     beq.s   .nolace6
  711.     addi.w  #ADDLACE,d1
  712. .nolace6
  713.     CALL    Move
  714.     lea     GOTxt2(pc),a0
  715.     bsr     StrLen
  716.     move.l  a2,a1
  717.     CALL    Text
  718.  
  719.     moveq   #2,d0
  720.     move.l  a2,a1
  721.     CALL    SetAPen
  722.     move.l  a2,a1
  723.     moveq   #49,d0
  724.     moveq   #74,d1
  725. *    add.l   TSize(a4),d1
  726.     GZZ
  727.     tst.b   IsLace(a4)
  728.     beq.s   .nolace
  729.     addi.w  #ADDLACE,d1
  730. .nolace
  731.     CALL    Move
  732.     lea     GOTxt1(pc),a0
  733.     bsr     StrLen
  734.     move.l  a2,a1
  735.     CALL    Text
  736.     move.l  a2,a1
  737.     moveq   #25,d0
  738.     moveq   #90,d1
  739. *    add.l   TSize(a4),d1
  740.     GZZ
  741.     tst.b   IsLace(a4)
  742.     beq.s   .nolace2
  743.     addi.w  #ADDLACE,d1
  744. .nolace2
  745.     CALL    Move
  746.     lea     GOTxt2(pc),a0
  747.     bsr     StrLen
  748.     move.l  a2,a1
  749.     CALL    Text
  750.  
  751.     move.l  a2,a1
  752.     moveq   #RP_JAM2,d0
  753.     CALL    SetDrMd
  754.     rts
  755. DrawSetUp
  756. *
  757. *   Zeichne Select-Level
  758. *
  759.     push    all
  760.     copy.l  CRastPort,a2
  761.     moveq   #10,d0
  762.     moveq   #4,d1
  763.     moveq   #85,d2
  764.     add.w   d2,d2
  765.     subq.w  #1,d2
  766.     moveq   #70,d3
  767.     add.w   d3,d3
  768.     addq.w  #7,d3
  769.     moveq   #2,d4
  770. *    copy.l  TSize,d5
  771. *    add.l   d5,d1
  772.     moveq   #0,d5
  773.     GZZ
  774.     GZZ2
  775.     tst.b   IsLace(a4)
  776.     beq.s   .nolace
  777.     addi.w  #144,d5
  778. .nolace
  779.     add.l   d5,d3
  780.     move.l  a2,a1
  781.     bsr     PunkteMuster
  782.     moveq   #74,d0
  783.     moveq   #36,d1
  784.     moveq   #105,d2
  785.     moveq   #115,d3
  786.     moveq   #BOX_HILIGHT,d4
  787. *    add.l   TSize(a4),d1
  788. *    add.l   TSize(a4),d3
  789.     GZZ
  790.     GZZ2
  791.     move.l  a2,a1
  792.     bsr     OSzweinullBorder
  793.     moveq   #0,d0
  794. *    copy.l  TSize,d1
  795.     moveq   #0,d1
  796.     GZZ
  797.     move.l  d1,d2
  798.     andi.l  #1,d2        ; Imagepunktemuster soll
  799.     add.l   d2,d1        ; mit Hintergrundmuster übereinstimmen
  800.     move.l  a2,a0
  801.     lea     LogoImage(pc),a1
  802.     CINT    DrawImage
  803.     moveq   #42,d0
  804.     moveq   #24,d1
  805. *    add.l   TSize(a4),d1
  806.     GZZ
  807.     move.l  a2,a1
  808.     CGFX    Move
  809.     moveq   #1,d0
  810.     move.l  a2,a1
  811.     CALL    SetAPen
  812.     moveq   #RP_JAM1,d0
  813.     move.l  a2,a1
  814.     CALL    SetDrMd
  815.     lea     SelectTxt(pc),a0
  816.     bsr     StrLen
  817.     move.l  a2,a1
  818.     CALL    Text
  819.  
  820.     moveq   #0,d4
  821. .textloop
  822.     moveq   #86,d0
  823.     moveq   #42,d1
  824.     move.w  d4,d2
  825.     lsl.w   #3,d2
  826.     add.w   d2,d1
  827. *    add.l   TSize(a4),d1
  828.     GZZ
  829.     move.l  a2,a1
  830.     CALL    Move
  831.     lea     Buffer(a4),a0
  832.     move.w  d4,d2
  833.     addi.b  #'0',d2                 Levelnummer
  834.     move.b  d2,(a0)
  835.     moveq   #1,d0
  836.     move.l  a2,a1
  837.     CALL    Text
  838.     addq.b  #1,d4
  839.     cmpi.b  #10,d4
  840.     blt.s   .textloop
  841.     moveq   #RP_JAM2,d0
  842.     move.l  a2,a1
  843.     CALL    SetDrMd
  844.     bsr     Light
  845.     on.b    IsHigh
  846.     pop     all
  847.     rts
  848. DoSetUp
  849. *   Levelauswahl
  850. *
  851. *   =>     d4  : SigMask
  852.  
  853.     push    a0-a2/a6/d0/d1
  854.     copy.l  CWindow,a0
  855.     lea     Klotz(pc),a1
  856.     moveq   #-1,d0
  857.     move.l  d0,a2
  858.     CINT    SetWindowTitles
  859.     pop     a0-a2/a6/d0/d1
  860.  
  861.     move.l  d4,d0
  862.     and.l   WUSpinMsk(a4),d0
  863.     beq     .keinFeuer
  864.     tst.b   IsHigh(a4)
  865.     beq     .normal
  866.     bsr     Light
  867.     off.b   IsHigh
  868. .normal
  869.     reloc.l SelLevel(a4),Level
  870.     bsr     AufbauFeld
  871.     off.b   IsSetup
  872.     off.b   IsPause
  873.     tst.b   SmallFlag(a4)
  874.     bne     .weiter
  875.     copy.l  CRastPort,a1
  876.     move.l  a1,a2
  877.     moveq   #-1,d0
  878.     bsr     ReDraw
  879.     move.l  a2,a1
  880.     bsr     ScoresOut
  881. .weiter
  882.     bra     Bottom3        ; Feld löschen
  883. .keinFeuer
  884.     move.l  d4,d0
  885.     and.l   WUMoveMsk(a4),d0
  886.     beq     .keinDrop
  887.     copy.b  QDrop,d0
  888.     beq     .keinDrop
  889.     tst.b   IsHigh(a4)
  890.     beq     .normal2
  891.     bsr     Light
  892.     off.b   IsHigh
  893. .normal2
  894.     copy.l  SelLevel,d0
  895.     addq.b  #1,d0
  896.     cmpi.b  #10,d0        ; Nach Level 9 wieder Level 0
  897.     blt     .inordnung
  898.     moveq   #0,d0
  899. .inordnung
  900.     reloc.l d0,SelLevel
  901.     bsr     Light
  902.     on.b    IsHigh
  903. .keinDrop
  904. .zurueck
  905.     bra     waitloop
  906.     xref    LogoData
  907. Light
  908. *   Invertieren
  909.     moveq   #74,d0
  910.     copy.l  SelLevel,d1
  911.     lsl.w   #3,d1
  912.     addi.b  #36,d1
  913. *    add.l   TSize(a4),d1
  914.     GZZ
  915.     move.w  d0,d2
  916.     addi.b  #31,d2
  917.     move.w  d1,d3
  918.     addi.b  #7,d3
  919.     copy.l  CRastPort,a1
  920.     bra     InvertBox
  921.  
  922. cleanup
  923.     bsr     StopTimer
  924.  ifne USELL
  925.     bsr     ExitJoy
  926.  endc
  927.     bsr     WindowClose
  928.  ifne USESFX
  929.     bsr     ExitAudio
  930.  endc
  931. *    bsr     CleanUpFeld
  932. CleanExit
  933.     bsr     ExitTimer
  934. CleanExitNTimer
  935.     copy.l  UtlBase,a1
  936.     CSYS    CloseLibrary
  937. CleanExitNUtl
  938.     copy.l  GfxBase,a1
  939.     CSYS    CloseLibrary
  940. CleanExitNGfx
  941.     copy.l  IntBase,a1
  942.     CSYS    CloseLibrary
  943. CleanExitNInt
  944.     copy.l  DOSBase,a1
  945.     CSYS    CloseLibrary
  946. CleanExitNDOS
  947.     moveq   #0,d0
  948.     bra     exit
  949.  
  950. ProcessIDCMP
  951. *  Nachrichten- Auswertung
  952. *  => a1 : IntuiMessage
  953. *  => a2 : Window
  954. *  => a6 : ExecBase
  955.  
  956.     move.l  im_Class(a1),d3
  957.     move.w  im_Code(a1),d4
  958.     CALL    ReplyMsg
  959. * ifeq USELL
  960. *    cmpi.l  #IDCMP_RAWKEY,d3
  961. *    bne     .skipthis
  962. *    reloc.b d4,CKey
  963. *.skipthis
  964. * endc
  965.     cmpi.l  #IDCMP_CLOSEWINDOW,d3
  966.     beq     cleanup
  967.     cmpi.l  #IDCMP_ACTIVEWINDOW,d3
  968.     bne     .continue
  969.  IFEQ    USELL
  970.     on.b    IsPause   ; Pause bei Aktivierung des Fensters
  971.  ENDC
  972.     rts
  973. .continue
  974.     cmpi.l  #IDCMP_CHANGEWINDOW,d3
  975.     bne     .noredraw2            ; und tschüß
  976. *    büschen rumfensterln - von wegen Zoom und so ...
  977.     cmpi.w  #245,wd_Width(a2)
  978.     bls     .noredraw
  979.     copy.b  SmallFlag,d0
  980.     beq     .noredraw2
  981.     off.b   SmallFlag
  982.     move.l  wd_RPort(a2),a1
  983.     move.l  a1,a2
  984.     moveq   #-1,d0
  985.     bsr     ReDraw
  986.     move.l  a2,a1
  987.     bsr     ScoresOut
  988.     bra     .noredraw2
  989. .noredraw
  990.     on.b    SmallFlag
  991. .noredraw2
  992.     rts
  993.  
  994. WindowOpen
  995. *
  996. *   Öffne Spielfeldfenster
  997. *
  998. *   <=     d0 : Window
  999. *
  1000.     push    a5-a6
  1001.  
  1002.     bsr     FetchPubScreen
  1003.     tst.l   d0
  1004.     beq     CleanExit
  1005.     move.l  d0,a0
  1006.     move.w  sc_Height(a0),d1
  1007.     cmpi.w  #300,d1        Ist Bildschirm groß genug ?
  1008.     bge.s   .big
  1009.     off.b   IsLace
  1010.     bra.s   .endif
  1011. .big
  1012.     copy.l  ArgLaceOn,d1
  1013.     beq.s   .checknolace
  1014.     on.b    IsLace
  1015.     bra.s   .endif
  1016. .checknolace
  1017.     copy.l  ArgLaceOff,d1
  1018.     beq.s   .autosense
  1019.     off.b    IsLace
  1020.     bra.s   .endif
  1021. .autosense
  1022.     bsr     FetchLace        Ist Bildschirm mit Zeilensprung ?
  1023. .endif
  1024.     move.l  d0,a5
  1025.     move.l  sc_Font(a5),a0
  1026.     moveq   #0,d0
  1027.     move.w  ta_YSize(a0),d0
  1028.     add.b   sc_WBorTop(a5),d0
  1029.     add.b   sc_WBorBottom(a5),d0
  1030. *    reloc.l d0,TSize
  1031.     lea     WindowTags,a1
  1032.     tst.b   IsLace(a4)
  1033.     beq     .nolace
  1034.     addi.w  #144,d0        Für LACE darfs noch etwas mehr sein
  1035.     addi.l  #144,28(a1)           ; Titelleistenhöhe
  1036. .nolace
  1037.     lea     ZoomPos,a0        ; Alternate position
  1038.     add.w   d0,6(a0)
  1039.     moveq   #0,d0
  1040.     move.b  sc_WBorLeft(a5),d0
  1041.     add.b   sc_WBorLeft(a5),d0
  1042.     add.w   d0,4(a0)
  1043.  
  1044. * Fenster zentrieren
  1045.     move.w  sc_Width(a5),d0
  1046.     subi.w  #254,d0
  1047.     asr.l   #1,d0
  1048.     bmi.s   .ohnonegx
  1049.     move.l  d0,4(a1)            ; Left
  1050. .ohnonegx
  1051.     move.w  sc_Height(a5),d0
  1052.     sub.l   28(a1),d0
  1053.     asr.l   #1,d0
  1054.     bmi.s   .ohnonegy
  1055.     move.l  d0,12(a1)            ; Right
  1056. .ohnonegy
  1057.     tst.l   ArgUseKeys(a4)       ; Falls Tasteneingabe, Fenster aktivieren
  1058.     beq.s   .noactwin
  1059.     ori.l   #WFLG_ACTIVATE,60(a1)
  1060. .noactwin
  1061.     clra.l  a0
  1062.     move.l  a5,68(a1)           ; PubScreen
  1063.     CINT    OpenWindowTagList
  1064.     reloc.l d0,CWindow
  1065.     beq     CleanExit
  1066. .isok
  1067.     move.l  d0,a1
  1068.     moveq   #0,d1
  1069.     move.b  wd_BorderTop(a1),d1
  1070.     subq.w  #1,d1
  1071.     reloc.w d1,TSize
  1072.     move.b  wd_BorderLeft(a1),d1
  1073.     subq.w  #4,d1
  1074.     reloc.w d1,BSize
  1075.  
  1076.     reloc.w #16,SteinWidth
  1077.     tst.b   IsLace(a4)
  1078.     beq.s   .nolace3
  1079.     reloc.w #16,SteinHeight
  1080.     bra.s   .endiff
  1081. .nolace3
  1082.     reloc.w #8,SteinHeight
  1083. .endiff
  1084.     off.b   IsColor
  1085.     tst.l   ArgMono(a4)
  1086.     bne.s   .skip
  1087.     move.l  a5,a1
  1088.     bsr     GetPens
  1089. .skip
  1090.     clra.l  a0
  1091.     move.l  a5,a1
  1092.     CALL    UnlockPubScreen
  1093.     copy.l  CWindow,a5
  1094.     move.l  wd_RPort(a5),a1
  1095.     reloc.l a1,CRastPort
  1096.     move.l  rp_BitMap(a1),a0
  1097.     cmp.b   #1,bm_Depth(a0)     Test auf 2-Farben Screen
  1098.     seq     IsBW(a4)
  1099.     ifne    NEEDFORSPEED
  1100.     moveq   #32,d0        ; Blit - Bitmap initialisieren
  1101.     moveq   #32,d1
  1102.     moveq   #8,d2
  1103.     moveq   #0,d3
  1104.     CGFX    AllocBitMap
  1105.     reloc.l d0,CImage
  1106.     copy.l  CRastPort,a1
  1107.     endc
  1108.     reloc.l rp_Font(a1),OFont
  1109.     lea     TxAttr(pc),a0
  1110.     CGFX    OpenFont
  1111.     reloc.l d0,CFont
  1112.     move.l  d0,a0
  1113.     copy.l  CRastPort,a1
  1114.     CALL    SetFont
  1115.     tst.b   IsLace(a4)
  1116.     beq.s   .nolace2
  1117.     lea     Borders,a0
  1118.     addi.w  #144,6(a0)
  1119.     lea     NXBorders,a0
  1120.     addi.w  #32,6(a0)
  1121. .nolace2
  1122.     moveq   #0,d0
  1123.     copy.l  CRastPort,a1
  1124.     bsr     ReDraw
  1125.     move.l  a5,d0
  1126.     pop     a5/a6
  1127.     rts
  1128. ReDraw
  1129. *   Zeichnet Boxen und Texte
  1130. *
  1131. *   =>     a1  : RastPort
  1132. *     d0  : NoFullRedrawFlag
  1133.     push    a2-a3/d2-d6
  1134.     move.l  a1,a2
  1135.     tst.l   d0
  1136.     bne     .nofullredraw
  1137.     st        d5
  1138.     moveq   #4,d0
  1139.     bra     .redrawweiter
  1140. .nofullredraw
  1141.     sf        d5
  1142.     moveq   #88,d0
  1143.     add.l   d0,d0
  1144. .redrawweiter
  1145.     moveq   #1,d1
  1146.     moveq   #124,d2
  1147.     add.l   d2,d2
  1148.     addq.l  #1,d2
  1149.     moveq   #75,d3
  1150.     add.l   d3,d3
  1151.     moveq   #2,d4
  1152. *    copy.l  TSize,d6
  1153. *    add.l   d6,d1
  1154.     moveq   #0,d6
  1155.     GZZ
  1156.     GZZ2
  1157.     tst.b   IsLace(a4)
  1158.     beq     .nolace
  1159.     addi.w  #144,d6
  1160. .nolace
  1161.     add.l   d6,d3
  1162.     bsr     PunkteMuster
  1163.     lea     Borders,a3
  1164.     tst.b   d5
  1165.     bne     .borderloop
  1166.     lea     8(a3),a3
  1167. .borderloop
  1168.     move.w  (a3)+,d0
  1169.     bmi     .unloop
  1170.     move.w  (a3)+,d1
  1171.     move.w  (a3)+,d2
  1172.     move.w  (a3)+,d3
  1173.     moveq   #BOX_HILIGHT,d4
  1174.     move.l  a2,a1
  1175. *    add.l   TSize(a4),d1
  1176. *    add.l   TSize(a4),d3
  1177.     GZZ
  1178.     GZZ2
  1179.     bsr     OSzweinullBorder
  1180.     bra     .borderloop
  1181. .unloop
  1182.     moveq   #1,d0
  1183.     move.l  a2,a1
  1184.     CGFX    SetAPen
  1185.     moveq   #RP_JAM1,d0
  1186.     move.l  a2,a1
  1187.     CALL    SetDrMd
  1188.     lea     Texte(pc),a3
  1189. .textloop
  1190.     move.w  (a3)+,d0
  1191.     bmi     .exitloop
  1192.     move.w  (a3)+,d1
  1193.     move.l  a2,a1
  1194. *    add.l   TSize(a4),d1
  1195.     GZZ
  1196.     CALL    Move
  1197.     move.l  a3,a0
  1198.     bsr     StrLen
  1199.     move.l  a2,a1
  1200.     CALL    Text
  1201.     lea     8(a3),a3
  1202.     bra     .textloop
  1203. .exitloop
  1204.     moveq   #RP_JAM2,d0
  1205.     move.l  a2,a1
  1206.     CALL    SetDrMd
  1207. .exit
  1208.     pop     a2-a3/d2-d6
  1209.     rts
  1210. StrLen
  1211. *  Zeichenkettenlänge
  1212. *   =>     a0: Zeichenkette
  1213. *   <=     a0:   "
  1214. *  d0: Länge
  1215.     moveq   #-1,d0
  1216. .loop
  1217.     addq.l  #1,d0
  1218.     cmpi.b  #0,0(a0,d0.l)
  1219.     bne     .loop
  1220.     rts
  1221.  loc.l CWindow
  1222.  loc.l CRastPort
  1223.  loc.l CFont
  1224.  loc.l OFont
  1225.  loc.w TSize
  1226.  loc.w BSize
  1227. WindowClose
  1228. *
  1229. *   schließt Fenster
  1230. *
  1231.     push    all
  1232. *   Neuer HiScore ?
  1233.     tst.b   NewHi(a4)
  1234.     beq.s   .nohi
  1235.     bsr     SaveHi
  1236. .nohi
  1237.     copy.l  CWindow,d2
  1238.     beq.s   .noWin
  1239.     move.l  d2,a2
  1240.     move.l  wd_UserPort(a2),a2
  1241.     copy.l  SysBase,a6
  1242. .msgloop
  1243.     move.l  a2,a0
  1244.     CALL    GetMsg
  1245.     tst.l   d0
  1246.     beq.s   .endloop
  1247.     move.l  d0,a1
  1248.     CALL    ReplyMsg
  1249.     bra.s   .msgloop
  1250. .endloop
  1251.     tst.b   IsColor(a4)
  1252.     beq.s   .noColor
  1253.     moveq   #7*3,d0
  1254.     bsr     FreePens
  1255. .noColor
  1256.     copy.l  CRastPort,a1
  1257.     copy.l  OFont,a0
  1258.     CGFX    SetFont
  1259.     move.l  d2,a0
  1260.     CINT    CloseWindow
  1261.     moveq   #0,d0
  1262.     reloc.l d0,CWindow
  1263.     reloc.l d0,CRastPort
  1264. .noWin
  1265.     copy.l  CFont,d0
  1266.     beq.s  .noFont
  1267.     move.l  d0,a1
  1268.     CGFX    CloseFont
  1269. .noFont
  1270.     ifne    NEEDFORSPEED
  1271.     copy.l  CImage,a0
  1272.     CGFX    FreeBitMap
  1273.     endc
  1274.     pop     all
  1275.     rts
  1276.  
  1277. CalcScores
  1278. *
  1279. *  Berechne Punktezahl
  1280. *   =>    d0  :    Volle Zeilenanzahl
  1281. *    [d1  :     DropLine]
  1282. *
  1283.     push    all
  1284.     ext.l   d0
  1285.     ext.l   d1
  1286.     move.l  d0,d4
  1287.     mulu    #10,d4
  1288.     lea     Level(a4),a2
  1289.     add.l   d0,Lines(a4)
  1290.     subq.w  #1,d0
  1291.     bmi     .keineLinie
  1292.     move.l  d0,d2
  1293.     add.l   d2,d2
  1294.     move.w  KnackPunkte(pc,d2),d0
  1295.     sub.l   d4,Kisten(a4)
  1296.  
  1297. *    copy.l  Kisten,-(sp)
  1298. *    bsr     LongOut
  1299.  
  1300.     tst.l   Kisten(a4)
  1301.     bne     .nobonus
  1302.     addi.w  #10000,d0            Bonus für 'leeres' Spielfeld
  1303. .nobonus
  1304.     copy.l  Level,d2
  1305.     addq.w  #1,d2
  1306.     mulu    d2,d0
  1307.     bra     .Linie
  1308. .keineLinie
  1309.     moveq   #0,d0
  1310. .Linie
  1311.     add.l   d1,d0
  1312.     add.l   d0,Score(a4)
  1313.     copy.l  Score,d0
  1314.     cmp.l   HiScore(a4),d0
  1315.     bls     .weiter
  1316.     reloc.l d0,HiScore
  1317. *    bsr     SaveHi
  1318.     on.b    NewHi
  1319. .weiter
  1320.     copy.l  Lines,d0
  1321.     moveq   #10,d2
  1322.     divu    d2,d0
  1323.     swap    d0
  1324.     clr.w   d0
  1325.     swap    d0
  1326.     cmp.l   Level(a4),d0
  1327.     bls     .weiter2
  1328.     reloc.l d0,Level
  1329.  ifne USESFX
  1330.     lea     smp_uettel(a4),a0
  1331.     bsr     PlayAudio
  1332.  endc
  1333. .weiter2
  1334.     pop     all
  1335.     rts
  1336. KnackPunkte
  1337.     dc.w    40
  1338.     dc.w    100
  1339.     dc.w    300
  1340.     dc.w    1200
  1341. ScoresOut
  1342. *
  1343. *   =>     a1  : RastPort
  1344.     push    all
  1345.     move.l  a1,a2
  1346.     moveq   #1,d0
  1347.     CGFX    SetAPen
  1348.     moveq   #0,d1
  1349.     lea     TextBorders,a3
  1350.     copy.l  Level,d0
  1351.     move.w  2(a3),d1
  1352.     bsr     PutPunkte
  1353.     copy.l  Lines,d0
  1354.     move.w  10(a3),d1
  1355.     bsr     PutPunkte
  1356.     copy.l  Score,d0
  1357.     move.w  18(a3),d1
  1358.     bsr     PutPunkte
  1359.     copy.l  HiScore,d0
  1360.     move.w  26(a3),d1
  1361.     bsr     PutPunkte
  1362.     pop     all
  1363.     rts
  1364. PutPunkte
  1365. *
  1366. *   Punkte ausgeben
  1367. *   =>    a2  : RastPort
  1368. *    d0  : Punkte
  1369. *    d1  : YPosition
  1370.     push    d3/a3
  1371.     move.l  d1,d3
  1372.     addq.l  #7,d3
  1373.     bsr     ToAscii
  1374.     move.l  d0,a0
  1375.     move.l  d0,a3
  1376.     bsr     StrLen
  1377.     move.l  d0,d2
  1378.     move.l  a2,a1
  1379.     CGFX    TextLength
  1380.     asr.l   #1,d0
  1381.     moveq   #106,d1
  1382.     add.l   d1,d1
  1383.     sub.l   d0,d1
  1384.     move.l  d1,d0
  1385.     move.l  d3,d1
  1386.     move.l  a2,a1
  1387. *    add.l   TSize(a4),d1
  1388.     GZZ
  1389.     CALL    Move
  1390.     move.l  a3,a0
  1391.     move.l  d2,d0
  1392.     move.l  a2,a1
  1393.     CALL    Text
  1394.     pop     d3/a3
  1395.     rts
  1396. ToAscii
  1397. *   Konvertierung
  1398. *   =>     d0  : Nummer
  1399. *   <=     a0,d0 : String
  1400.     push    a1-a2/d1-d2/a6
  1401.     copy.l  UtlBase,a6
  1402.     lea     Buffer+16(a4),a2
  1403.     moveq   #'0',d2
  1404.     clr.b   -(a2)        Endekennung
  1405. .loop
  1406.     moveq   #10,d1
  1407.     CALL    UDivMod32    Durch 10
  1408.     add.w   d2,d1    Rest ( 0..9 ) plus ASCII '0'
  1409.     move.b  d1,-(a2)    Speichern
  1410.     tst.l   d0        Wenn Divisionsergebnis nicht NULL ...
  1411.     bne     .loop    ... nochmal
  1412.     move.l  a2,a0
  1413.     move.l  a2,d0
  1414.     pop     a1-a2/d1-d2/a6
  1415.     rts
  1416. *   eine ULONG-Zahl hat max. 9 Stellen (lg 2^32)
  1417.  bloc    Buffer,32
  1418.  ifne USELL
  1419. OpenNV
  1420. *    <= a6: NVBase
  1421. *    d0: error
  1422.     lea     NVName(pc),a1
  1423.     moveq   #40,d0
  1424.     CSYS    OpenLibrary
  1425.     move.l  d0,a6
  1426.     tst.l   d0
  1427.     rts
  1428. GetHi
  1429.     push    d0-d4/a0-a2/a6
  1430.     bsr     OpenNV
  1431.     beq     GetHiOld
  1432.     lea     Klotz(pc),a0
  1433.     lea     VarName(pc),a1
  1434.     moveq   #0,d1
  1435.     CALL    GetCopyNV
  1436.     move.l  d0,d1
  1437.     beq     .nohi
  1438.     move.l  a6,-(sp)
  1439.     move.l  d0,d3
  1440.     lea     HiScore(a4),a0
  1441.     move.l  a0,d2
  1442.     CDOS    StrToLong
  1443.     move.l  (sp)+,a6
  1444.     move.l  d3,a0
  1445.     CALL    FreeNVData
  1446.     move.l  a6,a1
  1447.     CSYS    CloseLibrary
  1448. .nohi
  1449.     pop     d0-d4/a0-a2/a6
  1450.     rts
  1451. SaveHi
  1452.     push    d0-d4/a0-a2/a6
  1453.     bsr     OpenNV
  1454.     beq     SaveHiOld
  1455.     copy.l  HiScore,d0
  1456.     bsr     ToAscii
  1457.     move.l  d0,a2
  1458.     bsr     StrLen
  1459.     lea     Klotz(pc),a0
  1460.     lea     VarName(pc),a1
  1461.     moveq   #0,d1
  1462.     CALL    StoreNV
  1463.     move.l  a6,a1
  1464.     CSYS    CloseLibrary
  1465.     pop     d0-d4/a0-a2/a6
  1466.     rts
  1467.  endc
  1468.  ifeq USELL
  1469. GetHi
  1470.  
  1471. *
  1472. *   Lade ENV: Variable
  1473. *
  1474. * <= HiScore enthält letzten gesicherten Wert
  1475.     push    d0-d4/a0-a2/a6
  1476.  endc
  1477. GetHiOld
  1478.     lea     VarName(pc),a0
  1479.     move.l  a0,d1
  1480.     lea     Buffer(a4),a0
  1481.     move.l  a0,d2
  1482.     moveq   #31,d3
  1483.     moveq   #0,d4
  1484.     CDOS    GetVar
  1485.     tst.l   d0
  1486.     bmi     .nichtda
  1487.     lea     Buffer(a4),a0
  1488.     move.l  a0,d1
  1489.     lea     HiScore(a4),a0
  1490.     move.l  a0,d2
  1491.     CALL    StrToLong
  1492. .nichtda
  1493.     pop     d0-d4/a0-a2/a6
  1494.     rts
  1495.  ifeq USELL
  1496. SaveHi
  1497. *
  1498. *  Setze ENV: Variable
  1499. *
  1500. *  Vorsicht! quelque chose in die Hose
  1501.     push    d0-d4/a0-a2/a6
  1502.  endc
  1503. SaveHiOld
  1504.     copy.l  HiScore,d0
  1505.     bsr     ToAscii
  1506.     move.l  d0,d2
  1507.     moveq   #-1,d3
  1508.     lea     VarName(pc),a0
  1509.     move.l  a0,d1
  1510.     move.l  #GVF_GLOBAL_ONLY!LV_VAR,d4
  1511.     CDOS    SetVar
  1512.     pop     d0-d4/a0-a2/a6
  1513.     rts
  1514. FetchPubScreen
  1515. *
  1516. *   PublicScreen locken
  1517. *
  1518. *    => d0 : ScreenLock
  1519. *
  1520.     push    a6
  1521.     copy.l  ArgPubScreen,a0          ; NameBuffer für Lock
  1522.     bra     .lock
  1523. .default
  1524.     clra.l  a0            ; Lock auf Default Public Screen
  1525. .lock
  1526.     CINT    LockPubScreen
  1527.     tst.l   d0
  1528.     beq     .default
  1529.     pop     a6
  1530.     rts
  1531.     bloc    DisInfo,dis_SIZEOF
  1532. FetchLace
  1533. *
  1534. *   Ist Bildschirm im INTERLACE - Modus ?
  1535. *   => a0 : Screen
  1536. *   <= IsLace entsprechend gesetzt
  1537.     push    a0-a2/d0-d2/a6
  1538.     move.l  a0,a2
  1539.     lea     sc_ViewPort(a0),a0
  1540.     CGFX    GetVPModeID
  1541. *    cmpi.l  #INVALID_ID,d0
  1542. *    bne.s   .IDOk
  1543. *.Error
  1544. *    move.l  a2,a0
  1545. *    CINT    DisplayBeep
  1546. *    bra.s   .nolace
  1547. *.IDOk
  1548.     CALL    FindDisplayInfo
  1549. *    tst.l   d0
  1550. *    beq     .Error
  1551.     move.l  d0,a0
  1552.     moveq   #0,d2
  1553.     move.l  #DTAG_DISP,d1
  1554.     moveq   #dis_SIZEOF,d0
  1555.     lea     DisInfo(a4),a1
  1556.     CALL    GetDisplayInfoData
  1557. *    tst.l   d0
  1558. *    beq     .Error
  1559. *    copy.l  DisInfo+dis_PropertyFlags,d0   Interlace geht nicht
  1560. *    andi.l  #DIPF_IS_LACE,d0
  1561. *    beq     .nolace
  1562.     copy.w  DisInfo+dis_Resolution+tpt_x,d0    Aber Pixel-Aspect
  1563.     bsr     ToFixed                Dumme Festpunkt-Zahlen
  1564.     move.l  d0,d1
  1565.     copy.w  DisInfo+dis_Resolution+tpt_y,d0
  1566.     bsr     ToFixed
  1567.     bsr     FixedDiv
  1568.     cmpi.l  #$00014000,d0   1.25 = 1+4/16
  1569.     bgt.s   .nolace
  1570.     on.b    IsLace
  1571.     bra.s   .endif
  1572. .nolace
  1573.     off.b   IsLace
  1574. .endif
  1575.     pop     a0-a2/d0-d2/a6
  1576.     rts
  1577. LogoImage
  1578.     dc.w 74,122,$20,$18,2
  1579.     dc.l LogoData
  1580.     dc.b $3,$0
  1581.     dc.l 0
  1582.  section "data",data
  1583. * Reihenfolge NICHT ändern !!
  1584. WindowTags
  1585.     dc.l    WA_Left,10
  1586.     dc.l    WA_Top,10
  1587. *    dc.l    WA_Width,254
  1588. *    dc.l    WA_Height,153
  1589.     dc.l    WA_InnerWidth,246
  1590.     dc.l    WA_InnerHeight,150
  1591.     dc.l    WA_IDCMP,IDCMP_CLOSEWINDOW!IDCMP_CHANGEWINDOW!IDCMP_ACTIVEWINDOW   ;!IDCMP_RAWKEY
  1592.     dc.l    WA_Title,Klotz
  1593.     dc.l    WA_Zoom,ZoomPos
  1594.     dc.l    WA_Flags,WFLG_DRAGBAR!WFLG_CLOSEGADGET!WFLG_DEPTHGADGET!WFLG_RMBTRAP
  1595. *    dc.l    WA_DragBar,-1
  1596. *    dc.l    WA_CloseGadget,-1
  1597. *    dc.l    WA_DepthGadget,-1
  1598. *    dc.l    WA_RMBTrap,-1
  1599.     dc.l    WA_PubScreen,0
  1600.     dc.l    TAG_DONE
  1601. ZoomPos
  1602.     dc.w    -1,-1,172,151
  1603. Borders
  1604.     dc.w    10,4,169,147
  1605. TextBorders
  1606.     dc.w    180,15,243,24
  1607.     dc.w    180,40,243,49
  1608.     dc.w    180,65,243,74
  1609.     dc.w    180,90,243,99
  1610. NXBorders
  1611.     dc.w    180,116,243,147
  1612.     dc.w    -1
  1613.  section "",code
  1614. Texte
  1615.     dc.w    192,10
  1616.     dc.b    "Level",0,0,0
  1617.     dc.w    192,35
  1618.     dc.b    "Lines",0,0,0
  1619.     dc.w    192,60
  1620.     dc.b    "Score",0,0,0
  1621.     dc.w    184,85
  1622.     dc.b    "HiScore",0
  1623.     dc.w    198,111
  1624.     dc.b    "Next",0,0,0,0
  1625.     dc.w    -1
  1626. TxAttr
  1627.     dc.l    FontName
  1628.     dc.w    8
  1629.     dc.b    FS_NORMAL
  1630.     dc.b    FPF_ROMFONT!FPF_DESIGNED
  1631. DOSName     dc.b 'dos.library',0
  1632. IntName     dc.b 'intuition.library',0
  1633. GfxName     dc.b 'graphics.library',0
  1634. UtlName     dc.b 'utility.library',0
  1635.  ifne USELL
  1636. NVName        dc.b 'nonvolatile.library',0
  1637. LowLevelName dc.b 'lowlevel.library',0
  1638. ERLLibLauft dc.b 'Lowlevel.library not',10
  1639.         dc.b 'found or JoyPort in use.',0
  1640.  endc
  1641. GOTxt1        dc.b 'Game Over!',0
  1642. GOTxt2        dc.b 'Please Try Again.',0
  1643. SelectTxt   dc.b 'Select Level',0
  1644. VarName     dc.b 'KlotzHiScore',0
  1645. ArgTemplate dc.b 'PUBSCREEN/K,KEYS/K,LACE/S,NOLACE/S,USEKEYS/S,MONO/S,NOSOUND/S,GBMODE/S',0
  1646. Klotz        dc.b 'Klotz',0
  1647. KlotzPaused dc.b 'Klotz - Game Paused',0
  1648. FontName    dc.b 'topaz.font',0
  1649.     cnop    0,4
  1650.     locend
  1651.  END
  1652.