
 INCLUDE "exec/types.i"
 INCLUDE "exec/ports.i"
 INCLUDE "exec/io.i"
 INCLUDE "exec/memory.i"
 INCLUDE "devices/audio.i"
 INCLUDE "libraries/dosextens.i"
 INCLUDE "intuition/intuition.i"
 INCLUDE "intuition/screens.i"
 INCLUDE "graphics/gfx.i"
 
 xref _AbsExecBase
 xref _BeginIO
 xref _LVOAbortIO
 xref _LVOAddPort
 xref _LVOAllocMem
 xref _LVOAllocSignal
 xref _LVOChangeSprite
 xref _LVOCheckIO
 xref _LVOClose
 xref _LVOCloseDevice
 xref _LVOCloseLibrary
 xref _LVOCloseScreen
 xref _LVOCloseWindow
 xref _LVODisplayAlert
 xref _LVODisplayBeep
 xref _LVODoIO
 xref _LVODrawImage
 xref _LVOFindPort
 xref _LVOFindTask
 xref _LVOFreeMem
 xref _LVOFreeSprite
 xref _LVOFreeSignal
 xref _LVOGetMsg
 xref _LVOGetSprite
 xref _LVOInitBitMap
 xref _LVOInitRastPort
 xref _LVOLoadRGB4
 xref _LVOMove
 xref _LVOMoveSprite
 xref _LVOOpen
 xref _LVOOpenDevice
 xref _LVOOpenLibrary
 xref _LVOOpenScreen
 xref _LVOOpenWindow
 xref _LVOOutput
 xref _LVOPolyDraw
 xref _LVOPutMsg
 xref _LVORead
 xref _LVOReadPixel
 xref _LVORectFill
 xref _LVORemPort
 xref _LVOReplyMsg
 xref _LVOSendIO
 xref _LVOSetAPen
 xref _LVOSetPointer
 xref _LVOSetRast
 xref _LVOText
 xref _LVOViewPortAddress
 xref _LVOWait
 xref _LVOWaitIO
 xref _LVOWaitPort
 xref _LVOWrite
 xref _LVOWritePixel

 section game,CODE

 movea.l #intname,a1
 moveq #31,d0
 movea.l 4,a6
 jsr _LVOOpenLibrary(a6)
 move.l d0,intbase
 beq abort
 movea.l #dosname,a1
 moveq #0,d0
; movea.l 4,a6
 jsr _LVOOpenLibrary(a6)
 move.l d0,dosbase
 beq abort
 movea.l #grname,a1
 moveq #0,d0
; movea.l 4,a6
 jsr _LVOOpenLibrary(a6)
 move.l d0,grbase
 beq abort

  suba.l a1,a1
  jsr _LVOFindTask(a6)
  movea.l d0,a4
  tst.l pr_CLI(a4)
  bne yes_cli

  lea pr_MsgPort(a4),a0
  jsr _LVOWaitPort(a6)
  lea pr_MsgPort(a4),a0
  jsr _LVOGetMsg(a6)
  move.l d0,returnmsg

yes_cli
;**************

 bsr init_audio
 tst.l d0
 beq vapautukset ; ei vapauteta spritejä

 bsr alusta_kentta
 tst.l d0
 beq vapautukset ;
 bsr avaa_ruutu
 tst.l d0
 beq vapautukset ;

 bsr muuta_varit
 bsr tee_spritet
 tst.l d0
 beq vapauta_spritet

 bsr game_info_screen

actual_game

 move.b #0,nkentta
 lea msg9,a0
 moveq #msglen9,d7
 move.l #186,d0
 move.l #244,d1
 moveq #9,d6
 bsr kirjoita
 lea msg10,a0
 moveq #msglen10,d7
 move.l #100,d0
 move.l #254,d1
 moveq #14,d6
 bsr kirjoita
 bsr kirjoita_taso

 bsr do_voice_bell

  lea maps,a0
  move.l #mapslen,d1
  move.l #2940,d6
  move.l kenttac,d7
  bsr Lataa ; ladataan kartat muistiin
 tst.l d0
 beq vapauta_spritet ; karttaa ei löytynyt

 move.w #17,c_spritex
 move.w #17,c_spritey
 bsr tee_kentta
 bsr energia_mittari
 bsr pallo_piirto
 move.l intbase,a6 ;hävitetään hiiren pointteri näkyvistä
 move.l cwindow,a0
 move.l #pointer,a1
 moveq #1,d0
 moveq #1,d1
 jsr _LVOSetPointer(a6)

 move.b #4,henget
 move.b #0,lopetus
 move.w #255,energia
 move.b #0,kanto
 move.w #0,jekut
 move.b #0,kivet
 move.b #0,hlaskuri
 move.l #0,a0
 move.l #sprite1,a1
 move.w c_spritex,d0
 move.w c_spritey,d1
 move.l grbase,a6
 jsr _LVOMoveSprite(a6)

;************* PELI SILMUKKA **********

loop1
 bsr spriteliikku_ohjaus
 cmp.l #0,d0
 beq no_click
ei_lopeteta
 bsr ota_esine
no_click
 tst.b lopetus
 bne pelin_loppu
 sub.b #1,txlaskuri
 bsr jekku_ohjaus
 bra loop1

;**************
pelin_loppu
 move.l #0,a0
 move.l grbase,a6
 move.w #321,d0
 move.l #sprite1,a1
 jsr _LVOMoveSprite(a6)

 move.l #$7ffff,d0
oloop
 sub.l #1,d0
 bne oloop

 sub.b #1,henget
 beq no_lives
 bsr pallo_poisto
  lea maps,a0
  move.l #mapslen,d1
  move.l #2940,d6
  move.l kenttac,d7
  bsr Lataa
 sub.b #1,nkentta
 move.w a_spritex,c_spritex
 move.w a_spritey,c_spritey
 bsr uusi_kentta
 move.b #0,lopetus
  move.l #0,a0
  move.l #sprite1,a1
  move.w c_spritex,d0
  move.w c_spritey,d1
  move.l grbase,a6
  jsr _LVOMoveSprite(a6)
  move.b #0,c_suunta
 bra loop1
no_lives
 move.l #$cffff,d0
loppuloop
 sub.l #1,d0
 bne loppuloop

 bsr game_over_screen
 tst.b d0
 bne actual_game

;********* Lopetetaan **************

 bsr do_voice_aaah
 move.l #180000,d0
loppu_test_loop1
 subi.l #1,d0
 bne loppu_test_loop1
 move.l 4,a6
 move.l aumsg,a1
 jsr _LVOAbortIO(a6)

vapauta_spritet
 lea numsprite,a5
 movea.l grbase,a6
 moveq #3,d7
loop2
 moveq #0,d0
 move.b -1(a5,d7.w),d0
 cmpi.b #-1,d0
 beq.s loop3
 jsr _LVOFreeSprite(a6)
loop3
 subq #1,d7
 bne loop2

vapautukset
 bsr free_audio

 bsr VapautaMuistit

close_gr
 movea.l 4,a6
 movea.l grbase,a1
 jsr _LVOCloseLibrary(a6)
close_dos
 movea.l 4,a6
 movea.l dosbase,a1
 jsr _LVOCloseLibrary(a6)
close_int
 movea.l 4,a6
 movea.l intbase,a1
 jsr _LVOCloseLibrary(a6)
abort
 tst.l returnmsg
 beq abort_2
 movea.l 4,a6
 movea.l returnmsg,a1
 jsr _LVOReplyMsg(a6)
abort_2
 rts          ;**** Palataan CLI:hin ( tai WB:hen )

;*************************

avaa_ruutu
 movea.l #newscreen,a0  ;newscreen structure
 movea.l intbase,a6
 jsr _LVOOpenScreen(a6)
 move.l d0,cscreen
 beq.s ei_nayttoa ; ei ruutua
 move.l d0,rport
 add.l #84,rport
 move.l d0,vport
 add.l #44,vport
 move.l #newwindow,a0  ;avataan myös ikkuna
 move.l cscreen,nw_Screen(a0)
 movea.l intbase,a6
 jsr _LVOOpenWindow(a6)
 move.l d0,cwindow
 beq.s ei_nayttoa ; ei ruutua
avaa_ruutu_pois
 rts

ei_nayttoa
  lea msg4,a1
  move.l #msglen4,d3
  bsr valitukset_ei_tiedosto
  bsr GURU
  moveq #0,d0
  bra.s avaa_ruutu_pois

muuta_varit
 movea.l grbase,a6
 movea.l vport,a0
 movea.l #colormap,a1
 moveq #32,d0
 jsr _LVOLoadRGB4(a6)        ; LoadRGB4;  muoto: $0RGB
 rts

tee_spritet
 lea numsprite,a5    ; sisältää kolmen spriten numerot
 moveq #1,d0
 lea sprite0,a0
 bsr.s init_sprite
 move.b d0,2(a5)
; cmpi.b #-1,d0
; beq.s ei_spriteja  ; itse asiassa tätä spriteä ei tarvita

 moveq #-1,d0
 lea sprite1,a0
 bsr.s init_sprite
 move.b d0,(a5)
 cmpi.b #-1,d0
 beq.s ei_spriteja

 moveq #-1,d0
 lea sprite2,a0
 bsr.s init_sprite
 move.b d0,1(a5)
 cmpi.b #-1,d0
 beq.s ei_spriteja

 moveq #-1,d0

 rts

ei_spriteja
  lea msg8,a1
  move.l #msglen8,d3
  bsr valitukset_ei_tiedosto
  bsr GURU
  moveq #0,d0
  rts

init_sprite
 move.l grbase,a6
 jsr _LVOGetSprite(a6)
 rts

tee_kentta
 move.w c_spritex,a_spritex
 move.w c_spritey,a_spritey
