home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 109 / EnigmaAmiga109CD.iso / software / testi / corsoasm / sorgenti7 / lezione11n1b.s < prev    next >
Text File  |  1995-09-29  |  4KB  |  140 lines

  1.  
  2. ; Lezione11n1.s -Routine di temporizzazione che permette di attendere un
  3. ;         certo numero di microsecondi usando un timer B del CIAA/B
  4.  
  5. ; Questa routine di test permette di verificare a quante linee video
  6. ; corrispondono un certo un certo numero di microsecondi.
  7. ; (la parte ROSSA dello schermo e' quella in cui viene eseguita la routine)
  8.  
  9.  
  10. MICS:    equ    2000        ; ~2000 microsecondi = ~2 millisecondi
  11.                 ; valore = mics/1,4096837
  12.                 ; 1 microsecondo = 1 sec/1 milione
  13.                 ; NOTA: per raffrontare questa routine con
  14.                 ; quella che attende le linee raster, fate
  15.                 ; conto che 200 millisecondi corrispondono
  16.                 ; circa a 5 linee di raster, 400 millisecondi
  17.                 ; a 9,5 linee, 600 millis. a 14 linee eccetera
  18.  
  19. Start:
  20.     move.l    4.w,a6        ; Execbase in a6
  21.     jsr    -$84(a6)    ; forbid
  22.     jsr    -$78(a6)    ; disable
  23.     LEA    $DFF000,A5
  24.  
  25. WBLANNY:
  26.     MOVE.L    4(A5),D0    ; $dff004 - VPOSR/VHPOSR
  27.     ANDI.L    #$1FF00,D0    ; con interessano solo i bit della linea vert.
  28.     CMPI.L    #$08000,D0    ; aspetta la linea $080
  29.     BNE.S    WBLANNY
  30.  
  31.     move.w    #$f00,$180(a5)    ; Colore zero ROSSO
  32.  
  33.     bsr.s    CIAMIC
  34.  
  35.     move.w    #$0f0,$180(a5)    ; Colore zero VERDE
  36.  
  37.     btst    #6,$bfe001
  38.     bne.s    WBLANNY
  39.  
  40.  
  41.     move.l    4.w,a6        ; Execbase in a6
  42.     jsr    -$7e(a6)    ; enable
  43.     jsr    -$8a(a6)    ; permit
  44.     rts
  45.  
  46. ;    Ecco la routine che aspetta un numero specifico di MICROSECONDI,
  47. ;    usando il timer B del CIAB. Per usare il timer B del CIAA basta
  48. ;    sostituire il "lea $bfd000,a4" con un "lea $bfe001,a4". Nel listato
  49. ;    e' gia' presente, basta togliere il punto e virgola, e metterlo
  50. ;    invece al CIAB base. Comunque e' meglio usare il CIAB perche' il
  51. ;    timer CIAA e' usato dal sistema operativo per vari compiti.
  52. ;       Infatti, se usate il timerB del ciaA, si blocca tutto!
  53.  
  54. CIAMIC:
  55.     movem.l    d0/a4,-(sp)        ; salviamo i registri usati
  56.     lea    $bfd000,a4        ; CIAB base
  57.  
  58. ;     lea    $bfe001,a4        ; CIAA base - PERO' MANDA IN BLOCCO
  59.                     ; TUTTO, DATO CHE LO USA IL SISTEMA
  60.                     ; OPERATIVO! NON USATE IL TIMER B
  61.                     ; DEL CIAA, PER FAVORE!
  62.  
  63.     move.b  $f00(a4),d0        ; $bfde00 - CRB, CIAB control reg. B
  64.     andi.b   #%11000000,d0        ; azzera i bit 0-5
  65.     ori.b    #%00001000,d0        ; One-Shot mode (runmode singolo)
  66.     move.b  d0,$f00(a4)        ; CRB - Setta il registro di controllo
  67.     move.b  #%01111101,$d00(a4)    ; ICR - cancella gli interrupts CIA
  68.     move.b  #(MICS&$FF),$600(a4)    ; TBLO - metti il byte basso del time
  69.     move.b  #(MICS>>8),$700(a4)    ; TBHI - metti il byte alto del time
  70.     bset.b  #0,$f00(a4)        ; CRB - Start timer!!
  71. wait:
  72.     btst.b  #1,$d00(a4)    ; ICR - Attendiamo che il tempo sia scaduto.
  73.                 ; da notare che si testa il bit 1, e non lo
  74.                 ; zero, per attendere il timer B.
  75.     beq.s   wait
  76.     movem.l    (sp)+,d0/a4        ; ripristiniamo i registri
  77.     rts
  78.  
  79.     end
  80.  
  81. Solo un'ultima cosa. Se eveste il tempo da aspettare in una label, potreste
  82. "spezzettarlo" in byte basso e byte alto con un lsr:
  83.  
  84.     lea    $bfd000,a4        ; cia_b base
  85.     move.w    TimerValue(PC),d0    ; countdown
  86.     move.b    d0,$600(a4)        ; timer B - set lo byte
  87.     lsr.w    #8,d0
  88.     move.b    d0,$700(a4)        ; timer B - set hi byte
  89.         ; 76543210
  90.     move.b  #%01111101,$d00(a4)    ; ICR - cancella gli interrupts CIA
  91.     move.b    #%00011001,$f00(a4)    ; CRB - start
  92.                     ; 7 - Alarm -> 0
  93.                     ; 6,5 - Inmode bits -> 00
  94.                     ; 4 - Load bit -> 1 (fa caricare al
  95.                     ;     timer il valore, e comincia
  96.                     ;     il conto alla rovescia).
  97.                     ; 3 - RunMode -> 1 (One shot, 1 volta)
  98.                     ; 2 - OutMode -> 0 (per ricev. pulse)
  99.                     ; 1 - PBON -> 0
  100.                     ; 0 - Start -> comuncia il conto alla
  101.                     ;     rovescia; giuto a 0->interrupt
  102.     MOVE.B    #%10000010,$d00(a4)    ; ICR - Abilita interr. timer B ciaB
  103. loop:
  104.     btst    #1,$d00(a4)        ; ICR - test tb-bit ->clear ICR
  105.     beq.s    loop            ; not set->wait
  106.     rts
  107.  
  108.  
  109. ; CIA:    ICR  (Interrupt Control Register)                [d]
  110. ;
  111. ; 0    TA        underflow
  112. ; 1    TB        underflow
  113. ; 2    ALARM        TOD alarm
  114. ; 3    SP        serial port full/empty
  115. ; 4    FLAG        flag
  116. ; 5-6    unused
  117. ; 7  R    IR
  118. ; 7  W    set/clear
  119. ;
  120. ; CIA:  CRA, CRB  (Control Register)                    [e-f]
  121. ;
  122. ; 0    START        0 = stop / 1 = start TA; {0}=0 when TA underflow
  123. ; 1    PBON        1 = TA output on PB / 0 = normal mode
  124. ; 2    OUTMODE        1 = toggle / 0 = pulse
  125. ; 3    RUNMODE        1 = one-shot / 0 = continous mode
  126. ; 4  S    LOAD        1 = force load (strobe, always 0)
  127. ; 5   A    INMODE        1 = TA counts positive CNT transition
  128. ;            0 = TA counts 02 pulses
  129. ; 6   A    SPMODE        serial port....
  130. ; 7   A    unused
  131. ; 6-5 B    INMODE        00 = TB counts 02 pulses
  132. ;            01 = TB counts positive CNT transition
  133. ;            10 = TB counts TA underflow pulses
  134. ;            11 = TB counts TA underflow pulses while CNT is high
  135. ; 7   B    ALARM        1 = writing TOD sets alarm
  136. ;            0 = writing TOD sets clock
  137. ;            Reading TOD always reads TOD clock
  138.  
  139.  
  140.