Sunteți pe pagina 1din 2

A 6502 Assembly Language program, BINX, to convert a 32-bit binary

number to an unsigned base 2-36 number.

CROSS ASSEMBLER/3000 LISTING

0000 ; BINX - Convert 32-bit binary TO unsigned base 2-36 number.


0000 ; TIME CRITICAL? No.
0000 ; DESCRIPTION:
0000 ;
0000 ; ACTION: Put ASCII carriage return onto stack.
0000 ; Divide number by base
0000 ; Convert remainder to ASCII
0000 ; & put onto stack.
0000 ; Repeat until number = 0.
0000 ; Pop digit off stack
0000 ; & store into RAM.
0000 ; Repeat until 'CR' popped & stored.
0000 ; SUBroutine DEPENDENCE: None
0000 ; INTERFACES: None
0000 ; INPUT: M0-M3 contains the unsigned 32-bit number for
0000 ; conversion with the most significant byte at M3.
0000 ; M4-M5 contain the RAM start address of the result.
0000 ; MC contains the base value.
0000 ; OUTPUT: M0-M3 = 0; Cy always clear.
0000 ; M4-M5,MC - unchanged.
0000 ; The ASCII string result is in RAM starting at the
0000 ; address given in M4-M5.
0000 ;
0000 ; REGs USED: M0-M3,M4-M5,MC (zero page memory locations)
0000 ; A,Y,P registers (note: X unused).
0000 ; STACK USE: 33 maximum
0000 ; LENGTH: 55 bytes
0000 ; T-STATES: 1,127 minimum, 38,730 maximum.
0000 ; PROCESSOR: 6502
0000 ;
0000 ; (note that $ prefix denotes hexadecimal number,
0000 ; @ prefix denotes immediate addressing mode )
0000 ;
0000 M0 EQU $80
0000 M1 EQU $81
0000 M2 EQU $82
0000 M3 EQU $83
0000 M4 EQU $84
0000 MC EQU $8C

0000 ;
3100 ORG $3100
3100 ;
3100 A9 0D BINX LDA @ $0D ; Put ASCII carriage
3102 48 PHA ; return onto stack.
3103 A0 20 BINX1 LDY @ 32 ; Initialise bit cnt.
3105 A9 00 LDA @ 0 ; Clear A.
3107 06 80 BINX2 ASL M0 ; Shift
3109 26 81 ROL M1 ; 32-bit
310B 26 82 ROL M2 ; number
310D 26 83 ROL M3 ; left
310F 2A ROL A ; into A.
3110 C5 0C CMP MC ; A less than base?
3112 90 04 BCC BINX3 ; Jump if so.
3114 E5 0C SBC MC ; Subtract base from A
3116 E6 80 INC M0 ; & set result bit.
3118 88 BINX3 DEY ; Repeat
3119 D0 EC BNE BINX2 ; 32 times.
311B C9 0A CMP @ 10 ; Convert
311D 90 02 BCC BINX4 ; digit
311F 69 06 ADC @ 6 ; to
3121 69 30 BINX4 ADC @ $30 ; ASCII
3123 48 PHA ; & put onto stack.
3124 A5 83 LDA M3 ; Check
3126 05 82 ORA M2 ; if 32-bit
3128 05 81 ORA M1 ; number
312A 05 80 ORA M0 ; now = 0.
312C D0 D5 BNE BINX1 ; Repeat if not.
312E 68 BINX5 PLA ; Get digit &
312F 91 84 STA (M4),Y ; store in RAM.
3131 C8 INY ; Adjust pointer.
3132 C9 0E CMP @ $0E ; CR stored?
3134 B0 F8 BCS BINX5 ; If not, get next digit
3136 60 BINX6 RTS ; else return with Cy=0.

=================================================================

S-ar putea să vă placă și