Space Invaders

Reply

Join Date: Jan 2009
Posts: 5
Reputation: Joonas is an unknown quantity at this point 
Solved Threads: 0
Joonas Joonas is offline Offline
Newbie Poster

Space Invaders

 
0
  #1
May 5th, 2009
Hello All!

Here is code of Space Invaders game. It is x86 Assembly

Enjoy!

  1.  
  2. ;;; $RCSfile: part0.asm,v $ $Revision: 1.8 $ $Date: 2005/03/09 15:31:55 $
  3.  
  4.  
  5. BITS 16 ; outputin koko bitteinä
  6.  
  7. stacksize EQU 0200h ; pinon koko
  8.  
  9. videobase EQU 0a000h ; starting address of video memory
  10.  
  11.  
  12. delay EQU 150 ; main loop viive
  13.  
  14.  
  15. ; some colors
  16.  
  17. black EQU 0
  18. green EQU 00110000b
  19. blue EQU 00001001b
  20. red EQU 00000100b
  21. white EQU 00001111b
  22. grey EQU 00000111b
  23.  
  24.  
  25. scrwidth EQU 320 ; screen width in pixels, in the graphics mode 320x200
  26.  
  27. Aluksenriviosoite EQU 150*scrwidth ; aluksen rivi
  28. Aluksenleveys EQU 28
  29. Aluksenkorkeus EQU 12
  30.  
  31. Tykinleveys EQU 5
  32. Tykinkorkeus EQU 5
  33. TykinPiirtoPisteeseen EQU ( -Aluksenkorkeus*scrwidth - Tykinkorkeus*scrwidth + Aluksenleveys/2 - Tykinleveys/2 )
  34.  
  35. ; Invader constants
  36. InvaderRows EQU 3
  37. InvadersPerRow EQU 5
  38. InvaderStartLoc EQU 13*scrwidth ; Location of the upperleftmost invader at the start of the game
  39. InvaderDistance_x EQU 50 ; invaderien välinen matka, HUOM: oltava InvadersPerRow*InvaderDistance_x < 320
  40. InvaderSpeed EQU 1
  41. InvaderDistance_y EQU 12*scrwidth ; esim. 12 riviä
  42. InvaderGoal EQU 107*scrwidth ; millä rivillä on invaderien maali
  43. InvaderRiviMuutos EQU 3 ; montako rivia invader laskeutuu reunalla
  44.  
  45. InvaderType EQU 1 ; type of invader (0-2)
  46. InvaderMatka EQU (scrwidth - (InvadersPerRow - 1)*InvaderDistance_x - 14) ; on matka, jonka invaderit kävelee yhdellä rivillä
  47.  
  48.  
  49. ;---------------------------------------------------------------------------------------------------
  50.  
  51.  
  52. segment mystack stack ; pino sekmentti
  53. resb stacksize ; varataan tila pinolle
  54.  
  55. stacktop:
  56.  
  57.  
  58. ;----------------------------------------------------------------------------------------------------
  59.  
  60.  
  61. segment mydata data ;data segmentti
  62.  
  63. shiplocation dw (Aluksenriviosoite + scrwidth/2) ; vanhan kuvan paikka
  64. newshiplocation dw (Aluksenriviosoite + scrwidth/2) ; uuden kuvan paikka
  65. shotlocation dw 0 ; ammuksen paikka
  66. fire dw 0 ; laukaustapahtuma (?)
  67. laskuri dw 0 ; laskuri, joka laskee 16
  68. laskuri2 dw 0 ; laskuri, joka laskee 110
  69. pisteenpaikka dw 0 ; pisteenpaikka
  70. mika_morko dw 0 ; mikä mörkö
  71. osumat dw 0 ; osuma contteri
  72. hyppy dw 0 ; hyppymuuttuja, jotta voidaan hypata pidemmalle koodissa
  73. animationstep dw 0 ; muuttuja joka kertoo jalkojen heiluttamisen
  74.  
  75.  
  76.  
  77. invaderLocation dw InvaderStartLoc
  78. InvaderStatus db green, green, green, green, green, blue, blue, blue, blue, blue, red, red, red, red, red
  79. invaderDirection dw 1
  80.  
  81.  
  82. Voitto DB ' Sina voitit! Press Esc to continue..$'
  83. Havio DB 13,10,' Sina havisit! Press Esc to continue..',13,10,'$'
  84.  
  85.  
  86. oldvideomode db 0 ; Varataan yksi tavu
  87. pressesc dw 0 ; one word variable pressesc with value of 0
  88.  
  89. ; HUOM ÄLÄ LAITA 0 NÄIHIN!!!!
  90. oldintseg resw 1
  91. oldintoff resw 1
  92.  
  93.  
  94.  
  95. ;-----------------------------------------------------------------------------------------------------
  96.  
  97.  
  98. segment mycode code ; Koodi segmentti
  99.  
  100.  
  101.  
  102. KeybInt:
  103. push ds ; put the value of ds,ax to safety
  104. push ax
  105.  
  106. mov ax,mydata ; Re-initialisation of
  107. mov ds,ax ; the data segment
  108.  
  109. cli ; Disable other interrupts
  110. ; during this one
  111.  
  112. .getstatus:
  113. in al, 64h
  114. test al, 02h
  115. loopnz .getstatus ; wait until the port is ready
  116.  
  117. in al,60h ; Get the scan code of
  118. ; the pressed/released key
  119.  
  120. ; scan codes can be found in helppc
  121. ; interrupt services ->
  122. ; keyboard interrupt -> make codes
  123.  
  124. ; here begins the actual key scanning
  125.  
  126. cmp al, 01h ; 1 is the scan code for ESC
  127. jne .kbread ; if ESC was not pressed, continue
  128.  
  129. mov word [pressesc], 1
  130.  
  131. .kbread:
  132. in al,61h ; Send acknowledgment without
  133. or al,10000000b ; modifying the other bits.
  134. out 61h,al ;
  135. and al,01111111b ;
  136. out 61h,al ;
  137. mov al,20h ; Send End-of-Interrupt signal
  138. out 20h,al ;
  139.  
  140. sti ; Enable interrupts again
  141.  
  142. pop ax
  143. pop ds ; Regain the ds,ax from stack
  144.  
  145. iret ; Return from interrupt
  146.  
  147.  
  148.  
  149.  
  150. ; Mouse interrupt subroutine
  151. MouseInt:
  152.  
  153.  
  154.  
  155. push cx
  156. push ds
  157.  
  158. mov cx, mydata ; Re-initialization of the data segment
  159. mov ds, cx ; (must be done in interrupt subroutines)
  160.  
  161. pop ds
  162. pop cx
  163.  
  164.  
  165. push di
  166.  
  167. add cx,Aluksenriviosoite ; Astetetaan aluksen paikka
  168.  
  169. mov word [newshiplocation],cx
  170.  
  171.  
  172. ; tarkistetaan onko "ammuttu"
  173. cmp bx,1 ; jos on painettu, bx=1, tarkistetaan..
  174. jne .hyppaayli ; jos ei oo painettu, hyppaa yli
  175. mov word [fire] ,1h ; jos on painettu, fire = 1
  176. mov di,[shotlocation] ; jos on ammuttu, pitää myös vanha ammus tuhota
  177. mov byte [es:di],black
  178.  
  179.  
  180.  
  181. .hyppaayli
  182.  
  183.  
  184. pop di
  185.  
  186. retf
  187.  
  188.  
  189.  
  190. ;--------------------------------------------------------------------------------------------------
  191.  
  192.  
  193.  
  194. mikamorko:
  195.  
  196.  
  197. push cx
  198. push bx
  199. push dx
  200. push di
  201.  
  202. mov cx,(InvaderRows+2) ;loop countterin alustus, varmuuden vuoksi vähän isommaksi
  203. mov dx,0
  204.  
  205.  
  206. inc di ; korjaa bugin, jossa osuma tappoi viereisen olion
  207.  
  208. .loop
  209.  
  210.  
  211. sub di,InvaderDistance_y
  212.  
  213. cmp di,[invaderLocation]
  214.  
  215. jb .poistumispaikka
  216.  
  217. add dx,InvadersPerRow
  218.  
  219.  
  220. LOOP .loop
  221.  
  222.  
  223.  
  224. .poistumispaikka
  225.  
  226.  
  227. mov cx,(InvaderDistance_y / scrwidth + 2)
  228.  
  229.  
  230. .loop2
  231.  
  232.  
  233. add di,scrwidth
  234. cmp di,[invaderLocation]
  235.  
  236. ja .poistumispaikka2 ; pudottaudutaan samalle riville
  237.  
  238.  
  239. LOOP .loop2
  240.  
  241.  
  242.  
  243. .poistumispaikka2
  244.  
  245.  
  246. mov cx, (InvadersPerRow + 2) ;loop countterin alustus, varmuuden vuoksi vähän isommaksi
  247.  
  248.  
  249. .loop3
  250.  
  251.  
  252. sub di,InvaderDistance_x
  253.  
  254. cmp di,[invaderLocation]
  255.  
  256. jb .poistumispaikka3
  257.  
  258. inc dx
  259.  
  260.  
  261. LOOP .loop3
  262.  
  263.  
  264. .poistumispaikka3
  265.  
  266.  
  267. mov [mika_morko],dx
  268.  
  269.  
  270. pop di
  271. pop dx
  272. pop bx
  273. pop cx
  274.  
  275.  
  276. ret
  277.  
  278.  
  279.  
  280.  
  281.  
  282. moveshot: ; liikuttaa paukkua
  283.  
  284. push di
  285. push bx
  286.  
  287. mov word di,[shotlocation]
  288.  
  289. ; ensin mustaksi "vanha" ammus
  290.  
  291. mov byte [es:di],black
  292.  
  293. cmp word di,scrwidth ; tarkistetaan ollaanko yläreunassa
  294. ja .hyppaayli ; jos ei, hypataan vain yli
  295. mov word [shotlocation],0h ; jos ollaan, tuhotaan ammus
  296. jmp .hyppaayli2
  297.  
  298.  
  299.  
  300.  
  301. .hyppaayli
  302.  
  303. sub word di, scrwidth ; shotlocation yksi ylöspäin
  304. sub word [shotlocation],scrwidth
  305. ; tarkistetaan seuraavan pikselin väri
  306. mov bx,[es:di] ; Haetaan väri bx:ään
  307. cmp bx,0 ; tarkistetaan onko nolla
  308. je .hyppaayli1 ; jos oli niin laiteteean valkoiseksi
  309. ; jos ei niin tuhotaan invader
  310. ; selvitetään mihinkä mörköön osuttu
  311. call mikamorko ; Huom! osumakoordinaatti on di:ssä
  312.  
  313. push bx
  314.  
  315. mov bx,InvaderStatus ; Kun tiedetään kehen on osuttu, pistetään kyseisen moron status=0
  316.  
  317. add bx,[mika_morko]
  318.  
  319. mov byte [bx],0h
  320.  
  321. pop bx
  322.  
  323.  
  324. mov word [shotlocation],0h ; kun osutaan, tuhotaan myös paukku
  325.  
  326.  
  327. inc word [osumat] ; kasvatetaan osumat laskuria
  328.  
  329.  
  330. jmp .hyppaayli2
  331.  
  332.  
  333.  
  334.  
  335. .hyppaayli1
  336.  
  337. mov byte [es:di], white
  338.  
  339.  
  340. .hyppaayli2
  341.  
  342. pop bx
  343. pop di
  344.  
  345.  
  346. ret
  347.  
  348.  
  349.  
  350.  
  351.  
  352.  
  353.  
  354.  
  355. fireshot: ; asettaa ammuksen lähtöpisteeseen
  356.  
  357. push ax
  358.  
  359. mov word ax,[shiplocation]
  360.  
  361. add ax, (Aluksenleveys/2 - Tykinkorkeus*scrwidth) ; mennään shiplocationista piippuun
  362.  
  363. mov word [shotlocation],ax
  364.  
  365. mov word [fire],0h ; nollaa fire
  366.  
  367. pop ax
  368.  
  369. ret
  370.  
  371.  
  372.  
  373.  
  374.  
  375.  
  376.  
  377. eraseship: ; poistaa vanhan avaruusaluksen
  378.  
  379. push ax ; ax työnnetään pinoon
  380. push bx ; bx myös
  381. push di
  382.  
  383.  
  384. mov ax, (-Aluksenleveys)
  385. mov word di,[shiplocation] ; avaruusaluksen sijainti asetetaan di-muistipaikkaan
  386. mov bx, (-Aluksenkorkeus)
  387.  
  388.  
  389.  
  390. .Alusloop ; Alus loop
  391.  
  392. mov byte [es:di], black ; pikselin piirto
  393. inc di ; mene seuraavaan pikseliin
  394. inc ax ; incrementoi vaaka-loop-laskuria
  395. cmp ax,0h
  396. jne .Alusloop
  397. add di,(scrwidth-Aluksenleveys) ; Menee seuraaval rivin alkuun
  398. inc bx ; inkrementoi pysty-loopin laskuria
  399. mov ax, (-Aluksenleveys)
  400. cmp bx,0h ; jos bx=0, on kaikki rivit piirretty
  401.  
  402. jne .Alusloop
  403.  
  404.  
  405. mov ax, (-Tykinleveys)
  406. add di, TykinPiirtoPisteeseen ; Tykin piirtopiste
  407. mov bx, (-Tykinkorkeus)
  408.  
  409.  
  410. .Tykkiloop ; Tykki loop
  411.  
  412. mov byte [es:di], black ; toimii vastaavasti, muuta piirtaa pienemman nelion
  413. inc di
  414. inc ax
  415. cmp ax,0h
  416.  
  417. jne .Tykkiloop
  418.  
  419. add di,(scrwidth-Tykinleveys) ; Menee seuraaval rivin alkuun
  420. inc bx
  421. mov ax, (-Tykinleveys)
  422. cmp bx,0h
  423.  
  424. jne .Tykkiloop
  425.  
  426.  
  427. pop di
  428. pop bx
  429. pop ax
  430.  
  431.  
  432. ret
  433.  
  434.  
  435.  
  436.  
  437.  
  438.  
  439. drawship: ; poistaa vanhan avaruusaluksen
  440.  
  441. push ax ; ax työnnetään pinoon
  442. push bx ; bx myös
  443. push di
  444.  
  445.  
  446. mov ax,(-Aluksenleveys)
  447. mov word di,[shiplocation] ; avaruusaluksen sijainti asetetaan di-muistipaikkaan
  448. mov bx,(-Aluksenkorkeus)
  449.  
  450.  
  451.  
  452. .Alusloop ; Alus loop
  453.  
  454. mov byte [es:di], blue ; pikselin piirto
  455. inc di ; mene seuraavaan pikseliin
  456. inc ax ; incrementoi vaaka-loop-laskuria
  457. cmp ax,0h
  458. jne .Alusloop
  459. add di,(scrwidth-Aluksenleveys) ; Menee seuraaval rivin alkuun
  460. inc bx ; inkrementoi pysty-loopin laskuria
  461. mov ax,(-Aluksenleveys)
  462. cmp bx,0h ; jos bx=0, on kaikki rivit piirretty
  463.  
  464. jne .Alusloop
  465.  
  466.  
  467.  
  468. mov ax,(-Tykinleveys)
  469. add di,TykinPiirtoPisteeseen ; Tykin piirtopiste
  470. mov bx,(-Tykinkorkeus)
  471.  
  472.  
  473. .Tykkiloop ; Tykki loop
  474.  
  475. mov byte [es:di], white ; toimii vastaavasti, muuta piirtaa pienemman nelion
  476. inc di
  477. inc ax
  478. cmp ax,0h
  479.  
  480. jne .Tykkiloop
  481.  
  482. add di,(scrwidth-Tykinleveys) ; Menee seuraaval rivin alkuun
  483. inc bx
  484. mov ax,(-Tykinleveys)
  485. cmp bx,0h
  486.  
  487. jne .Tykkiloop
  488.  
  489.  
  490. pop di
  491. pop bx
  492. pop ax
  493.  
  494.  
  495. ret
  496.  
  497.  
  498.  
  499.  
  500.  
  501. drawInvader:
  502.  
  503.  
  504. pusha ; pistää kaikki rekisterit pinoon
  505.  
  506.  
  507. CMP BX, 0
  508. je .i1
  509. jmp .i2
  510.  
  511.  
  512. .i1
  513. cmp CX, 0
  514. je .invader11
  515. jmp .invader12
  516.  
  517. .invader11:
  518. add di, 5
  519. mov byte [es:di], al
  520. inc di
  521. mov byte [es:di], al
  522. add di, 318
  523. mov cx, 4
  524. .loop1:
  525. mov byte [es:di], al
  526. inc di
  527. loop .loop1
  528. add di, 315
  529. mov cx, 6
  530. .loop2:
  531. mov byte [es:di], al
  532. inc di
  533. loop .loop2
  534. add di, 313
  535. mov byte [es:di], al
  536. inc di
  537. mov byte [es:di], al
  538. inc di
  539. inc di
  540. mov byte [es:di], al
  541. inc di
  542. mov byte [es:di], al
  543. inc di
  544. inc di
  545. mov byte [es:di], al
  546. inc di
  547. mov byte [es:di], al
  548. add di, 313
  549. mov cx, 8
  550. .loop3:
  551. mov byte [es:di], al
  552. inc di
  553. loop .loop3
  554. add di, 314
  555. mov byte [es:di], al
  556. add di, 3
  557. mov byte [es:di], al
  558. add di, 316
  559. mov byte [es:di], al
  560. inc di
  561. inc di
  562. mov byte [es:di], al
  563. inc di
  564. mov byte [es:di], al
  565. inc di
  566. inc di
  567. mov byte [es:di], al
  568. add di, 314
  569. mov byte [es:di], al
  570. inc di
  571. inc di
  572. mov byte [es:di], al
  573. add di, 3
  574. mov byte [es:di], al
  575. inc di
  576. inc di
  577. mov byte [es:di], al
  578. jmp .end2
  579.  
  580. .invader12:
  581. add di, 5
  582. mov byte [es:di], al
  583. inc di
  584. mov byte [es:di], al
  585. add di, 318
  586. mov cx, 4
  587. .loop4:
  588. mov byte [es:di], al
  589. inc di
  590. loop .loop4
  591. add di, 315
  592. mov cx, 6
  593. .loop5:
  594. mov byte [es:di], al
  595. inc di
  596. loop .loop5
  597. add di, 313
  598. mov byte [es:di], al
  599. inc di
  600. mov byte [es:di], al
  601. inc di
  602. inc di
  603. mov byte [es:di], al
  604. inc di
  605. mov byte [es:di], al
  606. inc di
  607. inc di
  608. mov byte [es:di], al
  609. inc di
  610. mov byte [es:di], al
  611. add di, 313
  612. mov cx, 8
  613. .loop6:
  614. mov byte [es:di], al
  615. inc di
  616. loop .loop6
  617. add di, 313
  618. mov byte [es:di], al
  619. inc di
  620. inc di
  621. mov byte [es:di], al
  622. inc di
  623. mov byte [es:di], al
  624. inc di
  625. inc di
  626. mov byte [es:di], al
  627. add di, 314
  628. mov byte [es:di], al
  629. add di, 7
  630. mov byte [es:di], al
  631. add di, 314
  632. mov byte [es:di], al
  633. add di, 5
  634. mov byte [es:di], al
  635. jmp .end2
  636.  
  637. .i2:
  638. CMP BX, 1
  639. je .i21
  640. jmp .i3
  641.  
  642. .i21:
  643. cmp CX, 0
  644. je .invader21
  645. jmp .invader22
  646.  
  647. .invader21:
  648. add di, 3
  649. mov byte [es:di], al
  650. add di, 5
  651. mov byte [es:di], al
  652. add di, 313
  653. mov byte [es:di], al
  654. add di, 3
  655. mov byte [es:di], al
  656. add di, 3
  657. mov byte [es:di], al
  658. add di, 3
  659. mov byte [es:di], al
  660. add di, 311
  661. mov byte [es:di], al
  662. inc di
  663. inc di
  664. mov cx, 6
  665. .loop7:
  666. mov byte [es:di], al
  667. inc di
  668. loop .loop7
  669. inc di
  670. mov byte [es:di], al
  671. add di, 311
  672. mov byte [es:di], al
  673. inc di
  674. mov byte [es:di], al
  675. inc di
  676. mov byte [es:di], al
  677. inc di
  678. inc di
  679. mov byte [es:di], al
  680. inc di
  681. mov byte [es:di], al
  682. inc di
  683. inc di
  684. mov byte [es:di], al
  685. inc di
  686. mov byte [es:di], al
  687. inc di
  688. mov byte [es:di], al
  689. add di, 311
  690. mov cx, 10
  691. .loop8:
  692. mov byte [es:di], al
  693. inc di
  694. loop .loop8
  695. add di, 311
  696. mov cx, 8
  697. .loop9:
  698. mov byte [es:di], al
  699. inc di
  700. loop .loop9
  701. add di, 313
  702. mov byte [es:di], al
  703. add di, 5
  704. mov byte [es:di], al
  705. add di, 314
  706. mov byte [es:di], al
  707. add di, 7
  708. mov byte [es:di], al
  709. jmp .end2
  710.  
  711. .invader22:
  712. add di, 3
  713. mov byte [es:di], al
  714. add di, 5
  715. mov byte [es:di], al
  716. add di, 316
  717. mov byte [es:di], al
  718. add di, 3
  719. mov byte [es:di], al
  720. add di, 316
  721. mov cx, 6
  722. .loop10:
  723. mov byte [es:di], al
  724. inc di
  725. loop .loop10
  726. add di, 313
  727. mov byte [es:di], al
  728. inc di
  729. mov byte [es:di], al
  730. inc di
  731. inc di
  732. mov byte [es:di], al
  733. inc di
  734. mov byte [es:di], al
  735. inc di
  736. inc di
  737. mov byte [es:di], al
  738. inc di
  739. mov byte [es:di], al
  740. add di, 312
  741. mov cx, 10
  742. .loop11:
  743. mov byte [es:di], al
  744. inc di
  745. loop .loop11
  746. add di, 310
  747. mov cx, 10
  748. .loop12:
  749. mov byte [es:di], al
  750. inc di
  751. loop .loop12
  752. add di, 310
  753. mov byte [es:di], al
  754. inc di
  755. inc di
  756. mov byte [es:di], al
  757. add di, 5
  758. mov byte [es:di], al
  759. inc di
  760. inc di
  761. mov byte [es:di], al
  762. add di, 314
  763. mov byte [es:di], al
  764. add di, 3
  765. mov byte [es:di], al
  766. jmp .end2
  767.  
  768. .i3:
  769. cmp CX, 0
  770. je .invader31
  771. jmp .invader32
  772.  
  773. .invader31:
  774. add di, 4
  775. mov cx, 4
  776. .loop13:
  777. mov byte [es:di], al
  778. inc di
  779. loop .loop13
  780. add di, 313
  781. mov cx, 10
  782. .loop14:
  783. mov byte [es:di], al
  784. inc di
  785. loop .loop14
  786. add di, 309
  787. mov cx, 12
  788. .loop15:
  789. mov byte [es:di], al
  790. inc di
  791. loop .loop15
  792. add di, 308
  793. mov cx, 3
  794. .loop16:
  795. mov byte [es:di], al
  796. inc di
  797. loop .loop16
  798. add di, 2
  799. mov byte [es:di], al
  800. inc di
  801. mov byte [es:di], al
  802. add di, 3
  803. mov cx, 3
  804. .loop17:
  805. mov byte [es:di], al
  806. inc di
  807. loop .loop17
  808. add di, 308
  809. mov cx, 12
  810. .loop18:
  811. mov byte [es:di], al
  812. inc di
  813. loop .loop18
  814. add di, 311
  815. mov byte [es:di], al
  816. inc di
  817. mov byte [es:di], al
  818. add di, 3
  819. mov byte [es:di], al
  820. inc di
  821. mov byte [es:di], al
  822. add di, 314
  823. mov byte [es:di], al
  824. inc di
  825. mov byte [es:di], al
  826. add di, 2
  827. mov byte [es:di], al
  828. inc di
  829. mov byte [es:di], al
  830. add di, 2
  831. mov byte [es:di], al
  832. inc di
  833. mov byte [es:di], al
  834. add di, 311
  835. mov byte [es:di], al
  836. inc di
  837. mov byte [es:di], al
  838. add di, 9
  839. mov byte [es:di], al
  840. inc di
  841. mov byte [es:di], al
  842. jmp .end2
  843.  
  844. .invader32:
  845. add di, 4
  846. mov cx, 4
  847. .loop19:
  848. mov byte [es:di], al
  849. inc di
  850. loop .loop19
  851. add di, 313
  852. mov cx, 10
  853. .loop20:
  854. mov byte [es:di], al
  855. inc di
  856. loop .loop20
  857. add di, 309
  858. mov cx, 12
  859. .loop21:
  860. mov byte [es:di], al
  861. inc di
  862. loop .loop21
  863. add di, 308
  864. mov cx, 3
  865. .loop22:
  866. mov byte [es:di], al
  867. inc di
  868. loop .loop22
  869. add di, 2
  870. mov byte [es:di], al
  871. inc di
  872. mov byte [es:di], al
  873. add di, 3
  874. mov cx, 3
  875. .loop23:
  876. mov byte [es:di], al
  877. inc di
  878. loop .loop23
  879. add di, 308
  880. mov cx, 12
  881. .loop24:
  882. mov byte [es:di], al
  883. inc di
  884. loop .loop24
  885. add di, 310
  886. mov byte [es:di], al
  887. inc di
  888. mov byte [es:di], al
  889. inc di
  890. mov byte [es:di], al
  891. add di, 3
  892. mov byte [es:di], al
  893. inc di
  894. mov byte [es:di], al
  895. inc di
  896. mov byte [es:di], al
  897. add di, 312
  898. mov byte [es:di], al
  899. inc di
  900. mov byte [es:di], al
  901. add di, 3
  902. mov byte [es:di], al
  903. inc di
  904. mov byte [es:di], al
  905. add di, 3
  906. mov byte [es:di], al
  907. inc di
  908. mov byte [es:di], al
  909. add di, 312
  910. mov byte [es:di], al
  911. inc di
  912. mov byte [es:di], al
  913. add di, 5
  914. mov byte [es:di], al
  915. inc di
  916. mov byte [es:di], al
  917. jmp .end2
  918.  
  919. .end2:
  920.  
  921.  
  922.  
  923.  
  924. popa
  925.  
  926.  
  927.  
  928. ret
  929.  
  930.  
  931.  
  932.  
  933. eraseInvaders: ; alirutiini, joka pyyhkii invaderit
  934.  
  935.  
  936. push ax
  937. push cx
  938. push bx ; laitetaan käytetyt rekisterit pinoon talteen
  939. push dx
  940. push di
  941.  
  942.  
  943.  
  944.  
  945. mov dx,0 ; alustetaan dx=0, dx osoittaa nykyiseen olioon taulukossa
  946. mov word di, [invaderLocation] ; di laitetaan invaderLocation, di kertoo mihin nykyinen olio piirretään
  947.  
  948.  
  949. mov cx,InvaderRows ; alustetaan pystyloopin countteri, esim.3 riviä => cx=3
  950.  
  951. .pystyloop
  952.  
  953. push cx
  954.  
  955.  
  956. mov cx, InvadersPerRow ; alustetaan riviloopin countteri
  957.  
  958. .riviloop
  959.  
  960. push cx ; pistetään loopcounter talteen
  961.  
  962. mov al,0 ; pyyhitään vanha invader pois, asetetaan musta väri
  963.  
  964. mov bx,InvaderType ; olion muotovakiot
  965.  
  966. mov cx,[animationstep] ; laitetaan cx:ään animaatiostep
  967.  
  968. call drawInvader ; jotta ei jää pikselijäämiä, pitää jostain syystä pyyhkiä kummatkin animaatiostepit
  969.  
  970. call animaatiostepinvaihto ; animaatiostepin vaihto
  971.  
  972. mov cx,[animationstep] ; laitetaan cx:ään animaatiostep
  973.  
  974. call animaatiostepinvaihto ; animaatiostepin vaihto takaisin siihen, mikä se on ollut ennen tätä alirutiinia
  975.  
  976. call drawInvader ; pyyhkiminen toisella animaatiostepilla
  977.  
  978. add di, InvaderDistance_x ; asetetaan di seuraavaan piirtokohtaan
  979.  
  980. inc dx ; käpistellään seuraavaa oliota
  981.  
  982. pop cx ; haetaan loopcountteri takaisin
  983.  
  984.  
  985. LOOP .riviloop
  986.  
  987.  
  988. add di, (InvaderDistance_y - InvadersPerRow*InvaderDistance_x) ; mennään seuraavalle riville
  989.  
  990. pop cx
  991.  
  992. LOOP .pystyloop
  993.  
  994. pop di
  995. pop dx
  996. pop bx
  997. pop cx
  998. pop ax
  999.  
  1000. ret
  1001.  
  1002.  
  1003.  
  1004.  
  1005.  
  1006. drawInvaders: ; alirutiini, joka piirtää invaderit
  1007.  
  1008. push ax
  1009. push cx
  1010. push bx
  1011. push dx ; laitetaan käytetyt rekisterit pinoon talteen
  1012. push di
  1013.  
  1014. call animaatiostepinvaihto ; animation stepin vaihto uuteen
  1015.  
  1016.  
  1017. mov dx,0 ; alustetaan dx=0, dx osoittaa nykyiseen olioon taulukossa
  1018. mov word di, [invaderLocation] ; di laitetaan invaderLocation, di kertoo mihin nykyinen olio piirretään
  1019.  
  1020.  
  1021.  
  1022. mov cx,InvaderRows ; esim.3 riviä
  1023.  
  1024. .pystyloop
  1025.  
  1026. push cx
  1027.  
  1028.  
  1029. mov cx, InvadersPerRow ; esim. 5 per rivi
  1030.  
  1031. .riviloop
  1032.  
  1033.  
  1034.  
  1035. call animaatiostepinvaihto ; animation stepin vaihto vanhaan
  1036.  
  1037. push cx ; pistetään loopcounter talteen
  1038.  
  1039. mov al,0 ; pyyhitään vanha invader pois
  1040.  
  1041. mov bx, InvaderType ; olion tyypin alustus
  1042.  
  1043. mov cx, [animationstep] ; animation stepin alustus
  1044.  
  1045. sub di, [invaderDirection] ; di pitää vähentää, jolloin se osoittaa vanhaan invaderiin
  1046.  
  1047. call drawInvader ; nyt on vanhat invaderit pyyhitty mustalla värillä
  1048.  
  1049. call animaatiostepinvaihto ; animation stepin vaihto takaisin uuteen
  1050.  
  1051.  
  1052. add di, [invaderDirection] ; pyyhkimisen jälkeen piirretään invader 1 askel eteenpäin
  1053.  
  1054.  
  1055.  
  1056. ; piirretään uusi invader uuteen paikkaan
  1057.  
  1058.  
  1059. mov cx, [animationstep] ; animation stepin alustus
  1060.  
  1061. push di ; laitetaan di pinoon, koska sitä tarvitaan seuraavilla 3:lla rivilla
  1062.  
  1063. mov word di, InvaderStatus ; asetetaan di, status-taulukon alkuun
  1064.  
  1065. add di,dx ; lisätään offset, jolloin päästään oikeaan olioon
  1066.  
  1067. mov byte al, [di] ; haetaan olion status al-paikkaan.
  1068.  
  1069. pop di ; haetaan di takaisin
  1070.  
  1071.  
  1072.  
  1073. call drawInvader ; piirtää uuden kuvan
  1074.  
  1075. add di, InvaderDistance_x ; asetetaan di seuraavaan piirtokohtaan
  1076.  
  1077. inc dx ; käpistellään seuraavaa oliota
  1078.  
  1079.  
  1080. pop cx ; haetaan loopcountteri takaisin
  1081.  
  1082.  
  1083. LOOP .riviloop
  1084.  
  1085.  
  1086. add di, (InvaderDistance_y - InvadersPerRow*InvaderDistance_x) ; mennään seuraavalle riville
  1087.  
  1088. pop cx
  1089.  
  1090.  
  1091. LOOP .pystyloop
  1092.  
  1093.  
  1094. pop di
  1095. pop dx
  1096. pop bx
  1097. pop cx
  1098. pop ax
  1099.  
  1100. ret
  1101.  
  1102.  
  1103.  
  1104.  
  1105. moveInvaders: ; liikuttaa invadereja
  1106.  
  1107. push bx
  1108. push di
  1109.  
  1110. inc word [laskuri2] ; kasvatetaan laskuria2, joka laskee kuinka monta askelta invader on kulkenut yhdellä rivillä
  1111.  
  1112. cmp word[laskuri2], InvaderMatka ; tarkistetaan, onko kävellyt yhden rivin matkan
  1113.  
  1114. jne .hyppaayli ; jos ei ole = InvaderMatka, suuntaa ei vaihdeta vaan hypataan yli
  1115.  
  1116. call eraseInvaders ; pyyhitään vanha pois tästä reunasta
  1117.  
  1118. add word [invaderLocation], (InvaderRiviMuutos*scrwidth) ; hypätään seuraavalle riville
  1119.  
  1120. neg word [invaderDirection] ; otetaan negaatio invaderlocationista
  1121.  
  1122. mov word [laskuri2],0 ; pitää nollata myös
  1123.  
  1124. jmp .hyppaayli2
  1125.  
  1126.  
  1127.  
  1128. .hyppaayli
  1129.  
  1130. mov word bx, [invaderDirection]
  1131.  
  1132. add word [invaderLocation],bx ; invaderlocation kasvatetaan 1:lla
  1133.  
  1134. call drawInvaders ; varsinainen piirtäminen
  1135.  
  1136.  
  1137.  
  1138. .hyppaayli2
  1139. pop di
  1140. pop bx
  1141.  
  1142. ret
  1143.  
  1144.  
  1145.  
  1146.  
  1147.  
  1148. Viive:
  1149.  
  1150.  
  1151. mov dx, delay
  1152.  
  1153. .pause1:
  1154. mov cx, 65535
  1155.  
  1156. .pause2:
  1157.  
  1158. dec cx
  1159. jne .pause2
  1160. dec dx
  1161. jne .pause1
  1162.  
  1163.  
  1164. ret
  1165.  
  1166.  
  1167.  
  1168.  
  1169. ;piirrapiste: ; testausfunktio
  1170.  
  1171. ; push di
  1172. ; push cx
  1173.  
  1174.  
  1175. ; mov cx,[mika_morko]
  1176. ; mov di,[pisteenpaikka]
  1177.  
  1178. ;.loop
  1179.  
  1180. ; add di,8
  1181. ; mov byte[es:di],red
  1182.  
  1183.  
  1184. ;LOOP .loop
  1185.  
  1186. ; pop cx
  1187. ; pop di
  1188.  
  1189. ;ret
  1190.  
  1191.  
  1192.  
  1193.  
  1194. animaatiostepinvaihto: ; vaihtaa eli invertoi animation stepin
  1195.  
  1196.  
  1197. cmp word [animationstep],0 ; päivitetään animation steppi
  1198.  
  1199. je .hyppaayli
  1200.  
  1201. mov word [animationstep],0
  1202.  
  1203. jmp .hyppaayli2
  1204.  
  1205. .hyppaayli
  1206.  
  1207. mov word [animationstep],1
  1208.  
  1209. .hyppaayli2
  1210.  
  1211.  
  1212. ret
  1213.  
  1214.  
  1215.  
  1216.  
  1217. ;-----------------------------------------------------------------------------------------------------------------------
  1218.  
  1219.  
  1220. ..start: ; pääohjelma alkaa tästä
  1221.  
  1222.  
  1223. mov ax, mydata ; asetetaan ds rekisteri oikeaan sekmentiiin
  1224. mov ds, ax
  1225. mov ax, mystack ; aettaa ss rekisterin oikeaan pino sekmenttiin
  1226. mov ss, ax
  1227. mov sp, stacktop ; pointteri osoittamaan stacktoppiiin
  1228.  
  1229. mov ah,35h ; Haetaan alkuperäinen keskeytysvektori
  1230. mov al, 9h ; ..näppäimistölle = 9
  1231. int 21h ; palauttaa es:bx, pointterin keskeytyshandleriin
  1232.  
  1233. mov [oldintseg],es ; segmenttiosoite tallennetaan => oldintseg
  1234. mov [oldintoff],bx ; offset tallennetaan => oldintoff
  1235.  
  1236.  
  1237.  
  1238.  
  1239. ; asetetaan oma näppäimistön keskeytysvektori
  1240. mov dx, KeybInt ; keskeytysvektorin offset => dx-rekisteriin
  1241. mov ax, mycode ; keskeytysvektorin segmenttiosoite => ds-rekisteriin
  1242. mov ds, ax
  1243.  
  1244. mov ah, 25h ; aseteteaan keskeytysvektori...
  1245. mov al, 9h ; näppäimistölle
  1246. int 21h ; varsinainen operaatio, joka asettaa uuden keskeytysvektorin
  1247.  
  1248. mov ax, mydata ; operaatiossa tarvittiin ds-rekisteriä, palautetaan se takaisin data-segmanttiin
  1249. mov ds, ax
  1250.  
  1251.  
  1252. mov ah,0Fh ; Haetaan vanha resoluutio ja tallennetaan se
  1253. int 10h ; Tiedot ovat ah al ja bh rekistereissä
  1254. mov byte [oldvideomode],al ; vanha moodi tallennetaan paikkaan oldvideomode
  1255.  
  1256.  
  1257. ; Asetetaan resoluutio 320*200*256
  1258. mov ah,00h ; Asetetaan resoluutio ...
  1259. mov al,13h ; 320x200
  1260. int 10h ; Varsinainen keskeytys
  1261.  
  1262.  
  1263.  
  1264. mov ax,00 ; Tutkitaan onko hiiri asennettu
  1265. int 33h ; varsinainen keskeytys
  1266.  
  1267.  
  1268. cmp ax,0000
  1269. jne .jump
  1270. mov word [hyppy],1 ; jos hiirtä ei ole asennettu, hypätään välihypyn kautta .dosexittiin
  1271. jmp .valihyppy
  1272.  
  1273. .jump
  1274. ; Vaihdetaan hiiren keskeytys rutiin
  1275. mov ax,mycode ; segmentti osoite es:ää
  1276. mov es,ax
  1277.  
  1278. mov dx,MouseInt ; offset osoite dx:ään
  1279. mov ax,14h
  1280. mov cx,0003h ; keskeytysjos: 1.cursor position changed, 2.leftmouseclick
  1281. int 33h ; Varsinainen keskeytys
  1282.  
  1283. ; asetetaan hiiren max ja min horisontaaliarvot
  1284. mov ax,7
  1285. mov bx,0 ; min=0
  1286. mov cx,(scrwidth-Aluksenleveys) ; max=320-aluksenleveys
  1287. int 33h ; varsinainen operaatio
  1288.  
  1289.  
  1290. ; Videomuistialueen alustus
  1291. mov ax,videobase
  1292. mov es,ax
  1293.  
  1294.  
  1295.  
  1296. ;------------------------------------------------------------------------------------------------------------------------
  1297.  
  1298.  
  1299. .mainloop ; Main-loop
  1300.  
  1301.  
  1302. call Viive ; viivästetään mainlooppia
  1303.  
  1304. call eraseship
  1305.  
  1306. mov ax,[newshiplocation]
  1307.  
  1308. mov [shiplocation],ax
  1309.  
  1310. call drawship
  1311.  
  1312. cmp word [fire],1 ; tarkistetaan, onko ammuttu
  1313.  
  1314. jne .hyppaayli1 ; jos ei, hyppaa yli
  1315.  
  1316. call fireshot ; jos on, kutsu fireshottia
  1317.  
  1318.  
  1319. .hyppaayli1
  1320.  
  1321.  
  1322. ; ammuksen liikuttaminen
  1323. cmp word [shotlocation],0
  1324.  
  1325. je .hyppaayli20 ; ei liikuteta vaan hypataan yli
  1326.  
  1327. call moveshot ; jos slocation=1, kutsutaan moveshot
  1328.  
  1329.  
  1330. .valihyppy ; valihyppy: jos hiirtä ei asennettuna, hypätään tämän kautta .dosexit
  1331.  
  1332. cmp word [hyppy],1
  1333.  
  1334. je .dosexit
  1335.  
  1336.  
  1337. .hyppaayli20
  1338.  
  1339. inc word [laskuri] ; kasvaa mainin tahtiin
  1340.  
  1341. cmp word [laskuri], InvaderSpeed
  1342.  
  1343. jne .hyppaayli3
  1344.  
  1345. call moveInvaders
  1346.  
  1347. mov word [laskuri], 0
  1348.  
  1349. cmp word [invaderLocation],InvaderGoal
  1350.  
  1351. jb .hyppaayli4
  1352.  
  1353. mov dx,Havio
  1354.  
  1355. mov ah,9 ; DOS: print string
  1356.  
  1357. int 21h ; display the appropriate greeting
  1358.  
  1359.  
  1360. .loputonloop2
  1361.  
  1362. cmp word [pressesc],1
  1363.  
  1364. jne .loputonloop2
  1365.  
  1366. jmp .dosexit
  1367.  
  1368.  
  1369.  
  1370. .hyppaayli4
  1371.  
  1372.  
  1373. cmp word [osumat],(InvaderRows * InvadersPerRow )
  1374.  
  1375. jne .hyppaayli3
  1376.  
  1377. mov dx,Voitto
  1378.  
  1379. mov ah,9 ; DOS: print string
  1380.  
  1381. int 21h ; display the appropriate greeting
  1382.  
  1383.  
  1384. .loputonloop
  1385.  
  1386. cmp word [pressesc],1
  1387.  
  1388. jne .loputonloop
  1389.  
  1390. jmp .dosexit
  1391.  
  1392.  
  1393. .hyppaayli3
  1394.  
  1395. cmp word [pressesc],1 ; tutki, onko esc-nappia painettu
  1396.  
  1397. jne .mainloop ; jos ei ole painettu, palaa looppiin
  1398.  
  1399.  
  1400. .dosexit: ; Lopetusalirutiini
  1401.  
  1402. ; Palautetaan resoluutio
  1403.  
  1404. mov ah,00h ; Asetetaan resoluutio ...
  1405. mov byte al,[oldvideomode] ; Vanhan videomoodin palautus
  1406. int 10h ; Varsinainen keskeytys
  1407.  
  1408. ; palautetaan alkuperäinen näppäimistön keskeytysvektori
  1409. mov dx,[oldintoff] ; asetetaan alkuperaiset arvot dx ja ds rekistereihin
  1410. mov ax,[oldintseg]
  1411. mov ds,ax
  1412. mov ah,25h ; keskeytysvektorin asetus
  1413. mov al,9h ; ja nimenomaan näppäimistölle
  1414. int 21h ; varsinainen operaatio, joka palauttaa alkuperaiset arvot
  1415.  
  1416.  
  1417. mov al, 0 ; palautusarvo 0
  1418. mov ah, 4ch ; keskeytys 21.4c joka lopettaa ohjelman palautusarvolla
  1419. int 21h
  1420.  
  1421. .end
