📄 div_f.lst
字号:
0001 * REGISTER USED AS INPUT: R0
0002 * REGISTERS MODIFIED: R0, R1, R2, R3
0003 * REGISTER CONTAINING RESULT: R0
0004 .global RESET,INIT
0005 .global INVF,Loo
0006 * REGISTER FROM 808000H (CTRL)
0007 000000 .data
0008 000000 ffffffff MASK .word 0FFFFFFFFH
0009 000001 00809800 BLK0 .word 0809800H ; 片内1K×32bit RAM块0起始地址
0010 000002 00809c00 BLK1 .word 0809C00H ; 片内1K×32bit RAM块1起始地址
0011 000003 00809e00 STCK .word 0809E00H ; 堆栈起始地址
0012 000004 00808000 CTRL .word 0808000H ; Pointer for peripheral±bus me
0013 000005 00000000 DMACTL .word 0000000H ; Init for DMA control (0)
0014 000006 00000000 TIM0CTL .word 0000000H ; Init of timer 0 control (32)
0015 000007 00000000 TIM1CTL .word 0000000H ; Init of timer 1 control (48)
0016 000008 00000000 SERGLOB0 .word 0000000H ; Init of serial 0 glbl control
0017 000009 00000000 SERPRTX0 .word 0000000H ; Init of serial 0 xmt port cont
0018 00000a 00000000 SERPRTR0 .word 0000000H ; Init of serial 0 rcv port cont
0019 00000b 00000000 SERTIM0 .word 0000000H ; Init of serial 0 timer control
0020 00000c 00000000 SERGLOB1 .word 0000000H ; Init of serial 1 glbl control
0021 00000d 00000000 SERPRTX1 .word 0000000H ; Init of serial 1 xmt port cont
0022 00000e 00000000 SERPRTR1 .word 0000000H ; Init of serial 1 rcv port cont
0023 00000f 00000000 SERTIM1 .word 0000000H ; Init of serial 1 timer control
0024 000010 00000000 PARINT .word 0000000H ; Init of parallel interface con
0025 000011 00000000 IOINT .word 0000000H ; Init of I/O interface control
0026 *
0027
0028 000000 .sect "init"; Named section
0029 000000 00000000' RESET .word INIT ; RS± load address INIT to PC
0030 000001 00000000 .space 63 ; Reserved space
0031
0032 000000 .text
0033 * THE STATUS REGISTER HAS THE FOLLOWING ARRANGEMENT:
0034 * BITS: 31–14 13 12 11 10 9 8 7 6 5 4 3
0035 * FUNCTION: RESRV GIE CC CE CF RESRV RM OVM LUF LV UF N
0036 *
0037 000000 08700000 INIT: LDP 0,DP ; Point the DP register to page 0
0038 000001 08751800 LDI 1800H,ST ; Clear and enable cache, and disa
0039 000002 08360000+ LDI @MASK,IE ; Unmask all interrupts
0040 000003 08280001+ LDI @BLK0,AR0 ; AR0 points to block 0
0041 000004 08290002+ LDI @BLK1,AR1 ; AR1 points to block 1
0042 000005 07608000 LDF 0.0,R0 ; 0 register R0
0043 000006 13fb03ff RPTS 1023 ; Repeat 1024 times ...
0044 000007 c0002120 STF R0,*AR0++(1) ; Zero out location in RAM blo
0045 || STF R0,*AR1++(1) ; Zero out location in RAM
0046 000008 08280004+ LDI @CTRL,AR0 ; Load in AR0 the pointer to cont
0047 000009 08200005+ LDI @DMACTL,R0
0048 00000a 15400000 STI R0,*+AR0(0) ; Init DMA control
0049 00000b 08200006+ LDI @TIM0CTL,R0
0050 00000c 15400020 STI R0,*+AR0(32) ; Init timer 0 control
0051 00000d 08200007+ LDI @TIM1CTL,R0
0052 00000e 15400030 STI R0,*+AR0(48) ; Init timer 1 control
0053 00000f 08200008+ LDI @SERGLOB0,R0
0054 000010 15400040 STI R0,*+AR0(64) ; Init serial 0 global control
0055 000011 08200009+ LDI @SERPRTX0,R0
0056 000012 15400042 STI R0,*+AR0(66) ; Init serial 0 xmt control
0057 000013 0820000a+ LDI @SERPRTR0,R0
0058 000014 15400043 STI R0,*+AR0(67) ; Init serial 0 rcv control
0059 000015 0820000b+ LDI @SERTIM0,R0
0060 000016 15400044 STI R0,*+AR0(68) ; Init serial 0 timer control
0061 000017 0820000c+ LDI @SERGLOB1,R0
0062 000018 15400050 STI R0,*+AR0(80) ; Init serial 1 global control
0063 000019 0820000d+ LDI @SERPRTX1,R0
0064 00001a 15400052 STI R0,*+AR0(82) ; Init serial 1 xmt control
0065 00001b 0820000e+ LDI @SERPRTR1,R0
0066 00001c 15400053 STI R0,*+AR0(83) ; Init serial 1 rcv control
0067 00001d 0820000f+ LDI @SERTIM1,R0
0068 00001e 15400054 STI R0,*+AR0(84) ; Init serial 1 timer control
0069 00001f 08200010+ LDI @PARINT,R0
0070 000020 15400064 STI R0,*+AR0(100) ; Init parallel interface control (C
0071 000021 08200011+ LDI @IOINT,R0
0072 000022 15400060 STI R0,*+AR0(96) ; Init I/O interface control
0073 000023 08340003+ LDI @STCK,SP ; Init the stack pointer
0074 000024 10752000 OR 2000H,ST ; Global interrupt enable
0075
0076 000025 07601b00 LDF -3.25,R0
0077 000026 6200002a+ CALL INVF
0078 000027 07612700 LDF 7.5,R1
0079 000028 24820100 MPYF3 R0,R1,R2
0080
0081 000029 60000029 BR $
0082
0083 00002a 07030000 INVF: LDF R0,R3 ; 浮点除数v暂存R3
0084 00002b 00000000 ABSF R0 ; 浮点除数v取正
0085 * EXTRACT THE EXPONENT OF v.
0086 00002c 0fa00000 PUSHF R0
0087 00002d 0e210000 POP R1
0088 00002e 03e1ffe8 ASH -24,R1 ;R1中的低8位为除数的指数部分
0089 * x[0] FORMATION IS GIVEN THE EXPONENT OF v.
0090
0091 00002f 0c010001 NEGI R1
0092 000030 18610001 SUBI 1,R1 ; 求-e-1, the exponent of x[0]
0093 000031 03e10018 ASH 24,R1
0094 000032 0f210000 PUSH R1
0095 000033 0ea10000 POPF R1 ; Now R1 = x[0] = 1.0 * 2**(-e-1)
0096 * NOW THE ITERATIONS BEGIN.
0097 000034 087b0008 LDI 8,RC
0098 000035 64000038+ RPTB Loo
0099 000036 24820001 MPYF R1,R0,R2 ; R2 = v * x[0]
0100 000037 19621000 SUBRF 2.0,R2 ; R2 = 2.0 ± v * x[0]
0101 000038 0a010002 Loo: MPYF R2,R1 ; R1 = x[1] = x[0] * (2.0 - v * x[0])
0102
0103 000039 11010001 RND R1 ; This minimizes error in the LSBs
0104
0105 * FOR THE LAST ITERATION WE USE THE FORMULATION:
0106 * x[5] = (x[4] * (1.0 ± (v * x[4]))) + x[4]
0107
0108 00003a 24820001 MPYF R1,R0,R2 ; R2 = v * x[4] = 1.0..01.. => 1
0109 00003b 19620000 SUBRF 1.0,R2 ; R2 = 1.0 ± v * x[4] = 0.0..01... => 0
0110 00003c 0a020001 MPYF R1,R2 ; R2 = x[4] * (1.0 - v * x[4])
0111 00003d 01810002 ADDF R2,R1 ; R2 = x[5] = (x[4]*(1.0±(v*x[4])))+x[4]
0112 *
0113 00003e 11000001 RND R1,R0 ; Round since this is followed by a MPYF
0114 *
0115 * NOW THE CASE OF v < 0 IS HANDLED.
0116 *
0117 00003f 0b820000 NEGF R0,R2
0118 000040 07030003 LDF R3,R3 ; This sets condition flags
0119 000041 43800002 LDFN R2,R0 ; If v < 0, then R0 = -R0
0120 *
0121 000042 78800000 RETS
0122
0123 .end
No Errors, No Warnings
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -