我试图掌握使用中断作为一种方式的时间的方式,在6502的替身微控制器。我已经成功地创建了一个计数器,通过触发中断来更快地添加比特:
%uasm65
; v.002
; Increment port 0A200h at a rate of once increment
; per second. Use the timer based interrupt handler
; to control the time delay.
T1LL: equ B006h
T1LH: equ B007h
IER: equ B00Eh
ACR: equ B00Bh
COUNTDOWN: equ 5
我试图产生两个输出:一个20赫兹方波和一个30赫兹方波在组装使用6502微控制器指令集。到目前为止,我可以输出20赫兹的波:
%uasm65,title="SQUARES"
org 0200h
lda #1d
sta 0a200h
Main:
;jump to the subroutine Delay and do it
jsr Delay
lda 0a200h
inc Count1
lda Count1
cmp #3d
beq Reset1
jmp Main
Reset1:
ld
我正在尝试理解6502汇编中的控制流。
假设我有以下代码:
ControlFlow:
lda mem
cmp #1
bne .sub_one
cmp #2
bne .sub_two
.sub_one:
; sub routine one goes here
jmp .done ; <-------------- without this jmp, .sub_two will execute
.sub_two:
; sub routine two
我想把一个16位数除以二。我对这个问题的解决办法如下
lda $17 ;set high byte
ldx $32 ;set low byte
divide:
PHA ;push A to stack
TXA ;X > A
LSR ;divide low byte by 2
TAX ;A > X
PLA ;pull A from stack
LSR ;divide high byte
我正在尝试设置一个简单的光栅中断处理程序来更改给定条纹中的背景颜色。但是,我的中断处理程序似乎总是被调用。(代码使用CA65的格式)
.include "c64.inc"
ROW = 100
.segment "ZPSAVE"
.segment "STARTUP"
sei
;; Turn off BASIC and KERNAL ROM
lda #$35
sta $01
;; Flush CIA IRQs
bit CIA1_ICR
例如:
.text
.align 2
.global main
.equ val,0x4712 # 16-bit binary code for 0x4712: 0100 0111 0001 0010
# Program code starts now
main: # This label must be main:, not MAIN:
movi r16,val
我正在尝试用6502处理器上一个操作的结果填充100个位置的内存。
如何递增存储在寄存器中的内存位置并将结果存储在其中?
*=0300
dato1 = $0A
dato2 = $0B
res = $0C
LDA #4
STA dato1
LDA #5
STA dato2
ADC dato1
STA res
LDX #100
LDY #res
LOOP
INY
; i have to fill 0C position and next 100 positions in this loop
我刚开始在学校学习汇编语言,作为练习,我必须编制一个计算第一个n个整数(1+2+3+4+5+...+n)之和的程序。我成功地构建了这个程序,但是在比较(line.9)过程中,我只比较了寄存器R1中的偶数,所以我不得不对R0中的奇数进行另一次比较。
MOV R0,#1 ; I put a register at 1 to start the sequence
INP R2,2 ; I ask the user up to what number the program should calculate, and I put its response in
在循环中,我必须实现一种裁剪
if ( isLast )
{
val = ( val < 0 ) ? 0 : val;
val = ( val > 255 ) ? 255 : val;
}
然而,在霓虹灯中,这种“剪裁”几乎占用了循环执行的一半时间。这就是整个循环的样子-
for (row = 0; row < height; row++)
{
for (col = 0; col < width; col++)
{
Int sum;
//...Calculate the sum
Shor
在程序集中使用分支命令(主要是BNE和BEQ )时感到困惑。因此,我必须为伪代码编写一个汇编代码:
X = 5, Y = 10, Z = 15
if X != 4 && Y == 10 || Z = 20
A = X + Y - 2
else R = Z - 5 + X
我正在编码在Keil uVision5的ARM皮质M0加法(如果这是需要的信息)在它的低寄存器,这是R0-R7为这个特定的板。
我知道如何编写if else语句本身,但我主要问的是如何处理代码的OR部分。显而易见的X!=4为真,Y==10为真,然后检查Z = 20是否为false,所以我将首先检查X
我在ARM上的dcd表中有一组整数。它们都出现了偶数次,但我正在尝试获取仅出现一次的唯一数字。下面是我在ARM中的算法。
; I understand why it doesn't work obviously, but I just can't figure out better code
AREA ExOdd1, CODE
ENTRY
LDR r1, =TABLE1
MOV r2, #17
MOV r6, r2
LOOP LDR r3, [r1], #4
B LOOP2
SUBS r2, r2, #1
BNE LOO
我昨天写了一个答案:和我真的很努力地记住我的6502程序集,但我终生记不住如何分支,如果小于...
:1
lda $C010
cmp #$80
bcc :1 ; branch if less than? I forget how to do that.
lda $C000
jsr $FDF0 ;output the accumulator value to the screen
有人知道指令是什么吗?BNE和BEQ是相等的,BCC用于进位,而CMP基本上是SBC,这会影响进位,但我不确定它在这种情况下是否有效。
import rv32i_types::*;
module cmp
(
input [2:0] sel,
input [31:0] a, b,
output logic f
);
always_comb
begin
case (sel)
beq:
if(a==b)
out = 1'b1;
else
out = 1'b0;
bne:
i
为什么在下面的代码中用值0x50C06填充表条目?
TTB_ENTRY_SUPERSEC_DEV DEFINE 0x50C06
; Setup page table.
LDR r0,=SFE(MMU_TT) ; Load page table base address
; Init the whole page table as dev m