tee_kentta_b
 ;ruudut (20*14) muuttujissa x ja y
 move.l rport,a1  ;... mutta ensin siivotaan...
 move.l grbase,a6
 moveq #0,d0
 jsr _LVOSetAPen(a6)
 moveq #0,d0
 moveq #0,d1
 move.w #319,d2
 move.w #224,d3
 move.l rport,a1
 jsr _LVORectFill(a6)
 bsr etsi_kenttaos
      ;nkenttaos on kentän osoite
      ; - ainoa enää ulkoa tarvittava vakio
 move.b #13,y
loopy
 move.b #19,x
loopx
 ; kenttien syvyys on 4 bittiä
 ; haetaan menossa olevan ruudun arvo
 moveq #0,d0
 move.b y,d0
 mulu #10,d0
 moveq #0,d1
 move.b x,d1
 lsr.b #1,d1
 add.w d1,d0
 move.l nkenttaos,a0
 move.b 0(a0,d0.w),d0
 move.b d0,dloop
 and.b #$f,d0
 bsr draw_box
 move.b dloop,d0
 lsr.b #4,d0
 subi.b #1,x
 bsr draw_box
 cmp.b #0,x
 beq.s looppo
 subi.b #1,x
 bra loopx
looppo
 subi.b #1,y
 cmp.b #-1,y
 bne loopy
 rts

draw_box
 move.l rport,a0
 move.l intbase,a6
 moveq #0,d2
 move.b d0,d2
 moveq #0,d1
 move.b y,d1
 lsl.w #4,d1
 moveq #0,d0
 move.b x,d0
 lsl.w #4,d0
 cmp.b #0,d2
 beq draw_pois
 move.l #box_images,a1
 lsl.w #2,d2
 move.l -4(a1,d2),a1
 jsr _LVODrawImage(a6)
draw_pois
 rts

;**********************
hextodec               ; muutettava luku d1:ssä
 move.l d1,d2          ; vain kaksinumeroinen, 0-99
 divu #10,d1
 andi.l #$f,d1
 move.l d1,d3
 lsl.w #4,d3   ; d3:ssa BCD luku , kymmenet
 mulu #10,d1
 sub.b d1,d2   ; d2:ssa BCD luku , ykköset
 move #4,CCR   ; Extended bit = 0, Zero bit =1
 abcd d3,d2    ; BCD yhteenlasku
modify                 ;muutettava luku d2:ssa
 move.l #string,addr
 move.l #string,a5     ;merkkijonon osoite, joho luku tulee
 moveq #8,d1
loopnum
 move.l d2,d0
 lsr.l #4,d2
 bsr muuta
 move.b d0,-1(a5,d1.l)
 subi.b #1,d1
 bne loopnum
 rts
muuta                  ;muutettava luku d0:ssa
 and.b #$f,d0
 or.b #$30,d0
 cmp.b #$3a,d0
 blt poisnum
 add.b #7,d0
poisnum
 rts
type
 move.l grbase,a6
 move.l rport,a1
 move.b #9,d0
 jsr _LVOSetAPen(a6)
 move.l rport,a1
 move.l addr,a0
 move.l lenght,d0
 jsr _LVOText(a6)
 rts

kirjoita_happo
 move.l d0,-(sp)
 moveq #0,d1
 move.b hlaskuri,d1
 bsr hextodec
 add.l #6,a5
 move.l a5,a0
 moveq #2,d7
 moveq #16,d0
 move.w #236,d1
 moveq #9,d6
 bsr kirjoita
 move.l (sp)+,d0
 rts

kirjoita_taso
 move.l d0,-(sp)
 moveq #0,d1
 move.b nkentta,d1
 addq #1,d1
 bsr hextodec
 add.l #6,a5
 move.l a5,a0
 moveq #2,d7
 move.w #252,d0
 move.w #244,d1
 moveq #9,d6
 bsr kirjoita
 move.l (sp)+,d0
 rts

report_mouse
 moveq #0,d7
 bsr intuimessage
 tst.l d0
 beq report_mouse_pois ; ei viestejä
 move.b #0,suunta
 move.w d7,d3
 swap d7
 move.w d7,d2
 move.b d3,d0
 bsr abs_muunnos
 move.b d0,d1
 move.b d2,d0
 bsr abs_muunnos
 move.b #1,suunta
 cmp.b d1,d0
 bgt.s report_a
 move.b #2,suunta
 move.b d1,d0
 move.b d3,d2
report_a
 cmp.b #2,d0
 bgt.s report_b
 move.b #0,suunta
 bra.s report_c
report_b
 and.b #$80,d2
 or.b d2,suunta
report_c
 moveq #3,d0
 cmp.l #RAWKEY,d5
 beq report_keys
 cmp.l #MOUSEBUTTONS,d5
 bne.s report_mouse_pois2
 cmp.w #$c000,d6
 beq.s report_mouse_pois
 moveq #0,d0
 cmp.w #$a000,d6
 bne.s report_mouse_pois
 bsr ota_kr
report_mouse_pois2
 moveq #0,d0
report_mouse_pois
 rts

intuimessage
 move.l cwindow,a0
 move.l $56(a0),a0
 movea.l 4,a6
 jsr _LVOGetMsg(a6)
 tst.l d0
 beq.s intuimessage_pois
 move.l d0,a1
 move.l im_MouseX(a1),d7
 move.w im_Qualifier(a1),d6
 move.l im_Class(a1),d5
 move.w im_Code(a1),d4
 jsr _LVOReplyMsg(a6) ;d0:ssa on 0, jos viestejä ei ole saapunut
 moveq #-1,d0
intuimessage_pois
 rts

passed
 lea msg13,a0
 move.w #msglen13,d7
 moveq #16,d0
 moveq #124,d1
 moveq #9,d6
 bsr kirjoita
 rts

report_keys
 ; d4:ssa näppäimen numero
 moveq #0,d0
 cmp.w #$45,d4
 beq report_esc
 cmp.w #$58,d4
 beq report_sanct
 cmp.w #$2e,d4
 beq report_acid
 cmp.w #$5f,d4
 beq report_info
 cmp.w #$19,d4
 beq report_pause
 rts
report_esc
 move.b #-1,lopetus
 move.b #1,henget
 rts
report_sanct

 cmp.b #$9a,d6   ; RSHIFT+CONTROL+LALT+RCOMMAND
 bne report_sanct_pois
 move.b #4,henget
 bsr pallo_piirto
 moveq #0,d0
report_sanct_pois 
 rts
report_acid
 cmp.b #$e1,d6   ; LSHIFT+RALT+LCOMMAND+RCOMMAND
 bne report_acid_pois
 move.b #90,hlaskuri
  moveq #0,d0
  move.w #224,d1
  move.l #happo_i,a1
  bsr piirra_image
  bsr kirjoita_happo

 bset.b #0,kanto
  moveq #16,d0
  move.w #240,d1
  move.l #kranaatti_i,a1
  bsr piirra_image

 bset.b #2,kanto
  moveq #0,d0
  move.w #240,d1
  move.l #myrkky_i,a1
  bsr piirra_image

 moveq #0,d0
report_acid_pois
 rts
report_info
 movem d1-d7/a0-a6,-(sp)
 bsr game_info_screen
 bsr info_clear
 movem (sp)+,d1-d7/a0-a6
 moveq #0,d0
 rts
report_pause
 movea.l rport,a1
 movea.l grbase,a6
 moveq #0,d0
 jsr _LVOSetAPen(a6)
 movea.l rport,a1
 movea.l grbase,a6
 moveq #100,d0
 move.w #246,d1
 move.w #319,d2
 move.w #255,d3
 jsr _LVORectFill(a6)
 lea msg11,a0
 move.w #msglen11,d7
 moveq #116,d0
 move.l #254,d1
 moveq #13,d6
 bsr kirjoita
report_pause_loop
 bsr intuimessage
 tst.l d0
 beq report_pause_loop
 cmp.l #RAWKEY,d5
 bne report_pause_loop
 cmp.b #$19,d4
 bne report_pause_loop
 ; puhdistetaan jäljet
 movea.l rport,a1
 movea.l grbase,a6
 lea msg10,a0
 moveq #msglen10,d7
 moveq #100,d0
 move.l #254,d1
 moveq #14,d6
 bsr kirjoita
 rts

etsi_kenttaos
 move.l #kentat,a0 ;kentat os. kenttien osoitteiden alkuun
 moveq #0,d0
 move.b nkentta,d0
 lsl.b #2,d0
 move.l 0(a0,d0.w),nkenttaos
 rts

etsi_ruutu
 ;etsittävän ruudun koordinaatit muuttujissa x ja y
 ;kentän osoite valmiina vakiossa nkenttaos
 move.l nkenttaos,a0
 moveq #0,d1
 move.b y,d1
 mulu #10,d1
 moveq #0,d0
 move.b x,d0
 lsr.b #1,d0
 add.w d1,d0 ;ruudun tavun offset-arvo d0:ssa
 move.b 0(a0,d0.w),d0 ;d0:ssa on ruudun tavu
 move.b x,d1
 and.b #1,d1
 cmp.b #1,d1
 beq.s etsi_ruutu_pois
 lsr.b #4,d0  ;parilliselle x:arvolle 4 ylintä bittiä
etsi_ruutu_pois
 and.b #$f,d0 ;lopullinen arvo on d0:ssa
; cmp.b #15,d0
; bne etsi_ruutu_pois2
; move.b #1,d0
etsi_ruutu_pois2
 rts

spriteliikku_ohjaus
 moveq #0,d0
 sub.w #1,solaskuri  ;määrätään, kuinka usein spriteä liikutetaan
 and.w #$7f,solaskuri
 bne spriteliikku_pois2
 bsr jekku_testit
 bsr report_mouse
 tst.l d0
 bne spriteliikku_pois2
spriteliikku
 bsr energy_loss
 bsr gaboom
 cmp.b #0,suunta
 beq.s spriteliikku_pois
 move.b suunta,c_suunta
 move.b #9,v_sprite
spriteliikku_pois
 tst.b c_suunta
 beq spriteliikku_b
 move.w c_spritex,d0
 move.w c_spritey,d1
 move.b c_suunta,sprite_suunta
 bsr suunta_lupa
 move.l #0,a0
 move.l #sprite1,a1
 move.w c_spritex,d0
 move.w c_spritey,d1
 move.l grbase,a6
 jsr _LVOMoveSprite(a6)
  bsr sprite_paikka
  bsr etsi_ruutu
  cmp.b #3,d0
  bne.s spriteliikku_a
 cmp.b #5,kivet
 bne.s spriteliikku_b
 bsr uusi_kentta
spriteliikku_a
 cmp.b #5,d0
 bne.s spriteliikku_b
 bsr kallot
spriteliikku_b                              
 clr.l d0
spriteliikku_pois2
 rts

sprite_paikka
 move.w c_spritex,d0
 add.w #7,d0
 lsr.w #4,d0
 move.b d0,x
 move.w c_spritey,d0
 add.w #7,d0
 lsr.w #4,d0
 move.b d0,y
 rts

suunta_ruudut
 ;ruudut paikoissa x,y ja xm,ym
 ;move.w c_spritex,d0
 ;move.w c_spritey,d1
 move.w d0,d2
 move.w d1,d3
 cmp.b #1,sprite_suunta
 bne.s suuntar_a
  ;suunta oikealle
  add.w #15,d0
  add.w #1,d1
  add.w #15,d2
  add.w #14,d3
  rts
suuntar_a
 cmp.b #$81,sprite_suunta
 bne.s suuntar_b
  ;suunta vasemmalle
  add.w #1,d1
  add.w #14,d3
  rts
suuntar_b
 cmp.b #2,sprite_suunta
 bne.s suuntar_c
  ;suunta alas
  add.w #15,d1
  add.w #14,d2
  add.w #15,d3
  add.w #1,d0
  rts
suuntar_c
  ;suunta ylös
  add.w #1,d0
  add.w #14,d2
  rts

suunta_xy
 bsr suunta_ruudut
 lsr.w #4,d0
 move.b d0,x
 lsr.w #4,d1
 move.b d1,y
 lsr.w #4,d2
 move.b d2,xm
 lsr.w #4,d3
 move.b d3,ym
 bsr etsi_ruutu
 rts

suunta_lupa
 bsr suunta_xy
  bsr pompotus
 cmp.b #1,d0
 beq.s suunta_loppu
 move.b xm,x
 move.b ym,y
 bsr etsi_ruutu
  bsr pompotus
 cmp.b #1,d0
 beq.s suunta_loppu
 move.w c_spritex,d1
 move.w c_spritey,d2
 move.b c_suunta,d0
 bsr vars_sliikku
 move.w d1,c_spritex
 move.w d2,c_spritey
suunta_loppu
 bsr spritehidastuvuus
 rts

pompotus
  cmp.b #$a,d0
  bne.s pompotus_loppu
  bsr do_voice_boing
  bchg.b #7,suunta
  move.b c_suunta,d1
  andi.b #$7f,d1
  andi.b #$80,suunta
  add.b d1,suunta
  move.b #$c,v_sprite
  move.b #1,d0
pompotus_loppu
  rts

vars_sliikku
 sub.b #1,nlaskuri   ;vähennetään nopeuslaskuria
 bne.s vars_sloppu         ;ellei nollautunut, mennään y:hyn
 bsr spriten_liike
 move.b v_sprite,d0
 move.b #$b,nlaskuri
 sub.b d0,nlaskuri
vars_sloppu
 rts

spriten_liike
 ;suunta d0:ssa, x-paikka d1:ssä, y-paikka d2:ssä
 move.w #-1,d4
 btst #7,d0
 bne spriten_x
 move.w #1,d4
spriten_x
 btst #0,d0
 beq spriten_y
 add.w d4,d1
 rts
spriten_y
 add.w d4,d2
 rts

spritehidastuvuus
 bsr sprite_paikka ;nopeuden pudotus 'suossa'
 bsr etsi_ruutu
 cmp.b #2,d0
 bne.s spriteh_a
 and.b #3,v_sprite
spriteh_a
 sub.b #1,vhlaskuri ;määritellään spriten automaattinen hidastuvuus
 and.b #$3f,vhlaskuri
 bne spriteh_loppu

 tst.b v_sprite
 beq.s spriteh_stop
 sub.b #1,v_sprite
 rts
spriteh_stop
 move.b #0,c_suunta
spriteh_loppu
 rts

uusi_kentta
 add.b #1,nkentta
 bsr kirjoita_taso
 bsr tee_kentta
 cmp.b #$14,nkentta
 bne uusi_kentta_2
 bsr passed
uusi_kentta_2
 move.b #0,kivet
 move.b #0,kanto
 move.b #0,hlaskuri
 bsr esine_poisto
 move.w #255,energia
 bsr energia_mittari
 move.w #0,jekut
 move.w #321,d0
 move.l #0,a0
 move.l #sprite2,a1
 move.l grbase,a6
 jsr _LVOMoveSprite(a6)
 rts

ota_esine
 move.b #0,v_sprite ; pysäytetään sprite
 bsr sprite_paikka
 bsr etsi_ruutu
  cmp.b #3,d0
  bls ei_esinetta
  cmp.b #5,d0
  beq ei_esinetta
  cmp.b #8,d0
  beq ei_esinetta
  move.l d0,-(sp)
  bsr do_voice_bell
  bsr pyyhi_ruutu
  move.l (sp)+,d0
 cmp.b #4,d0
 bne.s ota_pullo
 add.b #1,kivet
 rts
ota_pullo
 cmp.b #6,d0
 bne.s ota_kranaatti
 addi.w #127,energia
 cmp.w #$ff,energia
 bls.s ota_pallo_a
 move.w #$ff,energia
ota_pallo_a
 bsr energia_mittari
 rts
ota_kranaatti
 cmp.b #7,d0
 bne.s ota_myrkky
 btst.b #0,kanto
 bne.s ota_myrkky
 bset.b #0,kanto
  moveq #16,d0
  move.w #240,d1
  move.l #kranaatti_i,a1
  bsr piirra_image
 rts
ota_myrkky
 cmp.b #9,d0
 bne.s ota_happo
 bset.b #2,kanto
  moveq #0,d0
  move.w #240,d1
  move.l #myrkky_i,a1
  bsr piirra_image
 rts
ota_happo
 cmp.b #$b,d0
 bne.s ota_pois
 addi.b #4,hlaskuri
  moveq #0,d0
  move.w #224,d1
  move.l #happo_i,a1
  bsr piirra_image
  bsr kirjoita_happo
 rts
ota_pois
 rts

piirra_image
 movea.l rport,a0
 movea.l intbase,a6
 jsr _LVODrawImage(a6)
 rts

ei_esinetta
 bsr do_voice_hit
 rts

ota_kr
 bsr sprite_paikka
 btst.b #0,kanto
 beq.s ota_kr_pois
  moveq #0,d0
  move.l rport,a1
  move.l grbase,a6
  jsr _LVOSetAPen(a6)
  moveq #16,d0
  move.w #240,d1
  moveq #31,d2
  move.w #255,d3
  move.l rport,a1
  move.l grbase,a6
  jsr _LVORectFill(a6)
 bclr.b #0,kanto
 bset.b #1,kanto
 move.b x,kpaikkax
 move.b y,kpaikkay
 moveq #7,d0
 bsr draw_box
ota_kr_pois
 rts

pyyhi_ruutu
 move.l grbase,a6
 move.l rport,a1
 moveq #0,d0
 jsr _LVOSetAPen(a6)
 moveq #0,d0  ; nollataan ensin rekisteri, koska x tyyppiä byte
 moveq #0,d1  ; nollataan ensin rekisteri, koska y tyyppiä byte
 move.b x,d0
 move.b y,d1
 lsl.w #4,d0
 lsl.w #4,d1
 move.w d0,d2
 add.w #15,d2
 move.w d1,d3
 add.w #15,d3
 move.l rport,a1
 jsr _LVORectFill(a6)
 bsr nollaa_taulukko
 rts
nollaa_taulukko
 bsr etsi_kenttaos
 move.l nkenttaos,a0
 moveq.l #0,d0
 move.b x,d0
 lsr.b #1,d0
 moveq.l #0,d1
 move.b y,d1
 mulu #10,d1
 add.b d1,d0
 btst.b #0,x
 beq.s nollaa_p
 and.b #$f0,0(a0,d0.w)
 bra nollaa_pois
nollaa_p
 and.b #$f,0(a0,d0.w)
nollaa_pois
 rts

energia_mittari
 ;piirretään muuttujassa energia oleva luku palkkina
 movea.l rport,a1
 moveq #12,d0
 move.l grbase,a6
 jsr _LVOSetAPen(a6)
 move.l rport,a1
 moveq #40,d0
 move.w #226,d1
 jsr _LVOMove(a6)
 move.l rport,a1
 moveq #4,d0
 move.l #epoints,a0
 jsr _LVOPolyDraw(a6)
  moveq #0,d0
  move.l rport,a1
  jsr _LVOSetAPen(a6)
  moveq #41,d0
  move.w #227,d1
  move.w #296,d2
  move.w #233,d3
  move.l rport,a1
  jsr _LVORectFill(a6)
 moveq #1,d0
 move.l rport,a1
 jsr _LVOSetAPen(a6)
 moveq #41,d0
 move.w #227,d1
 move.w d0,d2
 move.w #233,d3
 add.w energia,d2
 move.l rport,a1
 jsr _LVORectFill(a6)
 move.l rport,a1
 moveq #0,d0
 jsr _LVOSetAPen(a6)
 rts

kallot
 move.b #0,v_sprite
 move.b #0,suunta
 sub.b #1,elaskuri
 and.b #$f,elaskuri
 bne.s kallot_pois
 tst.b hlaskuri
 bne happo_laskut
 lsr.w energia
 lsr.w energia
 bsr do_voice_aaah
 bsr energia_mittari
 move.l intbase,a6
 move.l cscreen,a0
 jsr _LVODisplayBeep(a6)
kallot_pois
 rts
happo_laskut
 subi.b #1,hlaskuri
 bsr kirjoita_happo
 bsr do_voice_chiump
 rts

energy_loss
 tst.w energia
 beq.s energy_loppu
 sub.w #1,evlaskuri
 and.w #$1ff,evlaskuri
 bne kallot_pois
 sub.w #1,energia
 bsr energia_mittari
 rts
energy_loppu
 move.b #1,lopetus
 rts

gaboom
 btst.b #1,kanto
 beq gaboom_loppu
 sub.b #1,klaskuri
 and.b #$7f,klaskuri
 bne gaboom_loppu
 bsr do_voice_buum
 move.l rport,a1
 move.b #0,d0
 move.l grbase,a6
 jsr _LVOSetAPen(a6)
 move.b kpaikkax,x
 move.b kpaikkay,y
 bsr pyyhi_ruutu
 add.b #1,x
 bsr pyyhi_ruutu
 sub.b #2,x
 bsr pyyhi_ruutu
 add.b #1,x
 add.b #1,y
 bsr pyyhi_ruutu
 sub.b #2,y
 bsr pyyhi_ruutu
 bclr.b #1,kanto
gaboom_loppu
 rts

j1_kohtaaminen
 btst #0,jekut
 beq j1_kohtaaminen_loppu
 bsr sprite_paikka
 move.w j1_spritex,d0
 add.w #7,d0
 lsr.w #4,d0
 cmp.b x,d0
 bne j1_kohtaaminen_loppu
 move.w j1_spritey,d0
 add.w #7,d0
 lsr.w #4,d0
 cmp.b y,d0
 bne j1_kohtaaminen_loppu
 move.b #0,v_sprite
 btst.b #2,kanto
 beq.s j1_koht_jatko
  moveq #0,d0
  move.l rport,a1
  move.l grbase,a6
  jsr _LVOSetAPen(a6)
  moveq #0,d0
  move.w #240,d1
  moveq #15,d2
  move.w #255,d3
  move.l rport,a1
  move.l grbase,a6
  jsr _LVORectFill(a6)
 bsr do_voice_chiump
 bclr.b #2,kanto
 bclr #0,jekut
 move.l #0,a0
 move.l #sprite2,a1
 move.w #321,d0
 move.l grbase,a6
 jsr _LVOMoveSprite(a6)
 rts
j1_koht_jatko
 sub.b #1,elaskuri
 and.b #$f,elaskuri
 bne.s j1_kohtaaminen_loppu
 lsr.w energia
 bsr do_voice_aaah
 bsr energia_mittari
 move.l intbase,a6
 move.l cscreen,a0
 jsr _LVODisplayBeep(a6)
j1_kohtaaminen_loppu
 rts

j1_suunta_lupa
 move.w j1_spritex,d0
 move.w j1_spritey,d1
 bsr suunta_xy
 cmp.b #1,d0
 beq.s j1_suunta_lloppu
 cmp.b #5,d0
 beq.s j1_suunta_lloppu
 cmp.b #8,d0
 beq.s j1_suunta_lloppu
 cmp.b #10,d0
 beq.s j1_suunta_lloppu
 move.b xm,x
 move.b ym,y
 bsr etsi_ruutu
 cmp.b #1,d0
 beq.s j1_suunta_lloppu
 cmp.b #5,d0
 beq.s j1_suunta_lloppu
 cmp.b #8,d0
 beq.s j1_suunta_lloppu
 cmp.b #10,d0
 beq.s j1_suunta_lloppu
 clr.l d0
j1_suunta_lloppu
 rts
jekku_testit
 btst #0,jekut
 bne.s jekku_loppu
 sub.w #1,j1laskuri
 and.w #$3ff,j1laskuri
 bne.s jekku_loppu
 bset #0,jekut
 move.l #j1_koord,a0
 moveq #0,d0
 move.b nkentta,d0
 lsl.w #2,d0
 move.w 0(a0,d0.w),d1
 move.w 2(a0,d0.w),d0
 move.w d1,j1_spritex
 move.w d0,j1_spritey
jekku_loppu
 rts

jekku_ohjaus
 sub.w #1,jekkulaskuri
 and.w #$1ff,jekkulaskuri
 bne jekku_loppu
 bsr j1_kohtaaminen
 btst #0,jekut
 beq jekku_loppu
 bsr jekku1
 rts

jekku1
 sub.w #1,animlaskuri  ; animlaskuri määrää, kuinka usein haukotellaan
 and.w #$ff,animlaskuri
 bne jekku1_apois1
 move.b #-1,frames     ; asetetaan animaatio päälle
 move.b #0,frame       ; frame antaa imagen numeron
 move.w #2,framelaskuri ; määrätään haukotuksen nopeus
 bsr do_voice_roar
jekku1_apois1
 cmp.b #0,frames
 beq jekku1_apois2
 bsr jekku_animaatio
jekku1_apois2
 bsr j1_suunta_valinta
 move.b sprite_suunta,d0
 tst.b d0
 beq.s jekku1_loppu
 move.w j1_spritex,d1
 move.w j1_spritey,d2
 bsr spriten_liike
 move.w d1,j1_spritex
 move.w d2,j1_spritey
 move.w d1,d0
 move.w d2,d1
 move.l #0,a0
 move.l grbase,a6
 move.l #sprite2,a1
 jsr _LVOMoveSprite(a6)
jekku1_loppu
 rts

jekku_animaatio
 subq.w #1,framelaskuri  ; framelaskuri määrää, kuinka kauan framea näytetään
 bne jekku_animaatio_pois
 move.w #2,framelaskuri ; määrätään haukotuksen nopeus
 moveq #0,d0
 move.b frame,d0
 lea spritedata2,a2
 move.l 0(a2,d0.w),a2 ; haettiin spritedatan osoite
 cmp.l #0,a2
 beq jekku_animaatio_stop ; viimeinen frame on jo piirretty
 move.l #0,a0
 move.l #sprite2,a1
 move.l grbase,a6
 jsr _LVOChangeSprite(a6)
 add.b #4,frame
jekku_animaatio_pois
 rts
jekku_animaatio_stop
 move.b #0,frames
 rts

j_c_sprite_erotus
 move.w c_spritey,d0
 sub.w j1_spritey,d0
 bsr abs_wmuunnos
 move.w d0,d1
 move.w c_spritex,d0
 sub.w j1_spritex,d0
 bsr abs_wmuunnos
 rts
j1_suunta_valinta
 bsr j_c_sprite_erotus
 cmp.w d0,d1
 bls.s j1_suunta_py
 move.b #$81,sprite_suunta
 move.w c_spritex,d0
 cmp.w j1_spritex,d0
 beq.s j1_suunta_py
 bls.s j1_suunta_a
 move.b #1,sprite_suunta
j1_suunta_a
 bsr j1_suunta_lupa
 tst.w d0
 bne.s j1_suunta_py
 rts
j1_suunta_py
 move.w c_spritey,d1
 move.b #$82,sprite_suunta
 cmp.w j1_spritey,d1
 beq.s j1_suunta_va
 bls.s j1_suunta_b
 move.b #2,sprite_suunta
j1_suunta_b
 bsr j1_suunta_lupa
 tst.w d0
 bne.s j1_suunta_va
j1_suunta_pois
 rts
j1_suunta_va
 move.w c_spritex,d0
 move.b #$81,sprite_suunta
 cmp.w j1_spritex,d0
 beq.s j1_suunta_d
 bls.s j1_suunta_c
 move.b #1,sprite_suunta
j1_suunta_c
 bsr j1_suunta_lupa
 tst.w d0
 beq j1_suunta_pois
j1_suunta_d
 move.b #0,sprite_suunta
 rts

abs_muunnos
 ;otetaan itseisarvo d0:sta
 tst.b d0
 bmi.s abs_m
 bra.s abs_p
abs_m
 neg.b d0
abs_p
 rts

abs_wmuunnos
 ;otetaan itseisarvo d0:sta
 tst.w d0
 bmi.s abs_wm
 bra.s abs_wp
abs_wm
 neg.w d0
abs_wp
 rts

pallo_poisto
 move.l rport,a1
 move.b #0,d0
 move.l grbase,a6
 jsr _LVOSetAPen(a6)
 moveq #0,d0
 move.b henget,d0
 mulu #18,d0
 add.b #28,d0
 move.w #240,d1
 move.w d0,d2
 add.w #16,d2
 move.w #255,d3
 move.l rport,a1
 jsr _LVORectFill(a6)
 rts

pallo_piirto
 move.b #46,x
pploop
 moveq #0,d0
 move.b x,d0
 move.w #240,d1
 move.l #pallo_i,a1
 bsr piirra_image
 add.b #18,x
 cmp.b #100,x
 blt pploop
 bsr esine_poisto
 rts

esine_poisto
 move.l rport,a1
 move.l grbase,a6
 moveq #0,d0
 jsr _LVOSetAPen(a6)
 move.l rport,a1
 move.l grbase,a6
 moveq #0,d0
 move.w #224,d1
 moveq #31,d2
 move.w #255,d3
 jsr _LVORectFill(a6)
 rts

game_over_screen
  move.l intbase,a6 ;hiiren pointteri näkyviin
  move.l cwindow,a0
  move.l #pointer2,a1
  moveq #16,d0
  moveq #16,d1
  moveq #0,d2
  moveq #0,d3
  jsr _LVOSetPointer(a6)
  move.l #0,a0
  move.l grbase,a6
  move.w #321,d0
  move.l #sprite2,a1
  jsr _LVOMoveSprite(a6)
 move.l grbase,a6
 move.l rport,a1
 moveq #0,d0
 jsr _LVOSetAPen(a6)
 move.l rport,a1
 moveq #0,d0
 moveq #0,d1
 move.w #319,d2
 move.w #255,d3
 jsr _LVORectFill(a6)
 move.l rport,a1
 moveq #9,d0
 jsr _LVOSetAPen(a6)
 move.l #msg1,a0
 move.w #27,d7
 move.w #52,d0
 move.w #80,d1
 moveq #9,d6
 bsr kirjoita
 move.l #msg2,a0
 moveq #3,d7
 move.w #68,d0
 move.w #140,d1
 moveq #9,d6
 bsr kirjoita
 move.l #msg3,a0
 move.w #6,d7
 move.w #216,d0
 move.w #140,d1
 moveq #9,d6
 bsr kirjoita
wait_for_click
 bsr intuimessage
 tst.l d0
 beq wait_for_click
 cmp.w #$c000,d6
 bne wait_for_click
 move.l cwindow,a0
 move.l $c(a0),d6
 move.w d6,d7
 swap d6
 cmp.w #122,d6
 blt wait_for_click
 cmp.w #150,d6
 bgt wait_for_click
  cmp.w #208,d7
  blt yes
  cmp.w #272,d7
  bgt wait_for_click
  moveq #0,d0
  rts
yes
  cmp.w #104,d7
  bgt wait_for_click
  cmp.w #56,d7
  blt wait_for_click
  moveq #1,d0
 rts

game_info_screen
  move.l #0,a0
  move.l grbase,a6
  move.w #321,d0
  move.l #sprite2,a1
  jsr _LVOMoveSprite(a6)
  move.l #0,a0
  move.l grbase,a6
  move.w #321,d0
  move.l #sprite1,a1
  jsr _LVOMoveSprite(a6)
 move.l grbase,a6
 move.l rport,a1
 moveq #0,d0
 jsr _LVOSetAPen(a6)
 move.l grbase,a6
 move.l rport,a1
 moveq #0,d0
 moveq #0,d1
 move.w #319,d2
 move.w #223,d3
 jsr _LVORectFill(a6)
;*** seuraavaksi kirjoitetaan tekstit
 moveq #108,d4
 lea info,a4
 lea infolen,a3
 moveq #0,d7
info_loop
 subq #4,d4
 move.l d4,d5
 lsr.w #2,d5
 move.l 0(a4,d4.w),a0  ; tekstin osoite
 move.b 0(a3,d5.w),d7  ; tekstin pituus
 moveq #0,d0
 moveq #8,d1
 move.l d4,d5
 lsl.l #1,d5
 add.l d5,d1
 moveq #11,d6
 bsr kirjoita
 tst.b d4
 bne info_loop
;***
wait_for_key
 bsr intuimessage
 tst.l d0
 beq wait_for_key
 cmp.w #RAWKEY,d5
 bne wait_for_key
 btst.l #7,d4
 bne wait_for_key
 rts

info_clear
;*** palataan peliin
 bsr tee_kentta_b
 move.l #0,a0
 move.l #sprite1,a1
 move.w c_spritex,d0
 move.w c_spritey,d1
 move.l grbase,a6
 jsr _LVOMoveSprite(a6)
 move.w j1_spritex,d0
 move.w j1_spritey,d1
 move.l #0,a0
 move.l grbase,a6
 move.l #sprite2,a1
 jsr _LVOMoveSprite(a6)
 rts

kirjoita
 ;d7:ssa on tekstin pituus
 ;d6:ssa on väri
 ;a0:ssa on tekstin osoite
 ;d0:ssa on x-koord.
 ;d1:ssa on y-koord.
 move.l grbase,a6
 move.l rport,a1
 jsr _LVOMove(a6)
 move.l rport,a1
 move.l d6,d0
 jsr _LVOSetAPen(a6)
 move.l rport,a1
 move.w d7,d0
 jsr _LVOText(a6)
 rts

alusta_kentta
 ;muistin varaus
 move.l #2940,d0  ; 21 kenttää
 moveq.l #0,d1
 movea.l 4,a6
 jsr _LVOAllocMem(a6)
 ;muistin osoite on d0:ssa
 tst.l d0
 beq.s ei_kartta_muistia
 move.l d0,kenttac

 lea kentat,a0
 moveq #20,d1
alusta_kentta_loop
 move.l d0,(a0)
 add.l #140,d0
 add.l #4,a0
 dbra d1,alusta_kentta_loop
alusta_kentta_pois
 rts

ei_kartta_muistia
  lea msg6,a1
  move.l #msglen6,d3
  bsr valitukset_ei_tiedosto
  bsr GURU
  moveq #0,d0
  bra.s alusta_kentta_pois

Lataa
   move.l a6,-(sp)
 
 ; Argumentit : (name,buffer,length)
 ; tiedoston nimen osoite a0:ssa
 ; nimen pituus d1:ssä
 ; tiedoston koko d6:ssa
 ; muistin osoite d7:ssa
 ; avataan tiedosto
 ; lea maps,a0
   move.l d1,nimipituus ; nimen pituus myhempää kirjoittamista varten
   move.l a0,tiedosto ; myöhempää nimen kirjoittamista varten
   move.l a0,d1   ; Nimen osoite : name
   move.l #MODE_OLDFILE,d2 ; accessMode
   movea.l dosbase,a6
   jsr _LVOOpen(a6)
   tst.l d0   ; jos tulos on nolla, tiedostoa ei ole
   beq.s ei_tiedostoa

 ; tiedosto saatiin avattua
   move.l d0,filehandle ;tiedoston tunnus muistiin
   move.l d0,d1
   move.l d7,d2 ; osoite muistiin, jonne kirjoitetaan : buffer
   move.l d6,d3 ; muistiblokin koko : length
   movea.l dosbase,a6
   jsr _LVORead(a6)
   cmp.l d6,d0
   bne.s ei_tiedostoa

 ; suljetaan tiedosto
   move.l filehandle,d1
   movea.l dosbase,a6
   jsr _LVOClose(a6)
   moveq #-1,d0
lataa_loppu
   move.l (sp)+,a6
   rts

ei_tiedostoa
  move.l tiedosto,a1
  move.l nimipituus,d3
  bsr valitukset
  bsr GURU
  moveq #0,d0
  bra.s lataa_loppu

valitukset
  ; a1:ssa tiedoston nimi, d3:ssa nimenpituus
  moveq #0,d5
  lea valitus,a0
  lea msg7b,a2         ; "Tiedosto "
  move.w #msglen7b,d0
  move.w d0,d5
valitukset_loop1
  move.b -1(a2,d0.w),-1(a0,d0.w)
  subq #1,d0
  bne valitukset_loop1

  add.w d3,d5
  move.l d5,d4
valitukset_loop2
  move.b -1(a1,d3.w),-1(a0,d4.w)
  subq #1,d4
  subq #1,d3
  bne valitukset_loop2

  lea msg7,a2          ; " ei avaudu."
  move.w #msglen7,d0
  add.w d0,d5
  move.l d5,d4
valitukset_loop3
  move.b -1(a2,d0.w),-1(a0,d4.w)
  subq #1,d4
  subq #1,d0
  bne valitukset_loop3

  bsr lisaa_hiiri
  rts

valitukset_ei_tiedosto
  ; a1:ssa teksti, d3:ssa tekstinpituus
  moveq #0,d5
  lea valitus,a0
  move.w d3,d5
valitukset_et_loop1
  move.b -1(a1,d3.w),-1(a0,d3.w)
  subq #1,d3
  bne valitukset_et_loop1

  bsr lisaa_hiiri
  rts

lisaa_hiiri
  lea msg12,a2
  move.w #msglen12,d0
  add.w d0,d5
  move.l d5,d4
valitukset_loop4
  move.b -1(a2,d0.w),-1(a0,d4.w)
  subq #1,d4
  subq #1,d0
  bne valitukset_loop4
  rts

GURU
 ; d0:ssa AlertNumber,a0:ssa String, d1:ssä Height
 movea.l intbase,a6
 moveq #0,d0
 moveq #28,d1
 jsr _LVODisplayAlert(a6)
 rts

;******

init_audio

 move.l #ioa_SIZEOF,d0
 move.l #(MEMF_CLEAR!MEMF_CHIP),d1
 move.l 4,a6
 jsr _LVOAllocMem(a6)
 move.l d0,aumsg
 beq ei_chip_muistia

 move.l #39912,d0
 move.l #MEMF_CHIP,d1
 move.l 4,a6
 jsr _LVOAllocMem(a6)
 move.l d0,audiodata
 beq ei_chip_muistia

 lea bell,a0
 move.l #belllen,d1
 move.l #16462,d6
 move.l audiodata,d7
 move.l d7,voice_bell
 bsr Lataa
 tst.l d0
 beq init_audio_pois

 lea aaah,a0
 move.l #aaahlen,d1
 add.l d6,d7
 move.l d7,voice_aaah
 move.l #2792,d6
 bsr Lataa
 tst.l d0
 beq init_audio_pois

 lea hit,a0
 move.l #hitlen,d1
 add.l d6,d7
 move.l d7,voice_hit
 move.l #720,d6
 bsr Lataa
 tst.l d0
 beq init_audio_pois

 lea buum,a0
 move.l #buumlen,d1
 add.l d6,d7
 move.l d7,voice_buum
 move.l #7738,d6
 bsr Lataa
 tst.l d0
 beq init_audio_pois

 lea boing,a0
 move.l #boinglen,d1
 add.l d6,d7
 move.l d7,voice_boing
 move.l #3648,d6
 bsr Lataa
 tst.l d0
 beq init_audio_pois

 lea chiump,a0
 move.l #chiumplen,d1
 add.l d6,d7
 move.l d7,voice_chiump
 move.l #5016,d6
 bsr Lataa
 tst.l d0
 beq init_audio_pois

 lea roar,a0
 move.l #roarlen,d1
 add.l d6,d7
 move.l d7,voice_roar
 move.l #3536,d6
 bsr Lataa
 tst.l d0
 beq init_audio_pois

 move.l aumsg,a1
 lea allocbits,a0
 move.l a0,ioa_Data(a1)
 move.l #4,ioa_Length(a1)
 move.l #0,MN_REPLYPORT(a1)
 move.b #127,LN_PRI(a1)
 move.b #ADIOF_NOWAIT,IO_FLAGS(a1)
 
 lea audioname,a0
 moveq #0,d0
 moveq #0,d1
 move.l 4,a6
 jsr _LVOOpenDevice(a6)
 tst.l d0
 bne ei_audiota

 move.l aumsg,a0
 move.l IO_UNIT(a0),unit
