home *** CD-ROM | disk | FTP | other *** search
/ ticalc.org / ticalc_org_rev_b.iso / archives / 82 / asm / source / crash / dstar82.asm < prev    next >
Encoding:
Assembly Source File  |  2001-07-01  |  11.4 KB  |  655 lines

  1. ;+------------------------------------------------------+
  2. ;|             DStar v2.5            |
  3. ;|             by Joe Wingbermuehle        |
  4. ;|              05-15-1998            |
  5. ;+------------------------------------------------------+
  6.  
  7. ; Visit my home page at:  http://www.usmo.com/~joewing/
  8. ; Send bugs/comments to:  joewing@usmo.com
  9.  
  10. ; Please do not modify this source in anyway!
  11.  
  12. #include    "crash82.inc"
  13.  
  14. ; the following are variables stored in apd safe ram (768 bytes)
  15. #define xc        APD_BUF
  16. #define yc        APD_BUF+2
  17. #define    loc        APD_BUF+4
  18. #define loc2        APD_BUF+6
  19. #define xloc        APD_BUF+8
  20. #define yloc        APD_BUF+10
  21. #define tmp        APD_BUF+12
  22. #define mvs        APD_BUF+14
  23. #define mv        APD_BUF+16
  24. #define lev        APD_BUF+18
  25. #define mvt        APD_BUF+19
  26. #define level        APD_BUF+20
  27.  
  28. #define string        TEXT_MEM+2
  29.  
  30. #define    number_of_levels    10
  31.  
  32.  
  33. ;------------ Beginning of ASM code ------------
  34. .db "DStar 2.5 by Joe W.",0
  35.  
  36. prog_start:
  37.  
  38. ;---------- Start of program ----------
  39.     ld    hl,$0000
  40.     ld    (mv),hl
  41.     ld    a,1
  42.     ld    (lev),a
  43.  
  44. ;---------= Decompress/Load level =---------
  45. start:    ld        a,$09
  46.     ld        (mvt),a
  47.     ld        hl,levels-26
  48.     ld        a,(lev)
  49.     ld        b,a
  50.     ld        de,26
  51. lslp1:    add        hl,de
  52.     djnz        lslp1
  53.     ld        de,level
  54.     ld        b,12
  55.     ld        a,$01
  56. lllp0:    ld        (de),a
  57.     inc        de
  58.     djnz        lllp0
  59.     ld        bc,21*256+3
  60.     call    vector0        ; decompress
  61.  
  62.     ld        b,12
  63.     ld        a,$01
  64. lllp2:    ld        (de),a
  65.     inc        de
  66.     djnz        lllp2
  67.     ld        a,(hl)
  68.     ld        (yloc),a
  69.     ld        (yc),a
  70.     inc        hl
  71.     ld        a,(hl)
  72.     ld        (xloc),a
  73.     ld        (xc),a
  74.     push        hl
  75.     call        align
  76.     ld        (loc2),hl
  77.     pop        bc
  78.     inc        bc
  79.     ld        a,(bc)
  80.     ld        (yc),a
  81.     inc        bc
  82.     ld        a,(bc)
  83.     ld        (xc),a
  84.     call        align
  85.     ld        (loc),hl
  86.     inc        bc
  87.     ld        a,(bc)
  88.     ld        (mvs),a
  89. begin:    ld        a,$09
  90.     ld        (mvt),a
  91.     ld        b,108
  92.     ld        de,level
  93.     ld        ix,GRAPH_MEM
  94. dlp1:    push        bc
  95.     ld        a,(de)
  96.     inc        a
  97.     ld        hl,pieces-7
  98.     ld        bc,$0007
  99. dlp2:    add        hl,bc
  100.     dec        a
  101.     jr        nz,dlp2
  102.     ld        b,$07
  103. dlp3:    ld        a,(hl)
  104.     ld        (ix),a
  105.     inc        hl
  106.     push        bc
  107.     ld        bc,$000C
  108.     add        ix,bc
  109.     pop        bc
  110.     djnz        dlp3
  111.     ld        bc,-1*(7*12-1)
  112.     add        ix,bc
  113.     pop        bc
  114.     ld        c,$0C
  115.     dec        b
  116.     call        mod
  117.     jr        nz,dsk
  118.     push        bc
  119.     ld        bc,6*12
  120.     add        ix,bc
  121.     pop        bc
  122. dsk:    inc        b
  123.     inc        de
  124.     djnz        dlp1
  125.  
  126.     ld    bc,(12*6)*256+0
  127.     ld    hl,GRAPH_MEM+((12*64)-(12*6))
  128. filllp:    ld    (hl),c
  129.     inc    hl
  130.     djnz    filllp
  131.  
  132.     set    7,(iy+20)    ; write to graphbuffer
  133.  
  134.     call        swap
  135.     call        swap
  136.  
  137. ;---------= Main program loop =---------
  138. main:    xor        a
  139.     ld        (mvt),a
  140.     ld        a,(mvs)
  141.     or        a
  142.     jp        z,won
  143.     ld        hl,$3A00
  144.     ld        (CURSOR_X),hl
  145.     ld        hl,nxlv
  146.     ROM_CALL(D_ZM_STR)
  147.     ld        a,(lev)
  148.     call        DispA
  149.     ld        hl,blank
  150.     ROM_CALL(D_ZM_STR)
  151.     ld        hl,numm
  152.     ROM_CALL(D_ZM_STR)
  153.     ld        hl,(mv)
  154.     ld        a,h
  155.     and        l
  156.     cp        $FF
  157.     jr        z,lost
  158.     call DispHL
  159.     ld    a,67
  160.     ld    (CURSOR_X),a
  161.     ld    hl,help1
  162.     ROM_CALL(D_ZM_STR)
  163.     call        CR_GRBCopy
  164.  
  165. keylp:    call    GET_KEY
  166.     cp    G_DOWN
  167.     jp    z,mdown
  168.     cp    G_LEFT
  169.     jp    z,mleft
  170.     cp    G_RIGHT
  171.     jp    z,mright
  172.     cp    G_UP
  173.     jp    z,mup
  174.     cp    G_2ND
  175.     jp    z,mswap
  176.     cp    G_TRACE
  177.     jp    z,savegame
  178.     cp    G_GRAPH
  179.     jp    z,loadgame
  180.     cp    G_ALPHA
  181.     jp    z,start
  182.     cp    G_CLEAR
  183.     jr    nz,keylp
  184.  
  185. ;---------- We have a losser! ----------
  186. lost:    ld        hl,losser
  187. exit:    set        3,(iy+5)
  188.     ld        bc,$0403
  189.     ld        (CURSOR_POS),bc
  190.     ROM_CALL(D_LT_STR)
  191.     res        3,(iy+5)
  192.     jp        wkey
  193.  
  194. ;---------- We have a winner! ----------
  195. won:    ld        a,(lev)
  196.     inc        a
  197.     ld        (lev),a
  198.     cp        number_of_levels+1
  199.     jp        nz,start
  200.     ld        hl,winner
  201.     jr        exit
  202.  
  203. ;---------- Swap pieces ----------
  204. mswap:    call        swap
  205.     jp        main
  206.  
  207. swap:    ld        a,(loc)
  208.     ld        bc,(loc2)
  209.     ld        (loc),bc
  210.     ld        (loc2),a
  211.     ld        de,p2
  212.     call        sprite
  213.     ld        a,(xloc)
  214.     ld        bc,(xc)
  215.     ld        (xc),a
  216.     ld        (xloc),bc
  217.     ld        a,(yloc)
  218.     ld        bc,(yc)
  219.     ld        (yloc),bc
  220.     ld        (yc),a
  221.     ld        de,p1
  222.     jp        sprite
  223.  
  224. ;---------- Move Left ----------
  225. mleft:    ld        bc,(loc)
  226.     dec        bc
  227.     ld        a,(loc2)
  228.     cp        c
  229.     jp        z,main
  230.     ld        hl,level
  231.     add        hl,bc
  232.     ld        a,(hl)
  233.     or        a
  234.     jr        nz,mlc
  235. mlcn:    ld        (loc),bc
  236.     ld        de,p3
  237.     call        sprite
  238.     ld        a,(xc)
  239.     dec        a
  240.     ld        (xc),a
  241.     ld        de,p1
  242.     call        sprite
  243.     jr        mleft
  244. mlc:    cp        $02
  245.     jp        nz,main
  246.     ld        a,(mvs)
  247.     dec        a
  248.     ld        (mvs),a
  249.     xor        a
  250.     ld        (hl),a
  251.     jr        mlcn
  252.  
  253. ;---------- Move Right ----------
  254. mright:    ld        bc,(loc)
  255.     inc        bc
  256.     ld        a,(loc2)
  257.     cp        c
  258.     jp        z,main
  259.     ld        hl,level
  260.     add        hl,bc
  261.     ld        a,(hl)
  262.     or        a
  263.     jr        nz,mrc
  264. mrcn:    ld        (loc),bc
  265.     ld        de,p3
  266.     call        sprite
  267.     ld        a,(xc)
  268.     inc        a
  269.     ld        (xc),a
  270.     ld        de,p1
  271.     call        sprite
  272.     jr        mright
  273. mrc:    cp        $02
  274.     jp        nz,main
  275.     ld        a,(mvs)
  276.     dec        a
  277.     ld        (mvs),a
  278.     xor        a
  279.     ld        (hl),a
  280.     jr        mrcn
  281.  
  282. ;---------- Move Up ----------
  283. mup:
  284.     Ld        hl,(loc)
  285.     ld        bc,12
  286.     or        a        ;reset carry
  287.     sbc        hl,bc
  288.     ld        b,h
  289.     ld        c,l
  290.     
  291.     ld        a,(loc2)
  292.     cp        c
  293.     jp        z,main
  294.     ld        hl,level
  295.     add        hl,bc
  296.     ld        a,(hl)
  297.     or        a
  298.     jr        nz,muc
  299. mucn:    ld        (loc),bc
  300.     ld        de,p3
  301.     call        sprite
  302.     ld        a,(yc)
  303.     dec        a
  304.     ld        (yc),a
  305.     ld        de,p1
  306.     call        sprite
  307.     jr        mup
  308. muc:    cp        $02
  309.     jp        nz,main
  310.     ld        a,(mvs)
  311.     dec        a
  312.     ld        (mvs),a
  313.     xor        a
  314.     ld        (hl),a
  315.     jr        mucn
  316.  
  317. ;---------- Move Down ----------
  318. mdown:
  319.     Ld        hl,(loc)
  320.     ld        bc,12
  321.     add        hl,bc
  322.     ld        b,h
  323.     ld        c,l
  324.  
  325.     ld        a,(loc2)
  326.     cp        c
  327.     jp        z,main
  328.     ld        hl,level
  329.     add        hl,bc
  330.     ld        a,(hl)
  331.     or        a
  332.     jr        nz,mdc
  333. mdcn:    ld        (loc),bc
  334.     ld        de,p3
  335.     call        sprite
  336.     ld        a,(yc)
  337.     inc        a
  338.     ld        (yc),a
  339.     ld        de,p1
  340.     call        sprite
  341.     jr        mdown
  342. mdc:    cp        $02
  343.     jp        nz,main
  344.     ld        a,(mvs)
  345.     dec        a
  346.     ld        (mvs),a
  347.     xor        a
  348.     ld        (hl),a
  349.     jr        mdcn
  350.  
  351. ;---------- Display a 8*7 sprite ----------
  352. sprite:    ld        hl,GRAPH_MEM-(12*7)
  353.     ld        a,(yc)
  354.     inc        a
  355.     ld        bc,12*7
  356. slp1:    add        hl,bc
  357.     dec        a
  358.     jr        nz,slp1
  359.     ld        a,(xc)
  360.     ld        c,a
  361.     add        hl,bc
  362.     ld        b,$07
  363. slpb:    ld        a,(de)
  364.     ld        (hl),a
  365.     inc        de
  366.     push        bc
  367.     ld        bc,$000C
  368.     add        hl,bc
  369.     pop        bc
  370.     djnz        slpb
  371.     ld        a,(mvt)
  372.     or        a
  373.     ret        nz
  374.     ld        a,$09
  375.     ld        (mvt),a
  376.     ld        hl,(mv)
  377.     inc        hl
  378.     ld        (mv),hl
  379.     ret
  380.  
  381. ;---------- Wait for a keypress ----------
  382. wkey:    ei
  383.     call    GET_KEY
  384.     or    a
  385.     jr    z,wkey
  386.     ret
  387.  
  388. ;---------= Align hl to (xc,yc) =---------
  389. align:    ld        a,(yc)
  390.     ld        l,a
  391.     ld        e,a
  392.     ld        h,$00
  393.     ld        d,h
  394.     add        hl,de
  395.     add        hl,de
  396.     add        hl,hl
  397.     add        hl,hl
  398.     ld        a,(xc)
  399.     ld        e,a
  400.     add        hl,de
  401.     ret
  402.  
  403. DispA:
  404.        ld h,0
  405.       ld l,a
  406.  
  407. DispHL:
  408.         push de
  409.         push hl
  410.         ld de,string+5
  411.         xor a
  412.         ld (de),a
  413. Repeat:
  414.         call UNPACK_HL
  415.         add a,'0'
  416.         dec de
  417.         ld (de),a
  418.         ld a,h
  419.         or l
  420.         jr nz,Repeat
  421.         ex de,hl
  422.         ROM_CALL(D_ZM_STR)
  423.         pop hl
  424.         pop de
  425.         ret
  426. ;---------= Find the Modulus of b/c =---------
  427. mod:    ld        a,b
  428. modlp:    sub        c
  429.     ret        c
  430.     jr        nz,modlp
  431.     ret
  432.  
  433. ;---------= Save a Game =---------
  434. savegame:
  435.     ld        de,savearea
  436.     ld        hl,xc
  437.     ld        bc,$0084
  438.     ldir
  439.     set        3,(iy+5)
  440.     ld        hl,1*256+3
  441.     ld        (CURSOR_POS),hl
  442.     ld        hl,svtxt
  443.     ROM_CALL(D_LT_STR)
  444.     res        3,(iy+5)
  445.     call        wkey
  446. saved:    jp        main
  447.  
  448. ;---------= Load a Game =---------
  449. loadgame:
  450.     ld        hl,savearea
  451.     ld        a,(hl)
  452.     or        a        ; make sure there is a saved game
  453.     jr        z,saved
  454.     ld        de,xc
  455.     ld        bc,$0084
  456.     ldir
  457.     set        3,(iy+5)
  458.     ld        hl,1*256+3
  459.     ld        (CURSOR_POS),hl
  460.     ld        hl,ldtxt
  461.     ROM_CALL(D_LT_STR)
  462.     res        3,(iy+5)
  463.     call        wkey
  464.     jp        begin
  465.  
  466. ;---------= Messages =----------
  467. nxlv:    .db        "Lev: ",0
  468. numm:    .db        "Moves:"
  469. blank:    .db        " ",0
  470. losser:    .db        8,"You Lost"
  471. winner:    .db        8,"You Won!"
  472. dstar:    .db        "DStar v2.5 by Joe "
  473.     .db        "Wingbermuehle",$00
  474. svtxt:    .db        14,"- Game Saved -"
  475. ldtxt:    .db        14,"- Game Loaded -"
  476. help1:    .db        "Sav        Ld",0
  477.  
  478.  
  479.     #define    data    TEXT_MEM    ; 2 bytes of data
  480.     
  481. ;---------= Decompress =---------
  482. ; input:
  483. ;    hl->compressed data
  484. ;    de->place to load data
  485. ;    b=length of compressed data
  486. ;    c=compression factor (1, 3, or 15)
  487. ; output:
  488. ;    level is decompressed
  489. ;    hl->next byte of compressed data
  490. vector0:
  491. decomp:    push    bc
  492.     ld    a,(hl)
  493.     ld    (data),a
  494.     ld    a,c
  495.     ld    b,$08
  496.     cp    $0F
  497.     jr    nz,dmpc
  498.     ld    b,$02
  499. dmpc:    cp    $03
  500.     jr    nz,dcmp1
  501.     ld    b,$04
  502. dcmp1:    push    bc
  503.     ld    a,c
  504.     ld    b,$01
  505.     cp    $0F
  506.     jr    nz,dcmpa
  507.     ld    b,$04
  508. dcmpa:    cp    $03
  509.     jr    nz,dcmpb
  510.     ld    b,$02
  511. dcmpb:    ld    a,(data)
  512. dcmp2:    rlca
  513.     djnz    dcmp2
  514.     ld    (data),a
  515.     and    c
  516.     ld    (de),a
  517.     inc    de
  518.     pop    bc
  519.     djnz    dcmp1
  520.     inc    hl
  521.     pop    bc
  522.     djnz    decomp
  523.     ret
  524. ;---------= Sprite Data =---------
  525. p3:
  526. pieces:
  527.     .db        $00,$00,$00,$00,$00,$00,$00
  528.     .db        11110111b
  529.     .db        11110111b
  530.     .db        11110111b
  531.     .db        00000000b
  532.     .db        10111111b
  533.     .db        10111111b
  534. icon:    .db        00000000b
  535.     .db        00000000b
  536.     .db        00000000b
  537.     .db        00011000b
  538.     .db        00100100b
  539.     .db        00100100b
  540.     .db        00011000b
  541.     .db        00000000b
  542.     .db        %11111110
  543.     .db        %10000010
  544.     .db        %10000010
  545.     .db        %10000010
  546.     .db        %10000010
  547.     .db        %11111110
  548. p1:    .db        00000000b
  549.     .db        00000000b
  550.     .db        00011000b
  551.     .db        00101100b
  552.     .db        00111100b
  553.     .db        00011000b
  554. p2:    .db        00000000b
  555.     .db        01000100b
  556.     .db        00111000b
  557.     .db        00101000b
  558.     .db        00111000b
  559.     .db        01000100b
  560.     .db        00000000b
  561.  
  562. ;---------- Level Data ----------
  563. ; each level is 26 bytes
  564. ; %00 = nothing
  565. ; %01 = wall
  566. ; %10 = dot
  567. ; %11 = stopper
  568.  
  569. savearea:
  570.     .db    $00
  571.     .ds    $0083
  572.  
  573. levels:    .db        %01000100,%00000000,%00000101
  574.     .db        %01000100,%00000000,%10000101
  575.     .db        %01000101,%00001000,%00000001
  576.     .db        %01000001,%10000000,%00000001
  577.     .db        %01000001,%00000001,%01010001
  578.     .db        %01001000,%00000000,%00000001
  579.     .db        %01000000,%00000000,%00100001
  580.     .db        $07,$06,$07,$04,$05
  581.     .db        %01000000,%00000000,%00011001
  582.     .db        %01000000,%00100000,%00000001
  583.     .db        %01000000,%00000000,%00000001
  584.     .db        %01011001,%00010000,%01000101
  585.     .db        %01000110,%01000001,%10010001
  586.     .db        %01000000,%00000000,%00000001
  587.     .db        %01000001,%00000000,%01000001
  588.     .db        $07,$06,$07,$04,$05
  589.     .db        %01000000,%00000000,%00010001
  590.     .db        %01000001,%01000000,%01010001
  591.     .db        %01001001,%10000000,%00000001
  592.     .db        %01000000,%00000101,%00000001
  593.     .db        %01000000,%00001001,%00100001
  594.     .db        %01000110,%00000000,%00000001
  595.     .db        %01000101,%00010000,%00000001
  596.     .db        $07,$06,$07,$04,$05
  597.     .db        %01000000,%00000000,%00000001
  598.     .db        %01010000,%00011000,%00000001
  599.     .db        %01000000,%01010100,%00000001
  600.     .db        %01000100,%10010000,%01100001
  601.     .db        %01010101,%00000001,%01010001
  602.     .db        %01000110,%00000000,%01100001
  603.     .db        %01000000,%00000000,%00010001
  604.     .db        $07,$06,$07,$04,$05
  605.     .db        %01010101,%00000000,%00000001
  606.     .db        %01010100,%00011001,%00000001
  607.     .db        %01010000,%00100110,%00000001
  608.     .db        %01000000,%00011001,%10000001
  609.     .db        %01000000,%01000000,%01000001
  610.     .db        %01000000,%00000000,%00000101
  611.     .db        %01000000,%00000000,%00010101
  612.     .db        $07,$06,$07,$04,$05
  613.     .db        %01000000,%00000101,%00000001
  614.     .db        %01000000,%00000001,%10010001
  615.     .db        %01000100,%01000010,%01000001
  616.     .db        %01001001,%10000001,%10010001
  617.     .db        %01000100,%01000000,%00000001
  618.     .db        %01000000,%00000000,%00000001
  619.     .db        %01000000,%00000000,%00010001
  620.     .db        $07,$06,$07,$04,$05
  621.     .db        %01010101,%01000000,%00000001
  622.     .db        %01010101,%00000000,%00000101
  623.     .db        %01010110,%00011000,%00000001
  624.     .db        %01011000,%01010100,%00100101
  625.     .db        %01000000,%00010000,%10010101
  626.     .db        %01010000,%00000000,%01010101
  627.     .db        %01000000,%00000001,%01010101
  628.     .db        $07,$06,$07,$04,$05
  629.     .db        %01000000,%00000000,%00000001
  630.     .db        %01000001,%10000001,%01000001
  631.     .db        %01000001,%01010010,%01100001
  632.     .db        %01000000,%00010000,%00000001
  633.     .db        %01010101,%00100000,%00000001
  634.     .db        %01010110,%00000101,%01000001
  635.     .db        %01000000,%00000000,%00000001
  636.     .db        $07,$06,$07,$04,$05
  637.     .db        %01000000,%00000000,%00000001
  638.     .db        %01000101,%10000001,%01000001
  639.     .db        %01000100,%01000110,%00000001
  640.     .db        %01000100,%01001001,%10000001
  641.     .db        %01000100,%01000010,%01000001
  642.     .db        %01000101,%00000101,%00000001
  643.     .db        %01000000,%00000000,%00000001
  644.     .db        $07,$06,$07,$04,$05
  645.     .db        %01000000,%00000000,%00000001
  646.     .db        %01000001,%00000101,%00000001
  647.     .db        %01000100,%01000010,%01000001
  648.     .db        %01001001,%10000001,%10000001
  649.     .db        %01000100,%01000010,%01000001
  650.     .db        %01000001,%00000101,%00000001
  651.     .db        %01000000,%00000000,%00000001
  652.     .db        $07,$06,$07,$04,$05
  653.  
  654. .end
  655. END