home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_disks / 300-399 / ff339.lzh / PCQ / Runtime.lzh / Runtime / Readers / readreal.asm < prev    next >
Assembly Source File  |  1989-11-20  |  2KB  |  95 lines

  1.  
  2. *    ReadReal.asm
  3. *    of PCQ Pascal runtime library
  4. *    Copyright (c) 1989 Patrick Quaid
  5.  
  6. *    This routine just reads a real number from the given
  7. *    file in normal decimal form, i.e.
  8. *        {digit}[.{digit}]
  9.  
  10.     XREF    _p%ReadOneChar
  11.     XREF    _p%GetThatChar
  12.     XREF    _p%ReadInt
  13.     XREF    _p%IOResult
  14.  
  15.     XREF    _p%MathBase
  16.     XREF    _LVOSPAdd
  17.     XREF    _LVOSPMul
  18.     XREF    _LVOSPDiv
  19.     XREF    _LVOSPFlt
  20.     XREF    _LVOSPNeg
  21.  
  22.     XDEF    _p%ReadReal
  23. _p%ReadReal
  24.  
  25. *    At the outset the address of the real variable is in a0
  26. *    and the file record pointer is on the stack, at 4(sp)
  27.  
  28.     tst.l    _p%IOResult    ; is IO system OK?
  29.     bne    Out
  30.  
  31.     move.l    a0,-(sp)    ; save var address
  32.     move.l    8(sp),d0    ; get the file record ptr
  33.     move.l    d0,-(sp)    ; set up for next call
  34.     jsr    _p%ReadInt    ; get integer part
  35.     addq.l    #4,sp        ; pop stack
  36.  
  37.     tst.l    _p%IOResult    ; check again
  38.     bne    5$
  39.  
  40.     move.w    #1,d1        ; default value
  41.     tst.l    d0        ; is it negative?
  42.     bgt.s    4$        ; no, so skip
  43.     move.w    #-1,d1        ; for negative numbers
  44.     neg.l    d0        ; take abs
  45. 4$    move.w    d1,-(sp)    ; save sign word
  46.  
  47.     move.l    _p%MathBase,a6    ; get float value of int part
  48.     jsr    _LVOSPFlt(a6)    ; d0 = float of int part
  49.  
  50.     move.l    d0,-(sp)    ; save it
  51.     move.l    14(sp),a0    ; get file rec
  52.  
  53.     jsr    _p%ReadOneChar    ; read next char into d0
  54.     tst.l    _p%IOResult    ; did it go OK?
  55.     bne    1$        ; if not, leave
  56.     cmp.b    #'.',d0        ; is it a period?
  57.     bne    1$        ; if not, we're done already
  58.     jsr    _p%GetThatChar    ; if so, eat the decimal point
  59.     move.l    #$A0000044,-(sp) ; store 10.0
  60.  
  61. 2$    jsr    _p%ReadOneChar    ; get next char into d0
  62.     tst.l    _p%IOResult    ; did IO go OK?
  63.     bne    3$
  64.     cmp.b    #'0',d0        ; compare to '0'
  65.     blt    3$        ; not numeric
  66.     cmp.b    #'9',d0        ; 9
  67.     bgt    3$        ; skip
  68.     and.l    #$FF,d0        ; get char part
  69.     sub.b    #'0',d0        ; get value
  70.     move.l    _p%MathBase,a6
  71.     jsr    _LVOSPFlt(a6)    ; d0 := flt(c)
  72.     move.l    (sp),d1        ; d1 := divisor
  73.     jsr    _LVOSPDiv(a6)    ; d0 := flt(c) / divisor
  74.     move.l    4(sp),d1    ; d1 := r
  75.     jsr    _LVOSPAdd(a6)    ; d0 := r + (flt(c) / divisor)
  76.     move.l    d0,4(sp)    ; save it
  77.     move.l    (sp),d0        ; d0 := divisor
  78.     move.l    #$A0000044,d1    ; d1 := 10.0
  79.     jsr    _LVOSPMul(a6)    ; d0 := divisor * 10
  80.     move.l    d0,(sp)        ; save it
  81.     jsr    _p%GetThatChar    ; eat the character we just processed
  82.     bra    2$
  83.  
  84. 3$    addq.l    #4,sp        ; pop stack
  85. 1$    move.l    (sp)+,d0    ; pop final value
  86.     move.w    (sp)+,d1    ; pop sign
  87.     bgt.s    5$        ; if positive, skip
  88.     move.l    _p%MathBase,a6
  89.     jsr    _LVOSPNeg(a6)    ; get -r
  90. 5$    move.l    (sp)+,a0    ; retrieve address
  91.     move.l    d0,(a0)        ; store final value
  92. Out    rts            ; and return
  93.  
  94.     END
  95.