Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;****************************************************************
- ; MARS Check Program
- ; SH2 Master Interrupt
- ;
- ; Copyright SEGA ENTERPRISES,LTD. 1994
- ; SEGA ENTERPRISES,LTD.
- ; CS Hardware R&D Dept.
- ; T.Okawa
- ;---------------------------------------------------------------*
- ;
- ;****************************************************************
- .import pwmint_rtn ; shsound.src
- .import _hotreset ; master.src
- .export m_int
- .include "include\shmap.i"
- .include "include\sdram.ass"
- .include "include\sh_const.ass"
- ;---------------------------------------------------------------*
- ; Interrupt Control
- ;---------------------------------------------------------------*
- m_int:
- push 0,1
- sts.l pr,@-r15
- stc sr,r0
- shlr2 r0
- and #h'3c,r0
- mov.l #inttable,r1
- add r1,r0
- mov.l @r0,r1
- jsr @r1
- nop
- lds.l @r15+,pr
- pop 0,1
- rte
- nop
- .align 4
- inttable:
- .data.l noret, ; Illigal Interrupt
- + noret, ; Level 1
- + noret, ; Level 2
- + noret, ; Level 3
- + sciint, ; Level 4
- + noret, ; Level 5
- + pwmint, ; Level 6
- + pwmint, ; Level 7
- + cmdint, ; Level 8
- + cmdint, ; Level 9
- + hint, ; Level 10
- + hint, ; Level 11
- + vint, ; Level 12
- + vint, ; Level 13
- + vresint, ; Level 14
- + vresint ; Level 15
- ;---------------------------------------------------------------*
- ; Illigal Interrupt
- ;---------------------------------------------------------------*
- noret:
- rts
- nop
- ;---------------------------------------------------------------*
- ; VRES Interrupt (Hot Reset)
- ;---------------------------------------------------------------*
- vresint:
- mov.l #_sysreg,r0
- ldc r0,gbr
- mov.w r0,@(vresintclr,gbr) ; V interrupt clear
- mov.b @(dreqctl,gbr),r0 ; VresÎô
- tst #RV,r0
- bf mars_reset
- mov.l #M_STACK-8,r15 ; X^bNÌÏX
- mov.l #_hotreset,r0
- mov r0,@r15 ; PC ÌÏX
- mov.w #h'f0,r0
- mov r0,@(4,r15) ; SR Ì}XN
- mov.l #_DMAOPERATION,r1
- mov #0,r0
- mov.l r0,@r1 ; DMA off
- mov #0,r0
- mov.b r0,@(m_sysflug,flugbase)
- rte
- nop
- mars_reset
- mov.l #_FRT,r1 ; System Reset
- mov.b @(_TOCR,r1),r0 ;
- or #h'01,r0 ;
- mov.b r0,@(_TOCR,r1) ;
- vresloop:
- bra vresloop
- nop
- ;---------------------------------------------------------------*
- ; V Interrupt
- ;---------------------------------------------------------------*
- vint:
- mov.l #h'f0,r0
- ldc r0,sr
- mov.l #_FRT,r1
- mov.b @(_TOCR,r1),r0
- xor #h'02,r0
- mov.b r0,@(_TOCR,r1)
- mov.w r0,@(vintclr,gbr) ; V interrupt clear
- mov.w @(m_vint_timer,workbase),r0
- add #1,r0
- mov.w r0,@(m_vint_timer,workbase)
- mov #0,r0
- mov.w r0,@(m_hint_timer,workbase)
- rts
- nop
- ;---------------------------------------------------------------*
- ; H Interrupt
- ;---------------------------------------------------------------*
- hint:
- mov.l #h'f0,r0
- ldc r0,sr
- mov.l #_FRT,r1
- mov.b @(_TOCR,r1),r0
- xor #h'02,r0
- mov.b r0,@(_TOCR,r1)
- mov.w r0,@(hintclr,gbr) ; H interrupt clear
- mov.w @(m_hint_timer,workbase),r0
- add #1,r0
- mov.w r0,@(m_hint_timer,workbase)
- mov.w @(m_hint1_timer,workbase),r0
- add #1,r0
- mov.w r0,@(m_hint1_timer,workbase)
- rts
- nop
- ;---------------------------------------------------------------*
- ; Command Interrupt
- ;---------------------------------------------------------------*
- cmdint:
- mov.l #h'f0,r0
- ldc r0,sr
- mov.l #_FRT,r1
- mov.b @(_TOCR,r1),r0
- xor #h'02,r0
- mov.b r0,@(_TOCR,r1)
- mov.w r0,@(cmdintclr,gbr) ; CMD interrupt clear
- mov.w @(comm0,gbr),r0
- mov r0,r1
- shlr8 r0
- shlr2 r0
- shlr2 r0
- tst #h'8,r0
- bt no_command
- mov r1,r0
- mov.w r0,@(m_command,workbase) ; Set Command No.
- mov.b @(m_sysflug,flugbase),r0
- or #M_CMD_ON,r0 ; Command On
- mov.b r0,@(m_sysflug,flugbase)
- no_command:
- mov.w @(m_cmdint_timer,workbase),r0
- add #1,r0
- mov.w r0,@(m_cmdint_timer,workbase)
- rts
- nop
- ;---------------------------------------------------------------*
- ; PWM Timer Interrupt
- ;---------------------------------------------------------------*
- pwmint:
- push 2,3
- mov.l #h'f0,r0
- ldc r0,sr
- mov.l #_FRT,r1
- mov.b @(_TOCR,r1),r0
- xor #h'02,r0
- mov.b r0,@(_TOCR,r1)
- mov.w r0,@(pwmintclr,gbr) ; PWM interrupt clear
- mov.w @(m_pwmint_timer,workbase),r0
- add #1,r0
- mov.w r0,@(m_pwmint_timer,workbase)
- mov.b @(m_sysflug,flugbase),r0
- tst #M_SOUNDINT,r0
- bt pwmint_00
- sts.l pr,@-r15
- bsr pwmint_rtn
- nop
- lds.l @r15+,pr
- pwmint_00:
- pop 2,3
- rts
- nop
- ;---------------------------------------------------------------*
- ; Serial Interrupt
- ;---------------------------------------------------------------*
- sciint:
- mov.l #_SCI,r1
- mov.b @(_SSR,r1),r0
- tst #h'08,r0
- bf sci_eri
- tst #h'10,r0
- bf sci_eri
- tst #h'20,r0
- bf sci_eri
- tst #h'40,r0
- bf sci_rxi
- tst #h'80,r0
- bf sci_txi
- tst #h'04,r0
- bf sci_tei
- rts
- nop
- ;---------------------------------------------------------------*
- ; óMG[
- ;---------------------------------------------------------------*
- sci_eri:
- push 0,1
- mov.l #_SCI,r1
- mov.b @(_SSR,r1),r0
- mov.b r0,@(m_sci_ssr,flugbase)
- mov.b @(_RDR,r1),r0
- mov.b r0,@(m_receivedata,flugbase)
- mov #h'c7,r0
- mov.b r0,@(_SSR,r1) ; Error flug clear
- mov.b @(m_sysflug,flugbase),r0
- or #SCI_ERR,r0
- mov.b r0,@(m_sysflug,flugbase)
- pop 0,1
- rts
- nop
- ;---------------------------------------------------------------*
- ; óMf[^t
- ;---------------------------------------------------------------*
- sci_rxi:
- push 0,2
- mov.l #_SCI,r1
- mov.b @(_SSR,r1),r0
- mov.b r0,@(m_sci_ssr,flugbase)
- mov.b @(_RDR,r1),r0
- mov.b r0,@(m_receivedata,flugbase)
- mov #h'bf,r0
- mov.b r0,@(_SSR,r1) ; RDRF clear
- nop
- nop
- mov.b @(_SSR,r1),r0
- mov.b r0,@(m_sci_ssr,flugbase)
- nop
- nop
- mov.b @(m_sysflug,flugbase),r0
- or #SCI_RXI,r0
- mov.b r0,@(m_sysflug,flugbase)
- ; mov #-1,r2
- ; mov.b @(m_receivedata,flugbase),r0
- ; cmp/eq r0,r2
- ; bt txi_end
- ;rxi00:
- ; mov.b @(_SSR,r1),r0
- ; tst #h'80,r0
- ; bt rxi00
- ; mov.b @(m_receivedata,flugbase),r0
- ; mov.b r0,@(_TDR,r1)
- ; mov #h'7f,r0
- ; mov.b r0,@(_SSR,r1) ; TDRE clear
- ;
- ; mov #SCI_TXOK,r0
- ; not r0,r1
- ; mov.b @(m_sysflug,flugbase),r0
- ; and r1,r0
- ; mov.b r0,@(m_sysflug,flugbase)
- txi_end:
- pop 0,2
- rts
- nop
- ;---------------------------------------------------------------*
- ; Mf[^GveB[
- ;---------------------------------------------------------------*
- sci_txi:
- push 0,1
- mov.l #_SCI,r1
- mov.b @(_SSR,r1),r0
- mov.b r0,@(m_sci_ssr,flugbase)
- ; mov #h'7f,r0
- ; mov.b r0,@(_SSR,r1) ; TDRE clear
- ; mov.b @(m_sysflug,flugbase),r0
- ; or #SCI_TXOK,r0
- ; mov.b r0,@(m_sysflug,flugbase)
- pop 0,1
- rts
- nop
- ;---------------------------------------------------------------*
- ; MI¹
- ;---------------------------------------------------------------*
- sci_tei:
- push 0,1
- mov.l #_SCI,r1
- mov.b @(_SSR,r1),r0
- mov.b r0,@(m_sci_ssr,flugbase)
- ; mov #h'7f,r0
- ; mov.b r0,@(_SSR,r1) ; TDRE clear
- mov.b @(m_sysflug,flugbase),r0
- or #SCI_TXOK,r0
- mov.b r0,@(m_sysflug,flugbase)
- pop 0,1
- rts
- nop
- ;****************************************************************
- ; end of file
- ;****************************************************************
- .end
Advertisement
Add Comment
Please, Sign In to add comment