Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;; ----------------------------------------------------
- ;;
- ;;
- ;; TKT-1110 HARJOITUSTYÖ 2
- ;; REAKTIOTESTI
- ;;
- ;; ----------------------------------------------------
- .program reaktio_testi
- .include "equt.inc"
- aika .equ 48000 ;48000 kellon jaksoa = 2ms
- .section muuttujat,data,locate=h'ffa000
- tick: .res.w 1 ;keskeytysten määrän laskenta
- sek: .res.b 1
- min: .res.b 1
- tun: .res.b 1
- mj: .res.b 25 ;mikä tahansa merkkijono
- aikap: .res.b 25 ;aika-merkkijono
- seed: .res.b 1
- rand: .res.w 1
- led_lippu: .res.b 1
- led_lippu2: .res.b 1
- led_aika: .res.w 1
- aika_muuttunut: .res.b 1
- koord_x0: .res.b 1 ;x-koordinaatti
- koord_x1: .res.b 1
- koord_y0: .res.b 1 ;y-koordinaatti
- koord_y1: .res.b 1
- luku_asc: .res.b 4 ;2 ascii numeroa
- .align 2
- top_taulu: .res.w 4
- laskuri: .res.b 1 ;laskuri ajantalletukseen
- ed_laskuri: .res.b 1
- reaktio_lippu: .res.b 1
- .align 2
- reaktio_aika: .res.w 1
- uudestaan: .res.b 1
- over_bit: .res.b 1
- sammuta_lippu: .res.b 1
- .section koodi,code,locate=h'ffa200
- start: mov.l #h'ffefc0, ER7 ;pino-osoitin
- bsr alusta_SCI
- bclr #6, @SCR_0 ;kielletään vastaanottimen keskeytykset
- bset #0, @PGDR ;sammuta ledi
- mov.w #0, R0
- mov.b R0L, @over_bit
- start_over: bclr #6, @SCR_0 ;kielletään vastaanottimen keskeytykset
- mov.w #0, R0
- mov.w R0, @tick ;laskureiden nollaus
- mov.b R0L, @laskuri
- mov.b R0L, @led_lippu
- mov.b R0L, @led_lippu2
- mov.w R0, @led_aika
- mov.b R0L, @aika_muuttunut ;aika_muuttunut = false
- mov.b R0L, @uudestaan
- mov.w R0, @top_taulu
- mov.w R0, @top_taulu+1
- mov.w R0, @top_taulu+2
- mov.b R0L, @sammuta_lippu ;sammuta_lippu = false
- mov.w R0, @reaktio_aika ;muuttujien nollaus
- mov.b R0L, @reaktio_lippu
- ;; Kuvaruudun tyhjennys
- mov.l #clrs, ER5
- bsr print_string
- ;; Muotoilut pois
- mov.l #default, ER5
- bsr print_string
- ;; Tekijöiden nimet ylälaitaan
- mov.l #tekijat, ER5 ;Merkkijonon alku rekisteriin
- bsr print_string
- ;; Luetaan kellonaika , kaiutetaan kaikki merkit, tuntien, sekuntien ja
- ;; minuuttien välille tulostetaan kaksoispiste, control-t (?) vie alkuun
- ;; Jos laiton aika, ei käynnistetä kelloa kunnes kirjoitettu oikea
- ;; Kello-prompt
- ;; Kursori osoitteeseen 1,3
- mov.b #1+48, R0L
- mov.b R0L, @koord_x0
- mov.b #0+48, R0L
- mov.b R0L, @koord_x1
- mov.b #3+48, R0L
- mov.b R0L, @koord_y0
- mov.b #0+48, R0L
- mov.b R0L, @koord_y1
- bsr move_cursor
- mov.l #kello, ER5
- bsr print_string
- mov.b #100, R0L
- mov.b R0L, @ed_laskuri
- mov.l #luku_asc, ER4 ;luku_asc osoitin
- ;; Tiedustellaan aika, ER4 kriittinen
- aika_init: mov.b @laskuri, R0L
- cmp.b #6, R0L ;onko koko aika syötetty
- beq pois_init
- odota_RDRF: btst #6, @SSR_0 ;odotetaan merkkiä
- beq odota_RDRF
- mov.b @RDR_0, R0L ;luetaan merkki
- bsr check_och_print
- mov.b @laskuri, R0L
- cmp.b #2, R0L
- beq valimerkki
- cmp.b #4, R0L
- beq valimerkki
- bra aika_init
- valimerkki: mov.b @laskuri, R0L
- mov.b @ed_laskuri, R1L
- cmp.b R0L, R1L ;ettei tehdä toimenpidettä turhaan
- beq pois_vali
- ;; Tarkistetaan luvun oikeellisuus
- bsr str2int ;luku_asc -> R0L
- mov.b @laskuri, R1L
- cmp.b #3, R1L
- blo check_tunnit ;laskuri < 3
- cmp.b #5, R1L
- blo check_mins ;laskuri < 5
- check_ret: mov.l #luku_asc, ER4
- mov.b #":", R0L ;tulostetaan välimerkki
- bsr print_char
- mov.b @laskuri, R0L ;laskurin edellinen arvo
- mov.b R0L, @ed_laskuri ;-talteen
- pois_vali: bra aika_init
- check_tunnit: cmp.b #24, R0L
- bhs aika_fail ;tunnit >= 25
- mov.b R0L, @tun
- bra check_ret
- check_mins: cmp.b #60, R0L
- bhi aika_fail ;minuutit >= 60
- mov.b R0L, @min
- bra check_ret
- aika_fail: bra start_over
- ;; Pitää tarkistaa vielä sekunnit
- pois_init: bsr str2int
- cmp.b #60, R0L
- bhi aika_fail ;sekunnit >= 60
- mov.b R0L, @sek
- ;; Viimein saatu aika asetettua
- ;; --------------------------------------
- bsr seeding ;seed random
- ;; --------------------------------------
- mov.b @over_bit, R0L
- cmp.b #1, R0L
- beq loop_start ;hypätään alustukset yli jos tehdään uudestaan
- bclr #5, @MSTPCRA ;TPU:n virta päälle
- mov.b #b'00000000, R0L ;pulssilaskurin jatkuva toiminta, esijakaja 1
- mov.b R0L, @TCR_0
- bset #5, @SYSCR ;8-tasoinen keskeytysjärjestelmä
- mov.b #h'17, R0L ;TPU:n prioriteetti ykkönen
- mov.b R0L, @IPRF
- mov.b #h'71, R0L
- mov.b R0L, @IPRJ ;myös sarjaportin prioriteetti 1
- mov.b #0, R0L
- mov.b R0L, @P1DDR
- mov.w @TCNT_0, R1
- add.w #10000, R1
- mov.w R1, @TGRA_0
- bset #0, @TSTR ;pulssilaskuri käyntiin
- bclr #0, @TSR_0 ;vanha tapahtumalippu nollataan
- bset #0, @TIER_0 ;sallitaan kanavan A0 keskeytykset
- andc #b'11111000, EXR ;keskeytysmaski nollaksi
- ;; Ajoittimen keskeystyspalvelussa aika-muistipaikkoja kasvatetaan aina kun sekunti on kulunut
- ;; Kun käyttäjä painaa välilyöntiä, 1-5s kuluttua sytytetään ledi
- ;; Satunnaisen ajan voisi ottaa kellosta?
- ;; Tallennetaan ledinsyttymisaika ja lasketaan erotus sen ja kytkimen painamisen välillä
- ;; Pääohjelman silmukka
- loop_start:
- bset #6, @SCR_0 ;sallitaan vastaanottimen keskeytykset
- mov.b @uudestaan, R0L
- cmp.b #1, R0L
- beq start_over
- mov.b @led_lippu, R0L
- cmp.b #1, R0L
- beq led_aloitusloop ;if (led_lippu == true)
- mov.b @aika_muuttunut, R0L
- cmp.b #1, R0L ;if (aika_muuttunut == true)
- bne loop_start ; {
- mov.b #0, R0L
- mov.b R0L, @aika_muuttunut ;aika_muuttunut = false
- ;; Ajoittimen keskeytys kielletään kun aikaa laitetaan
- bclr #0, @TIER_0 ;kielto
- bsr time_string
- bset #0, @TIER_0 ;sallitaan
- mov.l #mj, ER5
- mov.b #8+48, R0L
- mov.b R0L, @koord_x0
- mov.b #0+48, R0L
- mov.b R0L, @koord_x1
- mov.b #3+48, R0L
- mov.b R0L, @koord_y0
- mov.b #0+48, R0L
- mov.b R0L, @koord_y1
- bsr move_cursor
- mov.l #aikap, ER5
- bsr print_string
- bra loop_start ; }
- ;; Ledinvilautuspaikka
- led_aloitusloop:
- bclr #6, @SCR_0 ;kielletään vastaanottimen keskeytykset
- led_loop:
- mov.b @led_lippu2, R0L
- cmp.b #1, R0L ;onko led_lippu2 = true
- beq led_sytyta
- bra led_loop
- led_sytyta: mov.b #0, R0L
- mov.b R0L, @led_lippu ;led_lippu = false
- mov.b R0L, @led_lippu2 ;led_lippu2 = false
- bclr #0, @PGDR ;sytytä
- ledin_poltto: mov.b @sammuta_lippu, R0L
- cmp.b #1, R0L
- beq sammutus
- bra ledin_poltto
- sammutus: bset #0, @PGDR ;sammuta
- mov.b #0, R0L
- mov.b R0L, @sammuta_lippu ;sammuta_lippu = false
- ; mov.w #1000, R0
- ; bsr viive
- ;mov.b #0, R0L
- ;mov.b R0L, @reaktio_lippu
- bsr valiaika ;tulostetaan uusin reaktioaika
- bset #6, @SCR_0 ;sallitaan vastaanottimen keskeytykset
- bra loop_start
- ;; -----------------------------
- ;viive: mov.w #7998, R1
- ;milli: dec.w #1, R1
- ; bne milli
- ; dec.w #1, R0
- ; bne viive
- ; rts
- ; ------------------------------------------
- ;;---------------------------------------------------------------
- ;;
- ;; Ajoittimen keskeytyspalvelu
- ;;
- ;;---------------------------------------------------------------
- TGI_PAL: push.l ER0
- push.l ER1 ;rekisterit talteen
- bclr #0, @TSR_0 ;kuitataan keskeytyspyyntö (TGFA)
- mov.w @TCNT_0, R1
- add.w #aika, R1
- mov.w R1, @TGRA_0
- mov.b @reaktio_lippu, R0L ;-------------------------------------
- cmp.b #1, R0L ;Lisäys -- tarkistetaan onko reaktio-lippu
- ;päällä ennenkuin tsekataan kytkin
- ; Näin varmistetaan että tarkistus tehdään
- ; vain kerran
- bne ei_stop ;-------------------------------------
- btst #0, @PORT1
- bne ei_stop
- mov.b #0, R0L
- mov.b R0L, @reaktio_lippu ;reaktio_lippu = false
- mov.b #1, R0L
- mov.b R0L, @sammuta_lippu ;sammuta_lippu = true
- ei_stop: mov.b @reaktio_lippu, R0L
- cmp.b #1, R0L ;if (reaktio_lippu == true)
- bne ei_reaktio
- mov.w @reaktio_aika, R0 ;kasvatetaan reaktio_aikaa
- inc.w #1, R0
- mov.w R0, @reaktio_aika
- ei_reaktio: mov.b @led_lippu, R0L
- cmp.b #1, R0L ;if (led_lippu == true)
- bne jatka_TGI
- mov.w @led_aika, R0
- dec.w #1, R0 ;led_aika--
- mov.w R0, @led_aika
- cmp.w #0, R0 ; if (led_aika > 0)
- bgt jatka_TGI ;2C-esityksessä
- mov.b #1, R0L ;led_aika == 0
- mov.b R0L, @led_lippu2 ;led_lippu2 = true
- mov.b R0L, @reaktio_lippu ;reaktio_lippu = true
- jatka_TGI: mov.w @tick, R0
- inc.w #1, R0
- cmp.w #500, R0 ;onko sekunti kulunut
- bhs tik_tok ;R0 >= 500
- mov.w R0, @tick
- pop.l ER1
- pop.l ER0
- rte
- ;; Kello käy
- tik_tok: mov.b #1, R0L
- mov.b R0L, @aika_muuttunut ;aika_muuttunut = true
- mov.w #0, R0
- mov.w R0, @tick
- mov.b @sek, R0L
- inc.b R0L
- cmp.b #60, R0L
- bhs sek_nol
- mov.b R0L, @sek
- ret_sek_nol: pop.l ER1
- pop.l ER0
- rte
- sek_nol: mov.b #0, R0L
- mov.b R0L, @sek
- mov.b @min, R0L
- inc.b R0L
- cmp.b #60, R0L
- bhs min_nol
- mov.b R0L, @min
- ret_min_nol: bra ret_sek_nol
- min_nol: mov.b #0, R0L
- mov.b R0L, @min
- mov.b @tun, R0L
- inc.b R0L
- cmp.b #24, R0L
- bhs tun_nol
- mov.b R0L, @tun
- ret_tun_nol: bra ret_min_nol
- tun_nol: mov.b #0, R0L
- mov.b R0L, @tun
- bra ret_tun_nol
- ;; ------------------------------------------------
- ;; Vastaanottimen virhetilan palvelu
- ;; ------------------------------------------------
- ERI_PAL: push.l ER0
- push.l ER1
- mov.b @SSR_0, R0L
- and.b #b'01000111, R0L
- mov.b R0L, @SSR_0
- pop.l ER1
- pop.l ER0
- rte
- ;; --------------------------------------------
- ;; Vastaanottimen palvelu
- ;; --------------------------------------------
- RXI_PAL: push.l ER0
- push.l ER1
- mov.b @RDR_0, R0L ;luetaan merkki
- bclr #6, @SSR_0 ;kuitataan keskeytyspyyntö
- cmp.b #h'14, R0L
- bne not_ctrl ;jos annetaan ctrl-t
- mov.b #1, R1L
- mov.b R1L, @uudestaan ;uudestaan = true
- mov.b R1L, @over_bit
- not_ctrl: cmp.b #h'20, R0L ;onko välilyönti
- bne pois_RXI
- mov.b #1, R0L
- mov.b R0L, @led_lippu ;led-lippu = true
- bsr random ;lasketaan random-luku
- mov.w @rand, R0 ;luku 500-2500 vertailumuuttujaan
- ;............................
- ;mov.w #500, R0 ;;TÄH
- ;...........................
- mov.w R0, @led_aika
- pois_RXI: pop.l ER1
- pop.l ER0
- rte
- ;; -------------------------------------
- ;; Sarjaportin alustusaliohjelma
- ;; -------------------------------------
- alusta_SCI: bclr #7, @MSTPCRB ;sarjaporttiin virrat päälle
- mov.b #1, R0L
- mov.b R0L, @PGDDR ;portin G linja 0 lähtötilaan
- xor.b R0L, R0L ;rekisterin nollaus
- mov.b R0L, @SCR_0 ;TE ja RE = 0
- mov.b @SSR_0, R1L ;luetaan tilarekisteri, jotta
- mov.b R0L, @SSR_0 ; - voidaan nollata virhebitit
- mov.b R0L, @SCR_0 ;CKE1 ja CKE0 = 0
- mov.b R0L, @SMR_0
- ;merkin formaatti 8bit, ei pariteettitarkistusta, yksi STOP-bitti
- mov.b #77, R0L ;nopeudeksi 9600 baud
- mov.b R0L, @BRR_0
- mov.w #500, R0
- wait: dec.w #1, R0 ;yhden bitin viive
- bne wait
- mov.b #b'00110000, R0L ;TE ja RE = 1
- mov.b R0L, @SCR_0 ;sallitaan lähettimen ja vastaanottimen
- rts ; - toiminta
- ;; Yhden merkin tulostus. Tulee sijaita rekisterissä R0L.
- print_char: bclr #6, @SSR_0 ;nollataan RDRF
- wait_TDRE: btst #7, @SSR_0 ;odotetaan lähetysrekisteriä
- beq wait_TDRE
- mov.b R0L, @TDR_0 ;merkki lähetysrekisteriin
- bclr #7, @SSR_0 ;kun TDRE nollataan, lähetys alkaa
- rts
- ;; Merkkijonon tulostusrutiini. Osoitin merkkijonon alkuun
- ;; tulee sijaita rekisterissä ER5.
- print_string: mov.b @ER5+, R0L ;seuraava merkki rekisteriin 0
- beq exit_string ;jos 0, pois
- wait_TDRE2: btst #7, @SSR_0 ;odotetaan, että lähetysrekisteriin
- beq wait_TDRE2 ; - tulee tilaa
- mov.b R0L, @TDR_0 ;viedään merkki lähetysrekisteriin
- bclr #7, @SSR_0 ;annetaan lähettimella tieto, että
- bra print_string ; - uusi merkki on odottamassa
- exit_string: rts
- ;; Kohdistimen siirto haluttuihin koordinaatteihin
- move_cursor: mov.l #mj, ER4 ;tulostettavan merkkijonon alkuosoite
- mov.b #h'1B, R0L ;ESC
- mov.b R0L, @ER4
- inc.l #1, ER4
- mov.b #h'5B, R0L ;"["
- mov.b R0L, @ER4
- inc.l #1, ER4
- mov.b @koord_y1, R0L ;rivi
- mov.b R0L, @ER4
- inc.l #1, ER4
- mov.b @koord_y0, R0L
- mov.b R0L, @ER4
- inc.l #1, ER4
- mov.b #h'3B, R0L ;";"
- mov.b R0L, @ER4
- inc.l #1, ER4
- mov.b @koord_x1, R0L ;sarake
- mov.b R0L, @ER4
- inc.l #1, ER4
- mov.b @koord_x0, R0L
- mov.b R0L, @ER4
- inc.l #1, ER4
- mov.b #h'48, R0L ;"H"
- mov.b R0L, @ER4
- inc.l #1, ER4
- mov.b #0, R0L ;null-terminator
- mov.b R0L, @ER4 ;merkkijonon loppuun
- mov.l #mj, ER5
- bsr print_string
- rts
- ;; 2-paikkaisen ascii-luvun muunto lukuarvoksi, menee rekisteriin R0L
- str2int: ;mov.l #1, ER2
- mov.b @luku_asc, R1L ;toka numero
- mov.b @luku_asc+1, R0L ;eka numero
- mov.b #h'30, R2L
- sub.b R2L, R1L ;toka numero nyt lukuarvona
- sub.b R2L, R0L ;eka numero nyt lukuarvona
- mov.b #10, R2L
- mulxu.b R2L, R1 ;toka numero*10 -> R1
- ;; Lukualue ei ylity?
- add.b R1L, R0L ;lasketaan yhteen, saadaan lukuarvo R0L:llaan
- rts
- ;; 8-bittisen binääriluvun muunto ascii-desimaaliksi, menee taulukkoon luku_asc.
- ;; On rekisterissä R0L
- int2str: cmp.b #100, R0L
- bhs virhe ;ei voi olla suurempi tai yhtäsuuri kuin 100
- extu.w R0 ;R0L -> R0
- mov.b #10, R1L
- divxu.b R1L, R0 ;luku jaetaan 10:nellä
- ;; Rekisteriin R0L tulee osamäärä ja R0H:n jakojäännös
- add.b #h'30, R0L
- add.b #h'30, R0H
- mov.b R0L, @luku_asc
- mov.b R0H, @luku_asc+1
- rts
- ;; 16-bittisen binääriluvun muunto ascii-desimaaliksi, menee taulukkoon luku_asc.
- ;; On rekisterissä R0
- int2str2: cmp.w #1000, R0
- bhs virhe ;ei voi olla suurempi tai yhtäsuuri kuin 1000
- extu.l ER0 ;R0 -> ER0
- mov.w #100, R1
- divxu.w R1, ER0 ;luku jaetaan 100:nellä
- ;; Rekisteriin R0 tulee osamäärä ja E0:n jakojäännös
- add.b #h'30, R0L
- mov.b R0L, @luku_asc
- mov.b #10, R1L
- divxu.b R1L, E0
- mov.w E0, R0
- ;; Rekisteriin R0L osamäärä ja R0H:n jakojäännös
- add.b #h'30, R0L
- add.b #h'30, R0H
- mov.b R0L, @luku_asc+1
- mov.b R0H, @luku_asc+2
- rts
- ;; Annetun merkin (R0L) laillisuuden tarkistelu. Jos laillinen, kaiutetaan ja tallennetaan taulukkoon. Osoite, mihin luku kirjoitetaan, on rekisterissä ER4.
- check_och_print:
- cmp.b #58, R0L
- bhs ret_check ;> 9
- cmp.b #48, R0L
- blo ret_check ;< 0
- bsr print_char
- mov.b R0L, @ER4
- inc.l #1, ER4
- mov.b @laskuri, R0L
- inc.b R0L
- mov.b R0L, @laskuri
- ret_check: bclr #6, @SSR_0 ;nollataan RDRF
- rts
- ;; Ajantulostusapuohjelma, laittaa merkkijonon muistipaikkaan mj
- time_string: mov.b @tun, R0L ;tunnit
- bsr int2str ;R0L -> luku_asc
- mov.l #aikap, ER4
- mov.b @luku_asc, R0L
- mov.b R0L, @ER4
- inc.l #1, ER4
- mov.b @luku_asc+1, R0L
- mov.b R0L, @ER4
- inc.l #1, ER4
- mov.b #":", R0L
- mov.b R0L, @ER4
- inc.l #1, ER4
- mov.b @min, R0L ;minuutit
- bsr int2str
- mov.b @luku_asc, R0L
- mov.b R0L, @ER4
- inc.l #1, ER4
- mov.b @luku_asc+1, R0L
- mov.b R0L, @ER4
- inc.l #1, ER4
- mov.b #":", R0L
- mov.b R0L, @ER4
- inc.l #1, ER4
- mov.b @sek, R0L ;sekunnit
- bsr int2str
- mov.b @luku_asc, R0L
- mov.b R0L, @ER4
- inc.l #1, ER4
- mov.b @luku_asc+1, R0L
- mov.b R0L, @ER4
- inc.l #1, ER4
- mov.b #0, R0L ;termis
- mov.b R0L, @ER4
- rts
- ;; Seed random generator v.0.1
- ;; Laskee sekunnit ja minuutit yhteen
- seeding: mov.b @sek, R0L
- mov.b @min, R1L
- add.b R1L, R0L ;R0L = R1L + R0L
- mov.b R0L, @seed
- rts
- ;; Satunnaislukugeneraatori v.0.1
- random: xor.l ER0, ER0
- xor.l ER1, ER1
- mov.b @seed, R0L ;luetaan siemenluku
- mov.b R0L, R1L
- mulxu.b R1L, R0 ;seed^2
- shlr.w #2, R0 ;seed >> 4
- shlr.w #2, R0
- bsr kompl ;seed = ~seed
- mov.b R0L, @seed ;uusi siemenluku
- xor.l ER1, ER1
- mov.b #5, R1L
- mulxu.b R1L, R0 ; seed * 5 ; divxu BUGAA
- cmp.w #500, R0
- bhs skip_add
- add.w #2000, R0 ;lisätään lukuun 500 jos se on < 500
- skip_add: cmp.w #2500, R0 ; while (R0 > 2500)
- bls skip_sub
- sub.w #100, R0
- bra skip_add
- skip_sub: mov.w R0, @rand
- rts
- ;; Bittien komplementointi sanassa (R0)
- kompl: mov.b #0, R1L ;indeksi
- kompl_loop1: cmp.b #7, R1L
- bhi pois_kompl1
- bnot R1L, R0L
- inc.b R1L
- bra kompl_loop1
- pois_kompl1: mov.b #0, R1L
- kompl_loop2: cmp.b #7, R1L
- bhi pois_kompl2
- bnot R1L, R0H
- inc.b R1L
- bra kompl_loop2
- pois_kompl2: rts
- ;; Uusin reaktioaika
- valiaika: ;; Kursori osoitteeseen 20,7
- mov.b #0+48, R0L
- mov.b R0L, @koord_x0
- mov.b #2+48, R0L
- mov.b R0L, @koord_x1
- mov.b #7+48, R0L
- mov.b R0L, @koord_y0
- mov.b #0+48, R0L
- mov.b R0L, @koord_y1
- bsr move_cursor
- mov.l #Reakt, ER5
- bsr print_string
- xor.l ER0, ER0
- mov.w @reaktio_aika, R0
- shll.w R0 ;reaktioaika * 2
- mov.b #10, R1L
- divxu.b R1L, R0 ;jaetaan 10:nellä, osamäärä menee R0L:lään
- extu.w R0
- mov.w R0, @reaktio_aika
- cmp.w #100, R0
- blo alle_100
- bsr int2str2
- bra tulosta_aika
- alle_100: bsr int2str
- mov.b @luku_asc+1, R0L
- mov.b R0L, @luku_asc+2
- mov.b @luku_asc, R0L
- mov.b R0L, @luku_asc+1
- mov.b #"0", R0L
- mov.b R0L, @luku_asc
- tulosta_aika:
- mov.b @luku_asc, R0L
- bsr print_char
- mov.b #",", R0L
- bsr print_char
- mov.b @luku_asc+1, R0L
- bsr print_char
- mov.b @luku_asc+2, R0L
- bsr print_char
- mov.b #"s", R0L
- bsr print_char
- mov.w @reaktio_aika, R0
- bsr top_sort ;taulukon järjestys
- mov.w #0, R0
- mov.w R0, @reaktio_aika
- ;; Kursori osoitteeseen 20,12
- mov.b #0+48, R0L
- mov.b R0L, @koord_x0
- mov.b #2+48, R0L
- mov.b R0L, @koord_x1
- mov.b #2+48, R0L
- mov.b R0L, @koord_y0
- mov.b #1+48, R0L
- mov.b R0L, @koord_y1
- bsr move_cursor
- mov.l #Toppis, ER5
- bsr print_string
- bsr top_print
- rts
- ;; Tulostaa top_taulukon
- top_print:
- ;; Kursori osoitteeseen 20,13
- mov.b #0+48, R0L
- mov.b R0L, @koord_x0
- mov.b #2+48, R0L
- mov.b R0L, @koord_x1
- mov.b #3+48, R0L
- mov.b R0L, @koord_y0
- mov.b #1+48, R0L
- mov.b R0L, @koord_y1
- bsr move_cursor
- mov.w @top_taulu, R0
- bsr int2str2
- mov.b @luku_asc, R0L
- bsr print_char
- mov.b #",", R0L
- bsr print_char
- mov.b @luku_asc+1, R0L
- bsr print_char
- mov.b @luku_asc+2, R0L
- bsr print_char
- mov.b #"s", R0L
- bsr print_char
- mov.b #h'0d, R0L
- bsr print_char
- ;; Kursori osoitteeseen 20,14
- mov.b #0+48, R0L
- mov.b R0L, @koord_x0
- mov.b #2+48, R0L
- mov.b R0L, @koord_x1
- mov.b #4+48, R0L
- mov.b R0L, @koord_y0
- mov.b #1+48, R0L
- mov.b R0L, @koord_y1
- bsr move_cursor
- mov.w @top_taulu+2, R0
- bsr int2str2
- mov.b @luku_asc, R0L
- bsr print_char
- mov.b #",", R0L
- bsr print_char
- mov.b @luku_asc+1, R0L
- bsr print_char
- mov.b @luku_asc+2, R0L
- bsr print_char
- mov.b #"s", R0L
- bsr print_char
- mov.b #h'0d, R0L
- bsr print_char
- ;; Kursori osoitteeseen 20,15
- mov.b #0+48, R0L
- mov.b R0L, @koord_x0
- mov.b #2+48, R0L
- mov.b R0L, @koord_x1
- mov.b #5+48, R0L
- mov.b R0L, @koord_y0
- mov.b #1+48, R0L
- mov.b R0L, @koord_y1
- bsr move_cursor
- mov.w @top_taulu+4, R0
- bsr int2str2
- mov.b @luku_asc, R0L
- bsr print_char
- mov.b #",", R0L
- bsr print_char
- mov.b @luku_asc+1, R0L
- bsr print_char
- mov.b @luku_asc+2, R0L
- bsr print_char
- mov.b #"s", R0L
- bsr print_char
- mov.b #h'0d, R0L
- bsr print_char
- rts
- ;; Järjestää top_taulun arvot suuruusjärjestykseen, uusin arvo on
- ;; rekisterissä R0
- top_sort: mov.w @top_taulu, R1
- cmp.w #0, R1
- beq kirjoita1
- cmp.w R1, R0
- bhs vertaa2
- kirjoita1: mov.w @top_taulu+2, R2
- mov.w R2, @top_taulu+4
- mov.w @top_taulu, R2
- mov.w R2, @top_taulu+2
- mov.w R0, @top_taulu
- rts
- vertaa2: mov.w @top_taulu+2, R1
- cmp.w #0, R1
- beq kirjoita2
- cmp.w R1, R0
- bhs vertaa3
- kirjoita2: mov.w @top_taulu+2, R2
- mov.w R2, @top_taulu+4
- mov.w R0, @top_taulu+2
- rts
- vertaa3: mov.w @top_taulu+4, R1
- cmp.w #0, R1
- beq kirjoita3
- cmp.w R1, R0
- bhs sort_lopetus
- kirjoita3: mov.w R0, @top_taulu+4
- sort_lopetus: rts
- ;; Virhepalvelu
- virhe: mov.l #poikkeus, ER5
- bsr print_string
- bra $
- .align 2
- tekijat: .sdata "Tekijät: Johannes Lehmusvaara, Petteri Vistiaho"<h'0d><00> ;lopuksi rivinvaihto ja 0
- .align 2
- clrs: .data.b h'1B,h'5B,h'32,h'4A,0 ;kuvaruudun tyhjennys
- .align 2
- default: .data.b h'1B,h'5B,h'30,h'6D,0 ;muotoilut pois
- .align 2
- kello: .sdata "Kello: "<00>
- .align 2
- poikkeus: .sdata "Error: Fatal exception at 0xDEADBEEF"<00>
- .align 2
- Reakt: .sdata "Reaktioaika: "<00>
- .align 2
- Toppis: .sdata "TOP 3:"<h'0d><00>
- ;; -----KÄYNNISTYSVEKTORI------------
- .section vektorit,code,locate=0
- .data.l start
- .org h'80
- .data.l TGI_PAL ;ajoittimen keskeytyspalvelu
- .org h'140
- .data.l ERI_PAL
- .org h'144
- .data.l RXI_PAL
- .end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement