- 注册时间
- 2005-5-28
- 最后登录
- 1970-1-1
|
这是用到的汇编代码:
ELEMENT_LENGTH=$7f
ELEMENT_INDEX=$7c
ELEMENT_BUF=$85 ;$85~$86
ELEMENT_AMOUNT=$87
NUMBER_LENGTH=$88
NUMBER_BUF=$1002
OFFSET_1=$89
DATA=$1100
DATA_LENGTH=$1000
TEMP=$80 ;$80~$83
MAT_INDEX=$84
TABLE=$1200
MULTIPLE=$7E
BRACKET_ENABLED=$7D
;;;;;;;;;;;;;;;;;;;
;This program is to
;analyze the formula
;;;;;;;;;;;;;;;;;;;
.org $32c8
MAIN:
lda #$00
sta ELEMENT_INDEX
lda #$ff
sta BRACKET_ENABLED
ldx #$f0
lda #$00
MAIN_1: sta TABLE-1,x
dex
bne MAIN_1
LOOP:
jsr GetNewElement
bcs END
jsr SearchElement
jmp LOOP
END:
rts
;;;;;;;;;
GetNewElement:
lda #$00
sta OFFSET_1
sta ELEMENT_LENGTH
GNE_MAIN:
ldx OFFSET_1
lda DATA,x
jsr CheckIfBC
bcs GNE_3
sta ELEMENT_BUF
inx
lda DATA,x
jsr CheckIfSC
bcs GNE_1
sta ELEMENT_BUF+1
inc ELEMENT_LENGTH
GNE_1:
inc ELEMENT_LENGTH
inc ELEMENT_INDEX
clc
rts
GNE_3:
inc OFFSET_1
lda OFFSET_1
cmp DATA_LENGTH
beq GNE_2
jmp GNE_MAIN
GNE_2: sec
rts
;;;;;;;;;;;;;
SearchElement:
lda #$01
sta MAT_INDEX
lda #$00
sta OFFSET_1
SE_MAIN:
ldx OFFSET_1
lda DATA,x
cmp #$2B ;'+'
beq SE_1
cmp #$2d ;'-'
bne SE_2
SE_1:
inc MAT_INDEX
jmp SE_6
SE_2:
cmp #$28 ;#'('
bne SE_3
lda #$00
sta BRACKET_ENABLED
jmp SE_6
SE_3:
cmp #$29 ;')'
bne SE_4
lda #$ff
sta BRACKET_ENABLED
jmp SE_6
SE_4:
cmp ELEMENT_BUF
bne SE_6
inx
lda DATA,x
jsr CheckIfSC
bcs SE_5
ldy ELEMENT_LENGTH
cpy #$02
bne SE_6
cmp ELEMENT_BUF+1
beq SE_PROCESS
jmp SE_6
SE_5:
ldy ELEMENT_LENGTH
cpy #$01
beq SE_PROCESS
SE_6:
inc OFFSET_1
lda OFFSET_1
cmp DATA_LENGTH
beq SE_END
jmp SE_MAIN
SE_END:
rts
SE_PROCESS:
lda #$00
sta TEMP+3
lda #$01
sta ELEMENT_AMOUNT
ldx OFFSET_1
lda ELEMENT_LENGTH
cmp #$01
beq SE_PRO_1
inx
SE_PRO_1:
inx
jsr GetNumber
bcs SE_PRO_5
lda NUMBER_LENGTH
sta TEMP+3
lda NUMBER_BUF
sta ELEMENT_AMOUNT
SE_PRO_5:
lda BRACKET_ENABLED
bne SE_PRO_3
jsr GetMultiple
ldy MULTIPLE
lda #$00
clc
SE_PRO_2:
adc ELEMENT_AMOUNT
dey
bne SE_PRO_2
sta ELEMENT_AMOUNT
SE_PRO_3:
jsr WriteTable
lda ELEMENT_LENGTH
clc
adc TEMP+3
tax
lda #$ff
ldy OFFSET_1
SE_PRO_4:
sta DATA,y
iny
dex
bne SE_PRO_4
jmp SE_6
;;;;;;;;;;;;
WriteTable:
lda #<TABLE
sta TEMP
lda #>TABLE
sta TEMP+1
ldx MAT_INDEX
WT_2:
dex
beq WT_3
clc
lda #$14
adc TEMP
sta TEMP
bcc WT_1
inc TEMP+1
WT_1:
jmp WT_2
WT_3:
ldy #$00
WT_4:
lda (TEMP),y
beq WT_5
iny
bne WT_4
WT_5:
lda ELEMENT_INDEX
sta (TEMP),y
iny
lda ELEMENT_AMOUNT
sta (TEMP),y
rts
;;;;;;;;;;;
GetNumber:
LDY #$00
GN_1: LDA DATA,X
CMP #$30
BCC GN_4
CMP #$3A
BCS GN_4
SEC
SBC #$30
STA TEMP,Y
INX
INY
BNE GN_1
GN_4: CPY #$00
BEQ GN_5
STY NUMBER_LENGTH
DEY
LDA TEMP,Y
DEY
BMI GN_8
LDX TEMP,Y
BEQ GN_7
CLC
GN_2: ADC #$0A
DEX
BNE GN_2
GN_7: DEY
BMI GN_8
LDX TEMP,Y
BEQ GN_8
CLC
GN_3: ADC #$64
DEX
BNE GN_3
GN_8: STA NUMBER_BUF
GN_6: CLC
RTS
GN_5: SEC
RTS
;;;;;;;;;;;
CheckIfBC:
cmp #$41
bcc CIB_FAIL
cmp #$5b
bcs CIB_FAIL
clc
rts
CIB_FAIL:
sec
rts
;;;;;;;;;;
CheckIfSC:
cmp #$61
bcc CIS_FAIL
cmp #$7b
bcs CIS_FAIL
clc
rts
CIS_FAIL:
sec
rts
;;;;;;;;;;
GetMultiple:
ldx OFFSET_1
GM_2:
inx
lda DATA,x
cmp #$29 ;')'
beq GM_1
jmp GM_2
GM_1: inx
jsr GetNumber
lda NUMBER_BUF
sta MULTIPLE
rts
上面代码是用来解析未配平的方程式的,以构建方程,BAS其实就是解这个方程。
输入是这样:O2-O3,配平显示3O2=2O3
本程序最多支持12个反应物加生成物,化合物下标最大255
详细的今天无法解释,我被父母逼着关电脑…… |
|