📄 fsqrt.txt
字号:
fsqrt:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Entry conditions: 32-bit argument in AM ;
; register. ;
; Exit conditions: 16-bit square root in ;
; d register. ;
; Modified: D, E, X, Y ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ldy #0000 ;start with 0 count
tmxed ;arg in x:e:d
xgde ;lsw in e, msw in d
tsta ;msb=0?
beq fazero ;yes, normalize
aiy #$01 ;1 shift more
lsrd ;divide by 2
rore ;
lsrd ;next divide by 2
bita #$ff ;done?
beq fdzero ;yes
rore ;finish divide
aiy #$01 ;1 shift more
lsrd ;divide by 2 again
rore ;
lsrd ;next divide by 2
bita #$ff ;done?
beq fdzero ;yes
rore ;finish divide
aiy #$01 ;1 shift more
lsrd ;divide by 2
rore ;
lsrd ;next divide by 2
;
fdzero: rore ;normalized argument in d:e
asld ;;;mult by 2 for table address
ldx #roottabl+2 ;base address of root table
adx ;;;add offset
ldd 0,x ;get nearest root from table
subd -2,x ;minus the lower root
lsre ;make the remainder a signed fraction
fmuls ;b*(xa+1-xa)
adce -2,x ;b*(xa+1-xa)+xa
xgdy ;# of shifts, k, in d
addd #-4 ;d-4 in d
negd ;4-d in d
beq fddone ;this is 0
lsre ;denormalize the result
addd #-1 ;next
beq fddone ;
lsre ;shift back
addd #-1 ;next
beq fddone ;
lsre ;shift back
;
fddone: xgde ;result in d
rts ;out
;
fazero: cmpb #$3f ;done normalizing?
bhi fadz ;yes, k=0
aiy #$01 ;one shift more
asle ;divide by 2
rold ;
asle ;divide by 2 again
rold ;done
cmpb #$3f ;done normalizing?
bhi fadz ;yes, k=2
aiy #$01 ;one shift more
asle ;divide by 2
rold ;
asle ;and again
rold ;done
cmpb #$3f ;done?
bhi fadz ;yes, k=4
aiy #$01 ;one shift more
asle ;divide by 2
rold ;
asle ;and again
rold ;done, k=6
;
fadz: asld ;;;mult by 2 to be table address
ldx #roottabl+2 ;table base address
adx ;;;add offset
ldd 0,x ;get table word
subd -2,x ;(xa+1-xa)
lsre ;make remainder a signed fraction
fmuls ;b*(xa+1-xa)
adce -2,x ;b*(xa+1-xa)+xa
lsre ;divide by 16 right off, since arg<224
lsre ;
lsre ;
lsre ;OK
xgdy ;# of shifts, k, in d
tstd ;=0?
beq fazone ;done
lsre ;denormalize the result, divide by 2
addd #-1 ;next
beq fazone ;done
lsre ;divide by 2
addd #-1 ;next
beq fazone ;done
lsre ;divide by 2
;
fazone: xgde ;result in d
rts ;out
roottabl:
dc.w $0
dc.w $1000
dc.w $16A1
dc.w $1BB6
dc.w $2000
dc.w $23C7
dc.w $2731
dc.w $2A55
dc.w $2D41
dc.w $3000
dc.w $3299
dc.w $3511
dc.w $376D
dc.w $39B0
dc.w $3BDE
dc.w $3DF8
dc.w $4000
dc.w $41F8
dc.w $43E2
dc.w $45BE
dc.w $478E
dc.w $4952
dc.w $4B0C
dc.w $4CBC
dc.w $4E62
dc.w $5000
dc.w $5196
dc.w $5323
dc.w $54AA
dc.w $562A
dc.w $57A3
dc.w $5916
dc.w $5A82
dc.w $5BEA
dc.w $5D4C
dc.w $5EA8
dc.w $6000
dc.w $6153
dc.w $62A1
dc.w $63EC
dc.w $6531
dc.w $6673
dc.w $67B1
dc.w $68EB
dc.w $6A22
dc.w $6B55
dc.w $6C84
dc.w $6DB1
dc.w $6EDA
dc.w $7000
dc.w $7123
dc.w $7243
dc.w $7361
dc.w $747B
dc.w $7593
dc.w $76A9
dc.w $77BC
dc.w $78CC
dc.w $79DA
dc.w $7AE6
dc.w $7BEF
dc.w $7CF7
dc.w $7DFC
dc.w $7EFF
dc.w $8000
dc.w $80FF
dc.w $81FC
dc.w $82F7
dc.w $83F0
dc.w $84E8
dc.w $85DE
dc.w $86D2
dc.w $87C4
dc.w $88B4
dc.w $89A3
dc.w $8A90
dc.w $8B7C
dc.w $8C66
dc.w $8D4F
dc.w $8E36
dc.w $8F1C
dc.w $9000
dc.w $90E3
dc.w $91C4
dc.w $92A4
dc.w $9383
dc.w $9461
dc.w $953D
dc.w $9618
dc.w $96F2
dc.w $97CA
dc.w $98A1
dc.w $9977
dc.w $9A4C
dc.w $9B20
dc.w $9BF3
dc.w $9CC4
dc.w $9D95
dc.w $9E64
dc.w $9F33
dc.w $A000
dc.w $A0CC
dc.w $A198
dc.w $A262
dc.w $A32B
dc.w $A3F4
dc.w $A4BB
dc.w $A581
dc.w $A647
dc.w $A70B
dc.w $A7CF
dc.w $A892
dc.w $A954
dc.w $AA15
dc.w $AAD5
dc.w $AB95
dc.w $AC53
dc.w $AD11
dc.w $ADCE
dc.w $AE8A
dc.w $AF45
dc.w $B000
dc.w $B0BA
dc.w $B173
dc.w $B22B
dc.w $B2E3
dc.w $B399
dc.w $B450
dc.w $B505
dc.w $B5BA
dc.w $B66E
dc.w $B721
dc.w $B7D3
dc.w $B885
dc.w $B937
dc.w $B9E7
dc.w $BA97
dc.w $BB46
dc.w $BBF5
dc.w $BCA3
dc.w $BD51
dc.w $BDFD
dc.w $BEA9
dc.w $BF55
dc.w $C000
dc.w $C0AA
dc.w $C154
dc.w $C1FD
dc.w $C2A6
dc.w $C34E
dc.w $C3F6
dc.w $C49C
dc.w $C543
dc.w $C5E9
dc.w $C68E
dc.w $C733
dc.w $C7D7
dc.w $C87B
dc.w $C91E
dc.w $C9C1
dc.w $CA63
dc.w $CB04
dc.w $CBA6
dc.w $CC46
dc.w $CCE6
dc.w $CD86
dc.w $CE25
dc.w $CEC4
dc.w $CF62
dc.w $D000
dc.w $D09D
dc.w $D13A
dc.w $D1D7
dc.w $D272
dc.w $D30E
dc.w $D3A9
dc.w $D444
dc.w $D4DE
dc.w $D577
dc.w $D611
dc.w $D6AA
dc.w $D742
dc.w $D7DA
dc.w $D872
dc.w $D909
dc.w $D9A0
dc.w $DA36
dc.w $DACC
dc.w $DB62
dc.w $DBF7
dc.w $DC8B
dc.w $DD20
dc.w $DDB4
dc.w $DE47
dc.w $DEDB
dc.w $DF6E
dc.w $E000
dc.w $E092
dc.w $E124
dc.w $E1B5
dc.w $E246
dc.w $E2D7
dc.w $E367
dc.w $E3F7
dc.w $E487
dc.w $E516
dc.w $E5A5
dc.w $E633
dc.w $E6C1
dc.w $E74F
dc.w $E7DD
dc.w $E86A
dc.w $E8F7
dc.w $E983
dc.w $EA0F
dc.w $EA9B
dc.w $EB27
dc.w $EBB2
dc.w $EC3D
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -