home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / dsp / dspgroup / adpcmnon.arc / XMT.ASM < prev   
Encoding:
Assembly Source File  |  1985-05-01  |  12.6 KB  |  653 lines

  1.  
  2.     IDT    'ADPCM'
  3.     OPTION    XREF
  4. *;
  5. *;**********************************************************
  6. *;**********************************************************
  7. *; This is the source module for a full duplex 32Kbps ADPCM
  8. *; system. This system is modelled after the CCITT standard
  9. *; but is not identically bit compatible and does not
  10. *; include synchronous coding adjustment in the receiver
  11. *; (this could be added). The loading on the system
  12. *; averages about 98%. The system reads samples on an
  13. *; interrupt basis from a mu-law codec (port 1) every 125
  14. *; microsec and outputs an ADPCM sample to port 4. During
  15. *; each interrupt, the system will also read a 4 bit ADPCM
  16. *; sample from port 3 and output an 8 bit mu-law PCM sample
  17. *; to port 2.
  18. *;
  19. *;**********************************************************
  20. *;**********************************************************
  21.     PAGE
  22. *;
  23. *; System I/O channel assignments
  24. *;
  25. ADC    EQU    1
  26. DAC    EQU    2
  27. IN32K    EQU    3
  28. OUT32K    EQU    4
  29. *;
  30.     PAGE
  31. *;**********************************************************
  32.     AORG    0
  33. *;
  34.     B    RESET
  35. *;
  36. *;**********************************************************
  37. *; INTERRUPT HANDLING ROUTINE -- SYSTEM HANDLES CODEC
  38. *; INTERRUPTS ON A SAMPLE BY SAMPLE BASIS. DURING
  39. *; EACH SAMPLE PERIOD BOTH A RECEIVE AND A TRANSMIT CYCLE
  40. *; ARE EXECUTED.
  41. *;*************************************************************************
  42. *;
  43. *; first execute code to transmit a 4-bit adpcm sample
  44. *;
  45. INTRPT    IN    SAMPLE,ADC    ; Get sample
  46. *;
  47. *; patch to stop simulation
  48. *;
  49.     LAC    SAMPLE
  50.     SUB    ONE,8
  51. STPSIM    BGEZ    STPSIM
  52. *;
  53.     LAC    SAMPLE        ; linearize
  54.     XOR    M255
  55.     ADD    CODEAD
  56.     TBLR    SAMPLE
  57. *;
  58.     PAGE
  59. *;
  60. *;*********************************************************
  61. *; SIGDIF
  62. *;
  63. *; COMPUTE SCALE FACTOR AND  BOTH PARTIAL AND FULL SIGNAL
  64. *; ESTIMATE FROM PREVIOUS SAMPLES DATA -- THEN COMPUTE
  65. *; DIFFERENCE SIGNAL
  66. *;*********************************************************
  67. *;
  68. *; compute SEZ-- partial signal estimate
  69. *;
  70. *;  SEZ(k) = B1(k-1)*DQ(k-1) + ... + B6(k-1)*DQ(k-6)
  71. *;
  72. SIGDIF    ZAC
  73.     LT    DQ5
  74.     MPY    B6
  75.     LTD    DQ4
  76.     MPY    B5
  77.     LTD    DQ3
  78.     MPY    B4
  79.     LTD    DQ2
  80.     MPY    B3
  81.     LTD    DQ1
  82.     MPY    B2
  83.     LTD    DQ
  84.     MPY    B1
  85.     APAC
  86. *;
  87. *; shift left by 1 to adjust decimal point
  88. *;
  89.     SACL    TEMP1
  90.     SACH    TEMP2
  91.     ADDH    TEMP2
  92.     ADDS    TEMP1
  93.     SACH    SEZ,1
  94. *;
  95. *; now compute signal estimate as
  96. *;
  97. *;  A1(k-1)*SR(k-1) + A2(k-1)*SR(k-2) + SEZ(k)
  98. *;
  99. GETSE    LAC    SEZ,14
  100.     LT    SR1
  101.     MPY    A2
  102.     LTD    SR
  103.     MPY    A1
  104.     APAC
  105. *;
  106. *; shift left by 1 to adjust decimal point
  107. *;
  108.     SACL    TEMP1
  109.     SACH    TEMP2
  110.     ADDH    TEMP2
  111.     ADDS    TEMP1
  112.     SACH    SE,1
  113. *;
  114. *; limit speed control parameter: AL===> 1.Q6
  115. *;
  116. *; APP : 2.Q8     AL: Q6
  117. *;
  118. *;    AL = 1 (64)    if APP >  1 (256)
  119. *;    AL = APP    if APP <= 1
  120. *;
  121. LIMA    LAC    ONE,6
  122.     SACL    AL
  123.     LAC    APP
  124.     SUB    ONE,8
  125.     BGEZ    MIX        ;APP >= 256
  126.     LAC    APP,14
  127.     SACH    AL        ;APP  < 256
  128. *;
  129. *; form linear combination of fast and slow scale factors
  130. *;
  131. *; Y(k) = (1-AL(k))*YL(k-1) + AL(k)*YU(k-1)
  132. *;
  133. MIX    LAC    YLL,10        ; shift yl right by 6
  134.     SACH    TEMP3
  135.     LAC    TEMP3
  136.     AND    M1023
  137.     ADD    YLH,10
  138.     SACL    TEMP3        ; low half
  139.     LAC    YU
  140.     SUB    TEMP3        ; YU-(YLL>>6)
  141.     SACL    TEMP3
  142.     ZALH    YLH
  143.     ADDS    YLL
  144.     LT    AL
  145.     MPY    TEMP3
  146.     APAC            ; YL + AL*(YU-(YLL>>6))
  147.     SACL    TEMP3
  148.     SACH    TEMP2
  149.     LAC    TEMP3,10    ; shift right by 6
  150.     SACH    TEMP3
  151.     LAC    TEMP3
  152.     AND    M1023        ; mask sign extension
  153.     ADD    TEMP2,10
  154.     AND    M8191
  155.     SACL    Y
  156.     LAC    Y,14
  157.     SACH    TEMP3
  158. *;
  159. *; get difference signal:   D = SAMPLE - SE
  160. *;
  161.     LAC    SAMPLE        ; compute difference sig
  162.     SUB    SE
  163.     SACL    D
  164. *;
  165. *;******************************************************
  166. *;  ADAPTIVE QUANTIZER --- 62 CLOCKS
  167. *;
  168. *;    input:    differenced PCM speech sample--D
  169. *;        scale factor--Y
  170. *;     output:  4-b quantized diff signal--I
  171. *;******************************************************
  172. *;
  173. *; first get log of difference signal
  174. *;
  175. AQUAN    ABS
  176.     SACL    TEMP1
  177. GETEXP    SUB    ONE,8    ; binary search to get exponent
  178.     BGEZ    C8TO14
  179. C0TO7    ADD    M15,4    ; TEMP1-16    exp = 0-7
  180.     BGEZ    C4TO7
  181. C0TO3    ADD    THREE,2 ; TEMP1-4    exp = 0-3
  182.     BGEZ    C2TO3
  183. C0TO1    ADD    ONE,1    ; TEMP1-2    exp = 0-1
  184.     BGEZ    EXP1
  185. EXP0    LARK    0,0    ; exp = 0
  186.     LAC    TEMP1,7
  187.     B    GETMAN    ; save exponent and get mantissa
  188. EXP1    LARK    0,1    ; exp = 1
  189.     LAC    TEMP1,6
  190.     B    GETMAN
  191. C2TO3    SUB    ONE,2    ; TEMP1-8    exp = 2-3
  192.     BGEZ    EXP3
  193. EXP2    LARK    0,2    ; exp = 2
  194.     LAC    TEMP1,5
  195.     B    GETMAN
  196. EXP3    LARK    0,3    ; exp = 3
  197.     LAC    TEMP1,4
  198.     B    GETMAN
  199. C4TO7    SUB    THREE,4 ; TEMP1-64    exp = 4-7
  200.     BGEZ    C6TO7
  201. C4TO5    ADD    ONE,5    ; TEMP1-32    exp = 4-5
  202.     BGEZ    EXP5
  203. EXP4    LARK    0,4    ; exp = 4
  204.     LAC    TEMP1,3
  205.     B    GETMAN
  206. EXP5    LARK    0,5    ; exp = 5
  207.     LAC    TEMP1,2
  208.     B    GETMAN
  209. C6TO7    SUB    ONE,6    ; TEMP1-128    exp = 6-7
  210.     BGEZ    EXP7
  211. EXP6    LARK    0,6    ; exp = 6
  212.     LAC    TEMP1,1
  213.     B    GETMAN
  214. EXP7    LARK    0,7    ; exp = 7
  215.     LAC    TEMP1
  216.     B    GETMAN
  217. C8TO14    SUB    M15,8    ; TEMP1-4096    exp = 8-14
  218.     BGEZ    CCTOE
  219. C8TO11    ADD    THREE,10 ;TEMP1-1024    exp = 8-11
  220.     BGEZ    CATOB
  221. C8TO9    ADD    ONE,9    ; TEMP1-512    exp = 8-9
  222.     BGEZ    EXP9
  223. EXP8    LARK    0,8    ; exp = 8
  224.     LAC    TEMP1,15
  225.     SACH    TEMP1
  226.     LAC    TEMP1
  227.     B    GETMAN
  228. EXP9    LARK    0,9    ; exp = 9
  229.     LAC    TEMP1,14
  230.     SACH    TEMP1
  231.     LAC    TEMP1
  232.     B    GETMAN
  233. CATOB    SUB    ONE,10    ; TEMP1-2048    exp = 10-11
  234.     BGEZ    EXP11
  235. EXP10    LARK    0,10    ; exp = 10
  236.     LAC    TEMP1,13
  237.     SACH    TEMP1
  238.     LAC    TEMP1
  239.     B    GETMAN
  240. EXP11    LARK    0,11    ; exp = 11
  241.     LAC    TEMP1,12
  242.     SACH    TEMP1
  243.     LAC    TEMP1
  244.     B    GETMAN
  245. CCTOE    SUB    THREE,12 ;TEMP1-16384    exp = 12-14
  246.     BGEZ    EXP14
  247. CCTOD    ADD    ONE,13    ; TEMP1-8192    exp = 13-14
  248.     BGEZ    EXP13
  249. EXP12    LARK    0,12    ; exp = 12
  250.     LAC    TEMP1,11
  251.     SACH    TEMP1
  252.     LAC    TEMP1
  253.     B    GETMAN
  254. EXP13    LARK    0,13    ; exp = 13
  255.     LAC    TEMP1,10
  256.     SACH    TEMP1
  257.     LAC    TEMP1
  258.     B    GETMAN
  259. EXP14    LARK    0,14    ; exp = 14
  260.     LAC    TEMP1,9
  261.     SACH    TEMP1
  262.     LAC    TEMP1
  263. GETMAN    AND    M127
  264.     SAR    0,TEMP1
  265.     ADD    TEMP1,7
  266. *;
  267. *; scale by subtraction
  268. *;
  269. SUBTB    ADD    THREE,11
  270.     SUB    TEMP3
  271.     AND    M4095
  272. *;
  273. *; 4b quantizer
  274. *;
  275. *; QUANT TABLE FOR 32KB OUTPUT (OFFSET: 2048)
  276. *;
  277. ITAB1    EQU    2041
  278. ITAB2    EQU    2171
  279. ITAB3    EQU    2250
  280. ITAB4    EQU    2309
  281. ITAB5    EQU    2358
  282. ITAB6    EQU    2404
  283. ITAB7    EQU    2453
  284. *;
  285. QUAN    SUB    K2309    ; ITAB4
  286.     BGEZ    CI4TO7
  287. CI0TO3    ADD    K138    ; ITAB2     I = 0-3
  288.     BGEZ    CI2TO3
  289. CI0TO1    ADD    K130    ; ITAB1     I = 0-1
  290.     BGEZ    IEQ1
  291. IEQ0    LACK    0
  292.     B    GETIM
  293. IEQ1    LACK    1
  294.     B    GETIM
  295. CI2TO3 SUB    K79    ; ITAB3     I = 2-3
  296.     BGEZ    IEQ3
  297. IEQ2    LACK    2
  298.     B    GETIM
  299. IEQ3    LACK    3
  300.     B    GETIM
  301. CI4TO7    SUB    K95    ; ITAB6     I = 4-7
  302.     BGEZ    CI6TO7
  303. CI5TO6    ADD    K46    ; ITAB5     I = 5-6
  304.     BGEZ    IEQ5
  305. IEQ4    LACK    4
  306.     B    GETIM
  307. IEQ5    LACK    5
  308.     B    GETIM
  309. CI6TO7    SUB    K49    ; ITAB6     I = 6-7
  310.     BGEZ    IEQ7
  311. IEQ6    LACK    6
  312.     B    GETIM
  313. IEQ7    LACK    7
  314. GETIM    SACL    IM
  315.     SACL    I
  316.     LAC    D
  317.     BGEZ    OUTI
  318.     LAC    IM
  319.     XOR    M15
  320.     SACL    I
  321. OUTI    OUT    I,OUT32K    ; XMITTER OUTPUT
  322. *;
  323. *;**********************************************************
  324. *; INVERSE ADAPTIVE QUANTIZER
  325. *;
  326. *;    input:    4b quantized samples    -- IM
  327. *;        scale factor        -- Y
  328. *;    output: reconstructed diff sig    -- DQ
  329. *;**********************************************************
  330. *;
  331. *; first convert quantized difference back to log domain
  332. *;
  333. IAQUAN    LAC    IM
  334.     ADD    INQTAB    ; reconst table
  335.     TBLR    TEMP1
  336. *;
  337. *; add back scale factor
  338. *;
  339. ADDA    LAC    TEMP1
  340.     ADD    TEMP3    ; Y >> 2
  341.     AND    M2047
  342.     SACL    TEMP2
  343. *;
  344. *; now covert to linear domain
  345. *;
  346. *;
  347. ALOG    LAC    TEMP2,9     ; extract exp
  348.     SACH    TEMP1
  349.     LACK    127
  350.     AND    TEMP2
  351.     ADD    ONE,7        ; 1+x
  352.     SACL    TEMP2        ; extract mantissa
  353.     LT    TEMP2        ; prepare to shift
  354.     LAC    TEMP1
  355.     ADD    SHIFT        ; look up multiplier
  356.     TBLR    TEMP3
  357.     MPY    TEMP3
  358.     PAC
  359.     BLZ    LEFTSF
  360.     SACH    DQ,1        ; right shift--dqmag
  361.     B    ADDSGN
  362. LEFTSF    ABS            ; left shift
  363.     SACL    DQ        ; dqmag
  364.     B    ADDSGN
  365. ADDSGN    LAC    ONE,11
  366.     SACL    SDQ
  367.     LAC    I        ; check sign
  368.     SUB    ONE,3
  369.     BLZ    QSFA
  370.     ZAC
  371.     SUB    DQ
  372.     SACL    DQ
  373.     LAC    MINUS,11
  374.     SACL    SDQ
  375. *;
  376. *;***********************************************************************
  377. *; QUANTIZER SCALE FACTOR ADAPTATION
  378. *;
  379. *;    input:      I : 32KB coded samples
  380. *;    output: YU,YLL: next sample scale factor
  381. *;***********************************************************************
  382. *; First compute WI
  383. *;
  384. *;    input --IM
  385. *;    output--TEMP1 (WI)
  386. *;
  387. QSFA    LAC    WITAB        ; get table address and offset
  388.     ADD    IM
  389.     TBLR    TEMP1        ; lookup WI (Q6)
  390. *;
  391. *; Update fast adaptation scale factor -- constant=1/32
  392. *;
  393. *;   YU(k)=(1-2**-5)*Y(k)+(2**-5)*WI(k)
  394. *;
  395. *;    input --TEMP1 (WI--- TC   6...Q4)
  396. *;    output--YU    (YU---SM      3...-9)
  397. *;
  398. FILTD    LAC    Y,12        ; Y    (Q21)
  399.     SUB    Y,7        ; Y/32    (Q21)
  400.     ADD    TEMP1,12    ; WI/32 (Q21)
  401.     SACH    YU,4        ; YU    (Q9)
  402.     LAC    YU
  403.     AND    M8191
  404.     SACL    YU
  405. *;
  406. *; limit quant scale factor 1.06 <= YU <= 10.0
  407. *;
  408. *;    input: YU    (3...-9)
  409. *;    ouput: YU
  410. *;
  411. LIMB    SUB    K544        ; check lo threshold
  412.     BGEZ    CHKHI
  413.     LAC    K544
  414.     B    STRLIM        ; go store limited value
  415. CHKHI    SUB    K4576        ; check hi threshold
  416.     BLEZ    FILTE        ; within limits--continue
  417.     LAC    K5120
  418. STRLIM    SACL    YU
  419. *;
  420. *; Update slow adaptation scale factor -- constant = 1/64
  421. *;
  422. *; YL(k) = (1-2**-6)*YL(k-1) + 2**-6 * YU(k)
  423. *;
  424. FILTE    LAC    YLH,6        ; shift yl left by 6
  425.     SACL    TEMP1
  426.     LAC    YLL,6
  427.     SACL    TEMP2
  428.     SACH    TEMP3
  429.     LAC    TEMP3        ; suppress sign extension
  430.     AND    M63
  431.     SACL    TEMP3
  432.     ZALH    TEMP1
  433.     ADDH    TEMP3
  434.     ADDS    TEMP2
  435.     SUBH    YLH
  436.     SUBS    YLL
  437.     ADD    YU,6
  438.     SACL    TEMP1
  439.     SACH    TEMP2        ; result = yl (shifted left by 6)
  440.     LAC    TEMP1,10    ; shift result right 6 --> 4.q15
  441.     SACH    TEMP1
  442.     LAC    TEMP1
  443.     AND    M1023        ; mask sign extension
  444.     ADD    TEMP2,10
  445.     SACL    YLL
  446.     SACH    YLH
  447.     LACK    7        ; mask upper 13 bits
  448.     AND    YLH
  449.     SACL    YLH
  450. *;
  451. *;***********************************************************************
  452. *; ADAPTATION SPEED CONTROL
  453. *;
  454. *;    input:    IM
  455. *;    output: APP
  456. *;***********************************************************************
  457. *;
  458. *; first compute FI function: 5 CLOCKS
  459. *;
  460. SPDCRL    LAC    FITAB    ; look-up value of FI function
  461.     ADD    IM
  462.     TBLR    TEMP1    ; FI*16
  463. *;
  464. *; now update short term average of FI
  465. *;
  466. *; DMS(k) = (1-2**-5)*DMS(k-1) + 2**-5 * FI(k)
  467. *;
  468. FILTA    LAC    TEMP1,15    ; FI/32 in q24
  469.     ADD    DMS,15
  470.     SUB    DMS,10        ; DMS/32
  471.     SACH    DMS,1
  472. *;
  473. *; update long term average of FI
  474. *;
  475. *; DML(k) = (1-2**-7)*DML(k-1) + 2**-7 * FI(k)
  476. *;
  477. FILTB    LAC    TEMP1,15    ; FI/128 in q26
  478.     ADD    DML,15
  479.     SUB    DML,8        ; DML/128
  480.     SACH    DML,1
  481. *;
  482. *; Compute mag of diff of short and long term
  483. *; and perform threshold comparison to compute speed
  484. *; control parameter--low-pass result.
  485. *;
  486. *; APP(k) = (1-2**-4)*APP(k-1) + 2**-3 , if y < 3 or
  487. *;           if |DMS-DML| > 2**-3 * DML
  488. *; else
  489. *;
  490. *; APP(k) = (1-2**-4)*APP(k-1)
  491. *;
  492. FILTC    ZALH    APP
  493.     SUB    APP,12
  494.     SACH    APP    ; (1-2**-4)*APP
  495.     LAC    Y
  496.     SUB    THREE,9
  497.     BLZ    ADD18
  498.     ZALH    DMS        ; DMS (Q25)
  499.     SUB    DML,14        ; DMS-DML
  500.     ABS
  501.     SUB    DML,11
  502.     BLZ    APRED
  503. ADD18    LAC    APP
  504.     ADD    ONE,5
  505.     SACL    APP        ; +1/8 in Q8
  506. *;
  507. *;************************************************************
  508. *; ADAPTIVE PREDICTOR: compute signal estimate from quantized
  509. *; difference
  510. *;
  511. *;    input:    DQ    quantized difference
  512. *;    output: SE    signal estimate
  513. *;************************************************************
  514. *;
  515. *; compute reconstructed signal:  DQ + SE
  516. *;
  517. APRED    LAC    DQ
  518.     ADD    SE
  519.     SACL    SR
  520. *;
  521. *; compute coefficients of 6th order predictor
  522. *;
  523. *; Bi(k) = (1-2**-8)*Bi(k-1)
  524. *;       + 2**-7 * SGN[DQ(k)] * SGN[DQ(k-1)]
  525. *;
  526. *;     for i = 1...6
  527. *;     and Bi is implicitly limited to +/- 2
  528. *;
  529. GETB6    LT    SDQ6
  530.     LAC    B6,15    ; Q29
  531.     SUB    B6,7    ; B6 * 2**-7  (Q29)
  532.     MPY    SDQ    ; SGN(SDQ)*SGN(SDQ6)*2**-7 (Q29)
  533.     LTD    SDQ5
  534.     SACH    B6,1    ; 1.Q14
  535. GETB5    LAC    B5,15
  536.     SUB    B5,7
  537.     MPY    SDQ
  538.     LTD    SDQ4
  539.     SACH    B5,1
  540. GETB4    LAC    B4,15
  541.     SUB    B4,7
  542.     MPY    SDQ
  543.     LTD    SDQ3
  544.     SACH    B4,1
  545. GETB3    LAC    B3,15
  546.     SUB    B3,7
  547.     MPY    SDQ
  548.     LTD    SDQ2
  549.     SACH    B3,1
  550. GETB2    LAC    B2,15
  551.     SUB    B2,7
  552.     MPY    SDQ
  553.     LTD    SDQ1
  554.     SACH    B2,1
  555. GETB1    LAC    B1,15
  556.     SUB    B1,7
  557.     MPY    SDQ
  558.     LTD    SDQ
  559.     SACH    B1,1
  560. *;
  561. *; Update coefficients of 2nd order predictor
  562. *;
  563. *; First get sign of sum of quantized diff
  564. *; and partial sig estimate
  565. *;
  566. ADDC    DMOV    PK1        ; PK1==>PK2
  567.     DMOV    PK0        ; PK0==>PK1
  568.     LAC    ONE,9
  569.     SACL    PK0
  570.     LAC    SEZ
  571.     ADD    DQ
  572.     BGEZ    SUMGT0        ; is SEZ+DQ negative?
  573.     LAC    MINUS,9
  574.     SACL    PK0
  575. SUMGT0    LT    PK0
  576. *;
  577. *;  now calculate f[A1(k-1)]  ==> TEMP3 will get 1/2 F
  578. *;
  579. *;      = 4*A1       if |A1|    <= 1/2
  580. *;      = 2*SGN(A1)  if |A1|    >  1/2
  581. *;
  582. GETF    LAC    A1,1        ; 2*A1
  583.     SACL    TEMP3
  584.     BLZ    GETF2
  585. GETF1    SUB    ONE,14
  586.     BLZ    GETA1
  587.     LAC    ONE,14
  588.     B    DONEF
  589. GETF2    ABS
  590.     SUB    ONE,14
  591.     BLZ    GETA1
  592.     LAC    MINUS,14
  593. DONEF    SACL    TEMP3
  594. *;
  595. *;  A1(k) = (1-2**-8)*A1(k-1)
  596. *;        + (3*2**-8)*SGN[p(k)]*SGN[p(k-1)]
  597. *;
  598. GETA1    LAC    A1,12
  599.     SUB    A1,4
  600.     MPY    PK1        ; 3*SGN[p(k-1)*SGN[p(k)]
  601.     APAC
  602.     APAC
  603.     APAC
  604.     SACH    A1,4
  605.     PAC        ; save sign of SGN[p(k-1)]*SGN[p(k)]
  606. *;
  607. *; A2(k) = (1-2**-7)*A2(k-1)
  608. *;       + (2**-7)*{SGN[p(k)]*SGN[(p(k-2)]
  609. *;       - f[A1(k-1)]*SGN[p(k)]*SGN[p(k-1)]}
  610. *;
  611. GETA2    BGEZ    SUBF        ; if sign + --> subtract F
  612.     ZAC            ;  else negate F and subtract
  613.     SUB    TEMP3
  614.     SACL    TEMP3
  615. *;
  616. SUBF    LAC    A2,12
  617.     SUB    A2,5
  618.     MPY    PK2
  619.     APAC
  620.     APAC
  621.     SUB    TEMP3,6
  622.     SACH    A2,4
  623. *;
  624. *; now limit A2 to +/- .75 and prevent overflow
  625. *;
  626. LIMC    LAC    A2
  627.     ABS
  628.     SUB    THREE,12    ; |value| must be < .75
  629.     BLEZ    LIMD
  630.     LAC    A2
  631.     BGEZ    SATPOS
  632. SATNEG    LAC    MINUS3,12    ; -.75
  633.     B    DONEG
  634. SATPOS    LAC    THREE,12
  635. DONEG    SACL    A2
  636. *;
  637. *; limit A1 to +/-  1-2**-4 - A2
  638. *;
  639. LIMD    LAC    M15,10
  640.     SUB    A2
  641.     SACL    TEMP1        ; 1-2**-4-A2P
  642.     LAC    A1
  643.     ABS
  644.     SUB    TEMP1
  645.     BLEZ    GET32K        ; A1 <= LIMIT
  646.     LAC    A1
  647.     BGEZ    A1LIM
  648.     ZAC
  649.     SUB    TEMP1
  650.     SACL    TEMP1
  651. A1LIM    LAC    TEMP1
  652.     SACL    A1
  653.