OpenCores
URL https://opencores.org/ocsvn/rf68000/rf68000/trunk

Subversion Repositories rf68000

[/] [rf68000/] [trunk/] [software/] [examples/] [boot.asm] - Diff between revs 3 and 7

Show entire file | Details | Blame | View Log

Rev 3 Rev 7
Line 329... Line 329...
numBreakpoints  equ             8
numBreakpoints  equ             8
BreakpointFlag  equ             $40200
BreakpointFlag  equ             $40200
NumSetBreakpoints       equ     $40202  ; to $40203
NumSetBreakpoints       equ     $40202  ; to $40203
Breakpoints                     equ             $40220  ; to $40240
Breakpoints                     equ             $40220  ; to $40240
BreakpointWords equ             $40280  ; to $402A0
BreakpointWords equ             $40280  ; to $402A0
 
fpBuf       equ $402C0
;RunningTCB  equ $40300
;RunningTCB  equ $40300
 
_exp equ $40500
 
_digit equ $40504
 
_width equ $40508
 
_E equ $4050C
 
_digits_before_decpt equ $40510
 
_precision equ $40514
 
_fpBuf equ $40520       ; to $40560
 
_fpWork equ $40600
TimerStack      equ     $40BFC
TimerStack      equ     $40BFC
 
 
; Keyboard buffer is in shared memory
; Keyboard buffer is in shared memory
IOFocus                 EQU     $00100000
IOFocus                 EQU     $00100000
memend                  equ $00100004
memend                  equ $00100004
Line 520... Line 529...
        moveq #-1,d1
        moveq #-1,d1
        move.l d1,160(a0)       ; all cores have access to semaphores
        move.l d1,160(a0)       ; all cores have access to semaphores
        move.l d1,164(a0)
        move.l d1,164(a0)
        move.l d1,168(a0)
        move.l d1,168(a0)
        move.l d1,172(a0)
        move.l d1,172(a0)
 
        move.l #2,508(a0)       ; all cores access random # generator
        swap d0
        swap d0
        move.w #31,d0                   ; 32 long words for the screen area per bitmap
        move.w #31,d0                   ; 32 long words for the screen area per bitmap
.0003
.0003
        move.l d1,(a0)+         ; all cores have access to a screen
        move.l d1,(a0)+         ; all cores have access to a screen
        dbra d0,.0003
        dbra d0,.0003
Line 1268... Line 1278...
        dc.l    SerialPutChar
        dc.l    SerialPutChar
        dc.l    SerialPeekChar
        dc.l    SerialPeekChar
        dc.l    SerialGetChar
        dc.l    SerialGetChar
        dc.l    T15LockSemaphore
        dc.l    T15LockSemaphore
        dc.l    T15UnlockSemaphore
        dc.l    T15UnlockSemaphore
        dc.l    StubRout
        dc.l    prtflt
 
 
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
; Cursor positioning / Clear screen
; Cursor positioning / Clear screen
; - out of range settings are ignored
; - out of range settings are ignored
;
;
Line 2079... Line 2089...
        dc.b    'D'+$80                                         ; D dump memory
        dc.b    'D'+$80                                         ; D dump memory
        dc.b    'J'+$80                                         ; J jump to code
        dc.b    'J'+$80                                         ; J jump to code
        dc.b    ':'+$80                                         ; : edit memory
        dc.b    ':'+$80                                         ; : edit memory
        dc.b    "CL",'S'+$80                    ; CLS clear screen
        dc.b    "CL",'S'+$80                    ; CLS clear screen
        dc.b    "COR",'E'+$80                   ; CORE  switch to core
        dc.b    "COR",'E'+$80                   ; CORE  switch to core
 
        dc.b    "TF",'P'+$80                    ; TFP test fp
        dc.b  "TRA",'M'+$80                     ; TRAM test RAM
        dc.b  "TRA",'M'+$80                     ; TRAM test RAM
        dc.b    'T','R'+$80                             ; TR test serial receive
        dc.b    'T','R'+$80                             ; TR test serial receive
        dc.b    'T'+$80                                         ; T test CPU
        dc.b    'T'+$80                                         ; T test CPU
        dc.b    'S'+$80                                         ; S send serial
        dc.b    'S'+$80                                         ; S send serial
        dc.b    "RESE",'T'+$80          ; RESET 
        dc.b    "RESE",'T'+$80          ; RESET 
Line 2102... Line 2113...
        dc.w    cmdDumpMemory
        dc.w    cmdDumpMemory
        dc.w    cmdJump
        dc.w    cmdJump
        dc.w    cmdEditMemory
        dc.w    cmdEditMemory
        dc.w    cmdClearScreen
        dc.w    cmdClearScreen
        dc.w    cmdCore
        dc.w    cmdCore
 
        dc.w  cmdTestFP
        dc.w  cmdTestRAM
        dc.w  cmdTestRAM
        dc.w    cmdTestSerialReceive
        dc.w    cmdTestSerialReceive
        dc.w    cmdTestCPU
        dc.w    cmdTestCPU
        dc.w    cmdSendSerial
        dc.w    cmdSendSerial
        dc.w    cmdReset
        dc.w    cmdReset
Line 2228... Line 2240...
        bhi                     Monitor
        bhi                     Monitor
        subi.b  #'0',d1                                 ; convert ascii to binary
        subi.b  #'0',d1                                 ; convert ascii to binary
        bsr                     select_iofocus
        bsr                     select_iofocus
        bra                     Monitor
        bra                     Monitor
 
 
 
cmdTestFP:
 
        bsr ignBlanks
 
        bsr GetDecNumber
 
        move.l d1,d3
 
        bsr ignBlanks
 
        bsr FromScreen
 
        move.b d1,d7
 
        bsr ignBlanks
 
        bsr GetDecNumber
 
        move.l d1,d2
 
        bsr CRLF
 
        fmove.l d3,fp0                                  ; this should do I2FP
 
;       moveq #39,d0
 
;       moveq #40,d1
 
;       moveq #30,d2
 
;       moveq #'e',d3
 
;       trap #15
 
;       bsr CRLF
 
        fmove.l d2,fp1                                  ; this should do I2FP
 
        fmove.p fp0,fpBuf
 
        fmove.p fp1,fpBuf+16
 
        cmpi.b #'+',d7
 
        bne .0001
 
        fadd fp1,fp0
 
        bra .0002
 
.0001
 
        cmpi.b #'-',d7
 
        bne .0003
 
        fsub fp1,fp0
 
        bra .0002
 
.0003
 
        cmpi.b #'*',d7
 
        bne .0004
 
        fmul fp1,fp0
 
        bra .0002
 
.0004
 
        cmpi.b #'/',d7
 
        bne .0005
 
        fdiv fp1,fp0
 
        bra .0002
 
.0002
 
        fmove.p fp0,fpBuf+32
 
        lea _fpBuf,a1                                           ; a0 = pointer to buffer to use
 
        moveq #39,d0
 
        moveq #40,d1
 
        moveq #30,d2
 
        moveq #'e',d3
 
        trap #15
 
.0005
 
        bsr CRLF
 
        bra Monitor
 
 
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
; CLOCK 
; CLOCK 
;    Set the clock register to n which will turn off or on clocks to the CPUs.
;    Set the clock register to n which will turn off or on clocks to the CPUs.
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
 
 
Line 2722... Line 2786...
 
 
GetHexNumber:
GetHexNumber:
        move.l  d2,-(a7)
        move.l  d2,-(a7)
        clr.l           d2
        clr.l           d2
        moveq           #0,d0
        moveq           #0,d0
.0002:
.0002
        bsr                     FromScreen
        bsr                     FromScreen
        bsr                     AsciiToHexNybble
        bsr                     AsciiToHexNybble
        cmp.b           #$ff,d1
        cmpi.b  #$ff,d1
        beq.s           .0001
        beq.s           .0001
        lsl.l           #4,d2
        lsl.l           #4,d2
        andi.l  #$0f,d1
        andi.l  #$0f,d1
        or.l            d1,d2
        or.l            d1,d2
        addq            #1,d0
        addq            #1,d0
        cmpi.b  #8,d0
        cmpi.b  #8,d0
        blo.s           .0002
        blo.s           .0002
.0001:
.0001
        move.l  d2,d1
        move.l  d2,d1
        move.l  (a7)+,d2
        move.l  (a7)+,d2
        tst.b           d0
        tst.b           d0
        rts
        rts
 
 
 
GetDecNumber:
 
        movem.l d2/d3,-(a7)
 
        clr.l d2
 
        clr.l d0
 
.0002
 
        bsr FromScreen                                  ; grab a character off the screen
 
        bsr     AsciiToHexNybble                ; convert to an ascii nybble
 
        cmpi.b #$ff,d1
 
        beq.s   .0001
 
        andi.b #$0F,d1                                  ; d1 = 0 to 9
 
        move.l d2,d3                                            ; d3 = current number
 
        add.l d3,d3                                                     ; d3*2
 
        lsl.l #3,d2                                                     ; current number * 8
 
        add.l d3,d2                                                     ; current number * 10
 
        add.l d1,d2                                                     ; add in new digit
 
        addq #1,d0                                                      ; increment number of digits
 
        cmpi.b #9,d0                                            ; make sure 9 or fewer
 
        blo .0002
 
.0001
 
        move.l d2,d1                                            ; return number in d1
 
        movem.l (a7)+,d2/d3
 
        tst.b d0
 
        rts
 
 
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
; Convert ASCII character in the range '0' to '9', 'a' tr 'f' or 'A' to 'F'
; Convert ASCII character in the range '0' to '9', 'a' tr 'f' or 'A' to 'F'
; to a hex nybble.
; to a hex nybble.
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
 
 
Line 3878... Line 3966...
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
 
 
DispatchMsg:
DispatchMsg:
        rts
        rts
 
 
 
        code
 
;==============================================================================
 
; Decimal-Floating point to string conversion routine.
 
;
 
; Modifies
 
;               _fpWork work area
 
; Register Usage:
 
;       fp0 = input decimal-float to convert
 
;               fp1 = constant holder, 1.0, 10.0
 
;               fp2 = 1.0e value for conversion
 
;               fp3 = holds digit value during significand conversion
 
;       a0 = pointer to string buffer, updated to point to NULL at end of string
 
;               a1 = pointer to "Nan" or "Inf" message string
 
;               d0 = temporary
 
;               d1 = digit value during exponent, significand conversion
 
;       d6 = exponent
 
;==============================================================================
 
        align 4
 
_dfOne  dc.l $25ff0000,$00000000,$00000000
 
_dfTen  dc.l $2600C000,$00000000,$00000000
 
_dfMil  dc.l $2606DDFA,$1C000000,$00000000
 
 
 
_msgNan dc.b "NaN",0
 
_msgInf dc.b "Inf",0
 
        even
 
 
 
;------------------------------------------------------------------------------
 
; Check for the special Nan and infinity values. Output the appropriate string.
 
;
 
; Modifies
 
;               _fpWork area
 
;               d0,a1,a0
 
; Parameters:
 
;               fp0 = dbl
 
;------------------------------------------------------------------------------
 
 
 
_CheckNan:
 
        fmove.p fp0,_fpWork
 
        move.b _fpWork,d0                               ; get sign+combo
 
        andi.b #$7C,d0                                  ; mask for combo bits
 
        cmpi.b #$7C,d0                                  ; is it the Nan combo?
 
        bne .notNan
 
        lea _msgNan,a1                                  ; output "Nan"
 
        bra .outStr
 
.notNan
 
        cmpi.b #$78,d0                                  ; is it infinity combo?
 
        bne .notInf
 
        lea _msgInf,a1
 
.outStr
 
        move.b (a1)+,(a0)+                      ; output "Inf"
 
        move.b (a1)+,(a0)+
 
        move.b (a1)+,(a0)+
 
        clr.b (a0)
 
.twoup
 
        addq #4,sp                                                      ; pop return address for two up return
 
.notInf
 
        rts
 
 
 
;------------------------------------------------------------------------------
 
; Check for a zero value. Output a single "0" if zero,
 
;
 
; Modifies:
 
;               a0
 
; Parameters:
 
;               fp0 = dbl
 
;------------------------------------------------------------------------------
 
 
 
_CheckZero:
 
        ftst fp0                                                                ; check if number is zero
 
        fbne .0003
 
        move.b #'0',(a0)+                               ; if zero output "0"
 
        clr.b (a0)
 
        addq #4,sp                                                      ; pop return address for two up return
 
.0003
 
        rts
 
 
 
;------------------------------------------------------------------------------
 
; Check for a negative number. This includes Nans and Infinities. Output a "-"
 
; if negative.
 
;
 
;       Modifies
 
;               a0
 
; Parameters:
 
;               fp0 = dbl
 
;------------------------------------------------------------------------------
 
 
 
_CheckNegative:
 
        ftst fp0                                                                ; is number negative?
 
        fbge .0002
 
        move.b #'-',(a0)+                               ; yes, output '-'
 
        fneg fp0                                                                ; make fp0 positive
 
.0002
 
        rts
 
 
 
;------------------------------------------------------------------------------
 
; Make the input value larger so that digits may appear before the decimal
 
; point.
 
;
 
; Modifies:
 
;               fp0,fp1,d6
 
; Parameters:
 
;               fp0 = dbl
 
;------------------------------------------------------------------------------
 
 
 
;       if (dbl < 1.0) {
 
;               while (dbl < 1.0) {
 
;                       dbl *= 1000000.0;
 
;                       exp -= 6;
 
;               }
 
;       }
 
 
 
_MakeBig:
 
        fmove.w #1,fp1
 
.0002
 
        fcmp fp1,fp0                                            ; is fp0 > 1?
 
        fbge .0001                                                      ; yes, return
 
        fscale.l #6,fp0                                 ; multiply fp0 by a million
 
        subi.w #6,d6                                            ; decrement exponent by six
 
        bra .0002                                                               ; keep trying until number is > 1
 
.0001
 
        fmove.p fp0,_fpWork+24  ; debugging
 
        rts
 
 
 
;------------------------------------------------------------------------------
 
;       Create a number dbl2 on the same order of magnitude as dbl, but
 
;       less than dbl. The number will be 1.0e
 
;
 
; Modifies:
 
;               d6,fp2
 
; Parameters:
 
;               fp0 = dbl
 
;------------------------------------------------------------------------------
 
 
 
;       // The following is similar to using log10() and pow() functions.
 
;       // Now dbl is >= 1.0
 
;       // Create a number dbl2 on the same order of magnitude as dbl, but
 
;       // less than dbl.
 
;       dbl2 = 1.0;
 
;       dbla = dbl2;
 
;       if (dbl > dbl2) {       // dbl > 1.0 ?
 
;               while (dbl2 <= dbl) {
 
;                       dbla = dbl2;
 
;                       dbl2 *= 10.0;   // increase power of 10
 
;                       exp++;
 
;               }
 
;               // The above loop goes one too far, we want the last value less
 
;               // than dbl.
 
;               dbl2 = dbla;
 
;               exp--;
 
;       }
 
 
 
_LessThanDbl:
 
        fmove.w #1,fp2                  ; setup fp2 = 1
 
        fcmp fp2,fp0                            ; if (dbl > dbl2)
 
        fble .0004
 
.0006
 
        fcmp fp0,fp2                            ; while (dbl2 <= dbl)
 
        fbgt .0005
 
        fscale.w #1,fp2                 ; dbl2 *= 10 (increase exponent by one)
 
        addi.w #1,d6                            ; exp++
 
        bra .0006
 
