* 37 rotulos ocupando 403 bytes. * 1 *; Programa para calcular o valor de Pi com 80 casas decimais. * 2 *; * 3 *; Algoritmo empregado: Pi = 6 * arco seno 0.5 * 4 *; * 5 *; O arco seno 0.5 e' calculado realizando o somatorio * 6 *; dos primeiros termos da serie de Taylor da funcao * 7 *; arco seno aplicado no ponto 0.5. * 8 *; * 9 *; Os termos dessa serie infinita tem a seguinte forma geral: * 10 *; 1 * 3 * 5 *....( 2 * n - 1 ) * 11 *; ---------------------------------------------------------------- * 12 *; ( 2 * 4 * 6 *....( 2 * n ) ) * ( 2 * n + 1 ) * 2 ^ ( 2 * n + 1 ) * 13 *; * 14 *; Agrupando-se esses termos nos seguintes fatores: * 15 *; 1 * 3 * 5 *....( 2 * n - 1 ) 1 * 16 *; ------------------------------------------------ e --------- * 17 *; ( 2 * 4 * 6 *....( 2 * n ) ) * 2 ^ ( 2 * n + 1 ) 2 * n + 1 * 18 *; constata-se que: * 19 *; a razao do primeiro fator entre 2 * n - 1 * 20 *; os termos de ordem n-1 e n e': --------------- * 21 *; 1 2^2 * ( 2 * n ) * 22 *; o segundo fator ( --------- ) e' trivial. * 23 *; 2 * n + 1 * 24 *; * 25 *; Dessa forma, o primeiro fator de cada um dos termos * 26 *; ( denominado X ) e' calculado a partir do primeiro fator * 27 *; do termo anterior multiplicado por 2 * n - 1, * 28 *; dividido o resultado obtido por 2 * n e, finalmente, * 29 *; dividindo esse resultado por 4. * 30 *; * 31 *; Assim, cada um dos termos da serie e' calculado dividindo o * 32 *; primeiro fator correspondente a esse termo por 2 * n + 1. * 33 *; * 34 *; Para estimar o erro decorrente do fato de serem empregados * 35 *; apenas um numero finito de termos da serie observamos que, * 36 *; para valores grandes de n, o segundo fator dos termos da * 37 *; serie decresce muito lentamente e a razao entre o valor do * 38 *; primeiro fator ( X ) de dois termos consecutivos ( que e' * 39 *; sempre menor que 1/4 ), tende a 1/4. * 40 *; * 41 *; Portanto pode-se empregar como limite superior do valor do erro * 42 *; o somatorio dos valores de uma PG de razao 1/4. * 43 *; * 44 *; Outra fonte de erro e' o truncamento, causado pelo fato de ser * 45 *; empregada uma representacao de tamanho finito para o termos * 46 *; da serie. Assim, deve-se admitir que pode haver um erro de * 47 *; ate' uma unidade em cada uma das parcelas do somatorio, * 48 *; causando um erro total igual ao numero de parcelas. * 49 *; * 50 *; Por razoes de facilidade de implementacao, a variavel N armazena * 51 *; realmente o valor de 2 * N e o valor de N foi limitado a 127. * 52 *; 0024 * 53 *TamNum: equ 36 ; Numeros de 36 bytes = . FFDC * 54 *Pi: equ -TamNum ; Apenas 34 bytes sao uteis: FFDB * 55 *N: equ Pi-1 ; 272bits >> 81 algarismos. FFB7 * 56 *X: equ N-TamNum 1000 * 57 * org 1000H 1000: 29 00 00 * 58 *Inicio: mov SP,0 1003: 40 49 00 * 59 * mov AB,-X 1006: 50 * 60 *Limpa: Push A ; Cria e zera Pi, N e X 1007: F1 FD * 61 * Loop B,Limpa 1009: 09 DA FF 03 * 62 * mov [X+TamNum-1],3 ; X := 3; { 6 * arcsin ( 0.5 ) } 100D: 61 * 63 *Repete: inc A ; inc ( N ); 100E: 0A DB FF * 64 * mov [N],A 1011: 48 24 00 * 65 *PilXdivN: mov CD,TamNum ; Pilha := X / N; 1014: 02 * 66 * mov A,C 1015: 18 B6 FF * 67 *PilDivN: mov B,[X+CD-1] 1018: 56 * 68 * push D 1019: 34 DB FF * 69 * mov D,[N] 101C: D2 * 70 * div AB,D 101D: 57 * 71 * pop D 101E: 52 * 72 * push B ; empilha o quociente; 101F: F3 F4 * 73 * Loop D,PilDivN 1021: 10 24 * 74 *SomaaPi: mov B,TamNum ; Pi := Pi + Pilha; 1023: 48 DC FF * 75 * mov CD,Pi 1026: FB * 76 * clc 1027: 51 * 77 *Soma: pop A ; desempilha o quociente; 1028: 52 * 78 * push B 1029: 17 * 79 * mov B,[CD] 102A: 8B * 80 * adc A,B 102B: 2A * 81 * mov [CD],A 102C: 53 * 82 * pop B 102D: 7F * 83 * inc CD 102E: F1 F7 * 84 * Loop B,Soma 1030: 00 00 * 85 *XmulN: mov A,0 ; X := X * N; 1032: 48 B7 FF * 86 * mov CD,X 1035: 17 * 87 *MultN: mov B,[CD] 1036: 56 * 88 * push D 1037: 34 DB FF * 89 * mov D,[N] 103A: 50 * 90 * push A 103B: 01 * 91 * mov A,B 103C: D0 * 92 * mul A,D 103D: 57 * 93 * pop D 103E: B9 * 94 * add B,D 103F: 83 00 * 95 * adc A,0 1041: 57 * 96 * pop D 1042: 2C * 97 * mov [CD],B 1043: 7F * 98 * inc CD 1044: 13 * 99 * mov B,D 1045: A4 DB * 100 * cmp B,X+TamNum 1047: E4 EC * 101 * jnz multN 1049: 04 DB FF * 102 * mov A,[N] ; inc ( N ); 104C: 61 * 103 * inc A 104D: 0A DB FF * 104 * mov [N],A 1050: DC 27 * 105 * jz Terminou 1052: 48 24 00 * 106 *XdivN: mov CD,TamNum ; X := X / N; 1055: 02 * 107 * mov A,C 1056: 18 B6 FF * 108 *DivN: mov B,[X+CD-1] 1059: 56 * 109 * push D 105A: 34 DB FF * 110 * mov D,[N] 105D: D2 * 111 * div AB,D 105E: 57 * 112 * pop D 105F: 2D B6 FF * 113 * mov [X+CD-1],B 1062: F3 F2 * 114 * Loop D,DivN 1064: 48 24 00 * 115 *Xdiv4: mov CD,TamNum 1067: 02 * 116 * mov A,C 1068: 18 B6 FF * 117 *DivX4: mov B,[X+CD-1] ; X := X / 4; 106B: 77 * 118 * rr AB 106C: 77 * 119 * rr AB 106D: 66 * 120 * rl A 106E: 66 * 121 * rl A 106F: 2D B6 FF * 122 * mov [X+CD-1],B 1072: F3 F4 * 123 * Loop D,DivX4 1074: 04 DB FF * 124 * mov A,[N] 1077: D5 94 * 125 * jr Repete 1079: 48 24 00 * 126 *Terminou: mov CD,TamNum ; X := X / 3; 107C: 02 * 127 * mov A,C ; Limite do somatorio dos termos 107D: 18 B6 FF * 128 *DivX3: mov B,[X+CD-1]; de P.G. com razao 1/4: 1080: 56 * 129 * push D ; 4/3 do primeiro termo. 1081: 30 03 * 130 * mov D,3 ; Como X eh o quadruplo do primeiro termo, 1083: D2 * 131 * div AB,D ; divido X por 3 para obter esse limite. 1084: 57 * 132 * pop D 1085: 2D B6 FF * 133 * mov [X+CD-1],B 1088: F3 F3 * 134 * Loop D,DivX3 108A: 48 B9 FF * 135 * mov CD,X+2 ; Correcao do erro para levar em conta o 108D: 07 * 136 * mov A,[CD] ; erro causado pelo truncamento: 108E: 81 80 * 137 * Add A,128 ; 1 unidade por cada uma 1090: 2A * 138 * mov [CD],A ; das 128 parcelas somadas. 1091: 48 02 11 * 139 *EscErro: Mov CD,ErroMax 1094: F5 1E 11 * 140 * Call EscCad 1097: 00 00 * 141 *Normaliza:mov A,0 1099: 61 * 142 *MultX10: inc A 109A: 50 * 143 * push A 109B: 00 00 * 144 * mov A,0 109D: 48 B7 FF * 145 * mov CD,X 10A0: F5 25 11 * 146 *Mult10X: call Mul10AddA 10A3: 7F * 147 * inc CD 10A4: 13 * 148 * mov B,D 10A5: A4 DC * 149 * cmp B,X+TamNum+1 10A7: E4 F7 * 150 * jnz Mult10X 10A9: 84 00 * 151 * cmp A,0 10AB: E4 03 * 152 * jnz EscX 10AD: 51 * 153 * pop A 10AE: D5 E9 * 154 * jr MultX10 10B0: 81 30 * 155 *EscX: add A,"0" 10B2: 3D * 156 * out A 10B3: 00 2C * 157 * mov A,"," 10B5: 3D * 158 * out A 10B6: 04 DB FF * 159 * mov A,[N] 10B9: 61 * 160 * inc A 10BA: 20 03 * 161 * mov C,3 10BC: 30 0A * 162 * mov D,10 10BE: D0 * 163 *AlgErro: mul A,D 10BF: 81 30 * 164 * add A,"0" 10C1: 3D * 165 * out A 10C2: 01 * 166 * mov A,B 10C3: F2 F9 * 167 * Loop C,AlgErro 10C5: 48 11 11 * 168 * mov CD,Expoente 10C8: F5 1E 11 * 169 * call EscCad 10CB: 53 * 170 * pop B 10CC: CB 25 00 * 171 * add SP,TamNum+1 ; elimina o X 10CF: 52 * 172 * push B ; N := numero de alg. apos a virgula. 10D0: 00 00 * 173 * mov A,0 10D2: 30 0A * 174 * mov D,10 10D4: 50 * 175 *EmpExp: push A 10D5: 00 00 * 176 * mov A,0 10D7: D2 * 177 * div AB,D 10D8: 81 30 * 178 * add A,"0" 10DA: ED F8 * 179 * jneqz B,EmpExp 10DC: 3D * 180 *EscExp: out A 10DD: 51 * 181 * pop A 10DE: EC FC * 182 * jneqz A,EscExp 10E0: 48 16 11 * 183 *EscPi: mov CD,PiEQ 10E3: F5 1E 11 * 184 * call EscCad 10E6: 53 * 185 * pop B ; Numero de algarismos apos aa virgula 10E7: A1 03 * 186 * add B,3 ; mais tres algarismos adicionais. 10E9: 00 00 * 187 *MulPi10: mov A,0 10EB: 4F * 188 * mov CD,SP 10EC: 52 * 189 * push B 10ED: F5 25 11 * 190 *Mult10Pi: Call Mul10AddA 10F0: 7F * 191 * inc cd 10F1: 13 * 192 * mov B,D 10F2: A4 FF * 193 * cmp B,Pi+TamNum-1 10F4: E4 F7 * 194 * jnz Mult10Pi 10F6: 81 30 * 195 * add A,"0" 10F8: 3D * 196 * out A 10F9: 53 * 197 * pop B 10FA: F1 ED * 198 * Loop B,MulPi10 10FC: 40 0A 0D * 199 * mov AB,0D0AH 10FF: 3F * 200 * out B 1100: 3D * 201 * out A 1101: FE * 202 * halt * 203 *; 1102: 0D 0A 45 72 * 204 *ErroMax: db 0DH, 0AH, "Erro maximo:", 0 1106: 72 6F 20 6D 61 78 69 6D 6F 3A 00 1111: 2A 31 30 5E * 205 *Expoente: db "*10^", 0 1115: 00 1116: 0D 0A 50 69 * 206 *PiEQ: db 0DH, 0AH, "Pi=3,", 0 111A: 3D 33 2C 00 111E: 07 * 207 *EscCad: mov A,[CD] 111F: 3D * 208 *EscLetra: out A 1120: 7F * 209 * inc CD 1121: 07 * 210 * mov A,[CD] 1122: EC FB * 211 * jneqz A,EscLetra 1124: FA * 212 * ret 1125: 17 * 213 *Mul10AddA:mov B,[CD] 1126: E9 0E * 214 * jeqz B,ElemZero 1128: 5E * 215 * push CD 1129: 50 * 216 * push A 112A: 00 00 * 217 * mov A,0 112C: 4E * 218 * mov CD,AB 112D: 74 * 219 * shl AB 112E: 74 * 220 * shl AB 112F: C3 * 221 * add AB,CD 1130: 74 * 222 * shl AB 1131: 57 * 223 * pop D 1132: C3 * 224 * add AB,CD 1133: 5F * 225 * pop CD 1134: 2C * 226 * mov [CD],B 1135: FA * 227 * ret 1136: 2A * 228 *ElemZero: Mov [CD],A 1137: 00 00 * 229 * mov A,0 1139: FA * 230 * ret * 231 * * Nenhum erro encontrado! * TABELA DE ROTULOS em ordem alfabetica * Valor Nome do rotulo * 10BEH: ALGERRO * 1056H: DIVN * 107DH: DIVX3 * 1068H: DIVX4 * 1136H: ELEMZERO * 10D4H: EMPEXP * 1102H: ERROMAX * 111EH: ESCCAD * 1091H: ESCERRO * 10DCH: ESCEXP * 111FH: ESCLETRA * 10E0H: ESCPI * 10B0H: ESCX * 1111H: EXPOENTE * 1000H: INICIO * 1006H: LIMPA * 1125H: MUL10ADDA * 10E9H: MULPI10 * 10EDH: MULT10PI * 10A0H: MULT10X * 1035H: MULTN * 1099H: MULTX10 * FFDBH: N * 1097H: NORMALIZA * FFDCH: PI * 1116H: PIEQ * 1015H: PILDIVN * 1011H: PILXDIVN * 100DH: REPETE * 1027H: SOMA * 1021H: SOMAAPI * 0024H: TAMNUM * 1079H: TERMINOU * FFB7H: X * 1064H: XDIV4 * 1052H: XDIVN * 1030H: XMULN ***Nome do arquivo objeto?