📄 div_f.asm
字号:
* REGISTER USED AS INPUT: R0
* REGISTERS MODIFIED: R0, R1, R2, R3
* REGISTER CONTAINING RESULT: R0
.global RESET,INIT
.global INVF,Loo
* REGISTER FROM 808000H (CTRL)
.data
MASK .word 0FFFFFFFFH
BLK0 .word 0809800H ; 片内1K×32bit RAM块0起始地址
BLK1 .word 0809C00H ; 片内1K×32bit RAM块1起始地址
STCK .word 0809E00H ; 堆栈起始地址
CTRL .word 0808000H ; Pointer for peripheral±bus memory map
DMACTL .word 0000000H ; Init for DMA control (0)
TIM0CTL .word 0000000H ; Init of timer 0 control (32)
TIM1CTL .word 0000000H ; Init of timer 1 control (48)
SERGLOB0 .word 0000000H ; Init of serial 0 glbl control (64)
SERPRTX0 .word 0000000H ; Init of serial 0 xmt port control (66)
SERPRTR0 .word 0000000H ; Init of serial 0 rcv port control (67)
SERTIM0 .word 0000000H ; Init of serial 0 timer control (68)
SERGLOB1 .word 0000000H ; Init of serial 1 glbl control (80)
SERPRTX1 .word 0000000H ; Init of serial 1 xmt port control (82)
SERPRTR1 .word 0000000H ; Init of serial 1 rcv port control (83)
SERTIM1 .word 0000000H ; Init of serial 1 timer control (84)
PARINT .word 0000000H ; Init of parallel interface control (100)
IOINT .word 0000000H ; Init of I/O interface control (96)
*
.sect "init"; Named section
RESET .word INIT ; RS± load address INIT to PC
.space 63 ; Reserved space
.text
* THE STATUS REGISTER HAS THE FOLLOWING ARRANGEMENT:
* BITS: 31–14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
* FUNCTION: RESRV GIE CC CE CF RESRV RM OVM LUF LV UF N Z V C
*
INIT: LDP 0,DP ; Point the DP register to page 0
LDI 1800H,ST ; Clear and enable cache, and disable OVM
LDI @MASK,IE ; Unmask all interrupts
LDI @BLK0,AR0 ; AR0 points to block 0
LDI @BLK1,AR1 ; AR1 points to block 1
LDF 0.0,R0 ; 0 register R0
RPTS 1023 ; Repeat 1024 times ...
STF R0,*AR0++(1) ; Zero out location in RAM block 0 and ...
|| STF R0,*AR1++(1) ; Zero out location in RAM block 1
LDI @CTRL,AR0 ; Load in AR0 the pointer to control registers
LDI @DMACTL,R0
STI R0,*+AR0(0) ; Init DMA control
LDI @TIM0CTL,R0
STI R0,*+AR0(32) ; Init timer 0 control
LDI @TIM1CTL,R0
STI R0,*+AR0(48) ; Init timer 1 control
LDI @SERGLOB0,R0
STI R0,*+AR0(64) ; Init serial 0 global control
LDI @SERPRTX0,R0
STI R0,*+AR0(66) ; Init serial 0 xmt control
LDI @SERPRTR0,R0
STI R0,*+AR0(67) ; Init serial 0 rcv control
LDI @SERTIM0,R0
STI R0,*+AR0(68) ; Init serial 0 timer control
LDI @SERGLOB1,R0
STI R0,*+AR0(80) ; Init serial 1 global control
LDI @SERPRTX1,R0
STI R0,*+AR0(82) ; Init serial 1 xmt control
LDI @SERPRTR1,R0
STI R0,*+AR0(83) ; Init serial 1 rcv control
LDI @SERTIM1,R0
STI R0,*+AR0(84) ; Init serial 1 timer control
LDI @PARINT,R0
STI R0,*+AR0(100) ; Init parallel interface control (C30 only)
LDI @IOINT,R0
STI R0,*+AR0(96) ; Init I/O interface control
LDI @STCK,SP ; Init the stack pointer
OR 2000H,ST ; Global interrupt enable
LDF -3.25,R0
CALL INVF
LDF 7.5,R1
MPYF3 R0,R1,R2
BR $
INVF: LDF R0,R3 ; 浮点除数v暂存R3
ABSF R0 ; 浮点除数v取正
* EXTRACT THE EXPONENT OF v.
PUSHF R0
POP R1
ASH -24,R1 ;R1中的低8位为除数的指数部分
* x[0] FORMATION IS GIVEN THE EXPONENT OF v.
NEGI R1
SUBI 1,R1 ; 求-e-1, the exponent of x[0]
ASH 24,R1
PUSH R1
POPF R1 ; Now R1 = x[0] = 1.0 * 2**(-e-1)
* NOW THE ITERATIONS BEGIN.
LDI 8,RC
RPTB Loo
MPYF R1,R0,R2 ; R2 = v * x[0]
SUBRF 2.0,R2 ; R2 = 2.0 ± v * x[0]
Loo: MPYF R2,R1 ; R1 = x[1] = x[0] * (2.0 - v * x[0])
RND R1 ; This minimizes error in the LSBs
* FOR THE LAST ITERATION WE USE THE FORMULATION:
* x[5] = (x[4] * (1.0 ± (v * x[4]))) + x[4]
MPYF R1,R0,R2 ; R2 = v * x[4] = 1.0..01.. => 1
SUBRF 1.0,R2 ; R2 = 1.0 ± v * x[4] = 0.0..01... => 0
MPYF R1,R2 ; R2 = x[4] * (1.0 - v * x[4])
ADDF R2,R1 ; R2 = x[5] = (x[4]*(1.0±(v*x[4])))+x[4]
*
RND R1,R0 ; Round since this is followed by a MPYF
*
* NOW THE CASE OF v < 0 IS HANDLED.
*
NEGF R0,R2
LDF R3,R3 ; This sets condition flags
LDFN R2,R0 ; If v < 0, then R0 = -R0
*
RETS
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -