mads 1.9.0 build 21 (16 Aug 09)
Source: C:\Users\Rudla\Projects\atalan\src\test/sieve_b.asm
     1 = 0080			_arr equ 128
     2 = 0034			_TEMPW2 equ 52
     3 = 0014			rtclock1 equ 20
     4 = 0013			rtclock2 equ 19
     5 = 0082			count equ 130
     6 = 0084			_s0__i equ 132
     7 = 0086			_s1__i equ 134
     8 = 0087			_s1___3 equ 135
     9 = 0088			_s1___4 equ 136
    10 = 0089			_s2__k equ 137
    11 = 008B			_s2___7 equ 139
    12 = 008D			_s2___8 equ 141
    13 = 008F			_s2___9 equ 143
    14 = 0091			_s3__k equ 145
    15 = 0093			_s3___12 equ 147
    16 = 0095			t equ 149
    17 = 0097			_17 equ 151
    18 = 0098			_18 equ 152
    19 = 0099			_19 equ 153
    20 = 009A			_20 equ 154
    21 = 009B			_21 equ 155
    22 				   org $2e0
    23 FFFF> 02E0-02E1> 00 20	   dta a($2000)
    24 02E2			   org $2000
    25 				;### sieve_b.atl(13) rtclock1 = 0
    26 2000-217E> A9 00		   lda #0
    27 2002 85 14		   sta rtclock1
    28 				;### sieve_b.atl(14) rtclock2 = 0
    29 2004 85 13		   sta rtclock2
    30 				;### sieve_b.atl(19) for i:0..$1fff flags(i)=$aa
    31 2006 85 85		   sta _s0__i+1
    32 2008 A8			   tay
    33 2009			_lbl2:
    34 2009 A9 7F		   lda #<flags
    35 200B 85 80		   sta _arr
    36 200D A9 21		   lda #>flags
    37 200F 18			   clc
    38 2010 65 85		   adc _s0__i+1
    39 2012 85 81		   sta _arr+1
    40 2014 A9 AA		   lda #170
    41 2016 91 80		   sta (_arr),y
    42 2018 C8			   iny
    43 2019 D0 02		   jne _lbl9
    44 201B E6 85		   inc _s0__i+1
    45 201D			_lbl9:
    46 201D C0 00		   cpy #0
    47 201F D0 E8		   jne _lbl2
    48 2021 A5 85		   lda _s0__i+1
    49 2023 C9 20		   cmp #32
    50 2025 D0 E2		   jne _lbl2
    51 				;### sieve_b.atl(21) for i:3..255 step 2 where (flags(i/8) and mask(i mod 8) <> 0)	
    52 2027 A9 03		   lda #3
    53 2029 85 86		   sta _s1__i
    54 202B			_lbl6:
    55 202B A5 86		   lda _s1__i
    56 202D 4A			   lsr
    57 202E 4A			   lsr
    58 202F 4A			   lsr
    59 2030 85 87		   sta _s1___3
    60 2032 A5 86		   lda _s1__i
    61 2034 29 07		   and #7
    62 2036 85 88		   sta _s1___4
    63 2038 A6 87		   ldx _s1___3
    64 203A BD 7F 21		   lda flags,x
    65 203D 85 97		   sta _17
    66 203F A6 88		   ldx _s1___4
    67 2041 BD 6F 21		   lda mask,x
    68 2044 25 97		   and _17
    69 2046 C9 00		   cmp #0
    70 2048 D0 03 4C CF 20	   jeq _lbl10
    71 				;### sieve_b.atl(22) 	for k:i*i..8192 step 2*i
    72 204D A5 86		   lda _s1__i
    73 204F A6 86		   ldx _s1__i
    74 2051 20 73 42		   jsr _sys_mul8
    75 2054 A5 86		   lda _s1__i
    76 2056 0A			   asl
    77 2057 85 8B		   sta _s2___7
    78 2059 A9 00		   lda #0
    79 205B 2A			   rol
    80 205C 85 8C		   sta _s2___7+1
    81 205E A5 34		   lda _TEMPW2
    82 2060 85 89		   sta _s2__k
    83 2062 A5 35		   lda _TEMPW2+1
    84 2064 85 8A		   sta _s2__k+1
    85 2066			_lbl5:
    86 				;### sieve_b.atl(23) 		flags(k/8) = flags(k/8) and maskx(k mod 8)
    87 2066 A5 89		   lda _s2__k
    88 2068 85 8D		   sta _s2___8
    89 206A A5 8A		   lda _s2__k+1
    90 206C 4A			   lsr
    91 206D 66 8D		   ror _s2___8+0
    92 206F 4A			   lsr
    93 2070 66 8D		   ror _s2___8+0
    94 2072 4A			   lsr
    95 2073 66 8D		   ror _s2___8+0
    96 2075 85 8E		   sta _s2___8+1
    97 2077 A5 89		   lda _s2__k
    98 2079 85 8F		   sta _s2___9
    99 207B A5 8A		   lda _s2__k+1
   100 207D 4A			   lsr
   101 207E 66 8F		   ror _s2___9+0
   102 2080 4A			   lsr
   103 2081 66 8F		   ror _s2___9+0
   104 2083 4A			   lsr
   105 2084 66 8F		   ror _s2___9+0
   106 2086 85 90		   sta _s2___9+1
   107 2088 A5 89		   lda _s2__k
   108 208A 29 07		   and #7
   109 208C AA			   tax
   110 208D A9 7F		   lda #<flags
   111 208F 85 80		   sta _arr
   112 2091 A9 21		   lda #>flags
   113 2093 18			   clc
   114 2094 65 90		   adc _s2___9+1
   115 2096 85 81		   sta _arr+1
   116 2098 A4 8F		   ldy _s2___9+0
   117 209A B1 80		   lda (_arr),y
   118 209C 85 98		   sta _18
   119 209E BD 77 21		   lda maskx,x
   120 20A1 85 9A		   sta _20
   121 20A3 A5 98		   lda _18
   122 20A5 25 9A		   and _20
   123 20A7 85 9B		   sta _21
   124 20A9 A9 21		   lda #>flags
   125 20AB 18			   clc
   126 20AC 65 8E		   adc _s2___8+1
   127 20AE 85 81		   sta _arr+1
   128 20B0 A4 8D		   ldy _s2___8+0
   129 20B2 A5 9B		   lda _21
   130 20B4 91 80		   sta (_arr),y
   131 20B6 A5 89		   lda _s2__k
   132 20B8 18			   clc
   133 20B9 65 8B		   adc _s2___7+0
   134 20BB 85 89		   sta _s2__k
   135 20BD A5 8A		   lda _s2__k+1
   136 20BF 65 8C		   adc _s2___7+1
   137 20C1 85 8A		   sta _s2__k+1
   138 20C3 C9 20		   cmp #32
   139 20C5 90 9F		   jcc _lbl5
   140 20C7 D0 06		   jne _lbl10
   141 20C9 A5 89		   lda _s2__k
   142 20CB C9 00		   cmp #0
   143 20CD 90 97		   jcc _lbl5
   144 20CF			_lbl10:
   145 20CF A5 86		   lda _s1__i
   146 20D1 18			   clc
   147 20D2 69 02		   adc #2
   148 20D4 85 86		   sta _s1__i
   149 20D6 C9 01		   cmp #1
   150 20D8 F0 03 4C 2B 20	   jne _lbl6
   151 				;### sieve_b.atl(25) count = 1
   152 20DD A9 01		   lda #1
   153 20DF 85 82		   sta count
   154 20E1 A9 00		   lda #0
   155 20E3 85 83		   sta count+1
   156 				;### sieve_b.atl(26) for k:3..8192 step 2 where (flags(k/8) and mask(k mod 8) <> 0) 
   157 20E5 A9 03		   lda #3
   158 20E7 85 91		   sta _s3__k
   159 20E9 A9 00		   lda #0
   160 20EB 85 92		   sta _s3__k+1
   161 20ED			_lbl8:
   162 20ED A5 91		   lda _s3__k
   163 20EF 85 93		   sta _s3___12
   164 20F1 A5 92		   lda _s3__k+1
   165 20F3 4A			   lsr
   166 20F4 66 93		   ror _s3___12+0
   167 20F6 4A			   lsr
   168 20F7 66 93		   ror _s3___12+0
   169 20F9 4A			   lsr
   170 20FA 66 93		   ror _s3___12+0
   171 20FC 85 94		   sta _s3___12+1
   172 20FE A5 91		   lda _s3__k
   173 2100 29 07		   and #7
   174 2102 AA			   tax
   175 2103 A9 7F		   lda #<flags
   176 2105 85 80		   sta _arr
   177 2107 A9 21		   lda #>flags
   178 2109 18			   clc
   179 210A 65 94		   adc _s3___12+1
   180 210C 85 81		   sta _arr+1
   181 210E A4 93		   ldy _s3___12+0
   182 2110 B1 80		   lda (_arr),y
   183 2112 85 99		   sta _19
   184 2114 BD 6F 21		   lda mask,x
   185 2117 25 99		   and _19
   186 2119 C9 00		   cmp #0
   187 211B F0 06		   jeq _lbl11
   188 				;### sieve_b.atl(27) 		inc count
   189 211D E6 82		   inc count+0
   190 211F D0 02		   jne _lbl11
   191 2121 E6 83		   inc count+1
   192 2123			_lbl11:
   193 2123 A5 91		   lda _s3__k
   194 2125 18			   clc
   195 2126 69 02		   adc #2
   196 2128 85 91		   sta _s3__k
   197 212A 90 02		   jcc _lbl12
   198 212C E6 92		   inc _s3__k+1
   199 212E			_lbl12:
   200 212E A5 91		   lda _s3__k
   201 2130 C9 01		   cmp #1
   202 2132 D0 B9		   jne _lbl8
   203 2134 A5 92		   lda _s3__k+1
   204 2136 C9 20		   cmp #32
   205 2138 D0 B3		   jne _lbl8
   206 				;### sieve_b.atl(29) t = rtclock2 * 256 + rtclock1
   207 213A A9 00		   lda #0
   208 213C 18			   clc
   209 213D 65 14		   adc rtclock1
   210 213F 85 95		   sta t
   211 2141 A5 13		   lda rtclock2
   212 2143 69 00		   adc #0
   213 2145 85 96		   sta t+1
   214 				;### sieve_b.atl(31) "[count] prime numbers in [t] ticks"
   215 2147 20 7F 41		   jsr _std_print_out
   216 214A 82 82 00		   dta b(130),a(count)
   217 214D 12 20 70 72 69 6D +    dta b(18),c' prime numbers in '
   218 2160 82 95 00		   dta b(130),a(t)
   219 2163 06 20 74 69 63 6B +    dta b(6),c' ticks'
   220 216A 80			   dta b(128)
   221 216B 00			   dta b(0)
   222 216C			_lbl13:
   223 216C 4C 6C 21		   jmp _lbl13
   224 216F			mask:
   225 				;### sieve_b.atl(8) 	mask:array(0..7) = 1,2,4,8,16,32,64,128
   226 216F 01			   dta b(1)
   227 2170 02			   dta b(2)
   228 2171 04			   dta b(4)
   229 2172 08			   dta b(8)
   230 2173 10			   dta b(16)
   231 2174 20			   dta b(32)
   232 2175 40			   dta b(64)
   233 2176 80			   dta b(128)
   234 2177			maskx:
   235 				;### sieve_b.atl(9) 	maskx:array(0..7) = %1111__1110,%1111__1101,%1111__1011,%1111__0111,%1110__1111,%1101__1111,%1011__1111,%0111__1111
   236 2177 FE			   dta b(254)
   237 2178 FD			   dta b(253)
   238 2179 FB			   dta b(251)
   239 217A F7			   dta b(247)
   240 217B EF			   dta b(239)
   241 217C DF			   dta b(223)
   242 217D BF			   dta b(191)
   243 217E 7F			   dta b(127)
   244 217F			flags:
   245 = 217F			   .ds 8192
   246 417F			   icl 'C:\Users\Rudla\Projects\atalan\src\platform\atari\atari.asm'
Source: C:\Users\Rudla\Projects\atalan\src\platform\atari\atari.asm
     1 				;********************************************************
     2 				;
     3 				;  ATALAN Atari standard library
     4 				;
     5 				;  Parts of code have been taken from Effectus library.
     6 				;
     7 				;********************************************************
     8
     9
    10 				;Noname
    11 				;651-655         028B-028F
    12 				;
    13 				;More spare bytes that you shouldn't use because future versions of the OS might use them. 
    14 				;Locations 651 and 652 are already used by version "B" as part of the interrupt handler routines.
    15
    16 				;OS registers we use as temporary:
    17 				;
    18 				;BUFRLO,BUFRHI   50,51 $32,$33
    19 				;BFENLO,BFENHI   52,53 $34,$35
    20
    21 				;ADRESS  100,101   $64,$65  A temporary storage location used by the display handler for so many things that it made my mind spin and I forgot what they were.
    22 				;MLTTMP  102,103   $66,$67  More temporary storage, with aliases OPNTMP and TOADR.
    23 				;SAVADR  104,105   $68,$69  Also know as FRMADR. Also used for temporary storage. 
    24 				;                           Also not significant enough to explain (look at the OS listing if, for some reason, you really care).
    25
    26 				;Registers used when drawing line
    27 				;ROWAC   112,113   $70,$71
    28 				;COLAC   114,115   $72,$73
    29 				;ENDPT   116,117   $74,$75
    30 				;COUNTR  126,127   $7E,$7F  COUNTR tells how many points have to be plotted before the line is finished.
    31
    32 = 0653			_putchr_proc_adr = $653  ;+$654 
    33 = 0032			?argptr =   $32		;$33
    34 = 0034			?varptr	=	$34
    35 = 0015			?size	=	$15		;15		//$16 BUFADR
    36 = 0038			?aux2	=	$38
    37 = 0039			?aux	=	$39
    38
    39 				;Following assigns are defined by mc6502.atl
    40
    41 = 0032			_TW1 = $32	;$33  mc6502.atl defines these labels as _TEMPW1, _TEMPW2.
    42 = 0034			_TW2 = $34  ;$35
    43 = 0015			_TW3 = $15	;$16
    44 = 0070			_TL1 = $70	;four byte register ($70-$73) defined under name _TEMPL1 in mc6502.atl		
    45
    46 = 0600			_stdbuf    = $600		;TODO: use LINBUF ($247-$26E)  (100,101 can point to it)
    47
    48 				;Argument list:
    49 				;	0	end of list
    50 				;	1..127  Constant string
    51 				;   128     EOL
    52 				;   129     one byte integer reference
    53 				;	130     two byte integer reference
    54 				;	131     three byte integer eference
    55 				;	132     four byte integer reference
    56
    57 417F			_std_print_adr .proc
    58
    59 						lda #<_adr_putchr
    60 						sta _putchr_proc_adr
    61 						lda #>_adr_putchr
    62 						sta _putchr_proc_adr+1
    63 						clc
    64 						bcc _std_print
    65 						.endp
    66 						
    67 417F			_std_print_out .proc
    68 417F-428C> A9 DF				lda #<_out_putchr
    69 4181 8D 53 06				sta _putchr_proc_adr
    70 4184 A9 41				lda #>_out_putchr
    71 4186 8D 54 06				sta _putchr_proc_adr+1
    72 4189 18					clc											;TODO: No Jump, if we are directly before the _std_print
    73 418A 90 00				bcc _std_print
    74 						.endp
    75 						
    76 418C			_std_print	.proc
    77
    78 						;Get address of argument from stack
    79 418C 68					pla
    80 418D 85 32				sta ?argptr
    81 418F 68					pla
    82 4190 85 33				sta ?argptr+1
    83 4192 20 D0 41				jsr _read_byte	;just skip next byte (that is part of return address)
    84
    85 						;Read command from input				
    86 4195			command
    87 4195 20 D0 41				jsr _read_byte
    88 4198 85 15				sta ?size
    89 419A A8					tay				; to set the flags
    90 419B F0 2F				beq done		;command 0 means end of sequence
    91 419D 10 21				bpl str			;1..127 constant string
    92
    93 						;Write n-byte integer variable
    94
    95 419F 29 7F				and #$7f
    96 				;		sec
    97 				;		sbc #128
    98 41A1 85 15				sta ?size
    99 41A3 F0 13				beq eol
   100
   101 41A5 20 D0 41				jsr _read_byte
   102 41A8 85 34				sta ?varptr		
   103 41AA 20 D0 41				jsr _read_byte
   104 41AD 85 35				sta ?varptr+1
   105
   106 41AF 20 34 42				jsr _std_bin_to_bcd
   107 41B2 20 EA 41				jsr _std_print_hex
   108 41B5 18					clc
   109 41B6 90 DD				bcc command		;jmp command
   110 41B8			eol
   111 41B8 A9 9B				lda #155	
   112 41BA 20 DB 41				jsr _std_putchr
   113 41BD 18					clc
   114 41BE 90 D5				bcc command		;jmp command
   115 						;Write constant string (size is 1..127, already stored)
   116 									
   117 41C0			str
   118 41C0 20 D0 41				jsr _read_byte
   119 41C3 20 DB 41				jsr _std_putchr
   120 41C6 C6 15				dec ?size
   121 41C8 D0 F6				bne str
   122 41CA F0 C9				beq	command
   123 										
   124 41CC			done		
   125 41CC 6C 32 00				jmp (?argptr)	
   126 41CF 60					rts
   127 						
   128 41D0			_read_byte
   129 41D0 A0 00				ldy #0
   130 41D2 B1 32				lda (?argptr),y
   131 41D4 E6 32				inc ?argptr
   132 41D6 D0 02				bne skip
   133 41D8 E6 33				inc ?argptr+1
   134 41DA			skip
   135 41DA 60					rts
   136 				.endp
   137
   138 				;_std_eol .proc
   139 				;	lda #155	
   140 				;.endp
   141
   142 				;BEWARE!!! _std_eol continues directly to _std_putchr
   143
   144 41DB			_std_putchr .proc
   145 41DB 6C 53 06				jmp (_putchr_proc_adr)
   146 41DE 60					rts
   147 				.endp
   148
   149 41DF			_adr_putchr .proc
   150 				;Write byte to address specified by _arr and increment the address by 1.
   151 					
   152 					;Convert ASCII to ATARI character screen code
   153 					;
   154 					;The rules are following:
   155 					;0..31   +64
   156 					;32..95  -32
   157 					;96..127 0  (codes are same)
   158 					 	
   159 					tax
   160 					rol 
   161 					rol 
   162 					rol 
   163 					rol
   164 					and #3
   165 					tay
   166 					txa
   167 					eor tbl,y
   168 					
   169 					;write the char to specified address	
   170 					ldy #0
   171 					sta (_arr),y
   172
   173 					inc _arr
   174 					bne skip1
   175 					inc _arr+1
   176 41DF			skip1
   177 					rts
   178
   179 41DF			tbl	dta b(%01000000)		;%0 00 00000		00..31	+64
   180 						dta b(%00100000)		;%0 01 00000		32..63	-32
   181 						dta b(%01100000)		;%0 10 00000    64..95  -32
   182 						dta b(%00000000)		;%0 11 00000    96..127 0
   183 					
   184 				.endp
   185
   186 41DF			_out_putchr .proc
   187 				;Write character from A to output.
   188 					
   189 41DF AA					tax
   190 41E0 AD 47 03				lda $347	;ICPUTB+1
   191 41E3 48					pha
   192 41E4 AD 46 03				lda $346	;ICPUTB
   193 41E7 48					pha
   194 41E8 8A					txa
   195 41E9 60					rts
   196
   197 				.endp
   198
   199 41EA			.proc _std_print_hex
   200 				;Print hexadecimal number of arbitrary length (?size). 
   201 				;Leading zeroes are not printed.
   202 				;In:
   203 				;	?varptr		Pointer to memory containing the number
   204 				;	?size		  Number of bytes to print
   205 				;Uses:
   206 				;	?aux
   207 				;	?aux2
   208 					
   209 41EA A5 15				lda ?size
   210 41EC 85 39				sta ?aux
   211 41EE A9 00				lda #0
   212 41F0 85 38				sta ?aux2		; number of non-zero digits on output
   213 41F2 F0 12				beq _loop
   214 41F4			_outbyte
   215 41F4 A4 39				ldy ?aux		
   216 41F6 B1 34				lda (?varptr),y
   217 41F8 48					pha
   218 41F9 4A					lsr
   219 41FA 4A					lsr
   220 41FB 4A					lsr
   221 41FC 4A					lsr
   222 41FD 20 14 42				jsr _write_digit
   223 					
   224 4200 68					pla
   225 4201 29 0F				and #$0f
   226 4203 20 14 42				jsr _write_digit
   227 4206			_loop	
   228 4206 C6 39				dec ?aux
   229 4208 10 EA				bpl _outbyte
   230 						
   231 						;If no character has been written, write at least one 0		
   232 420A A5 38				lda ?aux2
   233 420C D0 05				bne _no_empty
   234 420E A9 30				lda #48
   235 4210 20 DB 41				jsr _std_putchr
   236 4213			_no_empty
   237 				 
   238 4213 60					rts
   239 					
   240 4214			_write_digit
   241 				;In: a 4 bit digit
   242
   243 4214 AA					tax
   244 4215 D0 04				bne _non_zero
   245 4217 A5 38				lda ?aux2
   246 4219 F0 08				beq _done		;this is zero and there has been no char before - no output
   247 421B			_non_zero
   248 421B BD 24 42				lda hex,x
   249 421E 20 DB 41				jsr _std_putchr
   250 4221 E6 38				inc ?aux2
   251 4223			_done
   252 4223 60					rts
   253
   254 4224 30 31 32 33 34 35 + hex     dta c"0123456789ABCDEF"
   255
   256 				.endp
   257
   258 4234			.proc _std_bin_to_bcd
   259 				;Convert binary number to BCD. 
   260 				;Arbitrary size (up to 127 bytes) are supported.
   261 				;In:
   262 				;	?varptr	pointer to binary number
   263 				;	?size	number of bytes
   264 				;Out:
   265 				;	?size	on output, returns size of resulting bcd number
   266 				;   ?varptr	on output, containg pointer to converted BCD
   267 				;Uses:
   268 				;	_stdbuf
   269 				;	?aux
   270 				;	?aux2
   271
   272 						;Compute size of resulting number 
   273 4234 A4 15				ldy ?size
   274 4236 84 39				sty ?aux		; used to count later
   275 4238 C8					iny				;add space to result
   276 4239 84 15				sty ?size
   277 						
   278 						;Zero the destination buffer
   279 423B A9 00				lda #0
   280 423D 99 FF 05		zero	sta _stdbuf-1,y
   281 4240 88					dey
   282 4241 D0 FA				bne zero
   283 						
   284 						;**** We convert the number byte a time
   285 4243 F8					sed
   286 						
   287 						;?aux = varptr(?aux)
   288 4244			bytes
   289 4244 C6 39				dec ?aux
   290 4246 A4 39				ldy ?aux
   291 4248 B1 34				lda (?varptr),y		
   292 424A 85 38				sta ?aux2
   293 424C 38					sec				;set top bit to 1
   294 424D B0 12				bcs loop		
   295
   296 424F			shift_byte			
   297 424F A2 00				ldx #0
   298 4251 A4 15				ldy ?size
   299 4253			bcd_mul2
   300 4253 BD 00 06				lda _stdbuf,x
   301 4256 7D 00 06				adc	_stdbuf,x			;buf2(x) = buf2(x) * 2 + carry
   302 4259 9D 00 06				sta _stdbuf,x
   303 425C E8					inx
   304 425D 88					dey
   305 425E D0 F3				bne bcd_mul2
   306 							
   307 4260 18					clc
   308 4261 26 38		loop	rol ?aux2		;divide by two, if result is 0, end
   309 4263 D0 EA				bne shift_byte		
   310 						
   311 4265 A5 39				lda ?aux
   312 4267 D0 DB				bne bytes
   313 4269 D8					cld		
   314 						
   315 426A A9 00				lda #<_stdbuf
   316 426C 85 34				sta ?varptr	
   317 426E A9 06				lda #>_stdbuf
   318 4270 85 35				sta ?varptr+1	
   319 4272 60					rts
   320
   321 				.endp
   322 				 
   323 				/*
   324 				  Mul8 - 8-bit multiplication routine
   325 				  
   326 				  Original source:
   327 				  Book Atari Roots (Chapter Ten - Assembly Language Math)
   328 				  Hyperlink: http://www.atariarchives.org/roots/chapter_10.php
   329 				  
   330 				  Parameters:
   331 					  a First multiplicant
   332 					  x Second multiplicant
   333 				  Result: 
   334 						TEMPW2,TEMPW2+1	high byte of the result
   335 				*/
   335
   336
   337 4273			_sys_mul8  .proc
   338
   339 = 0032			MUL1 = _TW1
   340 = 0033			MUL2 = _TW1+1
   341 = 0034			RES  = _TW2		;_TW2+1
   342
   343 4273 85 32				sta MUL1			;input comes in A and X
   344 4275 86 33				stx MUL2
   345 						
   346 4277 A9 00				lda #0			;RES = 0
   347 4279 85 34				sta RES
   348 						
   349 427B A2 08				ldx #8  
   350 427D			loop
   351 427D 46 32				lsr MUL1		;MUL1 = MUL1 / 2
   352 427F 90 03				bcc noadd
   353 						
   354 4281 18					clc					;RES = RES + (MUL2 * $ff)
   355 4282 65 33				adc MUL2	  
   356 4284			noadd 
   357 4284 6A					ror @				;RES = RES / 2		(Carry is 0, when there was no add)
   358 4285 66 34				ror RES
   359
   360 4287 CA					dex
   361 4288 D0 F3				bne loop
   362 						
   363 428A 85 35				sta RES+1
   364 428C 60					rts
   365
   366 						.endp
   367
   368 				/*
   369 				  Mul16 - 16-bit multiplication routine
   370 				    
   371 				  Parameters:
   372 					  _TW1 First multiplicant (we use only two bytes now)
   373 					  _TW2 Second multiplicant
   374 				  Result: 
   375 						_TL1 Result
   376 				*/
   376
   377
   378 428D			_sys_mul16  .proc
   379
   380 = 0032			MUL1 = _TW1
   381 = 0034			MUL2 = _TW2
   382 = 0070			RES  = _TL1
   383 						
   384 						lda #0      ;RES = 0;
   385 						sta RES
   386 						sta RES+1
   387 						sta RES+2
   388 						sta RES+3
   389 						
   390 						ldx #16  
   391 428D			loop
   392 						lsr MUL1+1		;MUL1 = MUL1 / 2
   393 						ror MUL1
   394 						bcc noadd
   395 						
   396 						lda RES+2			;RES = RES + (MUL2 * $ffff)  (only upper half) 
   397 						clc		
   398 						adc MUL2
   399 						sta RES+2
   400 						lda RES+3
   401 						adc MUL2+1
   402 						sta RES+3
   403 428D			noadd
   404 						ror RES+3				;RES = RES / 2		(Carry is 0, when there was no add)
   405 						ror RES+2
   406 						ror RES+1
   407 						ror RES+0
   408 						 
   409 						dex
   410 						bne loop
   411 						
   412 						rts
   413
   414 						.endp
   415 				 
   416 				/*
   417 				  Div8 - 8-bit division routine
   418 				 
   419 				  Original source:
   420 				  Book Atari Roots (Chapter Ten - Assembly Language Math)
   421 				  Hyperlink: http://www.atariarchives.org/roots/chapter_10.php
   422 				 
   423 				  Parameters:
   424 				  _TEMPW1		16-bit dividend
   425 				  a					 p1_math:  8-bit divisor
   426 				  x          number of bits of an divisir (8 max)
   427 				 
   428 				  Result:
   429 				  x STORE1: 8-bit quotient
   430 				  a STORE2: 8-bit remainder
   431 				*/
   431
   432
   433 428D			_sys_div8  .proc
   434 				  ldx #08  ; For an 8-bit divisor
   435 					
   436 428D			_sys_div
   437
   438 = 0034			divisor  = _TW2
   439 = 0035			quotient = _TW2+1
   440
   441 				  sta divisor
   442 					lda #0     				; for non-8 divis
   443 					sta quotient
   444 				  lda _TW1+1
   445 				  sec 
   446 				  sbc divisor
   447 428D			dloop 
   448 				  php  					; The loop that divides 
   449 				  rol quotient
   450 				  asl _TW1
   451 				  rol @
   452 				  plp
   453 				  bcc addit
   454 				  sbc divisor
   455 				  jmp next
   456 428D			addit 
   457 				  adc divisor
   458 428D			next  
   459 				  dex
   460 				  bne dloop
   461 				  bcs fini
   462 				  adc divisor
   463 				  clc
   464 428D			fini
   465 					tax            ; x = remainder
   466 				  lda quotient   ; a = quotient
   467 				  rol
   468 				  rts
   469 				 
   470 				  .endp
   471