Reply With Quote Quick reply to this message  
Join Date: Nov 2008
Posts: 939
Reputation: MosaicFuneral is just really nice MosaicFuneral is just really nice MosaicFuneral is just really nice MosaicFuneral is just really nice MosaicFuneral is just really nice 
Solved Threads: 92
MosaicFuneral's Avatar
MosaicFuneral MosaicFuneral is offline Offline
Posting Shark

Re: Space Invaders

 
0
  #2
May 5th, 2009
We have a section here to post your code.

What assembler did you use? I'll try playing it later.
"Jedenfalls bin ich überzeugt, daß der Alte nicht würfelt."
"I became very sensitive to what will happen to all this and all of us." -Two geniuses named Albert
Reply With Quote Quick reply to this message  
Join Date: Jan 2009
Posts: 5
Reputation: Joonas is an unknown quantity at this point 
Solved Threads: 0
Joonas Joonas is offline Offline
Newbie Poster

Re: Space Invaders

 
0
  #3
May 6th, 2009
I used NASM assembler, you can compile it with following commands:

nasm -f obj filename.asm
val filename.obj
filename

Have fun
Reply With Quote Quick reply to this message  
Reply

This thread is more than three months old.
Perhaps start a new thread instead?
Message:



Similar Threads
Other Threads in the Assembly Forum
Thread Tools Search this Thread



About Us | Contact Us | Advertise | DaniWeb | Acceptable Use Policy | RSS Feed

©2003 - 2009 DaniWeb® LLC