; move.l #0,MN_REPLYPORT(a0)
 move.l IO_DEVICE(a0),audev
 move.l ioa_AllocKey(a0),allockey
 moveq #-1,d0
init_audio_pois
 rts

ei_audiota
  lea amsg1,a1
  move.l #amsglen1,d3
  bsr valitukset_ei_tiedosto
  bsr GURU
  moveq #0,d0
  bra.s init_audio_pois

ei_chip_muistia
  lea msg5,a1
  move.l #msglen5,d3
  bsr valitukset_ei_tiedosto
  bsr GURU
  moveq #0,d0
  bra.s init_audio_pois

voice_out
 ; annetaan a0:ssa osoite messagedataan
 moveq #13,d1
 move.l aumsg,a1
voice_out_loop
 move.b 0(a0,d1.w),ioa_Data(a1,d1.w)
 dbra d1,voice_out_loop

; move.l audiodata,ioa_Data(a1)
; move.w allockey,ioa_AllocKey(a1)
 move.w #CMD_WRITE,IO_COMMAND(a1)
; move.l unit,IO_UNIT(a1)
 move.b #(ADIOF_NOWAIT!ADIOF_PERVOL),IO_FLAGS(a1)

 move.l aumsg,a1
 move.l a1,-(sp)
 jsr _BeginIO
 move.l (sp)+,a1

 rts

do_voice_bell
 move.l aumsg,a1
 move.l 4,a6
 jsr _LVOAbortIO(a6)
 lea voice_bell,a0
 bsr voice_out
 rts

do_voice_aaah
 move.l aumsg,a1
 move.l 4,a6
 jsr _LVOAbortIO(a6)
 lea voice_aaah,a0
 bsr voice_out
 rts

do_voice_hit
 move.l aumsg,a1
 move.l 4,a6
 jsr _LVOAbortIO(a6)
 lea voice_hit,a0
 bsr voice_out
 rts

do_voice_buum
 move.l aumsg,a1
 move.l 4,a6
 jsr _LVOAbortIO(a6)
 lea voice_buum,a0
 bsr voice_out
 rts

do_voice_boing
 move.l aumsg,a1
 move.l 4,a6
 jsr _LVOAbortIO(a6)
 lea voice_boing,a0
 bsr voice_out
 rts

do_voice_chiump
 move.l aumsg,a1
 move.l 4,a6
 jsr _LVOAbortIO(a6)
 lea voice_chiump,a0
 bsr voice_out
 rts

do_voice_roar
 move.l aumsg,a1
 move.l 4,a6
 jsr _LVOAbortIO(a6)
 lea voice_roar,a0
 bsr voice_out
 rts

free_audio
 move.l aumsg,a1
 move.l audev,d1
 tst.l d1
 beq free_audio_pois
 move.l 4,a6
; jsr _LVOAbortIO(a6)

; move.w allockey,ioa_AllocKey(a1)
 move.w #ADCMD_FREE,IO_COMMAND(a1)
 move.b #IOF_QUICK,IO_FLAGS(a1)
; move.l unit,IO_UNIT(a1)
 move.l 4,a6
 jsr _LVODoIO(a6)

 move.l aumsg,a1
 move.l 4,a6
 jsr _LVOCloseDevice(a6)

free_audio_pois
 rts

;******
VapautaMuistit
  move.l cwindow,a0
  cmpa.l #0,a0
  beq VM0
  move.l intbase,a6
  jsr _LVOCloseWindow(a6)
VM0
  move.l cscreen,a0
  cmpa.l #0,a0
  beq VM1
;  move.l intbase,a6
  jsr _LVOCloseScreen(a6)
VM1
  move.l kenttac,a1
  cmpa.l #0,a1
  beq VM2
  move.l #2940,d0
  move.l 4,a6
  jsr _LVOFreeMem(a6)
VM2
 move.l aumsg,a1
 move.l #ioa_SIZEOF,d0
  cmpa.l #0,a1
  beq VM7
; move.l 4,a6
 jsr _LVOFreeMem(a6)
VM7
 move.l audiodata,a1
 move.l #39912,d0
  cmpa.l #0,a1
  beq VM8
; move.l 4,a6
 jsr _LVOFreeMem(a6)
VM8
  rts
  
;**************************************************

;        DATA ALUE
henget      dc.b 0
addr        dc.l 0
lenght      dc.l 0
kanta       dc.l 0
returnmsg   dc.l 0
string      dc.b '********',32,10
intname     dc.b 'intuition.library',0
dosname     dc.b 'dos.library',0
grname      dc.b 'graphics.library',0
audioname   dc.b 'audio.device',0
valitus     dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
            dc.l 0,0  ; mahtuu 128 merkkiä

intbase ds.l 1

newwindow
   dc.w 0
   dc.w 0
   dc.w 320
   dc.w 256
   dc.b -1
   dc.b -1
   dc.l MOUSEBUTTONS!MOUSEMOVE!RAWKEY!DELTAMOVE
   dc.l REPORTMOUSE!BORDERLESS!ACTIVATE!RMBTRAP
   dc.l 0
   dc.l 0
   dc.l 0
   dc.l 0 ;screen addr
   dc.l 0
   dc.w 0
   dc.w 0
   dc.w 0
   dc.w 0
   dc.w $f

newscreen
   dc.w 0
   dc.w 0
   dc.w 320
   dc.w 256
   dc.w 4
   dc.b 0
   dc.b 1
   dc.w 0
   dc.w $f
   dc.l 0
   dc.l 0
   dc.l 0
   dc.l 0

suo_i   ;kynät 0 ja 2
   dc.w 0,0
   dc.w 16,16,1
   dc.l suo_id
   dc.b 2,0
   dc.w 0,0
exit_i  ;kynät 0, 1, 4 ja 5
   dc.w 0,0
   dc.w 16,16,2
   dc.l exit_id
   dc.b 5,0
   dc.w 0,0
muuri_i ;kynät 1, 3, 5 ja 7
   dc.w 0,0
   dc.w 16,16,2
   dc.l muuri_id
   dc.b 6,1
   dc.w 0,0
kivi_i ;kynät 0, 4, 8 ja 12
   dc.w 0,0
   dc.w 16,16,2
   dc.l kivi_id
   dc.b 12,0
   dc.w 0,0
kallo_i ;kynät 0, 4, 8 ja 12
   dc.w 0,0
   dc.w 16,16,2
   dc.l kallo_id
   dc.b 12,0
   dc.w 0,0
pullo_i ;kynät 0, 2, 8 ja 10
   dc.w 0,0
   dc.w 16,16,2
   dc.l pullo_id
   dc.b 10,0
   dc.w 0,0
kranaatti_i ;kynät 0, 2, 4 ja 6
   dc.w 0,0
   dc.w 16,16,2
   dc.l kranaatti_id
   dc.b 6,0
   dc.w 0,0
portti_i ;kynät 0, 1, 4 ja 5
   dc.w 0,0
   dc.w 16,16,2
   dc.l portti_id
   dc.b 5,0
   dc.w 0,0
pallo_i ;kynät 0, 4, 8 ja 12
   dc.w 0,0
   dc.w 16,16,2
   dc.l pallo_id
   dc.b 12,0
   dc.w 0,0
myrkky_i ;kynät 0, 1, 8 ja 9
   dc.w 0,0
   dc.w 16,16,2
   dc.l myrkky_id
   dc.b 9,0
   dc.w 0,0
linko_i ;kynät 12, 13, 14 ja 15
   dc.w 0,0
   dc.w 16,16,2
   dc.l linko_id
   dc.b 3,12
   dc.w 0,0
happo_i  ;kynät 9, 11, 13 ja 15
   dc.w 0,0
   dc.w 16,16,2
   dc.l happo_id
   dc.b 6,9
   dc.w 0,0

spritedata2
   dc.l spritedata2b
   dc.l spritedata2c
   dc.l spritedata2d
   dc.l spritedata2e
   dc.l spritedata2d
   dc.l spritedata2c
   dc.l spritedata2b
   dc.l spritedata2a
   dc.l 0

sprite1
   dc.l spritedata1
   dc.w 16
   dc.w 20,20,2

   cnop 0,2

sprite2
   dc.l spritedata2a
   dc.w 16
   dc.w 20,20,3
sprite0
   dc.l pointer
   dc.w 1
   dc.w 20,20,1

kentat
   dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
colormap
   dc.w $0333,$0d86,$0111,$0a64
   dc.w $0000,$0742,$0353,$0420
   dc.w $023f,$0ff3,$081f,$01f6
   dc.w $0fff,$0800,$0f70,$0333
   dc.w $0a64,$0cff,$019e,$0f90
   dc.w $0444,$0002,$0779,$0ddf
   dc.w $0555,$0002,$0779,$0ddf
   dc.w $0999,$0002,$0779,$0ddf

epoints
   dc.w 297,226
   dc.w 297,234
   dc.w 40,234
   dc.w 40,226

box_images
   dc.l muuri_i      ; image n:o $1
   dc.l suo_i        ; image n:o $2
   dc.l exit_i       ; image n:o $3
   dc.l kivi_i       ; image n:o $4
   dc.l kallo_i      ; image n:o $5
   dc.l pullo_i      ; image n:o $6
   dc.l kranaatti_i  ; image n:o $7
   dc.l portti_i     ; image n:o $8
   dc.l myrkky_i     ; image n:o $9
   dc.l linko_i      ; image n:o $A
   dc.l happo_i      ; image n:o $B
j1_koord
   dc.w 18,18
   dc.w 144,128
   dc.w 18,80
   dc.w 288,160
   dc.w 192,18
   dc.w 160,192
   dc.w 192,64
   dc.w 144,48
   dc.w 160,48
   dc.w 16,128
   dc.w 16,16
   dc.w 32,32
   dc.w 192,80
   dc.w 64,160
   dc.w 208,192
   dc.w 240,96
   dc.w 176,112
   dc.w 240,32
   dc.w 160,48
   dc.w 16,176
   dc.w 16,128
kenttac      ds.l 1
filehandle   dc.l 0
tiedosto     dc.l 0
nimipituus   dc.l 0
dosbase   ds.l 1
grbase    ds.l 1
cscreen   ds.l 1
cwindow   ds.l 1
rport     ds.l 1
vport     ds.l 1
dloop     dc.l 0
x         dc.b 0
y         dc.b 0
nkentta   dc.b 0
numsprite dc.b 0,0,0
nkenttaos dc.l 0
ym        dc.l 0
xm        dc.l 0
kivet     dc.b 0
energia   dc.w 255
msg1      dc.b 'Do you want to play again ?'
msg2      dc.b 'YES'
msg3      dc.b '..no..'
;********** GAME CONTROL DATA ************
suunta        dc.b 0
sprite_suunta dc.b 0
c_suunta      dc.b 0
c_spritex     dc.w 321
c_spritey     dc.w 0
a_spritex     dc.w 0
a_spritey     dc.w 0
j1_spritex    dc.w 321
j1_spritey    dc.w 0
v_sprite      dc.b 0
nlaskuri      dc.b 1
vhlaskuri     dc.b 0
solaskuri     dc.w 0
txlaskuri     dc.b 0
elaskuri      dc.b 0
hlaskuri      dc.b 0
evlaskuri     dc.w 0
klaskuri      dc.b 0
j1laskuri     dc.w 0
jekkulaskuri  dc.w 0
jekut         dc.w 0
kpaikkax      dc.b 0
kpaikkay      dc.b 0
lopetus       dc.b 0
kanto         dc.b 0

;********************

audiodata   dc.l 0
audev       dc.l 0
unit        dc.l 0
aumsg       dc.l 0
allockey    dc.w 0
allocbits   dc.b 1,2,4,8

animlaskuri    dc.w 0
framelaskuri   dc.w 0
frames         dc.b 0
frame          dc.b 0

voice_bell
 dc.l 0     ; ioa_Data
 dc.l 16462 ; ioa_Length
 dc.w 300   ; ioa_Period
 dc.w 63    ; ioa_Volume
 dc.w 1     ; ioa_Cycles

voice_aaah
 dc.l 0     ; ioa_Data
 dc.l 2792  ; ioa_Length
 dc.w 300   ; ioa_Period
 dc.w 63    ; ioa_Volume
 dc.w 1     ; ioa_Cycles

voice_hit
 dc.l 0     ; ioa_Data
 dc.l 720   ; ioa_Length
 dc.w 300   ; ioa_Period
 dc.w 63    ; ioa_Volume
 dc.w 1     ; ioa_Cycles

voice_buum
 dc.l 0     ; ioa_Data
 dc.l 7738  ; ioa_Length
 dc.w 300   ; ioa_Period
 dc.w 63    ; ioa_Volume
 dc.w 1     ; ioa_Cycles

voice_boing
 dc.l 0     ; ioa_Data
 dc.l 3648  ; ioa_Length
 dc.w 300   ; ioa_Period
 dc.w 63    ; ioa_Volume
 dc.w 1     ; ioa_Cycles

voice_chiump
 dc.l 0     ; ioa_Data
 dc.l 5016  ; ioa_Length
 dc.w 300   ; ioa_Period
 dc.w 63    ; ioa_Volume
 dc.w 1     ; ioa_Cycles

voice_roar
 dc.l 0     ; ioa_Data
 dc.l 3536  ; ioa_Length
 dc.w 300   ; ioa_Period
 dc.w 63    ; ioa_Volume
 dc.w 1     ; ioa_Cycles

amsg1       dc.b 0,208,11,'Can''t open audio.device !',0,1
amsglen1    equ *-amsg1

;**
msg0       dc.b 'DekaQuest V1.0 © Leo Puolamaa May 1991',$0a
msglen0    equ *-msg0
           dc.b 0
msg4       dc.b 0,216,11,'Screen won''t open.',0,1
msglen4    equ *-msg4
msg5       dc.b 0,216,11,'Out of CHIP_MEM !',0,1
msglen5    equ *-msg5
msg6       dc.b 0,216,11,'Map memory won''t open.',0,1
msglen6    equ *-msg6
msg7       dc.b ' won''t open.',0,1
msglen7    equ *-msg7
msg7b      dc.b 0,172,11,'File '
msglen7b   equ *-msg7b
msg8       dc.b 0,216,11,'No sprites !',0,1
msglen8    equ *-msg8
msg9       dc.b 'Level :'
msglen9    equ *-msg9
           dc.b 0
msg10      dc.b 'DiamondQuest © Leo Puolamaa'
msglen10   equ *-msg10
           dc.b 0
msg11      dc.b 'GAME PAUSED'
msglen11   equ *-msg11
           dc.b 0
msg12      dc.b 0,172,21,'Press a mouse button to continue...',0,0
msglen12   equ *-msg12
msg13      dc.b 'Amazing,how on earth did you do it?!'
msglen13   equ *-msg13
           dc.b 0
 cnop 0,2
info
 dc.l info0
 dc.l info1
 dc.l info2
 dc.l info3
 dc.l info4
 dc.l info5
 dc.l info6
 dc.l info7
 dc.l info8
 dc.l info9
 dc.l info10
 dc.l info11
 dc.l info12
 dc.l info13
 dc.l info14
 dc.l info15
 dc.l info16
 dc.l info17
 dc.l info18
 dc.l info19
 dc.l info20
 dc.l info21
 dc.l info22
 dc.l info23
 dc.l info24
 dc.l info25
 dc.l info26

infolen
 dc.b infolen0
 dc.b infolen1
 dc.b infolen2
 dc.b infolen3
 dc.b infolen4
 dc.b infolen5
 dc.b infolen6
 dc.b infolen7
 dc.b infolen8
 dc.b infolen9
 dc.b infolen10
 dc.b infolen11
 dc.b infolen12
 dc.b infolen13
 dc.b infolen14
 dc.b infolen15
 dc.b infolen16
 dc.b infolen17
 dc.b infolen18
 dc.b infolen19
 dc.b infolen20
 dc.b infolen21
 dc.b infolen22
 dc.b infolen23
 dc.b infolen24
 dc.b infolen25
 dc.b infolen26

info0       dc.b '          «** DiamondQuest **»'
infolen0    equ *-info0
info1       dc.b '          --------------------'
infolen1    equ *-info1
info2       dc.b '  Welcome to the world of games. This'
infolen2    equ *-info2
info3       dc.b 'time you are a grey ball and have just'
infolen3    equ *-info3
info4       dc.b 'entered a great maze to pick up some'
infolen4    equ *-info4
info5       dc.b 'diamonds and get rich.  There are 20'
infolen5    equ *-info5
info6       dc.b 'levels each containing five diamonds.'
infolen6    equ *-info6
info7       dc.b 'Exit to the next level becomes available'
infolen7    equ *-info7
info8       dc.b 'after you have collected all diamonds'
infolen8    equ *-info8
info9       dc.b 'on the current level.  Although you are'
infolen9    equ *-info9
info10      dc.b 'not immortal, you still have four lives.'
infolen10   equ *-info10
info11      dc.b 'To roll around you drag the mouse to the'
infolen11   equ *-info11
info12      dc.b 'desired direction.  To perform some'
infolen12   equ *-info12
info13      dc.b 'important actions you may use these'
infolen13   equ *-info13
info14      dc.b 'commands :'
infolen14   equ *-info14
info15      dc.b ' '
infolen15   equ *-info15
info16      dc.b ' - Left mouse button to pick up things'
infolen16   equ *-info16
info17      dc.b ' - Right button to drop a handgrenade'
infolen17   equ *-info17
info18      dc.b ' - Esc for suicide'
infolen18   equ *-info18
info19      dc.b ' - "p" to start and end pause mode'
infolen19   equ *-info19
info20      dc.b ' - Help for this information'
infolen20   equ *-info20
info21      dc.b ' - Left & right Amiga + ctrl to reset'
infolen21   equ *-info21
info22      dc.b ' '
infolen22   equ *-info22
info23      dc.b ' © Leo Puolamaa June 1991 ,Oulu Finland'
infolen23   equ *-info23
info24      dc.b ' '
infolen24   equ *-info24
info25      dc.b ' '
infolen25   equ *-info25
info26      dc.b ' HIT A KEY...'
infolen26   equ *-info26

maps        dc.b 'DQ:maps'
mapslen     equ *-maps
            dc.b 0
bell        dc.b 'DQ:Bell.sound'
belllen     equ *-bell
            dc.b 0
aaah        dc.b 'DQ:Aaah.sound'
aaahlen     equ *-aaah
            dc.b 0
hit         dc.b 'DQ:Hit.sound'
hitlen      equ *-hit
            dc.b 0
buum        dc.b 'DQ:Buum.sound'
buumlen     equ *-buum
            dc.b 0
boing       dc.b 'DQ:Boing.sound'
boinglen    equ *-boing
            dc.b 0
chiump      dc.b 'DQ:Chiump.sound'
chiumplen   equ *-chiump
            dc.b 0
roar        dc.b 'DQ:Roar.sound'
roarlen     equ *-roar
            dc.b 0

 SECTION sprites,DATA ; ladataan CHIP -muistiin

pointer
   dc.w 0,0,0,0,0,0

spritedata1
   dc.w 0,0
   dc.w $07e0,$0000
   dc.w $1db8,$0240
   dc.w $285c,$17a0
   dc.w $502e,$2fd0
   dc.w $478a,$3ff4
   dc.w $9fe3,$7ffc,$bff1,$7ffe,$bff3,$7ffc
   dc.w $7ffd,$fffa,$7ffb,$fffc,$7ffd,$fffa
   dc.w $7ffa,$7ffc
   dc.w $3ff2,$7ffc
   dc.w $3ff4,$3ff8
   dc.w $1ff8,$1fe0
   dc.w $07e0,$0780
   dc.w 0,0

spritedata2a
   dc.w 0,0
   dc.w $03e0,$0000
   dc.w $1018,$0fe0
   dc.w $066c,$3990
   dc.w $4e72,$718c
   dc.w $4e72,$718c
   dc.w $8c31,$f3ce
   dc.w $8001,$fffe
   dc.w $a005,$fffe
   dc.w $a185,$fe7e
   dc.w $a3c5,$fc3e
   dc.w $b00d,$fffe
   dc.w $581a,$7ffc
   dc.w $4ff2,$7ffc
   dc.w $27e4,$3ff8
   dc.w $1008,$1ff0
   dc.w $07c0,$07e0
   dc.w 0,0

spritedata2b
   dc.w 0,0
   dc.w $03e0,$0000
   dc.w $1018,$0fe0
   dc.w $066c,$3990
   dc.w $4e72,$718c
   dc.w $4e72,$718c
   dc.w $8c31,$f3ce
   dc.w $8001,$fffe
   dc.w $a185,$fe7e
   dc.w $a3c5,$fc3e
   dc.w $b00d,$fffe
   dc.w $b81d,$fffe
   dc.w $5ffa,$7ffc
   dc.w $4ff2,$7c3c
   dc.w $27e4,$3ff8
   dc.w $1008,$1ff0
   dc.w $07c0,$07e0
   dc.w 0,0

spritedata2c
   dc.w 0,0
   dc.w $03e0,$0000
   dc.w $1018,$0fe0
   dc.w $066c,$3990
   dc.w $4e72,$718c
   dc.w $4e72,$718c
   dc.w $8c31,$f3ce
   dc.w $8181,$fe7e
   dc.w $a3c5,$fc3e
   dc.w $b00d,$fffe
   dc.w $b81d,$eff6
   dc.w $bffd,$f7ee
   dc.w $5ffa,$781c
   dc.w $4ff2,$7c3c
   dc.w $27e4,$3ff8
   dc.w $1008,$1ff0
   dc.w $07c0,$07e0
   dc.w 0,0

spritedata2d
   dc.w 0,0
   dc.w $03e0,$0000
   dc.w $1018,$0fe0
   dc.w $066c,$3990
   dc.w $4e72,$718c
   dc.w $4e72,$718c
   dc.w $8c31,$f3ce
   dc.w $e3c7,$fc3e
   dc.w $f00f,$fffe
   dc.w $f81f,$cff2
   dc.w $bffd,$e7e6
   dc.w $bffd,$f00e
   dc.w $5ffa,$781c
   dc.w $4ff2,$7c3c
   dc.w $27e4,$3c38
   dc.w $17e8,$1ff0
   dc.w $07c0,$07e0
   dc.w 0,0

spritedata2e
   dc.w 0,0
   dc.w $03e0,$0000
   dc.w $1018,$0fe0
   dc.w $066c,$3990
   dc.w $4e72,$718c
   dc.w $4e72,$718c
   dc.w $8db1,$f24e
   dc.w $e247,$fdbe
   dc.w $f81f,$9ff8
   dc.w $ffff,$c7e2
   dc.w $bffd,$e006
   dc.w $bffd,$f00e
   dc.w $5ffa,$781c
   dc.w $4ff2,$781c
   dc.w $27e4,$3c38
   dc.w $17e8,$1c30
   dc.w $07c0,$07e0
   dc.w 0,0

pointer2
   dc.w 0,0
   dc.w $8000,$0000,$8000,$4000
   dc.w $c000,$2000,$4000,$3000
   dc.w $6000,$1800,$3000,$0c00
   dc.w $1800,$0600,$0c00,$0300
   dc.w $0604,$0184,$030e,$00ce
   dc.w $019c,$007c,$00e8,$0038
   dc.w $0058,$0068,$00fc,$0004
   dc.w $018e,$0146,$0086,$0006
   dc.w 0,0

suo_id
   dc.w $6262,$1919,$9898,$4646
   dc.w $6262,$1919,$9898,$4646
   dc.w $6262,$1919,$9898,$4646
   dc.w $6262,$1919,$9898,$4646
exit_id
   dc.w $0000,$0f60,$3ff8,$2ff8
   dc.w $7ff4,$f83e,$f39e,$f21e
   dc.w $f31e,$f21e,$f39e,$683c
   dc.w $7ff6,$3ff8,$1ff8,$07e0

   dc.w $07e0,$17f8,$1f7c,$5f76
   dc.w $200e,$77cf,$7c6f,$0def
   dc.w $7ce1,$7def,$7c6f,$37c6
   dc.w $0ef8,$1efc,$06e0,$0000
muuri_id
   dc.w $7fff,$3fff,$1fff,$0fff
   dc.w $0fff,$081f,$0a1f,$0b9f
   dc.w $0b9f,$0bdf,$081f,$0fff
   dc.w $1007,$2003,$4001,$8000

   dc.w $ffff,$7fff,$3fff,$1fff
   dc.w $000f,$07ef,$062f,$062f
   dc.w $062f,$07ef,$07ef,$000f
   dc.w $000f,$0007,$0003,$0001
kivi_id
   dc.w $0000,$0000,$03c0,$07f0
   dc.w $07f8,$03f8,$01fc,$01fc
   dc.w $3f00,$3f80,$1fc0,$1fe0
   dc.w $0fe0,$03c0,$0000,$0000

   dc.w $0000,$0000,$03c0,$0fe0
   dc.w $1fe0,$1fc0,$3f80,$3f80
   dc.w $00fc,$01fc,$03f8,$07f8
   dc.w $07f0,$03c0,$0000,$0000
kallo_id
   dc.w $0380,$3f60,$7fd0,$6fe8
   dc.w $f5f8,$fedc,$fffc,$ffdc
   dc.w $7ff4,$1ffe,$03fd,$03fe
   dc.w $0195,$01ff,$00fe,$007c

   dc.w $03c0,$3ff0,$7ff8,$7ff8
   dc.w $fffc,$fff0,$ffe0,$fff0
   dc.w $7ffe,$1fff,$027f,$027f
   dc.w $0115,$0195,$00ff,$007e
pullo_id
   dc.w $0000,$0180,$0720,$0340
   dc.w $0340,$0340,$0340,$0340
   dc.w $0fb0,$1fe8,$3f64,$3e24
   dc.w $3f44,$1fb8,$03c0,$0000

   dc.w $0000,$0000,$07c0,$0380
   dc.w $0380,$0380,$0380,$0380
   dc.w $0fc0,$1ff0,$3ef8,$3df8
   dc.w $3ef8,$1fc0,$0300,$0000
kranaatti_id
   dc.w $0000,$0000,$6000,$3000
   dc.w $1800,$3e00,$37e0,$27f0
   dc.w $27f8,$27f8,$27f8,$33fc
   dc.w $11fc,$08fc,$0418,$0200

   dc.w $1800,$2800,$1000,$0800
   dc.w $0400,$05e0,$0610,$07e8
   dc.w $07f4,$06f4,$0774,$039a
   dc.w $09ea,$04f8,$0200,$01c0
portti_id
   dc.w $0490,$e00e,$e00e,$e24e
   dc.w $0000,$0000,$4924,$0000
   dc.w $0000,$2492,$0000,$0000
   dc.w $0240,$e00e,$e00e,$e92e

   dc.w $f49f,$7007,$7007,$1241
   dc.w $0000,$0000,$4924,$0000
   dc.w $0000,$2492,$0000,$0000
   dc.w $f24f,$7007,$7007,$1921
pallo_id
   dc.w $07e0,$1db8,$285c,$502e
   dc.w $478a,$9fe3,$bff1,$bff3
   dc.w $7ffd,$7ffb,$7ffd,$7ffa
   dc.w $3ff2,$3ff4,$1ff8,$07e0

   dc.w $0000,$0240,$17a0,$2fd0
   dc.w $3ff4,$7ffc,$7ffe,$7ffc
   dc.w $fffa,$fffc,$fffa,$7ffc
   dc.w $7ffc,$3ff8,$1fe0,$0780
myrkky_id
   dc.w $0000,$07e0,$07e0,$03c0
   dc.w $03c0,$03c0,$0ff0,$3ffc
   dc.w $7bbe,$7d7e,$7efe,$7d7e
   dc.w $3bbc,$1ff8,$07e0,$0000

   dc.w $0000,$07c0,$07c0,$0300
   dc.w $0380,$0380,$0fc0,$3ff0
   dc.w $7ff8,$6ff8,$7ff8,$6ff8
   dc.w $3ff0,$1fe0,$0780,$0000
linko_id
   dc.w $ffff,$fcff,$ffff,$fe7f
   dc.w $f01f,$f0df,$e34f,$c065
   dc.w $a021,$a007,$f00f,$f00f
   dc.w $fc3f,$feff,$fe7f,$ffff

   dc.w $f00f,$ed37,$de7b,$bdbd
   dc.w $7fee,$7f2e,$3cb4,$3b9a
   dc.w $59dc,$2d3c,$74fe,$77fe
   dc.w $bdbd,$de7b,$ecb7,$f00f
happo_id
   dc.w $ffff,$fcff,$fcff,$fcff
   dc.w $fe7f,$feff,$f1ff,$c7ff
   dc.w $ce6f,$cdaf,$cc2f,$e5bf
   dc.w $e7df,$f3ff,$f87f,$ffff

   dc.w $ffff,$fc3f,$fc3f,$fc3f
   dc.w $fe7f,$fe7f,$f00f,$c003
   dc.w $c183,$c243,$c3c3,$e247
   dc.w $e007,$f00f,$f81f,$ffff
 end

