Advertisement
Guest User

Untitled

a guest
Aug 16th, 2017
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;; ----------------------------------------------------
  2. ;;
  3. ;;
  4. ;;  TKT-1110 HARJOITUSTYÖ 2
  5. ;;       REAKTIOTESTI
  6. ;;
  7. ;; ----------------------------------------------------
  8.    
  9.                 .program reaktio_testi
  10.                 .include "equt.inc"
  11.  
  12. aika            .equ    48000               ;48000 kellon jaksoa = 2ms
  13.    
  14.                 .section muuttujat,data,locate=h'ffa000
  15. tick:           .res.w  1                   ;keskeytysten määrän laskenta
  16. sek:            .res.b  1
  17. min:            .res.b  1
  18. tun:            .res.b  1
  19. mj:             .res.b  25                  ;mikä tahansa merkkijono
  20. aikap:          .res.b  25                  ;aika-merkkijono
  21. seed:           .res.b  1
  22. rand:           .res.w  1
  23. led_lippu:      .res.b  1
  24. led_lippu2:     .res.b  1
  25. led_aika:       .res.w  1
  26. aika_muuttunut: .res.b  1
  27. koord_x0:       .res.b  1                   ;x-koordinaatti
  28. koord_x1:       .res.b  1
  29. koord_y0:       .res.b  1                   ;y-koordinaatti
  30. koord_y1:       .res.b  1
  31. luku_asc:       .res.b  4                   ;2 ascii numeroa
  32.                 .align  2
  33. top_taulu:      .res.w  4              
  34. laskuri:        .res.b  1                   ;laskuri ajantalletukseen
  35. ed_laskuri:     .res.b  1
  36. reaktio_lippu:  .res.b  1
  37.                 .align  2
  38. reaktio_aika:   .res.w  1
  39. uudestaan:      .res.b  1
  40. over_bit:       .res.b  1
  41. sammuta_lippu:  .res.b  1
  42.    
  43.                 .section koodi,code,locate=h'ffa200
  44.        
  45. start:          mov.l   #h'ffefc0, ER7      ;pino-osoitin
  46.                 bsr     alusta_SCI
  47.                 bclr    #6, @SCR_0          ;kielletään vastaanottimen keskeytykset  
  48.                 bset    #0, @PGDR           ;sammuta ledi
  49.                 mov.w   #0, R0
  50.                 mov.b   R0L, @over_bit
  51. start_over:     bclr    #6, @SCR_0          ;kielletään vastaanottimen keskeytykset
  52.                 mov.w   #0, R0             
  53.                 mov.w   R0, @tick ;laskureiden nollaus
  54.                 mov.b   R0L, @laskuri
  55.                 mov.b   R0L, @led_lippu
  56.                 mov.b   R0L, @led_lippu2
  57.                 mov.w   R0, @led_aika
  58.                 mov.b   R0L, @aika_muuttunut    ;aika_muuttunut = false
  59.                 mov.b   R0L, @uudestaan
  60.                 mov.w   R0, @top_taulu
  61.                 mov.w   R0, @top_taulu+1
  62.                 mov.w   R0, @top_taulu+2
  63.                 mov.b   R0L, @sammuta_lippu     ;sammuta_lippu = false
  64.  
  65.                 mov.w   R0, @reaktio_aika       ;muuttujien nollaus
  66.                 mov.b   R0L, @reaktio_lippu
  67.                
  68.                 ;; Kuvaruudun tyhjennys
  69.                 mov.l   #clrs, ER5
  70.                 bsr     print_string
  71.                 ;; Muotoilut pois
  72.                 mov.l   #default, ER5
  73.                 bsr     print_string
  74.                 ;; Tekijöiden nimet ylälaitaan
  75.                 mov.l   #tekijat, ER5       ;Merkkijonon alku rekisteriin
  76.                 bsr     print_string
  77.  
  78.    
  79.                 ;; Luetaan kellonaika , kaiutetaan kaikki merkit, tuntien, sekuntien ja
  80.                 ;; minuuttien välille tulostetaan kaksoispiste, control-t (?) vie alkuun
  81.                 ;; Jos laiton aika, ei käynnistetä kelloa kunnes kirjoitettu oikea
  82.  
  83.                 ;; Kello-prompt
  84.                 ;; Kursori osoitteeseen 1,3
  85.                 mov.b   #1+48, R0L
  86.                 mov.b   R0L, @koord_x0
  87.                 mov.b   #0+48, R0L
  88.                 mov.b   R0L, @koord_x1
  89.                 mov.b   #3+48, R0L
  90.                 mov.b   R0L, @koord_y0
  91.                 mov.b   #0+48, R0L
  92.                 mov.b   R0L, @koord_y1
  93.                 bsr     move_cursor
  94.  
  95.                 mov.l   #kello, ER5
  96.                 bsr     print_string
  97.  
  98.                 mov.b   #100, R0L
  99.                 mov.b   R0L, @ed_laskuri
  100.                 mov.l   #luku_asc, ER4      ;luku_asc osoitin
  101.                 ;; Tiedustellaan aika, ER4 kriittinen
  102. aika_init:      mov.b   @laskuri, R0L
  103.                 cmp.b   #6, R0L             ;onko koko aika syötetty
  104.                 beq     pois_init
  105. odota_RDRF:     btst    #6, @SSR_0          ;odotetaan merkkiä
  106.                 beq     odota_RDRF
  107.                 mov.b   @RDR_0, R0L         ;luetaan merkki
  108.                
  109.                 bsr     check_och_print
  110.                 mov.b   @laskuri, R0L
  111.                 cmp.b   #2, R0L
  112.                 beq     valimerkki
  113.                 cmp.b   #4, R0L
  114.                 beq     valimerkki
  115.                 bra     aika_init
  116.  
  117. valimerkki:     mov.b   @laskuri, R0L
  118.                 mov.b   @ed_laskuri, R1L
  119.                 cmp.b   R0L, R1L            ;ettei tehdä toimenpidettä turhaan
  120.                 beq     pois_vali
  121.  
  122.                 ;; Tarkistetaan luvun oikeellisuus
  123.                 bsr     str2int             ;luku_asc -> R0L
  124.                 mov.b   @laskuri, R1L
  125.                 cmp.b   #3, R1L
  126.                 blo     check_tunnit        ;laskuri < 3
  127.                 cmp.b   #5, R1L
  128.                 blo     check_mins          ;laskuri < 5
  129.  
  130. check_ret:      mov.l   #luku_asc, ER4
  131.                 mov.b   #":", R0L           ;tulostetaan välimerkki
  132.                 bsr     print_char
  133.                 mov.b   @laskuri, R0L       ;laskurin edellinen arvo
  134.                 mov.b   R0L, @ed_laskuri    ;-talteen
  135. pois_vali:      bra     aika_init
  136.  
  137.  
  138. check_tunnit:   cmp.b   #24, R0L
  139.                 bhs     aika_fail           ;tunnit >= 25
  140.                 mov.b   R0L, @tun
  141.                 bra     check_ret
  142. check_mins:     cmp.b   #60, R0L
  143.                 bhi     aika_fail           ;minuutit >= 60
  144.                 mov.b   R0L, @min
  145.                 bra     check_ret
  146.    
  147. aika_fail:      bra     start_over
  148.  
  149.    
  150.                 ;; Pitää tarkistaa vielä sekunnit
  151. pois_init:      bsr     str2int
  152.                 cmp.b   #60, R0L
  153.                 bhi     aika_fail           ;sekunnit >= 60
  154.                 mov.b   R0L, @sek
  155.                 ;; Viimein saatu aika asetettua
  156.                
  157.                 ;; --------------------------------------
  158.                 bsr     seeding             ;seed random
  159.                 ;; --------------------------------------
  160.                
  161.                 mov.b   @over_bit, R0L
  162.                 cmp.b   #1, R0L
  163.                 beq     loop_start          ;hypätään alustukset yli jos tehdään uudestaan
  164.    
  165.                 bclr    #5, @MSTPCRA        ;TPU:n virta päälle
  166.                 mov.b   #b'00000000, R0L    ;pulssilaskurin jatkuva toiminta, esijakaja 1
  167.                 mov.b   R0L, @TCR_0
  168.  
  169.                 bset    #5, @SYSCR          ;8-tasoinen keskeytysjärjestelmä
  170.                 mov.b   #h'17, R0L          ;TPU:n prioriteetti ykkönen
  171.                 mov.b   R0L, @IPRF
  172.                
  173.                 mov.b   #h'71, R0L
  174.                 mov.b   R0L, @IPRJ          ;myös sarjaportin prioriteetti 1
  175.                
  176.                 mov.b   #0, R0L
  177.                 mov.b   R0L, @P1DDR
  178.            
  179.                 mov.w   @TCNT_0, R1
  180.                 add.w   #10000, R1
  181.                 mov.w   R1, @TGRA_0
  182.    
  183.                 bset    #0, @TSTR           ;pulssilaskuri käyntiin
  184.                 bclr    #0, @TSR_0          ;vanha tapahtumalippu nollataan
  185.                 bset    #0, @TIER_0         ;sallitaan kanavan A0 keskeytykset
  186.                
  187.                
  188.                
  189.                 andc    #b'11111000, EXR    ;keskeytysmaski nollaksi
  190.  
  191.                 ;; Ajoittimen keskeystyspalvelussa aika-muistipaikkoja kasvatetaan aina  kun sekunti on kulunut
  192.  
  193.                 ;; Kun käyttäjä painaa välilyöntiä, 1-5s kuluttua sytytetään ledi
  194.                 ;; Satunnaisen ajan voisi ottaa kellosta?
  195.                 ;; Tallennetaan ledinsyttymisaika ja lasketaan erotus sen ja kytkimen painamisen välillä
  196.    
  197.                 ;; Pääohjelman silmukka
  198. loop_start:
  199.                 bset    #6, @SCR_0          ;sallitaan vastaanottimen keskeytykset
  200.                 mov.b   @uudestaan, R0L
  201.                 cmp.b   #1, R0L
  202.                 beq     start_over
  203.                
  204.                 mov.b   @led_lippu, R0L
  205.                 cmp.b   #1, R0L
  206.                 beq     led_aloitusloop             ;if (led_lippu == true)
  207.                
  208.                 mov.b   @aika_muuttunut, R0L   
  209.                 cmp.b   #1, R0L                 ;if (aika_muuttunut == true)
  210.                 bne     loop_start              ; {
  211.                                            
  212.                 mov.b   #0, R0L
  213.                 mov.b   R0L, @aika_muuttunut    ;aika_muuttunut = false
  214.                    
  215.                 ;; Ajoittimen keskeytys kielletään kun aikaa laitetaan
  216.                 bclr    #0, @TIER_0         ;kielto
  217.                 bsr     time_string
  218.                 bset    #0, @TIER_0         ;sallitaan
  219.        
  220.                
  221.                 mov.l   #mj, ER5
  222.                 mov.b   #8+48, R0L
  223.                 mov.b   R0L, @koord_x0
  224.                 mov.b   #0+48, R0L
  225.                 mov.b   R0L, @koord_x1
  226.                 mov.b   #3+48, R0L
  227.                 mov.b   R0L, @koord_y0
  228.                 mov.b   #0+48, R0L
  229.                 mov.b   R0L, @koord_y1
  230.                 bsr     move_cursor
  231.                
  232.                 mov.l   #aikap, ER5
  233.                 bsr     print_string
  234.                 bra     loop_start       ; }
  235.  
  236.  
  237.  
  238.  
  239.                 ;;  Ledinvilautuspaikka
  240. led_aloitusloop:
  241.                 bclr    #6, @SCR_0          ;kielletään vastaanottimen keskeytykset      
  242.                
  243. led_loop:          
  244.                 mov.b   @led_lippu2, R0L
  245.                 cmp.b   #1, R0L             ;onko led_lippu2 = true
  246.                 beq     led_sytyta
  247.                 bra     led_loop
  248.                
  249. led_sytyta:     mov.b   #0, R0L
  250.                 mov.b   R0L, @led_lippu     ;led_lippu = false
  251.                 mov.b   R0L, @led_lippu2    ;led_lippu2 = false
  252.                 bclr    #0, @PGDR           ;sytytä
  253.                                    
  254. ledin_poltto:   mov.b   @sammuta_lippu, R0L
  255.                 cmp.b   #1, R0L
  256.                 beq     sammutus
  257.                 bra     ledin_poltto
  258.                
  259. sammutus:       bset    #0, @PGDR           ;sammuta
  260.                 mov.b   #0, R0L
  261.                 mov.b   R0L, @sammuta_lippu     ;sammuta_lippu = false
  262.                
  263. ;               mov.w   #1000, R0
  264. ;               bsr     viive
  265.                
  266.                 ;mov.b  #0, R0L
  267.                 ;mov.b  R0L, @reaktio_lippu
  268.                
  269.                 bsr     valiaika            ;tulostetaan uusin reaktioaika
  270.                
  271.                 bset    #6, @SCR_0          ;sallitaan vastaanottimen keskeytykset
  272.                 bra     loop_start
  273.            
  274.             ;; -----------------------------   
  275. ;viive:         mov.w   #7998, R1          
  276. ;milli:         dec.w   #1, R1              
  277. ;               bne     milli              
  278. ;               dec.w   #1, R0            
  279. ;               bne     viive              
  280. ;               rts                        
  281. ; ------------------------------------------
  282.  
  283.                 ;;---------------------------------------------------------------
  284.                 ;;
  285.                 ;; Ajoittimen keskeytyspalvelu 
  286.                 ;;
  287.                 ;;---------------------------------------------------------------
  288.                
  289. TGI_PAL:        push.l  ER0
  290.                 push.l  ER1                 ;rekisterit talteen
  291.                 bclr    #0, @TSR_0          ;kuitataan keskeytyspyyntö (TGFA)
  292.                
  293.                 mov.w   @TCNT_0, R1
  294.                 add.w   #aika, R1
  295.                 mov.w   R1, @TGRA_0
  296.                
  297.                 mov.b   @reaktio_lippu, R0L     ;-------------------------------------
  298.                 cmp.b   #1, R0L                 ;Lisäys -- tarkistetaan onko reaktio-lippu
  299.                                                 ;päällä ennenkuin tsekataan kytkin
  300.                                                 ; Näin varmistetaan että tarkistus tehdään
  301.                                                 ; vain kerran
  302.                 bne     ei_stop                 ;-------------------------------------
  303.                 btst    #0, @PORT1
  304.                 bne     ei_stop
  305.                 mov.b   #0, R0L
  306.                 mov.b   R0L, @reaktio_lippu     ;reaktio_lippu = false
  307.                 mov.b   #1, R0L
  308.                 mov.b   R0L, @sammuta_lippu     ;sammuta_lippu = true
  309.                
  310. ei_stop:        mov.b   @reaktio_lippu, R0L
  311.                 cmp.b   #1, R0L                 ;if (reaktio_lippu == true)
  312.                 bne     ei_reaktio
  313.                 mov.w   @reaktio_aika, R0       ;kasvatetaan reaktio_aikaa
  314.                 inc.w   #1, R0
  315.                 mov.w   R0, @reaktio_aika
  316.                
  317. ei_reaktio:     mov.b   @led_lippu, R0L
  318.                 cmp.b   #1, R0L             ;if (led_lippu == true)
  319.                 bne     jatka_TGI
  320.                 mov.w   @led_aika, R0
  321.                 dec.w   #1, R0              ;led_aika--
  322.                 mov.w   R0, @led_aika
  323.                 cmp.w   #0, R0              ; if (led_aika > 0)
  324.                 bgt     jatka_TGI                ;2C-esityksessä
  325.                  
  326.                 mov.b   #1, R0L                 ;led_aika == 0
  327.                 mov.b   R0L, @led_lippu2    ;led_lippu2 = true 
  328.                 mov.b   R0L, @reaktio_lippu ;reaktio_lippu = true
  329.  
  330. jatka_TGI:      mov.w   @tick, R0
  331.                 inc.w   #1, R0
  332.                 cmp.w   #500, R0            ;onko sekunti kulunut
  333.                 bhs     tik_tok             ;R0 >= 500
  334.                 mov.w   R0, @tick
  335.                 pop.l   ER1
  336.                 pop.l   ER0
  337.                 rte
  338.  
  339.                 ;; Kello käy
  340. tik_tok:        mov.b   #1, R0L
  341.                 mov.b   R0L, @aika_muuttunut  ;aika_muuttunut = true
  342.                 mov.w   #0, R0
  343.                 mov.w   R0, @tick
  344.                 mov.b   @sek, R0L
  345.                 inc.b   R0L
  346.                 cmp.b   #60, R0L
  347.                 bhs     sek_nol
  348.                 mov.b   R0L, @sek
  349. ret_sek_nol:    pop.l   ER1
  350.                 pop.l   ER0
  351.                 rte
  352.  
  353. sek_nol:        mov.b   #0, R0L
  354.                 mov.b   R0L, @sek
  355.                 mov.b   @min, R0L
  356.                 inc.b   R0L
  357.                 cmp.b   #60, R0L
  358.                 bhs     min_nol
  359.                 mov.b   R0L, @min
  360. ret_min_nol:    bra     ret_sek_nol
  361.    
  362. min_nol:        mov.b   #0, R0L
  363.                 mov.b   R0L, @min
  364.                 mov.b   @tun, R0L
  365.                 inc.b   R0L
  366.                 cmp.b   #24, R0L
  367.                 bhs     tun_nol
  368.                 mov.b   R0L, @tun
  369. ret_tun_nol:    bra     ret_min_nol
  370.  
  371.    
  372. tun_nol:        mov.b   #0, R0L
  373.                 mov.b   R0L, @tun
  374.                 bra     ret_tun_nol
  375.    
  376.    
  377.    
  378.                 ;; ------------------------------------------------
  379.                 ;; Vastaanottimen virhetilan palvelu
  380.                 ;; ------------------------------------------------
  381. ERI_PAL:        push.l  ER0
  382.                 push.l  ER1  
  383.                 mov.b   @SSR_0, R0L
  384.                 and.b   #b'01000111, R0L
  385.                 mov.b   R0L, @SSR_0
  386.                 pop.l   ER1
  387.                 pop.l   ER0
  388.                 rte
  389.                
  390.                
  391.                
  392.                 ;; --------------------------------------------
  393.                 ;; Vastaanottimen palvelu
  394.                 ;; --------------------------------------------
  395. RXI_PAL:        push.l  ER0
  396.                 push.l  ER1  
  397.                 mov.b   @RDR_0, R0L     ;luetaan merkki
  398.                 bclr    #6, @SSR_0      ;kuitataan keskeytyspyyntö
  399.                
  400.                 cmp.b   #h'14, R0L
  401.                 bne     not_ctrl            ;jos annetaan ctrl-t
  402.                 mov.b   #1, R1L
  403.                 mov.b   R1L, @uudestaan     ;uudestaan = true
  404.                 mov.b   R1L, @over_bit
  405.                
  406. not_ctrl:       cmp.b   #h'20, R0L      ;onko välilyönti
  407.                 bne     pois_RXI
  408.                
  409.                 mov.b   #1, R0L
  410.                 mov.b   R0L, @led_lippu ;led-lippu = true
  411.                
  412.                 bsr     random          ;lasketaan random-luku
  413.                 mov.w   @rand, R0       ;luku 500-2500 vertailumuuttujaan
  414.  
  415.                 ;............................
  416.                 ;mov.w  #500, R0            ;;TÄH
  417.                 ;...........................
  418.                
  419.                 mov.w   R0, @led_aika
  420.                
  421. pois_RXI:       pop.l   ER1
  422.                 pop.l   ER0
  423.                 rte
  424.  
  425.  
  426.  
  427.  
  428.  
  429.  
  430.  
  431.  
  432.                
  433.                 ;; -------------------------------------
  434.                 ;; Sarjaportin alustusaliohjelma
  435.                 ;; -------------------------------------
  436. alusta_SCI:     bclr    #7, @MSTPCRB        ;sarjaporttiin virrat päälle
  437.                 mov.b   #1, R0L
  438.                 mov.b   R0L, @PGDDR         ;portin G linja 0 lähtötilaan
  439.                 xor.b   R0L, R0L            ;rekisterin nollaus
  440.                 mov.b   R0L, @SCR_0         ;TE ja RE = 0
  441.                 mov.b   @SSR_0, R1L         ;luetaan tilarekisteri, jotta
  442.                 mov.b   R0L, @SSR_0         ; - voidaan nollata virhebitit
  443.                 mov.b   R0L, @SCR_0         ;CKE1 ja CKE0 = 0
  444.                 mov.b   R0L, @SMR_0
  445.                 ;merkin formaatti 8bit, ei pariteettitarkistusta, yksi STOP-bitti
  446.                 mov.b   #77, R0L            ;nopeudeksi 9600 baud
  447.                 mov.b   R0L, @BRR_0
  448.  
  449.                 mov.w   #500, R0
  450. wait:           dec.w   #1, R0              ;yhden bitin viive
  451.                 bne     wait
  452.  
  453.                 mov.b   #b'00110000, R0L    ;TE ja RE = 1
  454.                 mov.b   R0L, @SCR_0         ;sallitaan lähettimen ja vastaanottimen
  455.                 rts                         ; - toiminta
  456.  
  457.  
  458.  
  459.  
  460.  
  461.  
  462.  
  463.  
  464.  
  465.  
  466.  
  467.                 ;; Yhden merkin tulostus. Tulee sijaita rekisterissä R0L.
  468. print_char:     bclr    #6, @SSR_0          ;nollataan  RDRF
  469. wait_TDRE:      btst    #7, @SSR_0          ;odotetaan lähetysrekisteriä
  470.                 beq     wait_TDRE
  471.                 mov.b   R0L, @TDR_0         ;merkki lähetysrekisteriin
  472.                 bclr    #7, @SSR_0          ;kun TDRE nollataan, lähetys alkaa
  473.                 rts
  474.    
  475.                 ;; Merkkijonon tulostusrutiini. Osoitin merkkijonon alkuun
  476.                 ;; tulee sijaita rekisterissä ER5.
  477. print_string:   mov.b   @ER5+, R0L          ;seuraava merkki rekisteriin 0
  478.                 beq     exit_string         ;jos 0, pois
  479. wait_TDRE2:     btst    #7, @SSR_0          ;odotetaan, että lähetysrekisteriin
  480.                 beq     wait_TDRE2          ; - tulee tilaa
  481.                 mov.b   R0L, @TDR_0         ;viedään merkki lähetysrekisteriin
  482.                 bclr    #7, @SSR_0          ;annetaan lähettimella tieto, että
  483.                 bra     print_string        ; - uusi merkki on odottamassa
  484. exit_string:    rts
  485.  
  486.                 ;; Kohdistimen siirto haluttuihin koordinaatteihin
  487. move_cursor:    mov.l   #mj, ER4 ;tulostettavan merkkijonon alkuosoite
  488.        
  489.                 mov.b   #h'1B, R0L          ;ESC
  490.                 mov.b   R0L, @ER4
  491.                 inc.l   #1, ER4
  492.    
  493.                 mov.b   #h'5B, R0L          ;"["
  494.                 mov.b   R0L, @ER4
  495.                 inc.l   #1, ER4
  496.    
  497.                 mov.b   @koord_y1, R0L      ;rivi
  498.                 mov.b   R0L, @ER4
  499.                 inc.l   #1, ER4
  500.                
  501.                 mov.b   @koord_y0, R0L     
  502.                 mov.b   R0L, @ER4
  503.                 inc.l   #1, ER4
  504.    
  505.                 mov.b   #h'3B, R0L          ;";"
  506.                 mov.b   R0L, @ER4
  507.                 inc.l   #1, ER4
  508.    
  509.                 mov.b   @koord_x1, R0L      ;sarake
  510.                 mov.b   R0L, @ER4
  511.                 inc.l   #1, ER4
  512.                
  513.                 mov.b   @koord_x0, R0L     
  514.                 mov.b   R0L, @ER4
  515.                 inc.l   #1, ER4
  516.  
  517.                 mov.b   #h'48, R0L          ;"H"
  518.                 mov.b   R0L, @ER4
  519.                 inc.l   #1, ER4
  520.    
  521.                 mov.b   #0, R0L             ;null-terminator
  522.                 mov.b   R0L, @ER4           ;merkkijonon loppuun
  523.  
  524.                 mov.l   #mj, ER5
  525.                 bsr     print_string
  526.                 rts
  527.  
  528.                 ;; 2-paikkaisen ascii-luvun muunto lukuarvoksi, menee rekisteriin R0L
  529. str2int:        ;mov.l  #1, ER2
  530.                 mov.b   @luku_asc, R1L      ;toka numero
  531.                 mov.b   @luku_asc+1, R0L    ;eka numero
  532.  
  533.                 mov.b   #h'30, R2L
  534.                 sub.b   R2L, R1L            ;toka numero nyt lukuarvona
  535.                 sub.b   R2L, R0L            ;eka numero nyt lukuarvona
  536.  
  537.                 mov.b   #10, R2L
  538.                 mulxu.b R2L, R1             ;toka numero*10 -> R1
  539.                 ;; Lukualue ei ylity?
  540.                 add.b   R1L, R0L            ;lasketaan yhteen, saadaan lukuarvo R0L:llaan
  541.                 rts
  542.  
  543.                 ;; 8-bittisen binääriluvun muunto ascii-desimaaliksi, menee taulukkoon luku_asc.
  544.                 ;; On rekisterissä R0L
  545. int2str:        cmp.b   #100, R0L
  546.                 bhs     virhe               ;ei voi olla suurempi tai yhtäsuuri kuin 100
  547.                 extu.w  R0                  ;R0L -> R0
  548.                 mov.b   #10, R1L
  549.                 divxu.b R1L, R0             ;luku jaetaan 10:nellä
  550.                 ;; Rekisteriin R0L tulee osamäärä ja R0H:n jakojäännös
  551.                 add.b   #h'30, R0L
  552.                 add.b   #h'30, R0H
  553.                 mov.b   R0L, @luku_asc
  554.                 mov.b   R0H, @luku_asc+1
  555.                 rts
  556.                
  557.                 ;; 16-bittisen binääriluvun muunto ascii-desimaaliksi, menee taulukkoon luku_asc.
  558.                 ;; On rekisterissä R0
  559. int2str2:       cmp.w   #1000, R0
  560.                 bhs     virhe               ;ei voi olla suurempi tai yhtäsuuri kuin 1000
  561.                 extu.l  ER0                     ;R0 -> ER0
  562.                 mov.w   #100, R1
  563.                 divxu.w R1, ER0             ;luku jaetaan 100:nellä
  564.                 ;; Rekisteriin R0 tulee osamäärä ja E0:n jakojäännös
  565.                 add.b   #h'30, R0L
  566.                 mov.b   R0L, @luku_asc
  567.                
  568.                 mov.b   #10, R1L
  569.                 divxu.b R1L, E0
  570.                 mov.w   E0, R0
  571.                 ;; Rekisteriin R0L osamäärä ja R0H:n jakojäännös
  572.                 add.b   #h'30, R0L
  573.                 add.b   #h'30, R0H
  574.                 mov.b   R0L, @luku_asc+1
  575.                 mov.b   R0H, @luku_asc+2
  576.                 rts
  577.                
  578.  
  579.                 ;; Annetun merkin (R0L) laillisuuden tarkistelu. Jos laillinen, kaiutetaan ja tallennetaan taulukkoon. Osoite, mihin luku kirjoitetaan, on rekisterissä ER4.
  580. check_och_print:
  581.                 cmp.b   #58, R0L
  582.                 bhs     ret_check           ;> 9
  583.                 cmp.b   #48, R0L
  584.                 blo     ret_check           ;< 0
  585.                 bsr     print_char
  586.                 mov.b   R0L, @ER4
  587.                 inc.l   #1, ER4
  588.                 mov.b   @laskuri, R0L
  589.                 inc.b   R0L
  590.                 mov.b   R0L, @laskuri
  591.                
  592. ret_check:      bclr    #6, @SSR_0          ;nollataan  RDRF
  593.                 rts
  594.  
  595.                 ;; Ajantulostusapuohjelma, laittaa merkkijonon muistipaikkaan mj
  596. time_string:    mov.b   @tun, R0L           ;tunnit
  597.                 bsr     int2str             ;R0L -> luku_asc
  598.                 mov.l   #aikap, ER4
  599.                 mov.b   @luku_asc, R0L
  600.                 mov.b   R0L, @ER4
  601.                 inc.l   #1, ER4
  602.                 mov.b   @luku_asc+1, R0L
  603.                 mov.b   R0L, @ER4
  604.                 inc.l   #1, ER4
  605.                 mov.b   #":", R0L
  606.                 mov.b   R0L, @ER4
  607.                 inc.l   #1, ER4
  608.  
  609.                 mov.b   @min, R0L           ;minuutit
  610.                 bsr     int2str
  611.                 mov.b   @luku_asc, R0L
  612.                 mov.b   R0L, @ER4
  613.                 inc.l   #1, ER4
  614.                 mov.b   @luku_asc+1, R0L
  615.                 mov.b   R0L, @ER4
  616.                 inc.l   #1, ER4
  617.                 mov.b   #":", R0L
  618.                 mov.b   R0L, @ER4
  619.                 inc.l   #1, ER4
  620.  
  621.                 mov.b   @sek, R0L           ;sekunnit
  622.                 bsr     int2str
  623.                 mov.b   @luku_asc, R0L
  624.                 mov.b   R0L, @ER4
  625.                 inc.l   #1, ER4
  626.                 mov.b   @luku_asc+1, R0L
  627.                 mov.b   R0L, @ER4
  628.                 inc.l   #1, ER4
  629.                 mov.b   #0, R0L             ;termis
  630.                 mov.b   R0L, @ER4
  631.                 rts
  632.        
  633.        
  634.                 ;; Seed random generator v.0.1
  635.                                ;; Laskee sekunnit ja minuutit yhteen
  636. seeding:        mov.b   @sek, R0L
  637.                 mov.b   @min, R1L
  638.                 add.b   R1L, R0L    ;R0L = R1L + R0L
  639.                 mov.b   R0L, @seed
  640.                 rts
  641.                
  642.    
  643.                 ;; Satunnaislukugeneraatori v.0.1
  644. random:         xor.l   ER0, ER0
  645.                 xor.l   ER1, ER1
  646.                 mov.b   @seed, R0L  ;luetaan siemenluku
  647.                 mov.b   R0L, R1L
  648.                 mulxu.b R1L, R0     ;seed^2
  649.                 shlr.w  #2, R0          ;seed >> 4
  650.                 shlr.w  #2, R0
  651.                                 bsr     kompl       ;seed = ~seed
  652.                 mov.b   R0L, @seed  ;uusi siemenluku
  653.                 xor.l   ER1, ER1
  654.                 mov.b   #5, R1L
  655.                 mulxu.b R1L, R0   ; seed * 5 ; divxu BUGAA
  656.                 cmp.w   #500, R0
  657.                 bhs skip_add
  658.                 add.w   #2000, R0   ;lisätään lukuun 500 jos se on < 500
  659. skip_add:           cmp.w   #2500, R0       ; while (R0 > 2500)
  660.                                bls     skip_sub
  661.                                sub.w   #100, R0
  662.                                bra     skip_add
  663.                                
  664. skip_sub:                       mov.w   R0, @rand
  665.                 rts
  666.                
  667.    
  668.                                ;; Bittien komplementointi sanassa  (R0)
  669. kompl:                          mov.b      #0, R1L       ;indeksi                      
  670. kompl_loop1:                     cmp.b      #7, R1L                                
  671.                                bhi        pois_kompl1
  672.                                bnot       R1L, R0L
  673.                                inc.b      R1L
  674.                                bra        kompl_loop1
  675. pois_kompl1:                     mov.b      #0, R1L
  676. kompl_loop2:                     cmp.b      #7, R1L
  677.                                 bhi        pois_kompl2
  678.                                 bnot       R1L, R0H
  679.                                 inc.b      R1L
  680.                                 bra        kompl_loop2
  681. pois_kompl2:                     rts
  682.                                
  683.                                
  684.                                  
  685.                 ;; Uusin reaktioaika
  686. valiaika:       ;; Kursori osoitteeseen 20,7
  687.                 mov.b   #0+48, R0L
  688.                 mov.b   R0L, @koord_x0
  689.                 mov.b   #2+48, R0L
  690.                 mov.b   R0L, @koord_x1
  691.                 mov.b   #7+48, R0L
  692.                 mov.b   R0L, @koord_y0
  693.                 mov.b   #0+48, R0L
  694.                 mov.b   R0L, @koord_y1
  695.                 bsr     move_cursor
  696.                
  697.                 mov.l   #Reakt, ER5
  698.                 bsr     print_string
  699.                
  700.                 xor.l   ER0, ER0
  701.                 mov.w   @reaktio_aika, R0
  702.                 shll.w  R0                  ;reaktioaika * 2
  703.                 mov.b   #10, R1L
  704.                 divxu.b R1L, R0             ;jaetaan 10:nellä, osamäärä menee R0L:lään
  705.                 extu.w  R0
  706.                
  707.                 mov.w   R0, @reaktio_aika
  708.                
  709.                 cmp.w   #100, R0
  710.                 blo     alle_100
  711.                 bsr     int2str2
  712.                 bra     tulosta_aika
  713.  
  714. alle_100:       bsr     int2str
  715.                 mov.b   @luku_asc+1, R0L
  716.                 mov.b   R0L, @luku_asc+2
  717.                 mov.b   @luku_asc, R0L
  718.                 mov.b   R0L, @luku_asc+1
  719.                 mov.b   #"0", R0L
  720.                 mov.b   R0L, @luku_asc         
  721.                
  722. tulosta_aika:  
  723.                 mov.b   @luku_asc, R0L
  724.                 bsr     print_char
  725.                 mov.b   #",", R0L
  726.                 bsr     print_char
  727.                 mov.b   @luku_asc+1, R0L
  728.                 bsr     print_char
  729.                 mov.b   @luku_asc+2, R0L
  730.                 bsr     print_char
  731.                 mov.b   #"s", R0L
  732.                 bsr     print_char
  733.                
  734.                 mov.w   @reaktio_aika, R0
  735.                 bsr     top_sort            ;taulukon järjestys
  736.                
  737.                 mov.w   #0, R0
  738.                 mov.w   R0, @reaktio_aika
  739.                
  740.                 ;; Kursori osoitteeseen 20,12
  741.                 mov.b   #0+48, R0L
  742.                 mov.b   R0L, @koord_x0
  743.                 mov.b   #2+48, R0L
  744.                 mov.b   R0L, @koord_x1
  745.                 mov.b   #2+48, R0L
  746.                 mov.b   R0L, @koord_y0
  747.                 mov.b   #1+48, R0L
  748.                 mov.b   R0L, @koord_y1
  749.                 bsr     move_cursor
  750.                                
  751.                 mov.l   #Toppis, ER5
  752.                 bsr     print_string
  753.                    
  754.                 bsr     top_print
  755.                 rts
  756.                
  757.                 ;; Tulostaa top_taulukon
  758. top_print:     
  759.                 ;; Kursori osoitteeseen 20,13
  760.                 mov.b   #0+48, R0L
  761.                 mov.b   R0L, @koord_x0
  762.                 mov.b   #2+48, R0L
  763.                 mov.b   R0L, @koord_x1
  764.                 mov.b   #3+48, R0L
  765.                 mov.b   R0L, @koord_y0
  766.                 mov.b   #1+48, R0L
  767.                 mov.b   R0L, @koord_y1
  768.                 bsr     move_cursor
  769.                
  770.                 mov.w   @top_taulu, R0
  771.                 bsr     int2str2
  772.                 mov.b   @luku_asc, R0L
  773.                 bsr     print_char
  774.                 mov.b   #",", R0L
  775.                 bsr     print_char
  776.                 mov.b   @luku_asc+1, R0L
  777.                 bsr     print_char
  778.                 mov.b   @luku_asc+2, R0L
  779.                 bsr     print_char
  780.                 mov.b   #"s", R0L
  781.                 bsr     print_char
  782.                 mov.b   #h'0d, R0L
  783.                 bsr     print_char
  784.                
  785.                 ;; Kursori osoitteeseen 20,14
  786.                 mov.b   #0+48, R0L
  787.                 mov.b   R0L, @koord_x0
  788.                 mov.b   #2+48, R0L
  789.                 mov.b   R0L, @koord_x1
  790.                 mov.b   #4+48, R0L
  791.                 mov.b   R0L, @koord_y0
  792.                 mov.b   #1+48, R0L
  793.                 mov.b   R0L, @koord_y1
  794.                 bsr     move_cursor
  795.                
  796.                 mov.w   @top_taulu+2, R0
  797.                 bsr     int2str2
  798.                 mov.b   @luku_asc, R0L
  799.                 bsr     print_char
  800.                 mov.b   #",", R0L
  801.                 bsr     print_char
  802.                 mov.b   @luku_asc+1, R0L
  803.                 bsr     print_char
  804.                 mov.b   @luku_asc+2, R0L
  805.                 bsr     print_char
  806.                 mov.b   #"s", R0L
  807.                 bsr     print_char
  808.                 mov.b   #h'0d, R0L
  809.                 bsr     print_char
  810.                
  811.                 ;; Kursori osoitteeseen 20,15
  812.                 mov.b   #0+48, R0L
  813.                 mov.b   R0L, @koord_x0
  814.                 mov.b   #2+48, R0L
  815.                 mov.b   R0L, @koord_x1
  816.                 mov.b   #5+48, R0L
  817.                 mov.b   R0L, @koord_y0
  818.                 mov.b   #1+48, R0L
  819.                 mov.b   R0L, @koord_y1
  820.                 bsr     move_cursor
  821.                
  822.                 mov.w   @top_taulu+4, R0
  823.                 bsr     int2str2
  824.                 mov.b   @luku_asc, R0L
  825.                 bsr     print_char
  826.                 mov.b   #",", R0L
  827.                 bsr     print_char
  828.                 mov.b   @luku_asc+1, R0L
  829.                 bsr     print_char
  830.                 mov.b   @luku_asc+2, R0L
  831.                 bsr     print_char
  832.                 mov.b   #"s", R0L
  833.                 bsr     print_char
  834.                 mov.b   #h'0d, R0L
  835.                 bsr     print_char
  836.                
  837.                 rts
  838.  
  839.                
  840.                 ;; Järjestää top_taulun arvot suuruusjärjestykseen, uusin arvo on
  841.                 ;; rekisterissä R0
  842. top_sort:       mov.w   @top_taulu, R1
  843.                 cmp.w   #0, R1
  844.                 beq     kirjoita1
  845.                 cmp.w   R1, R0
  846.                 bhs     vertaa2
  847. kirjoita1:      mov.w   @top_taulu+2, R2
  848.                 mov.w   R2, @top_taulu+4
  849.                 mov.w   @top_taulu, R2
  850.                 mov.w   R2, @top_taulu+2
  851.                 mov.w   R0, @top_taulu
  852.                 rts
  853. vertaa2:        mov.w   @top_taulu+2, R1
  854.                 cmp.w   #0, R1
  855.                 beq     kirjoita2
  856.                 cmp.w   R1, R0
  857.                 bhs     vertaa3
  858. kirjoita2:      mov.w   @top_taulu+2, R2
  859.                 mov.w   R2, @top_taulu+4
  860.                 mov.w   R0, @top_taulu+2
  861.                 rts
  862. vertaa3:        mov.w   @top_taulu+4, R1
  863.                 cmp.w   #0, R1
  864.                 beq     kirjoita3
  865.                 cmp.w   R1, R0
  866.                 bhs     sort_lopetus
  867. kirjoita3:      mov.w   R0, @top_taulu+4
  868. sort_lopetus:   rts            
  869.                
  870.                                
  871.  
  872.  
  873.                                
  874.                 ;; Virhepalvelu
  875. virhe:          mov.l   #poikkeus, ER5
  876.                 bsr     print_string
  877.                 bra $
  878.    
  879.                 .align 2
  880. tekijat:        .sdata  "Tekijät: Johannes Lehmusvaara, Petteri Vistiaho"<h'0d><00>    ;lopuksi rivinvaihto ja 0
  881.                 .align 2
  882. clrs:           .data.b  h'1B,h'5B,h'32,h'4A,0  ;kuvaruudun tyhjennys
  883.                 .align 2
  884. default:        .data.b  h'1B,h'5B,h'30,h'6D,0  ;muotoilut pois
  885.                 .align 2
  886. kello:          .sdata  "Kello: "<00>
  887.                 .align 2
  888. poikkeus:       .sdata "Error: Fatal exception at 0xDEADBEEF"<00>
  889.                 .align  2
  890. Reakt:          .sdata  "Reaktioaika: "<00>
  891.                 .align  2
  892. Toppis:         .sdata  "TOP 3:"<h'0d><00>
  893.    
  894.                 ;; -----KÄYNNISTYSVEKTORI------------
  895.                 .section vektorit,code,locate=0
  896.                 .data.l start
  897.                 .org h'80
  898.                 .data.l TGI_PAL             ;ajoittimen keskeytyspalvelu
  899.                 .org    h'140
  900.                 .data.l ERI_PAL
  901.                 .org    h'144
  902.                 .data.l RXI_PAL
  903.    
  904.                 .end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement