home *** CD-ROM | disk | FTP | other *** search
/ ticalc.org / ticalc_org_rev_b.iso / archives / 85 / asm / source / usgard / pj1.asm < prev    next >
Encoding:
Assembly Source File  |  2001-07-01  |  27.7 KB  |  1,287 lines

  1. ;-------------------------------------------------------------------------------
  2. ;PLAINJUMP (C) 1997 BY ANDREAS ESS
  3. ;                      TUFERS 11
  4. ;                      A-6811 GOEFIS
  5. ;                      AUSTRIA/EUROPE
  6. ;                      ess.andreas@computerhaus.at
  7. ;                      http://andi.ganymed.org
  8. ;
  9. ;This is the Usgard version of Plainjump, nearly the same, but 300 bytes smaller
  10. ;through the use of Usgard functions + another ? bytes by clearing out stuff.
  11. ;Have fun with it,
  12. ;       Andreas
  13. ;-------------------------------------------------------------------------------
  14.  
  15. #INCLUDE "USGARD.H"             ;use the Usgard header file!
  16.  
  17. ;-------------------------------------------------------------------------------
  18. ;Variables in text-memory:
  19. ;-------------------------------------------------------------------------------
  20. LEVELY          = TEXT_MEM      ;position in level
  21. JUMPFLAG        = TEXT_MEM+1    ;0 = no jump; 1 = up; 2 = down
  22. SPEED           = TEXT_MEM+2    ;speed of ball
  23. LIFE            = TEXT_MEM+3    ;lifes of player
  24. SCORE           = TEXT_MEM+4    ;contains player's score
  25. BALLY           = TEXT_MEM+6    ;only needed for savegame
  26. BALLX           = TEXT_MEM+7
  27. LEVELNAME       = TEXT_MEM+8
  28. ;--> saved from TEXT_MEM to TEXT_MEM+20
  29. SAVELEN         = 17
  30.  
  31.  
  32. SCROLLY         = TEXT_MEM+21    ;position in level-y
  33. SCROLLY1        = TEXT_MEM+22    ;
  34. SCROLLY2        = TEXT_MEM+23    ;
  35. WHATPLAIN       = TEXT_MEM+24
  36.  
  37. LEVELPT         = TEXT_MEM+42   ;pointer to level data
  38. ORIGLVL         = TEXT_MEM+44   ;pointer to start of level
  39. PLAYERPT1       = TEXT_MEM+46 ;pointer to black-player image
  40. ANICOUNT        = TEXT_MEM+48  ;animation counter
  41.  
  42.  
  43. HiScoreTemp     = TEXT_MEM+28
  44. TempByte        = TEXT_MEM+30
  45. ANISCROLLC      = TEXT_MEM+31
  46.  
  47. LvlNo           = TEXT_MEM+35
  48. Top             = TEXT_MEM+36
  49. LvlMinusTop     = TEXT_MEM+37
  50.  
  51. Levels          = GRAPH_MEM
  52.  
  53. BackgroundTemp  = TEXT_MEM2
  54.  
  55. ;-------------------------------------------------------------------------------
  56. BITMAPMEM       = GRAPH_MEM
  57.  
  58. .org    0
  59. .db     "PlaneJump v1.1",0
  60.  
  61.  
  62. ;-------------------------------------------------------------------------------
  63. ;Program start!
  64. ;-------------------------------------------------------------------------------
  65. Title:
  66.     call    CLEARLCD                ;In Usgard, you may use either
  67.                     ;a normal call or a ROM_CALL!
  68.     ld      HL, &TitlePicture       ;Automatic addition of PROGRAM_ADDR
  69.                     ;using a & in front of a label!
  70.     ld      DE, VIDEO_MEM+(16*7)
  71. ;Function calls make your life easier!
  72.     #fncall ZCP
  73.     ld      HL, &ByStr
  74.     ld      DE, $3028
  75.     ld      (CURSOR_X), DE
  76.     call    D_ZM_STR
  77.     ld      DE, $3706
  78.     ld      (CURSOR_X), DE
  79.     call    D_ZM_STR
  80.  
  81. Wait:
  82.     call    GET_KEY                 ;A = key
  83.     and     A                       ;no key pressed?
  84.     jr      z, Wait
  85.  
  86.     ld      HL, &LevelSaved
  87.     ld      A, (HL)
  88.     and     A
  89.     jr      nz, LoadGame
  90.  
  91.     call    &LoadLevel
  92.     ret     c
  93.     jr      RegularGame
  94.  
  95. ;Wait until F1 released
  96. LoadGame:
  97. ;Copy saved game to TEXT_MEM
  98.     ld      (HL), 0
  99.     inc     HL
  100.     ld      BC, SAVELEN
  101.     ld      DE, LEVELY
  102.     ldir
  103.  
  104.     ld      HL, LEVELNAME
  105.     call    VAR_GET
  106.     ret     c
  107.     inc     HL
  108.     inc     HL
  109.     ld      A, (LEVELY)
  110.     ld      E, A
  111.     ld      D, 0
  112.     add     HL, DE
  113.  
  114.     ld      BC, (BALLY)
  115.     jr      SetParams
  116.  
  117. RegularGame:
  118. ;Do some initialisation
  119.     ld      A, 6
  120.     ld      (LIFE), A
  121.     ld      BC, $342E
  122. SetParams:
  123.     ld      (ORIGLVL), HL
  124.     ld      (LEVELPT), HL
  125.     ld      HL, &BlackBall1
  126.     ld      (PLAYERPT1), HL
  127.     jr      StartGameLoop
  128.  
  129. ;Draw screen first time:
  130. StartAfterLife:
  131.     ld      BC, $342E
  132. StartGameLoop:
  133.     call    &DisplayInfo
  134.     ld      HL, $0203
  135.     ld      ($800C), HL
  136.     ld      HL, &LifeStatus
  137.     call    D_ZT_STR
  138.     ld      A, (LIFE)
  139.     ld      H, 0
  140.     ld      L, A
  141.     call    D_HL_DECI
  142. WaitInfo:
  143.     halt
  144.     call    GET_KEY
  145.     and     A
  146.     jr      z, WaitInfo
  147.     call    &ClearDBuf
  148.     call    &DrawScreen
  149.     call    &ScanBk
  150.  
  151. ;-------------------------------------------------------------------------------
  152. ;The game loop:
  153. ;-------------------------------------------------------------------------------
  154. GameLoop:
  155.     call    &DrawBk
  156.     ld      A, C
  157.     cp      46
  158.     jr      nz, TestKeys
  159.     push    BC
  160.     ld      A, B
  161.     add     A, 8
  162.     ld      B, A
  163.     ld      C, 63-60
  164.     call    FIND_PIXEL
  165.     ld      DE, BITMAPMEM
  166.     add     HL, DE
  167.     and     (HL)
  168.     pop     BC
  169.     jp      z, &LostLife
  170. TestKeys:
  171.     call    OTH_ARROW               ;OTH_ARROW returns most used multikeys:
  172.                     ;bit 0: down
  173.     cp      $FF                     ;bit 1: left
  174.                     ;bit 2: right
  175.     jp      z, &Redraw              ;bit 3: up
  176. TestLeftKey:                            ;bit 4: F1
  177.     ld      D, A                    ;bit 5: 2nd
  178.     ld      A, (SPEED)              ;bit 6: exit
  179.     ld      E, A                    ;bit 7: more
  180.     bit     1, d                    ;It's best to load the result into an
  181.     jr      nz, TestRightKey        ;unused register an perform bit ?, reg
  182.     ld      A, B
  183.     cp      2
  184.     jr      c, TestRightKey
  185.     dec     B
  186.     ld      A, E
  187.     cp      3
  188.     jr      nz, TestRightKey
  189.     dec     B
  190. TestRightKey:
  191.     bit     2, d
  192.     jr      nz, TestUpKey
  193.     ld      a, b
  194.     cp      127-16
  195.     jr      nc, TestUpKey
  196.     inc     b
  197.     ld      a, e
  198.     cp      3
  199.     jr      nz, TestUpKey
  200.     inc     b
  201. TestUpKey:
  202.     bit     3, d
  203.     jr      nz, TestDownKey
  204.     ld      A, E
  205.     cp      3
  206.     jr      nc, TestDownKey
  207.     inc     E
  208. TestDownKey:
  209.     bit     0, D
  210.     jr      nz, Test2ndKey
  211.     ld      A, E
  212.     and     A
  213.     jr      z, Test2ndKey
  214.     dec     E
  215. Test2ndKey:     ;JUMP?
  216.     ld      A, E
  217.     ld      (SPEED), A
  218.     bit     5, d
  219.     jr      nz, TestExitKey
  220.     ld      a, (JUMPFLAG)
  221.     and     a
  222.     jr      nz, TestExitKey
  223.     inc     a
  224.     ld      (JUMPFLAG), a
  225.  
  226. TestExitKey:
  227.     bit     6, D
  228.     jp      z, &ExitGame
  229. TestPauseKey:
  230.     bit     7, D
  231.     jp      z, &Pause
  232. TestF1Key:
  233.     bit     4, D
  234.     jp      z, &LSaveGame
  235.  
  236. Redraw:
  237.     ld      A, (JUMPFLAG)
  238.     and     A
  239.     jr      z, ReallyRedraw
  240.     dec     A
  241.     jr      nz, FlyDown
  242.     ld      A, C
  243.     cp      20
  244.     jr      z, SetFlyDown
  245.     dec     C
  246.     jr      ReallyRedraw
  247. SetFlyDown:
  248.     ld      A, 2
  249.     ld      (JUMPFLAG), A
  250. FlyDown:
  251.     ld      A, C
  252.     cp      46
  253.     jr      nz, FlyDown1
  254.     xor     A
  255.     ld      (JUMPFLAG), A
  256.     jr      ReallyRedraw
  257. FlyDown1:
  258.     inc     C
  259. ReallyRedraw:
  260.     ld      A, (SPEED)
  261.     and     A
  262.     jr      z, RedrawBall
  263.     push    BC
  264.     ld      B, A
  265. DoScrolling:
  266.     call    &DoScroll
  267.     djnz    DoScrolling
  268.     pop     BC
  269.  
  270. RedrawBall:
  271.     call    &ScanBk
  272.     ld      DE, &WhiteBall
  273.     call    &WhiteSprite
  274.     ld      DE, (PLAYERPT1)
  275.     call    &BlackSprite
  276.  
  277.     ld      A, (ANISCROLLC)
  278.     ld      HL, SPEED
  279.     add     A, (HL)
  280.     ld      (ANISCROLLC), A
  281.     cp      6
  282.     jr      c, GoOnMainLoop
  283.  
  284.     xor     A
  285.     ld      (ANISCROLLC), A
  286.     ld      HL, ANICOUNT
  287.     inc     (HL)
  288.     ld      A, (HL)
  289.     cp      3
  290.     jr      nz, NextFrame
  291.     ld      (HL), 0
  292.     ld      HL, &BlackBall1
  293.     ld      (PLAYERPT1), HL
  294.     jr      GoOnMainLoop
  295. NextFrame:
  296.     ld      HL, (PLAYERPT1)
  297.     ld      DE, 32
  298.     add     HL, DE
  299.     ld      (PLAYERPT1), HL
  300.  
  301. GoOnMainLoop:
  302.  ;copy GRAPH-MEM to LCD-MEM
  303.     ld      DE, VIDEO_MEM
  304.     ld      HL, BITMAPMEM
  305.     push    BC
  306.     ld      BC, 1024
  307.     ldir
  308.     pop     BC
  309. J2GameLoop:
  310.     jp      &GameLoop
  311.  
  312. Pause:
  313.     call    GET_KEY
  314.     and     A
  315.     jr      z, Pause
  316.     jr      J2GameLoop
  317.  
  318. LostLife:
  319.     xor     A
  320.     ld      (SPEED), A
  321. NoFade:
  322.     ld      A, (LIFE)
  323.     dec     A
  324.     jr      z, GameOver
  325.     call    CLEARLCD
  326.     ld      (LIFE), A
  327.     xor     A
  328.     ld      HL, SCROLLY
  329.     ld      (HL), A
  330.     inc     HL
  331.     ld      (HL), A
  332.     inc     HL
  333.     ld      (HL), A
  334.     inc     HL
  335.     ld      (HL), A
  336.     ld      HL, (LEVELPT)
  337. FindStone:
  338.     dec     HL
  339.     ld      (LEVELPT), HL
  340.     ld      A, (LEVELY)
  341.     dec     A
  342.     ld      (LEVELY), A
  343.     jp      z, &StartAfterLife
  344.     ld      C, $80
  345.     ld      B, 1
  346. FindStone1:
  347.     ld      A, (HL)
  348.     and     C
  349.     jr      nz, FoundDone
  350.     srl     C
  351.     jr      z, FindStone
  352.     ld      A, B
  353.     add     A, 16
  354.     ld      B, A
  355.     jr      FindStone1
  356. FoundDone:
  357.     ld      C, 46
  358.     jp      &StartGameLoop
  359.  
  360. GameOver:
  361.     call    &HiScoreHand
  362.     jr      ExitGame
  363.  
  364. LSaveGame:
  365.     ld      (BALLY), BC
  366.     ld      HL, &LevelSaved
  367.     ld      (HL), 1
  368.     inc     HL
  369.     ld      DE, LEVELY
  370.     ex      DE, HL
  371.     ld      BC, SAVELEN
  372.     ldir
  373.     ld      HL, USG_BITS
  374.     set     1, (HL)              ;Tell Usgard to warp out...
  375. ExitGame:
  376.     call    &ClearDBuf
  377.     call    GET_KEY
  378.     ret
  379.  
  380. ;-------------------------------------------------------------------------------
  381. ;ClearDBuf: clears graphmem which is used as double buffer
  382. ;-------------------------------------------------------------------------------
  383. ClearDBuf:
  384.     push    BC
  385.     ld      HL, BITMAPMEM
  386.     ld      BC, 1023
  387.     call    OTH_CLEAR       ;OTH_CLEAR clears BC+1 bytes at HL
  388.     pop     BC
  389.     ret
  390.  
  391. ;-------------------------------------------------------------------------------
  392. ;WhiteLine: draws a horizontal, white line from (B,D) to (C,D)
  393. ;-------------------------------------------------------------------------------
  394. WhiteLine:
  395.  push   HL
  396.  push   DE
  397.  ld     A, C
  398.  sub    B
  399.  push   AF
  400.  ld     A, 63
  401.  sub    D
  402.  ld     C, A
  403.  call   FIND_PIXEL
  404.  ld     DE, BITMAPMEM
  405.  add    HL, DE
  406.  ld     B, A
  407.  pop    AF
  408.  ld     C, A
  409. WLoop:          ;ready-go!
  410.  ld     A, B                 ;erase point
  411.  cpl
  412.  and    (HL)
  413.  ld     (HL), A   ;and save it back to vid-ram
  414.  
  415.  dec    C         ;decrement X2 if X2 = X1 -> end
  416.  jr     z, EndWhite
  417.  
  418.  rrc    B         ;shift mask
  419.  jr     nc, WLoop
  420.  inc    HL
  421.  jr     WLoop
  422. EndWhite:
  423.  pop  de
  424.  pop  hl
  425.  ret
  426.  
  427. ;-------------------------------------------------------------------------------
  428. ;BlackLine: draws a horizontal, black line from (B,D) to (C,D)
  429. ;-------------------------------------------------------------------------------
  430. BlackLine:
  431.  push   HL
  432.  push   DE
  433.  ld     A, C
  434.  sub    B
  435.  push   AF
  436.  ld     A, 63
  437.  sub    D
  438.  ld     C, A
  439.  call   FIND_PIXEL
  440.  ld     DE, BITMAPMEM
  441.  add    HL, DE
  442.  ld     B, A
  443.  pop    AF
  444.  ld     C, A
  445.  
  446. BLoop:          ;ready-go!
  447.  ld     A, (HL)   ;load byte from vid-ram
  448.  or     B         ;set it to black
  449.  ld     (HL), A   ;and save it back to vid-ram
  450.  
  451.  dec    C         ;decrement X2 if X2 = X1 -> end
  452.  jr     z, EndBlack
  453.  
  454.  rrc    B         ;shift mask
  455.  jr     nc, BLoop
  456.  inc    HL
  457.  jr     BLoop
  458. EndBlack:
  459.  pop    DE
  460.  pop    HL
  461.  ret
  462.  
  463. ;-------------------------------------------------------------------------------
  464. ;DrawLine: this draws a line at y-pos D, accoriding to bits in E
  465. ;-------------------------------------------------------------------------------
  466. DrawLine:
  467.  push   BC
  468.  push   IX
  469.  ld     IX, &StartLine
  470.  ld     B,  0
  471.  ld     C,  D
  472.  sla    C
  473.  add    IX, BC
  474.  add    IX, BC
  475. ;IX now contains pointer to StartLine1
  476.  
  477.  ld     L, $80
  478. DrawLine_Loop1:
  479.  ld     A, 63
  480.  sub    (IX)
  481.  ld     B, A
  482.  ld     A, 63
  483.  sub    (IX+1)
  484.  ld     C, A
  485.  bit    4, L
  486.  jr     z, NotMiddle
  487.  ld     C, 63
  488. NotMiddle:
  489.  inc    IX
  490.  
  491.  ld     A, E
  492.  and    L
  493.  jr     z, WhiteLine_1
  494.  call   &BlackLine
  495.  jr     DrawLine_Loop1_2
  496. WhiteLine_1:
  497.  call   &WhiteLine
  498. DrawLine_Loop1_2:
  499.  rrc    L
  500.  ld     A, L
  501.  cp     $08
  502.  jr     nz, DrawLine_Loop1
  503.  
  504.  dec    IX
  505.  ld     B, 63
  506.  jr     SkipMiddle
  507. DrawLine_Loop2:
  508.  ld     A, (IX+1)
  509.  add    A, 63
  510.  ld     B, A
  511. SkipMiddle:
  512.  ld     A, (IX)
  513.  add    A, 63
  514.  ld     C, A
  515.  dec    IX
  516.  
  517.  ld     A, E
  518.  and    L
  519.  jr     z, WhiteLine_2
  520.  call   &BlackLine
  521.  jr     DrawLine_Loop2_2
  522. WhiteLine_2:
  523.  call   &WhiteLine
  524. DrawLine_Loop2_2:
  525.  rrc    L
  526.  jr     nc, DrawLine_Loop2
  527.  pop    IX
  528.  pop    BC
  529.  ret
  530.  
  531. ;-------------------------------------------------------------------------------
  532. ;Drawscreen
  533. ;-------------------------------------------------------------------------------
  534. DrawScreen:
  535. #ifdef OLD
  536.  ld   hl, (LEVELPT)
  537.  ld   e, (hl)
  538.  ld   b, 32
  539. DrawScrLoop:
  540.  ld   a, b
  541.  add  a, 32
  542.  ld   d, a
  543.  call   &DrawLine
  544.  djnz DrawScrLoop
  545.  ld   hl, (LEVELPT)
  546.  inc  hl
  547.  ld   e, (hl)
  548.  ld   b, 32
  549. DrawScrLoop1:
  550.  ld   d, b
  551.  call   &DrawLine
  552.  djnz DrawScrLoop1
  553.  ret
  554. #else
  555.  push   BC
  556.  ld     IX, (LEVELPT)
  557.  ld     E, (IX)
  558.  ld     B, 31
  559. DrawScrLoop:
  560.  ld     A, B
  561.  add    A, 32
  562.  ld     D, A
  563.  call   &DrawLine
  564.  djnz   DrawScrLoop
  565.  ld     E, (IX+1)
  566.  ld     B, 21
  567. DrawScrLoop1:
  568.  ld     A, B
  569.  add    A, 11
  570.  ld     D, A
  571.  call   &DrawLine
  572.  djnz   DrawScrLoop1
  573.  ld     E, (IX+2)
  574.  ld     B, 11
  575. DrawScrLoop2:
  576.  ld     D, B
  577.  call   &DrawLine
  578.  djnz   DrawScrLoop2
  579.  pop    BC
  580.  ret
  581. #endif
  582.  
  583. ;-------------------------------------------------------------------------------
  584. ;DoScroll: handles scrolling
  585. ;-------------------------------------------------------------------------------
  586. DoScroll:
  587. #ifdef OLD
  588.  ld     A, (SCROLLY)   ;increment SCROLLY
  589.  inc    A
  590.  ld     D, A
  591.  ld     (SCROLLY), A   ;save it
  592.  cp     32             ;SCROLLY = 32 ?
  593.  jr     nz, LoadHLScr
  594.  xor    A
  595.  ld     D, A
  596.  ld     (SCROLLY), a
  597.  ld     H, A
  598.  ld     L, A
  599.  ld     ($8333), hl
  600.  ld     HL, (SCORE)
  601.  call   DM_HL_DECI      ;display HL menu style
  602.  push bc
  603.  ld   b, 6
  604.  ld   de, BITMAPMEM
  605.  ld   hl, VIDEO_MEM
  606. CopyVid2Grf:
  607.  push bc
  608.  ldi
  609.  ldi
  610.  ldi
  611.  ld   bc, 13
  612.  add  hl, bc
  613.  ex   de, hl
  614.  add  hl, bc
  615.  ex   de, hl
  616.  pop  bc
  617.  djnz CopyVid2Grf
  618.  pop  bc
  619.  ld   a, (LEVELY)    ;increment LEVELY
  620.  inc  a
  621.  ld   (LEVELY), a
  622.  cp   254
  623.  jr   nz, GoOnScroll
  624.  xor  a
  625.  ld   (LEVELY), a
  626.  ld   hl, (ORIGLVL)
  627.  ld   (LEVELPT), hl
  628. GoOnScroll:
  629.  ld   hl, (SCORE)
  630.  ld   de, $0002
  631.  add  hl, de
  632.  ld   (SCORE), hl
  633.  ld   hl, (LEVELPT)  ;and increment LEVELPT
  634.  inc  hl
  635.  ld   (LEVELPT), hl
  636. LoadHLScr:
  637.  ld   hl, (LEVELPT)  ;get Levelinformation from LEVELPT
  638.  inc  hl
  639.  ld   e, (hl)
  640.  call   &DrawLine
  641.  ld   a, (SCROLLY)
  642.  add  a, 32
  643.  ld   d, a
  644.  ld   hl, (LEVELPT)
  645.  ld   e, (hl)
  646.  call   &DrawLine
  647.  ret
  648. #else
  649.  ld     HL, SCROLLY
  650.  inc    (HL)
  651.  ld     A, (HL)
  652.  cp     32                  ;SCROLLY = 32 ?
  653.  jr     nz, LoadHLScr
  654.  xor    A
  655.  ld     (HL), a
  656.  ld     D, A
  657.  ld     H, A
  658.  ld     L, A
  659.  ld     (SCROLLY1), hl
  660.  ld     (CURSOR_X), hl
  661.  ld     HL, (SCORE)
  662.  call   DM_HL_DECI
  663.  push   BC
  664.  ld     B, 6
  665.  ld     DE, BITMAPMEM
  666.  ld     HL, VIDEO_MEM
  667. CopyVid2Grf:
  668.  push   BC
  669.  ldi
  670.  ldi
  671.  ldi
  672.  ld     BC, 13
  673.  add    HL, BC
  674.  ex     DE, HL
  675.  add    HL, BC
  676.  ex     DE, HL
  677.  pop    BC
  678.  djnz   CopyVid2Grf
  679.  pop    BC
  680.  ld     A, (LEVELY)    ;increment LEVELY
  681.  inc    A
  682.  cp     251
  683.  jr     nz, NoBonus
  684. Bonus:
  685.  ld     HL, LIFE
  686.  inc    (HL)
  687. NoBonus:
  688.  cp     253
  689.  jr     nz, GoOnScroll
  690.  xor    A
  691.  ld     HL, (ORIGLVL)
  692.  inc    HL
  693.  ld     (LEVELPT), HL
  694. GoOnScroll:
  695.  ld     (LEVELY), A
  696.  ld     HL, (SCORE)
  697.  ld     D, 0
  698.  ld     A, (SPEED)
  699.  ld     E, A
  700.  add    HL, DE
  701.  ld     (SCORE), HL
  702.  ld     HL, (LEVELPT)  ;and increment LEVELPT
  703.  inc    HL
  704.  ld     (LEVELPT), hl
  705. LoadHLScr:
  706.  ld     A, (WHATPLAIN)
  707.  inc    A
  708.  cp     4
  709.  jr     nz, WhatPlain_Set
  710.  ld     A, 1
  711. WhatPlain_Set:
  712.  ld     (WHATPLAIN), a
  713.  cp     2
  714.  jr     z, Plain_2
  715.  cp     3
  716.  jr     z, Plain_3
  717. Plain_1:
  718.  ld     A, (SCROLLY1)
  719.  inc    A
  720.  ld     (SCROLLY1), A
  721.  ld     D, A
  722.  ld     HL, (LEVELPT)  ;get Levelinformation from LEVELPT
  723.  inc    HL
  724.  inc    HL
  725.  ld     E, (HL)
  726.  call   &DrawLine
  727. Plain_2:
  728.  ld     A, (SCROLLY2)
  729.  inc    A
  730.  ld     (SCROLLY2), A
  731.  add    A, 10
  732.  ld     D, A
  733.  ld     HL, (LEVELPT)
  734.  inc    HL
  735.  ld     E, (HL)
  736.  call   &DrawLine
  737. Plain_3:
  738.  ld     A, (SCROLLY)
  739.  add    A, 32
  740.  ld     D, A
  741.  ld     HL, (LEVELPT)
  742.  ld     E, (HL)
  743.  call   &DrawLine
  744.  ret
  745. #endif
  746.  
  747.  
  748. ;-------------------------------------------------------------------------------
  749. ;ScanBk: stores background from(B,C)-(B+16,C+16) in BKPT
  750. ;-------------------------------------------------------------------------------
  751. ScanBk:
  752.  push bc
  753.  ld     A, 63
  754.  sub    C
  755.  ld     C, A
  756.  call   FIND_PIXEL
  757.  ld     DE, BITMAPMEM
  758.  add    HL, DE
  759.  ld     DE, BackgroundTemp
  760.  ;HL contains Video-Offset
  761.  ;DE contains BkPt
  762.  ;Now we are ready...
  763.  ld     B, 16       ;16 lines to scan
  764. ScanLoop:
  765.  push bc
  766.  ld   bc, 3
  767.  ldir             ;move 4 bytes from hl to de
  768.  ld   bc, 13
  769.  add  hl, bc
  770.  pop  bc
  771.  djnz ScanLoop
  772.  pop  bc
  773.  ret
  774.  
  775. ;-------------------------------------------------------------------------------
  776. ;DrawBk: draws background from(B,C)-(B+16,C+16) in BKPT
  777. ;-------------------------------------------------------------------------------
  778. DrawBk:
  779.  push bc
  780.  ld     A, 63
  781.  sub    C
  782.  ld     C, A
  783.  call   FIND_PIXEL
  784.  ld     DE, BITMAPMEM
  785.  add    HL, DE
  786.  ld     DE, BackgroundTemp
  787.  ex     DE, HL
  788.  ;DE contains Video-Offset
  789.  ;HL contains BkPt
  790.  ;Now we are ready...
  791.  ld   b, 16       ;23 lines to draw
  792. PutLoop:
  793.  push bc
  794.  ld   bc, 3
  795.  ldir              ;move 4 bytes from hl to de
  796.  ld   bc, 13
  797.  ex   de, hl
  798.  add  hl, bc
  799.  ex   de, hl
  800.  pop  bc
  801.  djnz PutLoop
  802.  pop  bc
  803.  ret
  804.  
  805. ;-----------------------------------------------------------------------------
  806. ;WhiteSprite: draws each white element of a 16*16 sprite
  807. ;-----------------------------------------------------------------------------
  808. WhiteSprite:
  809.  push   BC
  810.  push   DE
  811.  ld     A, 32
  812.  ld     (TempByte), A ;Line
  813.  ld     A, 63
  814.  sub    C
  815.  ld     C, A
  816.  call   FIND_PIXEL
  817.  ld     DE, BITMAPMEM
  818.  add    HL, DE
  819.  pop    DE
  820.  ld     C, A
  821.  ld     B, 128
  822. WSLoop:
  823.  ld   a, (de)
  824.  and  b
  825.  jr   nz, WSLoop1
  826.  ld   a, c
  827.  cpl
  828.  and  (hl)
  829.  ld   (hl), a
  830. WSLoop1:
  831.  rrc  c
  832.  jr   nc, WSLoop2
  833.  inc  hl
  834. WSLoop2:
  835.  rrc  b
  836.  jr   nc, WSLoop
  837. WSNextLine:
  838.  inc    DE
  839.  ld     A, (TempByte)
  840.  dec    A
  841.  ld     (TempByte), A
  842.  jr     z, WSEndBMP
  843.  bit    0, A
  844.  jr     nz, WSLoop
  845.  push   DE
  846.  ld     DE, 14
  847.  add    HL, DE
  848.  pop    DE
  849.  jr     WSLoop
  850. WSEndBMP:
  851.  pop  bc
  852.  ret
  853.  
  854. ;-----------------------------------------------------------------------------
  855. ;BlackSprite: draws each black element of a 16*16 sprite
  856. ;-----------------------------------------------------------------------------
  857. BlackSprite:
  858.  push   BC
  859.  push   DE
  860.  ld     A, 32
  861.  ld     (TempByte), A ;Line
  862.  ld     A, 63
  863.  sub    C
  864.  ld     C, A
  865.  call   FIND_PIXEL
  866.  ld     DE, BITMAPMEM
  867.  add    HL, DE
  868.  pop    DE
  869.  ld     C, A
  870.  ld     B, 128
  871. BSLoop:
  872.  ld     A, (de)
  873.  and    B
  874.  jr     z, BSLoop1
  875.  ld     A, (hl)
  876.  or     C
  877.  ld     (hl), A
  878. BSLoop1:
  879.  rrc    C
  880.  jr     nc, BSLoop2
  881.  inc    hl
  882. BSLoop2:
  883.  rrc    B
  884.  jr     nc, BSLoop
  885. BSNextLine:
  886.  inc    DE
  887.  ld     A, (TempByte)
  888.  dec    A
  889.  ld     (TempByte), A
  890.  jr     z, BSEndBMP
  891.  bit    0, A
  892.  jr     nz, BSLoop
  893.  push   de
  894.  ld     de, 14
  895.  add    hl, de
  896.  pop    de
  897.  jr     BSLoop
  898. BSEndBMP:
  899.  pop  bc
  900.  ret
  901.  
  902. ;-----------------------------------------------------------------------------
  903. ;Handle Hi-score
  904. ;-----------------------------------------------------------------------------
  905. HiScoreHand:
  906.  call   CLEARLCD
  907.  ld     HL, &HiScore
  908.  call   LD_HL_MHL
  909.  ld     DE, (SCORE)
  910.  ld     (HiScoreTemp), DE
  911. ;DE contains hiscore, HL actual score
  912.  call   CP_HL_DE
  913.  ret    nc
  914.  ld     HL, &HiScore
  915.  ex     DE, HL
  916.  ld     HL, HiScoreTemp
  917.  ld     C, 2
  918.  ldi
  919.  ldi
  920.  ld     HL, $0300
  921.  ld     ($800C), HL
  922.  ld     HL, &HiScr
  923.  call   D_ZT_STR
  924.  ld     DE, $0A1F
  925.  ld     ($8333), DE
  926.  call   D_ZM_STR
  927.  ld     HL, $0803
  928.  ld     ($800C), HL
  929.  ld     HL, &HiScrName
  930.  ld     C, 3
  931.  #fncall INP_INIT
  932.  ret
  933.  
  934. DisplayInfo:
  935.     push    BC
  936.     call    CLEARLCD
  937.     ld      HL, VIDEO_MEM
  938.     call    &Invert
  939.     ld      HL, VIDEO_MEM+1024-112
  940.     call    &Invert
  941.     ld      HL, $0001
  942.     ld      (CURSOR_X), HL
  943.     set     3, (IY+5)
  944.     ld      HL, &Instr
  945.     call    D_ZM_STR
  946.     ld      A, 82
  947.     ld      (CURSOR_X), A
  948.     call    D_ZM_STR
  949.     call    LD_HL_MHL
  950.     call    DM_HL_DECI
  951.     ld      HL, $390D
  952.     ld      (CURSOR_X), HL
  953.     ld      HL, &EMail
  954.     call    D_ZM_STR
  955.     res     3, (IY+5)
  956.     pop     BC
  957.     ret
  958.  
  959. LoadLevel:
  960.     call    &DisplayInfo
  961. ;Search for level files:
  962.     ld      IX, Levels
  963.     xor     A
  964.     ld      (LvlNo), A
  965.     ld      HL, VAT_START-10
  966. SearchLoop:
  967.     ld      A, $0C
  968.     call    SEARCH_VAT
  969.     jr      c, SearchDone
  970.     ld      A, (DE)
  971.     cp      3
  972.     jr      nz, SearchLoop
  973.     inc     DE
  974.     ld      A, (DE)
  975.     and     A
  976.     jr      nz, SearchLoop
  977.     push    HL
  978.     ld      HL, VATName
  979.     push    IX
  980.     pop     DE
  981.     ld      BC, 9
  982.     push    BC
  983.     ldir
  984.     pop     BC
  985.     add     IX, BC
  986.     pop     HL
  987.     ld      A, (LvlNo)
  988.     inc     A
  989.     ld      (LvlNo), A
  990.     jr      SearchLoop
  991. SearchDone:
  992.     xor     A
  993.     ld      (&SetD+1), A
  994.  
  995.     ld      A, (LvlNo)
  996.     and     A
  997.     jp      z, &NoLevels
  998. ShowLevels:
  999.     ld      HL, $0801
  1000.     ld      (CURSOR_X), HL
  1001.  
  1002.     ld      HL, VIDEO_MEM+112
  1003.     ld      BC, 799
  1004.     call    OTH_CLEAR
  1005.     ld      HL, (Top)
  1006.     ld      H, 9
  1007.     call    MUL_HL
  1008.     ld      DE, Levels
  1009.     add     HL, DE
  1010.     ld      B, 8
  1011.     ld      A, (LvlNo)
  1012.     cp      8
  1013.     jr      nc, ShowLevel
  1014.     ld      B, A
  1015. ShowLevel:
  1016.     push    HL
  1017.     call    D_ZM_STR
  1018.     pop     HL
  1019.     ld      DE, 9
  1020.     add     HL, DE
  1021.     ld      A, (CURSOR_Y)
  1022.     add     A, 6
  1023.     ld      (CURSOR_Y), A
  1024.     ld      A, 1
  1025.     ld      (CURSOR_X), A
  1026.     djnz    ShowLevel
  1027.     ld      HL, Top
  1028.     ld      A, (LvlNo)
  1029.     sub     (HL)
  1030.     cp      8
  1031.     jr      c, SetMax
  1032.     ld      A, 8
  1033. SetMax:
  1034.     ld      E, A
  1035.     dec     E
  1036. SetD:
  1037.     ld      D, 0
  1038.     call    &ShowBar
  1039. CL_KeyLoop:
  1040.     call    GET_KEY
  1041.     cp      K_DOWN
  1042.     jr      z, ScrollDown
  1043.     cp      K_UP
  1044.     jr      z, ScrollUp
  1045.     cp      K_ENTER
  1046.     jr      z, AcceptLevel
  1047.     cp      K_EXIT
  1048.     jr      nz, CL_KeyLoop
  1049.     scf
  1050.     ret
  1051. ScrollDown:
  1052.     call    &ShowBar
  1053.     ld      A, D
  1054.     cp      E
  1055.     jr      z, ScrollL_Down
  1056.     inc     D
  1057.     jr      ShowIt
  1058. ScrollL_Down:
  1059.     ld      (&SetD+1), A
  1060.     ld      A, (LvlNo)
  1061.     sub     8
  1062.     jr      c, ShowIt
  1063.     ld      HL, Top
  1064.     cp      (HL)
  1065.     jr      z, ShowIt
  1066.     inc     (HL)
  1067.     jp      &ShowLevels
  1068. ScrollUp:
  1069.     call    &ShowBar
  1070.     ld      A, D
  1071.     and     A
  1072.     jr      z, ScrollL_Up
  1073.     dec     D
  1074.     jr      ShowIt
  1075. ScrollL_Up:
  1076.     ld      (&SetD+1), A
  1077.     ld      A, (Top)
  1078.     and     A
  1079.     jr      z, ShowIt
  1080.     dec     A
  1081.     ld      (Top), A
  1082.     jp      &ShowLevels
  1083. ShowIt:
  1084.     call    &ShowBar
  1085.     jr      CL_KeyLoop
  1086. AcceptLevel:
  1087.     ld      A, (Top)
  1088.     add     A, D
  1089.     ld      L, A
  1090.     ld      H, 9
  1091.     call    MUL_HL
  1092.     ld      DE, Levels
  1093.     add     HL, DE
  1094.     push    HL
  1095.     ld      BC, 8
  1096.     ld      DE, LEVELNAME
  1097.     ldir
  1098.     pop     HL
  1099.     call    VAR_GET
  1100.     ret     c
  1101.     inc     HL
  1102.     inc     HL
  1103.     or      A
  1104.     ret
  1105. NoLevels:
  1106.     ld      HL, $0801
  1107.     ld      (CURSOR_X), HL
  1108.     ld      HL, &NoLevel
  1109.     call    D_ZM_STR
  1110.     call    OTH_PAUSE
  1111.     scf
  1112.     ret
  1113.  
  1114. ShowBar:
  1115.     push    DE
  1116.     ld      L, D
  1117.     ld      H, 96
  1118.     call    MUL_HL
  1119.     ld      DE, VIDEO_MEM+128
  1120.     add     HL, DE
  1121.     call    &Invert
  1122.     pop     DE
  1123.     ret
  1124.  
  1125. Invert:
  1126.     ld      BC, 112
  1127. InvLoop:
  1128.     ld      A, (HL)
  1129.     cpl
  1130.     ld      (HL), A
  1131.     inc     HL
  1132.     dec     BC
  1133.     ld      A, B
  1134.     or      C
  1135.     jr      nz, InvLoop
  1136.     ret
  1137.  
  1138. ;-------------------------------------------------------------------------------
  1139. ;Some important variables:
  1140. ;-------------------------------------------------------------------------------
  1141.             ;012345678901234567890
  1142. NoLevel:   .db "No level found!",0
  1143. Instr:     .db "PJ 1.1 by AE",0
  1144. HiScrTxt:  .db "Hi: "
  1145. HiScrName: .db "AND",0
  1146. HiScore:   .dw 10                       ;This is standard hi-score
  1147. HiScr:     .db "NEW HIGH SCORE!",0
  1148. EnterInit: .db "ENTER YOUR INITIALS:",0
  1149.            ;123456789012345678901
  1150. EMail:     .db "ess.andreas@computerhaus.at",0
  1151. ByStr:     .db "by Andreas Ess",0
  1152. TitTxt:    .db "Title picture by"
  1153.        .db " Johannes Rajala",0
  1154. LifeStatus: .db "Lifes left:",0
  1155.  
  1156. ;-------------------------------------------------------------------------------
  1157. ;This contains savegame
  1158. ;-------------------------------------------------------------------------------
  1159. LevelSaved: .db 0  ;standard: no level saved
  1160. SavedLevel:
  1161.  .db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1162.  
  1163. ;-------------------------------------------------------------------------------
  1164. ;This array contains start&end-line indexes(?)
  1165. ;-------------------------------------------------------------------------------
  1166. StartLine:
  1167.  .db  16, 12, 8, 4              ;#0
  1168.  .db  17, 13, 8, 4
  1169.  .db  17, 13, 9, 4
  1170.  .db  18, 13, 9, 4
  1171.  .db  19, 14, 10, 5             ;#4
  1172.  .db  19, 15, 10, 5
  1173.  .db  20, 15, 10, 5
  1174.  .db  21, 16, 11, 5
  1175.  .db  22, 17, 11, 6             ;#8
  1176.  .db  23, 17, 11, 6
  1177.  .db  23, 18, 12, 6
  1178.  .db  24, 18, 12, 6
  1179.  .db  25, 19, 13, 6             ;#12
  1180.  .db  26, 19, 13, 6
  1181.  .db  26, 20, 13, 7
  1182.  .db  27, 21, 14, 7
  1183.  .db  28, 21, 14, 7             ;#16
  1184.  .db  29, 22, 14, 7
  1185.  .db  29, 22, 15, 7
  1186.  .db  30, 23, 15, 8
  1187.  .db  31, 23, 16, 8             ;#20
  1188.  .db  32, 24, 16, 8
  1189.  .db  33, 25, 16, 8
  1190.  .db  33, 25, 17, 8
  1191.  .db  34, 26, 17, 9             ;#24
  1192.  .db  35, 26, 18, 9
  1193.  .db  35, 27, 18, 9
  1194.  .db  36, 27, 18, 9
  1195.  .db  37, 28, 19, 9             ;#28
  1196.  .db  38, 29, 19, 9
  1197.  .db  38, 29, 19, 9
  1198.  .db  39, 30, 20, 10
  1199.  .db  40, 30, 20, 10            ;#32
  1200.  .db  41, 31, 21, 10
  1201.  .db  41, 31, 21, 10
  1202.  .db  42, 32, 21, 11
  1203.  .db  43, 33, 22, 11            ;#36
  1204.  .db  44, 33, 22, 11
  1205.  .db  44, 34, 22, 11
  1206.  .db  45, 34, 23, 11
  1207.  .db  46, 35, 23, 12            ;#40
  1208.  .db  47, 35, 24, 12
  1209.  .db  47, 36, 24, 12
  1210.  .db  48, 37, 24, 12
  1211.  .db  49, 37, 25, 12            ;#44
  1212.  .db  50, 38, 25, 13
  1213.  .db  50, 38, 26, 13
  1214.  .db  51, 39, 26, 13
  1215.  .db  52, 39, 26, 13            ;#48
  1216.  .db  53, 40, 27, 13
  1217.  .db  54, 41, 27, 14
  1218.  .db  55, 41, 27, 14
  1219.  .db  55, 42, 28, 14            ;#52
  1220.  .db  56, 42, 28, 14
  1221.  .db  56, 43, 29, 14
  1222.  .db  57, 43, 29, 14
  1223.  .db  58, 44, 29, 15            ;#56
  1224.  .db  59, 45, 30, 15
  1225.  .db  59, 45, 30, 15
  1226.  .db  60, 46, 30, 15
  1227.  .db  61, 46, 31, 15            ;#60
  1228.  .db  62, 47, 31, 16
  1229.  .db  62, 47, 32, 16
  1230.  .db  63, 48, 32, 16
  1231.  
  1232.  
  1233. ;-------------------------------------------------------------------------------
  1234. ;Bitmapdata:
  1235. ;-------------------------------------------------------------------------------
  1236. WhiteBall:
  1237.  .db $FF,$FF,$FF,$FF,$F8,$3F,$E0,$0F,$C0,$07,$C0,$07,$80,$03,$80,$03
  1238.  .db $80,$03,$80,$03,$80,$03,$C0,$07,$C0,$07,$E0,$0F,$F8,$3F,$FF,$FF,
  1239.  
  1240. BlackBall1:
  1241.  .db $00,$00,$07,$C0,$18,$30,$20,$08,$40,$04,$40,$04,$80,$02,$80,$02
  1242.  .db $80,$02,$C0,$06,$A0,$0A,$54,$54,$6A,$AC,$35,$58,$1A,$B0,$07,$C0
  1243.  
  1244.  .db $00,$00,$07,$C0,$18,$30,$20,$08,$40,$04,$40,$04,$8A,$A2,$D5,$56
  1245.  .db $AA,$AA,$D5,$56,$8A,$A2,$40,$04,$40,$04,$20,$08,$18,$30,$07,$C0
  1246.  
  1247.  .db $00,$00,$07,$C0,$1A,$B0,$35,$58,$6A,$AC,$54,$54,$A0,$0A,$C0,$06
  1248.  .db $80,$02,$80,$02,$80,$02,$40,$04,$40,$04,$20,$08,$18,$30,$07,$C0
  1249.  
  1250.  
  1251. TitlePicture:
  1252.  .db $00,$3F,$2C,$C0,$3F,$3F,$22,$C0,$0A,$C0,$3F,$A0,$3F,$2C,$C0,$80
  1253.  .db $E0,$22,$C0,$90,$84,$37,$E0,$FF,$39,$C0,$34,$4D,$19,$C0,$82,$81
  1254.  .db $0A,$E0,$1B,$E3,$80,$C0,$83,$F0,$98,$88,$10,$C0,$98,$98,$84,$BE
  1255.  .db $12,$C0,$BE,$FC,$10,$E2,$87,$B0,$12,$E0,$BC,$F0,$83,$E6,$18,$F6
  1256.  .db $EF,$82,$09,$E9,$E3,$C0,$13,$FB,$48,$0B,$E1,$E0,$09,$C0,$B9,$F0
  1257.  .db $F0,$A4,$8D,$9F,$98,$18,$FE,$8F,$0B,$E9,$FC,$C0,$09,$F0,$F0,$98
  1258.  .db $BC,$ED,$9F,$CC,$19,$F0,$8E,$84,$8D,$DC,$0B,$C0,$F0,$B0,$DC,$8F
  1259.  .db $BE,$9F,$E7,$1A,$E0,$87,$91,$EE,$B0,$0A,$E0,$F0,$88,$EC,$87,$FF
  1260.  .db $8F,$F3,$C0,$14,$E3,$E3,$E3,$4A,$83,$C1,$C1,$E8,$C5,$DC,$86,$F7
  1261.  .db $8F,$F3,$F0,$13,$E3,$F9,$F1,$DF,$F0,$FF,$9C,$87,$B1,$E1,$CC,$F7
  1262.  .db $B8,$BE,$B9,$C0,$10,$E3,$F9,$E3,$8F,$F9,$C3,$F8,$83,$CF,$D9,$DE
  1263.  .db $E3,$B9,$80,$F0,$90,$10,$E3,$F9,$C3,$8F,$CF,$80,$F8,$81,$FD,$CF
  1264.  .db $FB,$E2,$98,$E3,$E0,$17,$E1,$F3,$C3,$8F,$8F,$09,$F0,$87,$E6,$BF
  1265.  .db $CF,$08,$C7,$FC,$1B,$E0,$87,$C7,$8F,$8F,$C0,$8E,$83,$F9,$CF,$E1
  1266.  .db $C0,$88,$BE,$1F,$E8,$BF,$DC,$8E,$9F,$90,$8C,$87,$F3,$9F,$E1,$09
  1267.  .db $CB,$23,$E7,$4C,$83,$C7,$EE,$83,$C3,$9C,$E7,$F8,$A0,$84,$8C,$20
  1268.  .db $E3,$4C,$93,$C7,$E7,$C1,$C6,$8C,$E3,$F8,$A0,$82,$AC,$1F,$F0,$FF
  1269.  .db $BC,$F3,$8F,$CF,$E3,$D8,$98,$E3,$F2,$D0,$C4,$D8,$1D,$FC,$BF,$8E
  1270.  .db $B9,$C7,$E7,$F1,$F8,$8D,$B0,$B0,$A6,$C0,$B7,$1D,$E6,$8F,$CF,$9C
  1271.  .db $EB,$F3,$F8,$FE,$9E,$CC,$80,$D1,$E8,$8B,$F0,$16,$C3,$A3,$E7,$08
  1272.  .db $E3,$E3,$F8,$4C,$8B,$08,$C8,$FA,$A6,$EC,$15,$C0,$B4,$B1,$E1,$C5
  1273.  .db $BD,$BF,$9F,$FF,$8D,$C8,$B6,$9E,$F1,$D8,$A0,$18,$EC,$A3,$C0,$CA
  1274.  .db $F0,$FC,$B8,$F8,$B7,$CF,$C8,$BD,$D3,$B8,$1E,$F6,$97,$87,$8C,$F2
  1275.  .db $FC,$BA,$0A,$FE,$B9,$C7,$B3,$B9,$C0,$1A,$FA,$93,$F3,$E2,$B3,$BC
  1276.  .db $9B,$80,$FE,$BC,$9E,$B1,$F8,$BC,$1E,$FC,$E4,$8B,$E3,$F4,$F9,$89
  1277.  .db $C7,$F8,$9F,$F7,$F0,$EF,$F8,$1D,$E6,$F9,$E9,$F1,$FD,$FD,$09,$49
  1278.  .db $83,$FE,$9F,$80,$FC,$20,$E3,$FF,$88,$FC,$BF,$EE,$E0,$49,$B0,$B1
  1279.  .db $E0,$E0,$86,$22,$C1,$F3,$4A,$B1,$EC,$99,$D7,$F8,$98,$C0,$E0,$E0
  1280.  .db $84,$29,$E0,$49,$9F,$E0,$8E,$87,$E0,$84,$09,$C0,$C0,$98,$31,$FF
  1281.  .db $8F,$C0,$9F,$FF,$18,$C1,$08,$C0,$32,$F0,$0D,$4A,$0E,$C0,$14,$C0
  1282.  .db $33,$E0,$0B,$E1,$E0,$19,$C4,$3F,$98,$0A,$C0,$90,$27,$C0,$36,$C0
  1283.  .db $10,$C0,$3F,$88,$00
  1284.  
  1285.  
  1286. .end
  1287.