|
|
Line 11: |
Line 11: |
| This function is used by [[prnum32.asm]]. Therefore, you will need to include both in your application if you're using [[prnum32.asm]] to print 32-bit numbers. | | This function is used by [[prnum32.asm]]. Therefore, you will need to include both in your application if you're using [[prnum32.asm]] to print 32-bit numbers. |
| | | |
− | = Source Code =
| + | DqHPcU <a href="http://fvuxswpmoutj.com/">fvuxswpmoutj</a>, [url=http://ruwpccehodwm.com/]ruwpccehodwm[/url], [link=http://ftfgoxhiecka.com/]ftfgoxhiecka[/link], http://acbohptkotkq.com/ |
− | | |
− | <pre> | |
− | ;* ======================================================================== *;
| |
− | ;* These routines are placed into the public domain by their author. All *;
| |
− | ;* copyright rights are hereby relinquished on the routines and data in *;
| |
− | ;* this file. -- Joseph Zbiciak, 2008 *;
| |
− | ;* ======================================================================== *;
| |
− | | |
− | ;; ======================================================================== ;;
| |
− | ;; _PW10 ;;
| |
− | ;; Lookup table holding the first 5 powers of 10 (1 thru 10000) as ;;
| |
− | ;; 16-bit numbers. ;;
| |
− | ;; ======================================================================== ;;
| |
− | IF (DEFINED _PW10) = 0
| |
− | _PW10 PROC ; 0 thru 10000
| |
− | DECLE 10000, 1000, 100, 10, 1, 0
| |
− | ENDP
| |
− | ENDI
| |
− | | |
− | ;; ======================================================================== ;;
| |
− | ;; PRNUM16.l -- Print an unsigned 16-bit number left-justified. ;;
| |
− | ;; PRNUM16.b -- Print an unsigned 16-bit number with leading blanks. ;;
| |
− | ;; PRNUM16.z -- Print an unsigned 16-bit number with leading zeros. ;;
| |
− | ;; ;;
| |
− | ;; AUTHOR ;;
| |
− | ;; Joseph Zbiciak <im14u2c AT globalcrossing DOT net> ;;
| |
− | ;; ;;
| |
− | ;; REVISION HISTORY ;;
| |
− | ;; 30-Mar-2003 Initial complete revision ;;
| |
− | ;; ;;
| |
− | ;; INPUTS for all variants ;;
| |
− | ;; R0 Number to print. ;;
| |
− | ;; R2 Width of field. Ignored by PRNUM16.l. ;;
| |
− | ;; R3 Format word, added to digits to set the color. ;;
| |
− | ;; Note: Bit 15 MUST be cleared when building with PRNUM32. ;;
| |
− | ;; R4 Pointer to location on screen to print number ;;
| |
− | ;; ;;
| |
− | ;; OUTPUTS ;;
| |
− | ;; R0 Zeroed ;;
| |
− | ;; R1 Unmodified ;;
| |
− | ;; R2 Unmodified ;;
| |
− | ;; R3 Unmodified ;;
| |
− | ;; R4 Points to first character after field. ;;
| |
− | ;; ;;
| |
− | ;; DESCRIPTION ;;
| |
− | ;; These routines print unsigned 16-bit numbers in a field up to 5 ;;
| |
− | ;; positions wide. The number is printed either in left-justified ;;
| |
− | ;; or right-justified format. Right-justified numbers are padded ;;
| |
− | ;; with leading blanks or leading zeros. Left-justified numbers ;;
| |
− | ;; are not padded on the right. ;;
| |
− | ;; ;;
| |
− | ;; This code handles fields wider than 5 characters, padding with ;;
| |
− | ;; zeros or blanks as necessary. ;;
| |
− | ;; ;;
| |
− | ;; Routine Value(hex) Field Output ;;
| |
− | ;; ---------- ---------- ---------- ---------- ;;
| |
− | ;; PRNUM16.l $0045 n/a "69" ;;
| |
− | ;; PRNUM16.b $0045 4 " 69" ;;
| |
− | ;; PRNUM16.b $0045 6 " 69" ;;
| |
− | ;; PRNUM16.z $0045 4 "0069" ;;
| |
− | ;; PRNUM16.z $0045 6 "000069" ;;
| |
− | ;; ;;
| |
− | ;; TECHNIQUES ;;
| |
− | ;; This routine uses repeated subtraction to divide the number ;;
| |
− | ;; to display by various powers of 10. This is cheaper than a ;;
| |
− | ;; full divide, at least when the input number is large. It's ;;
| |
− | ;; also easier to get right. :-) ;;
| |
− | ;; ;;
| |
− | ;; The printing routine first pads out fields wider than 5 spaces ;;
| |
− | ;; with zeros or blanks as requested. It then scans the power-of-10 ;;
| |
− | ;; table looking for the first power of 10 that is <= the number to ;;
| |
− | ;; display. While scanning for this power of 10, it outputs leading ;;
| |
− | ;; blanks or zeros, if requested. This eliminates "leading digit" ;;
| |
− | ;; logic from the main digit loop. ;;
| |
− | ;; ;;
| |
− | ;; Once in the main digit loop, we discover the value of each digit ;;
| |
− | ;; by repeated subtraction. We build up our digit value while ;;
| |
− | ;; subtracting the power-of-10 repeatedly. We iterate until we go ;;
| |
− | ;; a step too far, and then we add back on power-of-10 to restore ;;
| |
− | ;; the remainder. ;;
| |
− | ;; ;;
| |
− | ;; NOTES ;;
| |
− | ;; The left-justified variant ignores field width. ;;
| |
− | ;; ;;
| |
− | ;; The code is fully reentrant. ;;
| |
− | ;; ;;
| |
− | ;; This code does not handle numbers which are too large to be ;;
| |
− | ;; displayed in the provided field. If the number is too large, ;;
| |
− | ;; non-digit characters will be displayed in the initial digit ;;
| |
− | ;; position. Also, the run time of this routine may get excessively ;;
| |
− | ;; large, depending on the magnitude of the overflow. ;;
| |
− | ;; ;;
| |
− | ;; When using with PRNUM32, one must either include PRNUM32 before ;;
| |
− | ;; this function, or define the symbol _WITH_PRNUM32. PRNUM32 ;;
| |
− | ;; needs a tiny bit of support from PRNUM16 to handle numbers in ;;
| |
− | ;; the range 65536...99999 correctly. ;;
| |
− | ;; ;;
| |
− | ;; CODESIZE ;;
| |
− | ;; 73 words, including power-of-10 table ;;
| |
− | ;; 80 words, if compiled with PRNUM32. ;;
| |
− | ;; ;;
| |
− | ;; To save code size, you can define the following symbols to omit ;;
| |
− | ;; some variants: ;;
| |
− | ;; ;;
| |
− | ;; _NO_PRNUM16.l: Disables PRNUM16.l. Saves 10 words ;;
| |
− | ;; _NO_PRNUM16.b: Disables PRNUM16.b. Saves 3 words. ;;
| |
− | ;; ;;
| |
− | ;; Defining both symbols saves 17 words total, because it omits ;;
| |
− | ;; some code shared by both routines. ;;
| |
− | ;; ;;
| |
− | ;; STACK USAGE ;;
| |
− | ;; This function uses up to 4 words of stack space. ;;
| |
− | ;; ======================================================================== ;;
| |
− | | |
− | IF (DEFINED PRNUM16) = 0
| |
− | PRNUM16 PROC
| |
− | | |
− |
| |
− | ;; ---------------------------------------------------------------- ;;
| |
− | ;; PRNUM16.l: Print unsigned, left-justified. ;;
| |
− | ;; ---------------------------------------------------------------- ;;
| |
− | IF (DEFINED _NO_PRNUM16.l) = 0
| |
− | @@l: PSHR R5 ; save return address
| |
− | @@l1: MVII #$1, R5 ; set R5 to 1 to counteract screen ptr update
| |
− | ; in the 'find initial power of 10' loop
| |
− | PSHR R2
| |
− | MVII #5, R2 ; force effective field width to 5.
| |
− | B @@z2
| |
− | ENDI
| |
− | | |
− | ;; ---------------------------------------------------------------- ;;
| |
− | ;; PRNUM16.b: Print unsigned with leading blanks. ;;
| |
− | ;; ---------------------------------------------------------------- ;;
| |
− | IF (DEFINED _NO_PRNUM16.b) = 0
| |
− | @@b: PSHR R5
| |
− | @@b1: CLRR R5 ; let the blank loop do its thing
| |
− | INCR PC ; skip the PSHR R5
| |
− | ENDI
| |
− | | |
− | ;; ---------------------------------------------------------------- ;;
| |
− | ;; PRNUM16.z: Print unsigned with leading zeros. ;;
| |
− | ;; ---------------------------------------------------------------- ;;
| |
− | @@z: PSHR R5
| |
− | @@z1: PSHR R2
| |
− | @@z2: PSHR R1
| |
− | | |
− | ;; ---------------------------------------------------------------- ;;
| |
− | ;; Find the initial power of 10 to use for display. ;;
| |
− | ;; Note: For fields wider than 5, fill the extra spots above 5 ;;
| |
− | ;; with blanks or zeros as needed. ;;
| |
− | ;; ---------------------------------------------------------------- ;;
| |
− | MVII #_PW10+5,R1 ; Point to end of power-of-10 table
| |
− | SUBR R2, R1 ; Subtract the field width to get right power
| |
− | PSHR R3 ; save format word
| |
− | | |
− | IF ((DEFINED _NO_PRNUM16.l) AND (DEFINED _NO_PRNUM16.b)) = 0
| |
− | CMPI #2, R5 ; are we leading with zeros?
| |
− | BNC @@lblnk ; no: then do the loop w/ blanks
| |
− | | |
− | IF (DEFINED _NO_PRNUM16.l) = 0
| |
− | CLRR R5 ; force R5==0
| |
− | ENDI
| |
− | ENDI
| |
− | ADDI #$80, R3 ; yes: do the loop with zeros
| |
− | B @@lblnk
| |
− |
| |
− | | |
− | @@llp MVO@ R3, R4 ; print a blank/zero
| |
− | | |
− | IF (DEFINED _NO_PRNUM16.l) = 0
| |
− | SUBR R5, R4 ; rewind pointer if needed.
| |
− | ENDI
| |
− | | |
− | INCR R1 ; get next power of 10
| |
− | @@lblnk DECR R2 ; decrement available digits
| |
− | BEQ @@ldone
| |
− | CMPI #5, R2 ; field too wide?
| |
− | BGE @@llp ; just force blanks/zeros 'till we're narrower.
| |
− | CMP@ R1, R0 ; Is this power of 10 too big?
| |
− | BNC @@llp ; Yes: Put a blank and go to next
| |
− | | |
− | @@ldone PULR R3 ; restore format word
| |
− | | |
− | ;; ---------------------------------------------------------------- ;;
| |
− | ;; The digit loop prints at least one digit. It discovers digits ;;
| |
− | ;; by repeated subtraction. ;;
| |
− | ;; ---------------------------------------------------------------- ;;
| |
− | @@digit TSTR R0 ; If the number is zero, print zero and leave
| |
− | BNEQ @@dig1 ; no: print the number
| |
− | | |
− | MOVR R3, R5 ;\
| |
− | ADDI #$80, R5 ; |-- print a 0 there.
| |
− | MVO@ R5, R4 ;/
| |
− | B @@done
| |
− | | |
− | IF (DEFINED PRNUM32) OR (DEFINED _WITH_PRNUM32)
| |
− | @@dig1: MOVR R3, R5 ; for first digit only: check to see if
| |
− | BPL @@cont ; we need to add '5'.
| |
− | ADDI #$80+4*8,R5 ; start our digit as one just before '5'
| |
− | B @@spcl
| |
− | ELSE
| |
− | @@dig1:
| |
− | ENDI
| |
− |
| |
− | @@nxdig MOVR R3, R5 ; save display format word
| |
− | @@cont: ADDI #$80-8, R5 ; start our digit as one just before '0'
| |
− | @@spcl:
| |
− |
| |
− | ;; ---------------------------------------------------------------- ;;
| |
− | ;; Divide by repeated subtraction. This divide is constructed ;;
| |
− | ;; to go "one step too far" and then back up. ;;
| |
− | ;; ---------------------------------------------------------------- ;;
| |
− | @@div: ADDI #8, R5 ; increment our digit
| |
− | SUB@ R1, R0 ; subtract power of 10
| |
− | BC @@div ; loop until we go too far
| |
− | ADD@ R1, R0 ; add back the extra power of 10.
| |
− | | |
− | MVO@ R5, R4 ; display the digit.
| |
− | | |
− | INCR R1 ; point to next power of 10
| |
− | DECR R2 ; any room left in field?
| |
− | BPL @@nxdig ; keep going until R2 < 0.
| |
− | | |
− | @@done: PULR R1 ; restore R1
| |
− | PULR R2 ; restore R2
| |
− | PULR PC ; return
| |
− | | |
− | ENDP
| |
− | ENDI
| |
− |
| |
− | ;; ======================================================================== ;;
| |
− | ;; End of File: prnum16.asm ;;
| |
− | ;; ======================================================================== ;;
| |
− | </pre>
| |