.0005
 
        fscale.l #-1,fp2                ; dbl2 /= 10 (decrease exponent by one)
 
        subi.w #1,d6                            ; exp--;
 
.0004
 
        fmove.p fp0,_fpWork     ; debugging
 
        fmove.p fp2,_fpWork+12
 
        rts
 
 
 
;------------------------------------------------------------------------------
 
; Compute the number of digits before the decimal point.
 
;
 
; Modifies:
 
;               d0,d6,_digits_before_decpt
 
; Parameters:
 
;               d6 = exponent
 
;------------------------------------------------------------------------------
 
 
 
; if (exp >= 0 && exp < 6) {
 
;   digits_before_decpt = exp+1;
 
;               exp = 0;
 
;       }
 
;       else if (exp >= -6)
 
;               digits_before_decpt = 1;
 
;       else
 
;               digits_before_decpt = -1;
 
 
 
_ComputeDigitsBeforeDecpt:
 
        tst.w d6
 
        bmi .0007
 
        cmpi.w #6,d6
 
        bge .0007
 
        move.w d6,d0
 
        addi.w #1,d0
 
        move.w d0,_digits_before_decpt
 
        clr.w d6
 
        rts
 
.0007
 
        cmpi.w #-6,d6
 
        blt .0009
 
        move.w #1,_digits_before_decpt
 
        rts
 
.0009
 
        move.w #-1,_digits_before_decpt
 
        rts
 
 
 
;------------------------------------------------------------------------------
 
;       Spit out a leading zero before the decimal point for a small number.
 
;
 
; Parameters:
 
;               d6 = exponent
 
;------------------------------------------------------------------------------
 
 
 
;  if (exp < -6) {
 
;                buf[ndx] = '0';
 
;                ndx++;
 
;    buf[ndx] = '.';
 
;    ndx++;
 
;  }
 
 
 
_LeadingZero:
 
        cmpi.w #-6,d6
 
        bge .0010
 
        move.b #'0',(a0)+
 
        move.b #'.',(a0)+
 
.0010
 
        rts
 
 
 
;------------------------------------------------------------------------------
 
; Extract the digits of the significand.
 
;
 
; Modifies:
 
;               _precision variable
 
; Register Usage
 
;               d1 = digit
 
;               fp0 = dbl
 
;               fp2 = dbl2
 
;               fp3 = digit as decimal float
 
;               fp7 = dbla
 
; Parameters:
 
;               fp0
 
;------------------------------------------------------------------------------
 
 
 
;       // Now loop processing one digit at a time.
 
;  for (nn = 0; nn < 25 && precision > 0; nn++) {
 
;    digit = 0;
 
;               dbla = dbl;
 
;               // dbl is on the same order of magnitude as dbl2 so
 
;               // a repeated subtract can be used to find the digit.
 
;    while (dbl >= dbl2) {
 
;      dbl -= dbl2;
 
;      digit++;
 
;    }
 
;    buf[ndx] = digit + '0';
 
;               // Now go back and perform just a single subtract and
 
;               // a multiply to find out how much to reduce dbl by.
 
;               // This should improve the accuracy
 
;               if (digit > 2)
 
;                       dbl = dbla - dbl2 * digit;
 
;    ndx++;
 
;    digits_before_decpt--;
 
;    if (digits_before_decpt==0) {
 
;                       buf[ndx] = '.';
 
;                       ndx++;
 
;    }
 
;    else if (digits_before_decpt < 0)
 
;      precision--;
 
;               // Shift the next digit to be tested into position.
 
;    dbl *= 10.0;
 
;  }
 
 
 
_SpitOutDigits:
 
        move.w #24,d0                   ; d0 = nn
 
        fmove.l #10,fp1         ; fp1 = 10.0
 
.0017
 
        tst.l _precision
 
        ble .0011
 
        moveq #0,d1                             ; digit = 0
 
        fmove fp0,fp7                   ; dbla = dbl
 
.0013
 
        fcmp fp2,fp0
 
        fblt .0012
 
        fsub fp2,fp0                    ; dbl -= dbl2
 
        addi.b #1,d1                    ; digit++
 
        bra .0013
 
.0012
 
        addi.b #'0',d1          ; convert digit to ascii
 
        move.b d1,(a0)+         ; and store
 
        subi.b #'0',d1          ; d1 = binary digit again
 
;       cmpi.b #2,d1
 
;       ble .0014
 
 
 
;       ext.w d1
 
;       ext.l d1
 
;       fmove.l d1,fp3          ; fp3 = digit
 
;       fmul fp2,fp3                    ; fp3 = dbl2 * digit
 
;       fmove fp7,fp0
 
;       fsub fp3,fp0                    ; dbl = dbla - dbl2 * digit
 
.0014
 
        subi.w #1,_digits_before_decpt
 
        bne .0015
 
        move.b #'.',(a0)+
 
.0015
 
        tst.w _digits_before_decpt
 
        bge .0016
 
        subi.l #1,_precision
 
.0016
 
        fscale.l #-1,fp2                ; dbl *= 10.0
 
        dbra d0,.0017
 
.0011
 
        rts
 
 
 
;------------------------------------------------------------------------------
 
; If the number ends in a decimal point, trim off the point.
 
;
 
; Registers Modified:
 
;               none
 
; Parameters:
 
;               a0 = pointer to end of number
 
; Returns:
 
;               a0 = updated to point just past last digit.
 
;------------------------------------------------------------------------------
 
 
 
_TrimTrailingPoint:
 
        cmpi.b #'.',-1(a0)
 
        bne .0001
 
        clr.b -(a0)
 
        rts
 
.0001
 
        cmpi.b #'.',(a0)
 
        bne .0002
 
        cmpi.b #0,1(a0)
 
        bne .0002
 
        clr.b (a0)
 
        subq #1,a0
 
.0002
 
        rts
 
 
 
;------------------------------------------------------------------------------
 
; If the number ends in .0 get rid of the .0
 
;
 
; Registers Modified:
 
;               none
 
; Parameters:
 
;               a0 = pointer to last digits of number
 
; Returns:
 
;               a0 = updated to point just past last digit.
 
;------------------------------------------------------------------------------
 
 
 
_TrimDotZero:
 
        tst.b (a0)
 
        bne .0004
 
        cmpi.b #'0',-1(a0)
 
        bne .0004
 
        cmpi.b #'.',-2(a0)
 
        bne .0004
 
        clr.b -2(a0)
 
        subq #2,a0
 
.0004
 
        rts
 
 
 
;------------------------------------------------------------------------------
 
; Trim trailing zeros from the number. Generally there is no need to display
 
; trailing zeros.
 
; Turns a number like 652.000000000000000000000 into 650.0
 
;
 
; Registers Modified:
 
;               none
 
; Parameters:
 
;               a0 = pointer to last digits of number
 
; Returns:
 
;               a0 = updated to point just past last digit.
 
;------------------------------------------------------------------------------
 
 
 
;       // Trim trailing zeros from the number
 
;  do {
 
;      ndx--;
 
;  } while(buf[ndx]=='0');
 
;  ndx++;
 
 
 
_TrimTrailingZeros:
 
.0018
 
        cmpi.b #'0',-(a0)               ; if the last digit was a zero, backup
 
        beq .0018
 
        addq #1,a0                                      ; now advance by one
 
        move.b #0,(a0)                  ; NULL terminate string
 
        rts
 
 
 
;------------------------------------------------------------------------------
 
; Output 'e+' or 'e-'
 
;
 
; Registers Modified:
 
;               d6.w (if negative)
 
; Parameters:
 
;               a0 = pointer to last digits of number
 
; Returns:
 
;               a0 = updated to point just past '+' or '-'.
 
;------------------------------------------------------------------------------
 
 
 
;       // Spit out +/-E
 
;  buf[ndx] = E;
 
;  ndx++;
 
;  if (exp < 0) {
 
;    buf[ndx]='-';
 
;    ndx++;
 
;    exp = -exp;
 
;  }
 
;  else {
 
;               buf[ndx]='+';
 
;               ndx++;
 
;  }
 
 
 
_SpitOutE:
 
        move.b _E,(a0)+
 
        tst.w d6
 
        bge .0021
 
        move.b #'-',(a0)+
 
        neg.w d6
 
        bra .0022
 
.0021
 
        move.b #'+',(a0)+
 
.0022
 
        rts
 
 
 
;------------------------------------------------------------------------------
 
; Extract a single digit of the exponent. Extract works from the leftmost digit
 
; to the rightmost.
 
;
 
; Register Usage
 
;               d2 = history of zeros
 
;               d3 = digit
 
; Modifies
 
;               d2,d3,d6,a0
 
; Parameter
 
;       d1.w = power of ten
 
;               d6.w = exponent
 
;------------------------------------------------------------------------------
 
 
 
_ExtExpDigit:
 
        ext.l d6                                ; make d6 a long
 
        divu d1,d6                      ; divide by power of ten
 
        move.b d6,d3            ; d3 = quotient (0 to 9)
 
        swap d6                                 ; d6 = remainder, setup for next digit
 
        or.b d3,d2
 
        tst.b d3
 
        bne .0003
 
        tst.b d2
 
        beq .0004
 
.0003
 
        addi.b #'0',d3  ; convert to ascii
 
        move.b d3,(a0)+
 
.0004
 
        rts
 
 
 
;------------------------------------------------------------------------------
 
; Extract all the digits of the exponent.
 
;
 
; Register Usage
 
;               d1 = power of 10
 
;               d2 = history of zeros
 
; Parameters
 
;               a0 = pointer to string buffer
 
;               d6 = exponent
 
;------------------------------------------------------------------------------
 
 
 
;       // If the number is times 10^0 don't output the exponent
 
;  if (exp==0) {
 
;    buf[ndx]='\0';
 
;    goto prt;
 
;  }
 
 
 
_ExtExpDigits:
 
        tst.w d6                                                        ; is exponent zero?
 
        beq .0002
 
        bsr _SpitOutE                                   ; exponent is non-zero e+
 
        clr.b d2                                                        ; d2 = history of zeros
 
        move.w #1000,d1
 
        bsr _ExtExpDigit
 
        move.w #100,d1
 
        bsr _ExtExpDigit
 
        move.w #10,d1
 
        bsr _ExtExpDigit
 
        move.w #1,d1
 
        bsr _ExtExpDigit
 
.0002:
 
        move.b #0,(a0)                          ; NULL terminate string
 
        rts                                                                             ; and return
 
 
 
;------------------------------------------------------------------------------
 
; Pad the left side of the output string.
 
;
 
; Modifies:
 
;               d0,d1,d2,d3
 
;------------------------------------------------------------------------------
 
 
 
;  // pad left
 
;  if (width > 0) {
 
;    if (ndx < width) {
 
;      for (nn = 39; nn >= width-ndx; nn--)
 
;        buf[nn] = buf[nn-(width-ndx)];
 
;      for (; nn >= 0; nn--)
 
;        buf[nn] = ' ';
 
;    }
 
;  }
 
 
 
_PadLeft:
 
        tst.b _width
 
        ble .0041
 
        move.l a0,d0
 
        sub.l #_fpBuf,d0        ; d0 = ndx
 
        cmp.b _width,d0
 
        bge .0041
 
        move.w #49,d1                   ; d1 = nn
 
.0040
 
        move.b _width,d2
 
        ext.w d2
 
        sub.w d0,d2                             ; d2 = width-ndx
 
        cmp.w d2,d1
 
        blt .0039
 
        move.w d1,d3                    ; d3 = nn
 
        sub.w d2,d3                             ; d3 = nn-(width-ndx)
 
        move.b (a0,d3.w),(a0,d1.w)
 
        subi.w #1,d1
 
        bra .0040
 
.0039
 
        tst.w d1
 
        bmi .0041
 
        move.b #' ',(a0,d1.w)
 
        subi.w #1,d1
 
        bra .0039
 
.0041
 
        rts
 
 
 
;------------------------------------------------------------------------------
 
; Pad the right side of the output string.
 
;
 
; Modifies:
 
;               d0
 
; Returns:
 
;               d0 = length of string
 
;------------------------------------------------------------------------------
 
 
 
;  // pad right
 
;  if (width < 0) {
 
;    width = -width;
 
;    while (ndx < width) {
 
;      buf[ndx]=' ';
 
;      ndx++;
 
;    }
 
;    buf[ndx]='\0';
 
;  }
 
;  return (ndx);
 
 
 
_PadRight:
 
        tst.b _width
 
        bpl .0042
 
        neg.b _width
 
        move.l a0,d0
 
        sub.l #_fpBuf,d0        ; d0 = ndx
 
.0044
 
        cmp.b _width,d0
 
        bge .0043
 
        move.b #' ',(a0,d0.w)
 
        addi.w #1,d0
 
        bra .0044
 
.0043
 
        move.b #0,(a0,d0.w)
 
.0042
 
        ext.w d0
 
        ext.l d0
 
        rts
 
 
 
;------------------------------------------------------------------------------
 
;
 
;------------------------------------------------------------------------------
 
 
 
_IsZero:
 
        clr.l d0                                                                ; d0 = 0
 
        move.b _fpWork,d0                               ; get sign, combo
 
        andi.b #$7f,d0                                  ; ignore sign bit
 
        or.b _fpWork+1,d0                               ; check all bytes for zero
 
        or.w _fpWork+2,d0
 
        or.w _fpWork+4,d0
 
        or.w _fpWork+6,d0
 
        or.w _fpWork+8,d0
 
        or.w _fpWork+10,d0
 
        rts
 
 
 
;------------------------------------------------------------------------------
 
; Output a string representation of a decimal floating point number to a
 
; buffer.
 
;
 
; Register Usage
 
;               a0 = pointer to string buffer
 
;               d6 = exponent
 
; Parameters:
 
;               fp0 = number to convert
 
;------------------------------------------------------------------------------
 
 
 
_sprtflt:
 
        bsr _CheckNegative                      ; is number negative?
 
        bsr _CheckZero                                  ; check for zero
 
        bsr _CheckNan                                           ; check for Nan or infinity
 
        ; Now the fun begins
 
        clr.l d6
 
        bsr _MakeBig
 
        bsr _LessThanDbl
 
        bsr _ComputeDigitsBeforeDecpt
 
        bsr _LeadingZero
 
        bsr _SpitOutDigits
 
        bsr _TrimTrailingZeros
 
        bsr _TrimTrailingPoint
 
        bsr _TrimDotZero
 
        bsr _ExtExpDigits                               ; extract exponent digits
 
        bsr _PadLeft                                            ; pad the number to the left or right
 
        bra _PadRight
 
 
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
 
; Trap #15, function 39 - convert floating-point to string and display
 
;
 
; Parameters
 
;               a0 = pointer to buffer
 
;               fp0 = number to print
 
;               d1 = width of print field
 
;               d2 = precision
 
;               d3 = 'E' or 'e'
 
;------------------------------------------------------------------------------
 
 
 
prtflt:
 
        movem.l d0/d1/d2/d3/d6/a1,-(a7)
 
;       fmove.p fp0,-(a7)
 
        move.l a1,a0                                            ; a0 = pointer to buffer to use
 
        move.b d1,_width
 
        move.l d2,_precision
 
        move.b d3,_E
 
        bsr _sprtflt
 
        bsr DisplayString
 
;       fmove.p (a7)+,fp0
 
        movem.l (a7)+,d0/d1/d2/d3/d6/a1
 
        rts
 
 
 
;==============================================================================
 
;==============================================================================
 
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
 
 
InitIRQ:
InitIRQ:
        moveq           #6,d0
        moveq           #6,d0
        lea                     KeybdIRQ,a0
        lea                     KeybdIRQ,a0

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.