以下のコードを割り込み(完全な手順)で書き直すように求められます。クラスで割り込みについてはあまり説明していません。割り込みがどのように使用され、どのように実装されるのか正確にはわかりません。これは、基本的にキーボードをピアノにしたり、モトローラ 68hc11用に書かれた曲 (lamb、chromsc、hall) を演奏したりできる割り込みを使用せずに書いたコードです。
PORTA EQU $1000 ;The speaker port
SPEAKER EQU PORTA
SPEAKERBIT EQU %00100000
SCSR EQU $6400 ; Serial communications status register
SCDR EQU $6401 ; Serial communcations data register
TDRE EQU %00000010 ; mask for TDRE flag in SCSR
RDRF EQU %00000001 ; mask for RDRF flag in SCSR
ORG $8000; Place data at 8000
LAMB FCB 'trerttttrrrrtuuutrerttttrrtre',$00
CHROMSC FCB 'q2we4r5ty7u8i9op-[=]',$00
HALL FCB 'qwertet5w5r2rqwertetiutetu',$00
KEYMAP FDB 'q', 220, 758 ; A ;key, frequency, and 1/4 second "period"
FDB '2', 233, 715 ; A#
FDB 'w', 247, 675 ; B
FDB 'e', 262, 636 ; C
FDB '4', 277, 602 ; C#
FDB 'r', 294, 567 ; D
FDB '5', 311, 536 ; D#
FDB 't', 330, 505 ; E
FDB 'y', 349, 478 ; F
FDB '7', 370, 450 ; F#
FDB 'u', 392, 425 ; G
FDB '8', 415, 402 ; G#
FDB 'i', 440, 379 ; A
FDB '9', 466, 358 ; A#
FDB 'o', 494, 337 ; B
FDB 'p', 523, 319 ; C
FDB '-', 554, 301 ; C#
FDB '[', 587, 284 ; D
FDB '=', 622, 268 ; D#
FDB ']', 659, 253 ; E
FDB $00 ; Null termination character
PROMPT FCB $0D, 'Piano program - use QWERTY row to play notes', $0D, $00 ;Prompt String
ORG $8800
LDS #$DFFF
;;;;;;;;;; Main Start ;;;;;;;;;;
LDX #PROMPT
PSHX ;Push the argument to the stack
JSR printString ;Print the promp string
PULX
ALWAYS DES
JSR getChar ;Get a character from the keyboard
JSR putChar
PULA ;put the character in A
PSHA ;Push character to the stack
JSR playTone ;Play the tone
PULA
CMPA #'a'
BNE SKIPLAMB
LDX #HALL
PSHX
JSR playSong
PULX
SKIPLAMB CMPA #'s'
BNE BRAALW
LDX #LAMB
PSHX
JSR playSong
PULX
BRAALW BRA ALWAYS ;Loop to the top and continue playing
;;;;;;;;;; Main End ;;;;;;;;;;
;;;;;;;;;; playTone Start ;;;;;;;;;; Passed an ascii character and a length on the stack
playTone PSHB ;for transparency
PSHA
PSHX
PSHY
TSY ;make Y point to the top of the stack
LDAA 8,Y ;load A with the passed argument
LDX #KEYMAP ;make Y point to the KEYMAP
CBAALWAYS LDAB 1,X ;load B with the ascii value
BEQ EXITPT ;If current value is $00, end of table, no key match, exit routine
CBA ;Compare B to A
BEQ SKIPTESTS ;If value are equal, skip rest of test to play tone
XGDX
ADDD #6 ;Make X point to the next character to compare
XGDX
BRA CBAALWAYS ;Branch until the end of table is reached
SKIPTESTS LDD 2,X ;Load D with the frequency
LSRD ;Number of times to toggle the speaker in a 1/4 second
LSRD ;this shortens the tone to an 1/8 note
;LSRD ;this plays a 1/16 note
;LSRD ;this plays a 1/32 note
PERIODLOOP LDY 4,X ;Load Y with the delay between toggles
FREQLOOP DEY ;Decrement Y until it's 0
BNE FREQLOOP ;Branch until X is 0
PSHB ;preserve D
PSHA
LDAA PORTA ;Load A with the speaker
EORA #SPEAKERBIT ;Toggle the speaker bit
STAA PORTA ;Store back into the speaker
PULA ;restore D
PULB
SUBD #1 ;Decrement D
CPD #0 ;Compare D to 0
BNE PERIODLOOP ;Branch until D is 0
EXITPT PULY
PULX
PULA
PULB ;return the stack to normal
RTS ;return to the main program
;;;;;;;;;; playTone End ;;;;;;;;;;
;;;;;;;;;; playSong Start;;;;;;;;;;
playSong PSHB ;Reference is passed on the stack
PSHA ;Pushes for transparency
PSHX
PSHY
TSX
LDX 8,x ;Load X with the passed value
LOOPSTRING LDAA 0,X ;Load A with the ith character of the string
BEQ ENDPSTRING ;Skips to end of subroutine if current character is null character
PSHA ;Pass the argument in A to putChar
JSR playTone
INS ;Return the stack to normal
INX ;increments X to point to the next character
BRA LOOPSTRING
ENDPSTRING PULY
PULX
PULA
PULB
RTS
;;;;;;;;;; playSong End ;;;;;;;;;;
;;;;;;;;;; putChar start ;;;;;;;;;; Passed argument should be an ascii value
putChar PSHB ;is passed an argument on the stack
PSHA ;for transparency
PSHX
PSHY
TSY ;stack frame
LDX #SCSR ;Load in address of SCSR (Serial Communication Status Register)
GCWAIT BRCLR 0,X TDRE GCWAIT ;Loop
LDAA 8,Y ;Load A with the passed value
STAA SCDR ;Write A to the SCDR
PULY
PULX
PULA
PULB
RTS
;;;;;;;;;; putChar end ;;;;;;;;;;
;;;;;;;;;; getChar start ;;;;;;;;;; ascii value is returned
getChar PSHB ;No argument. Passes result back on the stack.
PSHA ;For transparency
PSHX
PSHY
TSY
LDX #SCSR ;Load in address of SCSR (Serial Communication Status Register)
PCWAIT BRCLR 0,X RDRF PCWAIT ;Loop when the
LDAA SCDR ;Load A with what's in the SCDR (should be the pressed key)
STAA 8,Y ;Store it to the stack to be passed back
PULY
PULX
PULA
PULB
RTS
;;;;;;;;;; getChar end ;;;;;;;;;;
;;;;;;;;;; printString start ;;;;;;;;;; argument passed on the stack in ascii
printString PSHB ;Reference is passed on the stack
PSHA ;Pushes for transparency
PSHX
PSHY
TSX
LDX 8,x ;Load X with the passed value
LOOPSTRING1 LDAA 0,X ;Load A with the ith character of the string
BEQ ENDPSTRING1 ;Skips to end of subroutine if current character is null character
PSHA ;Pass the argument in A to putChar
JSR putChar
INS ;Return the stack to normal
INX ;increments X to point to the next character
BRA LOOPSTRING1
ENDPSTRING1 PULY
PULX
PULA
PULB
RTS
;;;;;;;;;; printString end ;;;;;;;;;;
効果的に実装する方法の例、または割り込みのコーディングを開始する方法のヒントを教えてください。割り込みを使用してコードを書き直すことができます。