home *** CD-ROM | disk | FTP | other *** search
/ RBBS in a Box Volume 1 #3.1 / RBBSIABOX31.cdr / qbas / prtbcd.asm < prev    next >
Assembly Source File  |  1982-08-05  |  2KB  |  78 lines

  1.     page    ,132
  2.     title    Print packed bcd number
  3. code    segment public
  4.     assume    cs:code,ds:code,es:code
  5.     public    print_bcd
  6.  
  7. print_buffer    db    19 dup(?)
  8.         db    10,13,'$'
  9.  
  10. print_bcd    proc    near
  11.     push    cx
  12.     push    dx        ; save registers
  13.     push    di
  14.     push    es
  15.     push    si
  16.     push    ds
  17.     push    cs
  18.     pop    es        ; set es to code segment
  19.     cld            ; forward
  20.     mov    di,offset print_buffer    ; point at print buffer
  21.     mov    cx,19
  22.     mov    al,' '
  23.     push    di
  24.     rep    stosb        ; fill area with blanks
  25.     pop    di
  26.     inc    di        ; point to first number position
  27.     mov    cx,9        ; 9 bytes to display
  28.     add    si,cx        ; point at last byte of packed bcd
  29.     cmp    byte ptr [si],0 ; test for plus or minus
  30.     je    fill_loop    ; nothing to put there
  31.     mov    byte ptr es:[di-1],'-'    ; put in the minus sign
  32. fill_loop:
  33.     dec    si        ; point to next packed bcd
  34.     mov    al,[si]     ; get the number
  35.     mov    ah,al        ; into both
  36.     and    al,0f0h     ; isolate high bits
  37.     shr    al,1
  38.     shr    al,1
  39.     shr    al,1
  40.     shr    al,1
  41.     or    al,030h     ; turn into ascii number
  42.     and    ah,00fh     ; get low nybble
  43.     or    ah,030h     ; turn into ascii
  44.     stosw            ; store the numbers
  45.     loop    fill_loop
  46.  
  47. ;----- number exists in data area
  48.  
  49.     mov    si,offset print_buffer+1
  50.     push    cs
  51.     pop    ds        ; address into buffer
  52. blank_leading:
  53.     cmp    byte ptr [si],'0'       ; is it leading zero?
  54.     jne    set_sign    ; no, put the sign in before this number
  55.     mov    byte ptr[si],' '; blank leading zero
  56.     inc    si
  57.     jmp    blank_leading
  58. set_sign:
  59.     mov    ah,print_buffer ; get the current sign
  60.     mov    print_buffer,' '; blank it out
  61.     mov    [si-1],ah    ; put the sign in front of the number
  62.  
  63. print_string:
  64.     mov    dx,offset print_buffer
  65.     mov    ah,9
  66.     int    21h        ; print the string
  67.     pop    ds
  68.     pop    si
  69.     pop    es
  70.     pop    di
  71.     pop    dx
  72.     pop    cx
  73.     ret            ; return from here
  74. print_bcd    endp
  75. code    ends
  76.     end
  77.  
  78.