home *** CD-ROM | disk | FTP | other *** search
/ ticalc.org / ticalc_org_rev_b.iso / archives / 86 / asm / source / squarez.asm < prev    next >
Encoding:
Assembly Source File  |  2001-07-01  |  10.5 KB  |  869 lines

  1. #include asm86.h
  2. #include ti86asm.inc
  3.  
  4. CurPiece  = _textShadow
  5. NextPiece = _textShadow+9
  6. tmpPiece  = _textShadow+18
  7. xy      = _textShadow+27
  8. corner      = _textShadow+29
  9. time      = _textShadow+30
  10. mult      = _textShadow+31
  11. rotrel      = _textShadow+32
  12. score      = _textShadow+33
  13. multtimer = _textShadow+35
  14. count      = _textShadow+36
  15. board      = _plotSScreen
  16.  
  17. .org _asm_exec_ram
  18.  
  19.  call _runindicoff
  20.  call _clrLCD
  21.  res appTextSave,(iy+appflags)
  22.  ld hl,CurPiece
  23.  ld bc,36
  24.  call Clear
  25.  ld a,1
  26.  ld (mult),a
  27.  ld hl,$FC10
  28.  ld b,62
  29. VLine:
  30.  ld (hl),$01
  31.  ld de,9
  32.  add hl,de
  33.  ld (hl),$80
  34.  ld e,7
  35.  add hl,de
  36.  djnz VLine
  37.  ld hl,$FC11
  38.  ld de,$FFE1
  39.  ld a,$FF
  40.  ld b,8
  41. HLine:
  42.  ld (hl),a
  43.  ld (de),a
  44.  inc hl
  45.  inc de
  46.  djnz HLine
  47.  ld hl,$0D01
  48.  ld (_currow),hl
  49.  ld hl,SquarezText
  50.  call _puts
  51.  ld hl,$1854
  52.  ld (_pencol),hl
  53.  ld hl,InfoText
  54.  call _vputs
  55.  ld de,$254E
  56.  ld (_pencol),de
  57.  call _vputs
  58.  ld de,$2C4E
  59.  ld (_pencol),de
  60.  call _vputs
  61.  ld de,$324E
  62.  ld (_pencol),de
  63.  call _vputs
  64.  ld de,$384E
  65.  ld (_pencol),de
  66.  call _vputs
  67.  ld hl,$2558
  68.  ld (_pencol),hl
  69.  ld hl,HiInitials
  70.  call _vputs
  71.  ld hl,$256B
  72.  ld (_pencol),hl
  73.  ld hl,(Hiscore)
  74.  call ShowHLDec
  75.  call ShowScore
  76.  call ShowMult
  77.  ld hl,$FC31
  78.  ld de,$1F
  79.  ld b,6
  80. PutDots:
  81.  ld (hl),%01010101
  82.  inc hl
  83.  ld (hl),%01010000
  84.  add hl,de
  85.  djnz PutDots
  86.  call NewPiece
  87.  call NewPiece
  88.  ld hl,board
  89.  ld bc,639
  90.  call Clear
  91.  ld hl,board+32
  92.  ld de,board+544
  93.  ld b,20
  94.  ld a,128
  95. FillHBorder:
  96.  ld (hl),a
  97.  ld (de),a
  98.  inc hl
  99.  inc de
  100.  djnz FillHBorder
  101.  ld hl,board+33
  102.  ld b,16
  103. FillVBorder:
  104.  ld (hl),a
  105.  ld de,17
  106.  add hl,de
  107.  ld (hl),a
  108.  ld e,15
  109.  add hl,de
  110.  djnz FillVBorder
  111. WaitKey:
  112.  call UpdateTimer
  113.  ld b,15
  114. Wait:
  115.  halt
  116.  djnz Wait
  117.  ld hl,(xy)
  118.  ld a,($C000)
  119.  cp K_EXIT
  120.  jp z,Quit
  121.  cp K_MORE
  122.  jp z,Pause
  123.  cp K_SECOND
  124.  jp z,TryRotate
  125.  cp K_XVAR
  126.  jr z,TryDrop
  127.  cp K_ENTER
  128.  jr z,TryDrop
  129.  cp K_ALPHA
  130.  jp z,TryRotate
  131.  push hl
  132.  ld hl,RotRel
  133.  res 0,(hl)
  134.  pop hl
  135.  dec a
  136.  jr z,MoveDown
  137.  dec a
  138.  jr z,MoveLeft
  139.  dec a
  140.  jr z,MoveRight
  141.  dec a
  142.  jr nz,WaitKey
  143. MoveUp:
  144.  dec l
  145.  jr TestUpdate
  146. MoveLeft:
  147.  dec h
  148.  jr TestUpdate
  149. MoveRight:
  150.  inc h
  151.  jr TestUpdate
  152. MoveDown:
  153.  inc l
  154. TestUpdate:
  155.  ld de,CurPiece
  156.  call TestPiece
  157.  jr nz,WaitKey
  158. UpdatePiece:
  159.  push hl
  160.  ld hl,(xy)
  161.  ld de,CurPiece
  162.  call ShowPiece
  163.  pop hl
  164.  ld (xy),hl
  165.  call ShowPiece
  166.  jr WaitKey
  167.  
  168. TryDrop:
  169.  call TestCorner
  170.  jr nz,WaitKey
  171.  ld hl,(xy)
  172.  call DropPiece
  173.  call Search3x3Block
  174.  ld a,(count)
  175.  cp 16
  176.  jr c,NoMultInc
  177.  ld hl,mult
  178.  inc (hl)
  179.  call ShowMult
  180. NoMultInc:
  181.  ld d,0
  182.  ld e,a
  183.  ld a,(time)
  184.  rrca
  185.  rrca
  186.  rrca
  187.  rrca
  188.  and $0F
  189.  inc a
  190.  ld h,d
  191.  ld l,a
  192.  add hl,de
  193.  ex de,hl
  194.  ld l,h
  195.  ld a,(mult)
  196.  ld b,a
  197. Multiply:
  198.  add hl,de
  199.  djnz Multiply
  200.  ld de,(score)
  201.  add hl,de
  202.  ld (score),hl
  203.  call ShowScore
  204.  call NewPiece
  205.  jp WaitKey
  206.  
  207. TryRotate:
  208.  ld hl,RotRel
  209.  bit 0,(hl)
  210.  jp nz,WaitKey
  211.  set 0,(hl)
  212.  call RotatePiece
  213.  ld de,tmpPiece
  214.  ld hl,(xy)
  215.  call TestPiece
  216.  jp nz,WaitKey
  217.  push de
  218.  ld de,CurPiece
  219.  call ShowPiece
  220.  pop hl
  221.  ld bc,9
  222.  ldir
  223.  ld hl,(xy)
  224.  ld de,CurPiece
  225.  call ShowPiece
  226.  jp WaitKey
  227.  
  228. Pause:
  229.  ld hl,$FC00
  230.  ld de,$A000
  231.  ld bc,1024
  232.  push bc
  233.  push de
  234.  push hl
  235.  push hl
  236.  ldir
  237.  pop hl
  238.  ld bc,1023
  239.  call Clear
  240. PauseWait:
  241.  call GET_KEY
  242.  cp K_ENTER
  243.  jr nz,PauseWait
  244.  pop de
  245.  pop hl
  246.  pop bc
  247.  ldir
  248.  jp WaitKey
  249.  
  250. NewPiece:
  251.  ld de,NextPiece
  252.  ld hl,$1B07
  253.  call ShowPiece
  254.  ex de,hl
  255.  ld de,CurPiece
  256.  ld bc,9
  257.  ldir
  258.  ld hl,$0202
  259.  ld (xy),hl
  260.  call ShowPiece
  261.  ld a,r
  262.  srl a
  263.  cp 39
  264.  jr c,InRange
  265.  sub 39
  266. InRange:
  267.  call ExtractPiece
  268.  ld hl,$1B07
  269.  call ShowPiece
  270.  ld a,144
  271.  ld (time),a
  272.  ret
  273.  
  274. RotatePiece:
  275.  ld ix,RotateData
  276.  ld de,tmpPiece
  277.  ld hl,CurPiece
  278.  push de
  279.  push hl
  280.  ld bc,9
  281.  ldir
  282.  pop de
  283.  pop hl
  284.  ld b,9
  285. Rotate:
  286.  push bc
  287.  push hl
  288.  ld b,0
  289.  ld c,(ix)
  290.  add hl,bc
  291.  ld a,(de)
  292.  ld (hl),a
  293.  inc de
  294.  inc ix
  295.  pop hl
  296.  pop bc
  297.  djnz Rotate
  298.  ret
  299.  
  300. TestCorner:
  301.  ld de,CurPiece
  302.  ld hl,(xy)
  303.  ld c,h
  304.  ld b,3
  305. TestCRow:
  306.  push bc
  307.  ld b,3
  308. TestCCol:
  309.  ld a,(de)
  310.  or a
  311.  jr z,TC_NextSq
  312.  ld a,h
  313.  cp 5
  314.  jr nc,TC_NextSq
  315.  ld a,l
  316.  cp 5
  317.  jr nc,TC_NextSq
  318.  pop bc
  319.  ret
  320. TC_NextSq:
  321.  inc de
  322.  inc h
  323.  djnz TestCCol
  324.  pop bc
  325.  ld h,c
  326.  inc l
  327.  djnz TestCRow
  328.  xor a
  329.  ret
  330.  
  331. TestPiece:
  332.  push de
  333.  push hl
  334.  call GetBoardPos
  335.  ld b,3
  336. TestRow:
  337.  push bc
  338.  ld b,3
  339. TestCol:
  340.  ld a,(de)
  341.  or a
  342.  jr z,NoCollide
  343.  ld a,(hl)
  344.  or a
  345.  jr nz,Collide
  346. NoCollide:
  347.  inc de
  348.  inc hl
  349.  djnz TestCol
  350.  ld c,29
  351.  add hl,bc
  352.  pop bc
  353.  djnz TestRow
  354.  pop hl
  355.  pop de
  356.  xor a
  357.  ret
  358. Collide:
  359.  pop bc
  360.  pop hl
  361.  pop de
  362.  inc a
  363.  ret
  364.  
  365. DropPiece:
  366.  push hl
  367.  call GetBoardPos
  368.  ld de,CurPiece
  369.  ld b,3
  370. DropRow:
  371.  push bc
  372.  ld b,3
  373. DropCol:
  374.  ld a,(de)
  375.  or (hl)
  376.  ld (hl),a
  377.  inc de
  378.  inc hl
  379.  djnz DropCol
  380.  ld c,29
  381.  add hl,bc
  382.  pop bc
  383.  djnz DropRow
  384.  pop hl
  385.  ret
  386.  
  387. Search3x3Block:
  388.  ld hl,board+66
  389.  ld b,13
  390. SearchY:
  391.  push bc
  392.  ld b,14
  393. SearchX:
  394.  ld a,(hl)
  395.  and $7F
  396.  jr z,SB_NextSq
  397.  ld ix,SurData
  398.  push bc
  399.  push ix
  400.  push hl
  401.  ld b,8
  402.  ld d,0
  403. CheckSurr:
  404.  ld e,(ix)
  405.  inc ix
  406.  add hl,de
  407.  ld a,(hl)
  408.  or a
  409.  jr z,NoBlock
  410.  cp 128
  411.  jr z,NoBlock
  412.  djnz CheckSurr
  413.  pop hl
  414.  pop ix
  415.  push hl
  416.  ld b,9
  417. ClearSurr:
  418.  ld (hl),2
  419.  ld e,(ix)
  420.  add hl,de
  421.  inc ix
  422.  djnz ClearSurr
  423.  pop hl
  424.  pop bc
  425.  jr SB_NextSq
  426. NoBlock:
  427.  pop hl
  428.  pop ix
  429.  pop bc
  430. SB_NextSq:
  431.  inc hl
  432.  djnz SearchX
  433.  ld c,18
  434.  add hl,bc
  435.  pop bc
  436.  djnz SearchY
  437.  
  438.  ld de,board+66
  439.  ld hl,count
  440.  ld (hl),0
  441.  ld hl,$FC21
  442.  ld c,$0F
  443.  ld b,15
  444. ClearY:
  445.  push bc
  446.  ld b,16
  447.  push hl
  448. ClearX:
  449.  ld a,(de)
  450.  cp 2
  451.  jr nz,C_NextSq
  452.  push hl
  453.  ld hl,count
  454.  inc (hl)
  455.  pop hl
  456.  xor a
  457.  ld (de),a
  458.  push bc
  459.  push de
  460.  ld de,16
  461.  ld b,4
  462. C_PutSq:
  463.  ld a,c
  464.  and (hl)
  465.  ld (hl),a
  466.  add hl,de
  467.  djnz C_PutSq
  468.  ld de,-64
  469.  add hl,de
  470.  pop de
  471.  pop bc
  472. C_NextSq:
  473.  ld a,c
  474.  cpl
  475.  ld c,a
  476.  cp $0F
  477.  jr nz,CSameByte
  478.  inc hl
  479. CSameByte:
  480.  inc de
  481.  djnz ClearX
  482.  pop hl
  483.  ld c,64
  484.  add hl,bc
  485.  ex de,hl
  486.  ld c,16
  487.  add hl,bc
  488.  ex de,hl
  489.  pop bc
  490.  djnz ClearY
  491.  ret
  492.  
  493. ShowScore:
  494.  ld hl,$326B
  495.  ld (_pencol),hl
  496.  ld hl,(score)
  497. ShowHLDec:
  498.  ld de,_OP1+5
  499.  xor a
  500.  ld (de),a
  501.  ld b,5
  502. Unpack:
  503.  call UNPACK_HL
  504.  add a,48
  505.  dec de
  506.  ld (de),a
  507.  djnz Unpack
  508.  ex de,hl
  509.  call _vputs
  510.  ret
  511.  
  512. ShowMult:
  513.  push af
  514.  push hl
  515.  ld hl,$2C77
  516.  ld (_pencol),hl
  517.  ld hl,MultText+1
  518.  ld a,(mult)
  519.  add a,'0'
  520.  ld (hl),a
  521.  dec hl
  522.  call _vputs
  523.  pop hl
  524.  pop af
  525.  ret
  526.  
  527. UpdateTimer:
  528.  ld hl,mult
  529.  ld de,multtimer
  530.  ld a,(hl)
  531.  dec a
  532.  jr z,DecTimer
  533.  ld a,(de)
  534.  dec a
  535.  ld (de),a
  536.  jr nz,DecTimer
  537.  dec (hl)
  538.  call ShowMult
  539. DecTimer:
  540.  ld hl,time
  541.  dec (hl)
  542.  ld a,(hl)
  543.  cp 255
  544.  push af
  545.  jr z,ShowTime
  546.  rrca
  547.  rrca
  548.  rrca
  549.  rrca
  550.  and $0F
  551. ShowTime:
  552.  add a,49
  553.  ld hl,$387B
  554.  ld (_pencol),hl
  555.  call _vputmap
  556.  pop af
  557.  ret nz
  558. OutOfTime:
  559.  pop hl
  560.  call TestCorner
  561.  jp z,TryDrop
  562.  ld hl,$0503
  563.  ld (_currow),hl
  564.  ld hl,GameOverText
  565.  set textInverse,(iy+textflags)
  566.  call _puts
  567.  res textInverse,(iy+textflags)
  568. GameOverWait:
  569.  call GET_KEY
  570.  cp K_ENTER
  571.  jr z,Quit
  572.  cp K_EXIT
  573.  jr nz,GameOverWait
  574. Quit:
  575.  call GET_KEY
  576. CheckHiscore:
  577.  ld hl,(Hiscore)
  578.  ld de,(score)
  579.  or a
  580.  sbc hl,de
  581.  jp nc,NoHi
  582. NewHi:
  583.  ld hl,HiInitials
  584.  ld a,'A'
  585.  ld (hl),a
  586.  inc hl
  587.  ld (hl),a
  588.  inc hl
  589.  ld (hl),a
  590.  inc hl
  591.  inc hl
  592.  ld (hl),e
  593.  inc hl
  594.  ld (hl),d
  595.  call _clrLCD
  596.  ld (_currow),de
  597.  ld hl,HiText
  598.  call _puts
  599.  ld de,2
  600.  ld (_currow),de
  601.  call _puts
  602.  xor a
  603.  ld (count),a
  604.  ld ix,HiInitials
  605. ShowIni:
  606.  ld hl,$1002
  607.  ld (_currow),hl
  608.  ld hl,HiInitials
  609.  call _puts
  610. Invert:
  611.  ld a,(count)
  612.  ld d,0
  613.  ld e,a
  614.  ld hl,HiInitials
  615.  add a,16
  616.  ld (_curcol),a
  617.  ld a,(ix)
  618. ShowLet:
  619.  ld (ix),a
  620.  set textInverse,(iy+textflags)
  621.  call _putmap
  622.  res textInverse,(iy+textflags)
  623. IniKey:
  624.  call GET_KEY
  625.  ld hl,count
  626.  ld b,(ix)
  627.  cp K_ENTER
  628.  jr z,NextLet
  629.  dec a
  630.  jr z,LetDec
  631.  dec a
  632.  jr z,PrevLet
  633.  dec a
  634.  jr z,NextLet
  635.  dec a
  636.  jr nz,IniKey
  637. LetInc:
  638.  ld a,b
  639.  inc a
  640.  cp 91
  641.  jr nz,ShowLet
  642.  ld a,'A'
  643.  jr ShowLet
  644. LetDec:
  645.  ld a,b
  646.  dec a
  647.  cp 64
  648.  jr nz,ShowLet
  649.  ld a,'Z'
  650.  jr ShowLet
  651. PrevLet:
  652.  ld a,(hl)
  653.  or a
  654.  jr z,IniKey
  655.  dec ix
  656.  dec (hl)
  657.  jr ShowIni
  658. NextLet:
  659.  ld a,(hl)
  660.  cp 2
  661.  jr z,SaveHi
  662.  inc (hl)
  663.  inc ix
  664.  jr ShowIni
  665. SaveHi:
  666.  ld hl,ProgName
  667.  rst 20h
  668.  rst 10h
  669.  ex de,hl
  670.  ld a,b
  671.  ld de,HiInitials-_asm_exec_ram+4
  672.  add hl,de
  673.  adc a,0
  674.  ld de,HiInitials
  675.  ld b,6
  676. RepCopy:
  677.  push af
  678.  push hl
  679.  call $46C3
  680.  ld a,(de)
  681.  ld (hl),a
  682.  pop hl
  683.  pop af
  684.  call $4637
  685.  inc de
  686.  djnz RepCopy
  687. NoHi:
  688.  set appTextSave,(iy+appflags)
  689.  res OnInterrupt,(iy+onFlags)
  690.  call _clrScrn
  691.  call $4A95
  692.  ret
  693.  
  694. GetBoardPos:
  695.  ld c,h
  696.  ld b,0
  697.  ld a,l
  698.  add a,a
  699.  add a,a
  700.  add a,a
  701.  ld h,b
  702.  ld l,a
  703.  add hl,hl
  704.  add hl,hl
  705.  add hl,bc
  706.  ld bc,board
  707.  add hl,bc
  708.  ret
  709.  
  710. ShowPiece:
  711.  push de
  712.  push hl
  713.  call GetScreenOfs
  714.  ld b,3
  715. PutRow:
  716.  push bc
  717.  push hl
  718.  ld b,3
  719. PutCol:
  720.  ld a,(de)
  721.  inc de
  722.  or a
  723.  jr z,NoSq
  724.  push bc
  725.  push de
  726.  ld de,16
  727.  ld b,4
  728. PutSq:
  729.  ld a,c
  730.  xor (hl)
  731.  ld (hl),a
  732.  add hl,de
  733.  djnz PutSq
  734.  ld de,-64
  735.  add hl,de
  736.  pop de
  737.  pop bc
  738. NoSq:
  739.  ld a,c
  740.  cpl
  741.  ld c,a
  742.  cp $F0
  743.  jr nz,SameByte
  744.  inc hl
  745. SameByte:
  746.  djnz PutCol
  747.  pop hl
  748.  ld c,64
  749.  add hl,bc
  750.  pop bc
  751.  djnz PutRow
  752.  pop hl
  753.  pop de
  754.  ret
  755.  
  756. GetScreenOfs:
  757.  push de
  758.  ld a,h
  759.  ld h,l
  760.  ld l,0
  761.  ld d,l
  762.  srl h
  763.  rr l
  764.  srl h
  765.  rr l
  766.  ld c,$F0
  767.  srl a
  768.  jr nc,EvenX
  769.  ld c,$0F
  770. EvenX:
  771.  ld e,a
  772.  add hl,de
  773.  ld de,$FBA0
  774.  add hl,de
  775.  pop de
  776.  ret
  777.  
  778. ExtractPiece:
  779.  push de
  780.  ld hl,Pieces
  781.  ld b,0
  782.  ld c,a
  783.  srl c
  784.  srl c
  785.  srl c
  786.  add hl,bc
  787.  ld c,128
  788.  and 7
  789.  jr z,NoShift
  790.  ld b,a
  791. RepShift:
  792.  srl c
  793.  djnz RepShift
  794. NoShift:
  795.  ld b,9
  796. ExtractBit:
  797.  ld a,c
  798.  and (hl)
  799.  ld a,0
  800.  jr z,NoBit
  801.  inc a
  802. NoBit:
  803.  ld (de),a
  804.  inc de
  805.  inc hl
  806.  inc hl
  807.  inc hl
  808.  inc hl
  809.  inc hl
  810.  djnz ExtractBit
  811.  pop de
  812.  ret
  813.  
  814. Clear:
  815.  ld d,h
  816.  ld e,l
  817.  inc de
  818.  ld (hl),0
  819.  ldir
  820.  ret
  821.  
  822. Pieces:
  823.  .db %11111111,%11010110,%11101100,%11110011,%10111110
  824.  .db %11111111,%11011110,%01111111,%11111111,%11111010
  825.  .db %11011111,%10001111,%01110011,%01101011,%01011000
  826.  .db %11110110,%10111011,%11111010,%00101110,%01101110
  827.  .db %11101111,%11111111,%10011111,%11011101,%11100000
  828.  .db %11110101,%01111101,%11111100,%00010110,%10010000
  829.  .db %11011010,%11101001,%11000011,%00100000,%00000100
  830.  .db %10101111,%01100110,%00011001,%11011100,%00000000
  831.  .db %01111001,%00110001,%10100100,%10000000,%00000000
  832.  
  833. RotateData:
  834.  .db 2,5,8,1,4,7,0,3,6
  835.  
  836. SurData:
  837.  .db 1,1,30,1,1,30,1,1
  838.  
  839. GameOverText:
  840.  .db " Game Over ",0
  841.  
  842. SquarezText:
  843.  .db "Squarez",0
  844.  
  845. InfoText:
  846.  .db "Next",0
  847.  .db "Hi:",0
  848.  .db "Mult:",0
  849.  .db "Score:",0
  850.  .db "Time:",0
  851.  
  852. MultText:
  853.  .db "x1",0
  854.  
  855. HiText:
  856.  .db "A New Hiscore!",0
  857.  .db "Your initials: ",0
  858.  
  859. HiInitials:
  860.  .db "---",0
  861.  
  862. Hiscore:
  863.  .dw 0
  864.  
  865. ProgName:
  866.  .db $12,7,"squarez"
  867.  
  868. .end
  869.