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

  1.  
  2. ; Lezione11e.s - Utilizzo di interrupts COPER e VERTB dell livello 3 ($6c).
  3. ;         In questo caso ridefiniamo tutti gli interrupt, giusto
  4. ;         per rendere l'idea di come si fa.
  5.  
  6.     Section    Interrupt,CODE
  7.  
  8. ;    Include    "DaWorkBench.s"    ; togliere il ; prima di salvare con "WO"
  9.  
  10. *****************************************************************************
  11.     include    "startup2.s"    ; salva interrupt, dma eccetera.
  12. *****************************************************************************
  13.  
  14.  
  15. ; Con DMASET decidiamo quali canali DMA aprire e quali chiudere
  16.  
  17.         ;5432109876543210
  18. DMASET    EQU    %1000001010000000    ; copper DMA abilitato
  19.  
  20. WaitDisk    EQU    30    ; 50-150 al salvataggio (secondo i casi)
  21.  
  22. START:
  23.     move.l    BaseVBR(PC),a0         ; In a0 il valore del VBR
  24.  
  25.     MOVE.L    #NOINT1,$64(A0)        ; Interrupt "vuoto"
  26.     MOVE.L    #NOINT2,$68(A0)        ; int vuoto
  27.     move.l    #MioInt6c,$6c(a0)    ; metto la mia rout. int. livello 3.
  28.     MOVE.L    #NOINT4,$70(A0)        ; int vuoto
  29.     MOVE.L    #NOINT5,$74(A0)        ; " "
  30.     MOVE.L    #NOINT6,$78(A0)        ; " "
  31.  
  32.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  33.                     ; e sprites.
  34.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  35.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  36.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  37.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  38.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  39.  
  40.     movem.l    d0-d7/a0-a6,-(SP)
  41.     bsr.w    mt_init        ; inizializza la routine musicale
  42.     movem.l    (SP)+,d0-d7/a0-a6
  43.  
  44.         ; 5432109876543210
  45.     move.w    #%1111111111111111,$9a(a5)    ; INTENA - abilito TUTTI gli
  46.                           ; interrupt!
  47.  
  48. mouse:
  49.     btst    #6,$bfe001    ; Mouse premuto? (il processore esegue questo
  50.     bne.s    mouse        ; loop in modo utente, e ogni vertical blank
  51.                 ; nonche' ogni WAIT della linea raster $a0
  52.                 ; lo interrompe per suonare la musica!).
  53.  
  54.     bsr.w    mt_end        ; fine del replay!
  55.  
  56.     rts            ; esci
  57.  
  58.  
  59. *****************************************************************************
  60. *    ROUTINE IN INTERRUPT $64 (livello 1)
  61. *****************************************************************************
  62.  
  63. ;    .:·.·...·..
  64. ;     ·::::::::::.
  65. ;      ·::::::::::
  66. ;      ( _____·:::
  67. ;       \____` ::|
  68. ;       _(° _)  ·l
  69. ;      / ¯¯¯     .)
  70. ;     /         ¯T
  71. ;    /  ,_  ___ _j
  72. ;    ¯¯¬ l____\  \
  73. ;            ¬\\  \ xCz
  74. ;    __________)   \
  75. ;    \_      _____  \
  76. ;     `------'   \___)
  77.  
  78. ;02    SOFT    1 ($64)    Riservato agli interrupt inizializzati via software.
  79. ;01    DSKBLK    1 ($64)    Fine del trasferimento di un blocco dati dal disco.
  80. ;00    TBE    1 ($64)    Buffer UART di trasmissione della porta seriale VUOTO.
  81.  
  82. NOINT1:    ; $64
  83.     btst.b    #0,$dff01f    ; INTREQR - TBE?
  84.     beq.w    NoTBE
  85.     ; tbe routines
  86. NoTBE:
  87.     btst.b    #1,$dff01f    ; INTREQR - DSKBLK?
  88.     beq.w    NoDSKBLK
  89.     ; DSKBLK routines
  90. NoDSKBLK:
  91.     btst.b    #2,$dff01f    ; INTREQR - SOFT?
  92.     beq.w    NoSOFT
  93.     ; SOFT routines
  94. NoSOFT:
  95.         ; 210
  96.     move.w    #%111,$dff09c    ; INTREQ - soft,dskblk,serial port tbe
  97.     rte
  98.  
  99. *****************************************************************************
  100. *    ROUTINE IN INTERRUPT $68 (livello 2)
  101. *****************************************************************************
  102.  
  103. ;        .:::::::::.
  104. ;       ¦:·       ·:¦
  105. ;       |'         `|
  106. ;       |    ,      |
  107. ;       |  ¯¯   `-- |
  108. ;      _!   __  __  |
  109. ;     (C \ ( °)(o ) |
  110. ;      7 /\ ¯(__)¯ _!
  111. ;     / /  \______/\\
  112. ;    /  \_______l__//
  113. ;    \   \:::::::::\\ xCz
  114. ;     \   \:::::::::\\
  115. ;      \___¯¯¯¯¯¯¯¯¯¯/
  116. ;         `---------'
  117.  
  118. ;03    PORTS    2 ($68)    Input/Output Porte e timers, connesso alla linea INT2
  119.  
  120. NOINT2:    ; $68
  121.     btst.b    #3,$dff01f    ; INTREQR - PORTS?
  122.     beq.w    NoPORTS
  123.     ; routines PORTS
  124. NoPORTS:
  125.     move.l    d0,-(sp)    ; salva d0
  126.     move.b    $bfed01,d0    ; CIAA icr - e' un interrupt della tastiera?
  127.     and.b    #$8,d0
  128.     beq.w    NoTastiera
  129.     ; Routines per la lettura della tastiera
  130. NoTastiera:
  131.     move.l    (sp)+,d0    ; ripristina d0
  132.         ; 3210
  133.     move.w    #%1000,$dff09c    ; INTREQ - ports
  134.     rte
  135.  
  136. *****************************************************************************
  137. *    ROUTINE IN INTERRUPT $6c (livello 3) - usato il VERTB e COPER.        *
  138. *****************************************************************************
  139. ;        __________________
  140. ;     __/  _______________/
  141. ;    ( .      ¬(___©)\©_T
  142. ;     \_,             \ |
  143. ;      T            C. )|
  144. ;      l____________  _ |
  145. ;           T      l__¬_!
  146. ;           |   (_) T`-'
  147. ;           l__     ¦ xCz
  148. ;             `-----'
  149.  
  150. ;06    BLIT    3 ($6c)    Se il blitter ha finito una blittata si setta ad 1
  151. ;05    VERTB    3 ($6c)    Generato ogni volta che il pennello elettronico e'
  152. ;            alla linea 00, ossia ad ogni inizio di vertical blank.
  153. ;04    COPER    3 ($6c)    Si puo' settare col copper per generarlo ad una certa
  154. ;            linea video. Basta richiederlo dopo un certo WAIT.
  155.  
  156. MioInt6c:
  157.     btst.b    #6,$dff01f    ; INTREQR - BLIT?
  158.     beq.w    NoBLIT
  159.     ; routines BLIT
  160. NoBLIT:
  161.     btst.b    #5,$dff01f    ; INTREQR - il bit 5, VERTB, e' azzerato?
  162.     beq.s    NointVERTB        ; Se si, non e' un "vero" int VERTB!
  163.     movem.l    d0-d7/a0-a6,-(SP)    ; salvo i registri nello stack
  164.     bsr.w    mt_music        ; suono la musica
  165.     movem.l    (SP)+,d0-d7/a0-a6    ; riprendo i reg. dallo stack
  166. nointVERTB:
  167.     btst.b    #4,$dff01f    ; INTREQR - COPER azzerato?
  168.     beq.s    NointCOPER    ; se si, non e' un int COPER!
  169.     move.w    #$F00,$dff180    ; int COPER, allora COLOR0 = ROSSO
  170. NointCOPER:
  171.          ;6543210
  172.     move.w    #%1110000,$dff09c ; INTREQ - cancello rich. BLIT,VERTB e COPER
  173.     rte    ; uscita dall'int COPER/BLIT/VERTB
  174.  
  175. *****************************************************************************
  176. *    ROUTINE IN INTERRUPT $70 (livello 4)
  177. *****************************************************************************
  178.  
  179. ;        _/\__/\_
  180. ;      _/ '_  _`¬\_
  181. ;     (/  (¤)(¤)  \)
  182. ;     /  _ ¯··¯ _  \
  183. ;    /    ¯Y¯¯Y¯    \
  184. ;    \____ '  ` ____/
  185. ;       `--------' xCz
  186.  
  187. ;10    AUD3    4 ($70)    Lettura di un blocco di dati del can. audio 3 finita.
  188. ;09    AUD2    4 ($70)    Lettura di un blocco di dati del can. audio 2 finita.
  189. ;08    AUD1    4 ($70)    Lettura di un blocco di dati del can. audio 1 finita.
  190. ;07    AUD0    4 ($70)    Lettura di un blocco di dati del can. audio 0 finita.
  191.  
  192. NOINT4: ; $70
  193.     BTST.b    #7,$dff01f    ; INTREQR - AUD0?
  194.     BEQ.W    NoAUD0
  195.     ; routines aud0
  196. NoAUD0:
  197.     BTST.b    #8-7,$dff01e    ; INTREQR - AUD1? nota: $dff01e e non $dff01f
  198.                 ;           perche' il bit e' >7!
  199.     BEQ.W    NoAUD1
  200.     ; routines aud1
  201. NoAUD1:
  202.     BTST.b    #9-7,$dff01e    ; INTREQR - AUD2?
  203.     Beq.W    NoAUD2
  204.     ; routines aud2
  205. NoAUD2:
  206.     BTST.b    #10-7,$dff01e    ; INTREQR - AUD3?
  207.     Beq.W    NoAUD3
  208.     ; routines aud3
  209. NoAUD3:
  210.         ; 09876543210
  211.     MOVE.W    #%11110000000,$DFF09C    ; aud0,aud1,aud2,aud3
  212.     RTE
  213.  
  214. *****************************************************************************
  215. *    ROUTINE IN INTERRUPT $74 (livello 5)
  216. *****************************************************************************
  217.  
  218. ;     .:::::.
  219. ;     ¦:·_ _!
  220. ;     ! (°T°)
  221. ;    ( , ¯,\\
  222. ;     \`---¯/
  223. ;      `---' xCz
  224.  
  225. ;12    DSKSYN    5 ($74)    Generato se il registro DSKSYNC corrisponde ai dati
  226. ;            letti dal disco nel drive.Serve per i loader hardware.
  227. ;11    RBF    5 ($74)    Buffer UART di ricezione della porta seriale PIENO.
  228.  
  229.  
  230. NOINT5: ; $74
  231.     BTST.b    #12-7,$dff01e    ; INTREQR - DSKSYN?
  232.     BEQ.W    NoDSKSYN
  233.     ; routines dsksyn
  234. NoDSKSYN:
  235.     BTST.b    #11-7,$dff01e    ; INTREQR - RBF?
  236.     BEQ.W    NoRBF
  237.     ; routines rbf
  238. NoRBF:
  239.         ; 2109876543210
  240.     MOVE.W    #%1100000000000,$DFF09C    ; serial port rbf, dsksyn
  241.     rte
  242.  
  243. *****************************************************************************
  244. *    ROUTINE IN INTERRUPT $78 (livello 6)                    *
  245. *****************************************************************************
  246.  
  247. ;     ......
  248. ;    ¡·¸ ,·:¦
  249. ;    | °u°. )
  250. ;    l_`--'_!
  251. ;     `----'xCz
  252.  
  253. ;14    INTEN    6 ($78)
  254. ;13    EXTER    6 ($78)    Interrupt esterno, connesso alla linea INT6 + TOD CIAB
  255.  
  256. NOINT6: ; $78
  257.     tst.b    $bfdd00        ; CIAB icr - resetta interrupt timer
  258.     BTST.b    #14-7,$dff01e    ; INTREQR - INTEN?
  259.     BEQ.W    NoINTEN
  260.     ; routines inten
  261. NoINTEN:
  262.     BTST.b    #13-7,$dff01e    ; INTREQR - EXTER?
  263.     BEQ.W    NoEXTER
  264.     ; routines exter
  265. NoEXTER:
  266.         ; 432109876543210
  267.     MOVE.W    #%110000000000000,$DFF09C ; INTREQ - external int + ciab
  268.     rte
  269.  
  270. *****************************************************************************
  271. ;    Routine di replay del protracker/soundtracker/noisetracker
  272. ;
  273.     include    "assembler2:sorgenti4/music.s"
  274. *****************************************************************************
  275.  
  276.     SECTION    GRAPHIC,DATA_C
  277.  
  278. COPPERLIST:
  279.     dc.w    $100,$200    ; BPLCON0 - no bitplanes
  280.     dc.w    $180,$00e    ; color0 BLU
  281.     dc.w    $a007,$fffe    ; WAIT - attendi la linea $a0
  282.     dc.w    $9c,$8010    ; INTREQ - Richiedo un interrupt COPER, il
  283.                 ; quale fa agire sul color0 con un "MOVE.W".
  284.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  285.  
  286. *****************************************************************************
  287. ;                MUSICA
  288. *****************************************************************************
  289.  
  290. mt_data:
  291.     dc.l    mt_data1
  292.  
  293. mt_data1:
  294.     incbin    "assembler2:sorgenti4/mod.fairlight"
  295.  
  296.     end
  297.  
  298. Abbiamo ridefinito tutti gli interrupt. Questo puo' essere uno schema di
  299. partenza per farsi un "sistema operativo", ma ve lo sconsiglio!
  300.  
  301.