gpt4 book ai didi

assembly - 在汇编中使用中断

转载 作者:行者123 更新时间:2023-12-05 00:00:21 28 4
gpt4 key购买 nike

我被要求用中断重写下面的代码 (full instructions) .我们还没有真正涵盖类里面的中断,我不确定它们是如何使用或如何实现的。这是我在不使用中断的情况下编写的代码,这些代码基本上使键盘变成了钢琴,或者可以播放为 motorola 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 ;;;;;;;;;;

有人可以给我一个如何有效实现的例子,或者只是一个提示如何开始编码中断,这样我就可以用它们重写我的代码。

最佳答案

要在 hc11 上使用中断,您必须做四件事:

  • 首先决定要使用哪种中断。 hc11 有许多不同的类型,因此您必须查阅手册以找到适合您尝试执行的操作的手册。

  • 在接下来的步骤中,我假设您正在使用 IRQ 中断。它只是 hc11 上的一个简单的中断引脚,当它的电压降至低时会中断系统。但是,对于任何其他中断,这些步骤都非常相似。
  • 您需要初始化中断服务程序的起始位置。当中断被触发时,处理器将检查向量表以确定它需要去哪里。因此,例如,当触发 IRQ 时,它将转到对应于 IRQ ($FFF2) 的表条目,然后跳转到存储在那里的地址。我们将标记中断服务程序 IRQ_INT并将其存储在IRQ对应的表项中,这样当IRQ被触发时,它就会开始执行标签IRQ_INT处的代码.
    ORG   $FFF2
    FDB IRQ_INT
  • 接下来,您需要启用中断,以便处理器在触发时识别它。再次,您将不得不检查手册,了解您必须将值存储在哪个值和哪个寄存器中才能启用它。要启用 IRQ,必须将中断控制寄存器 (INTCR) 中的 IRQ 启用位 (IRQEN) 设置为 1。然后可以使用 CLI 启用它命令。
    INTCR    EQU   $001E   ;address of interrupt control register
    INTCR_IN EQU $60 ;sets IRQEN bits

    LDAA #INTCR_IN
    STAA INTCR
    CLI
  • 最后,您需要编写中断服务程序。这是每次触发中断时都会执行的代码。它将从我们之前在向量表中设置的标签开始,并在遇到指令 RTI 时结束。 .中断返回指令告诉处理器服务程序已经完成,它应该返回到触发中断之前它正在执行的任何程序。
    IRQ_INT
    <instructions go here>
    RTI

  • 我的猜测是,您将需要在键盘端口上出现某种中断,以便在击中键时触发。一旦按下一个键,中断就会触发处理器进入中断服务程序。在那里,您必须编写代码来确定击中哪个键并播放正确的音符。

    关于assembly - 在汇编中使用中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10323666/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com