Convierte un numero de línea a binario ($AF67-$AF88)Esta función toma caracteres de la línea BASIC y los convierte en un valor entero, para lo cual al código del carácter que ya viene leído le resta el del "0" obteniendo 0-9 y lo almacena en CHARAC.
Luego compara el valor del byte mas alto del acumulador anterior con 24 que es el máximo que puede contener este acumulado para el byte alto, ya que 25*256 mas la multiplicación por 10 que hará luego da 64000, esto es 25*256=6400 que por 10 da 64000 por lo tanto no puede ser mayor de 24 y si es mayor da 'SYNTAX ERROR" y termina, si no, multiplica el acumulado por 10 y suma el valor guardado del ultimo carácter y continua sumando otro carácter.
El CPU tiene una instrucción de multiplicación pero solo de 2 valores de 8 bits.
La forma de multiplicar por 10 es usar shift binario a la izquierda 2 veces que multiplica por 4, luego suma el valor original para completar 5 veces y luego otro shift a la izquierda para completar el por 10, se asegura de activar el flag de acarreo de la multiplicación a la suma.
ENTRADAS: Necesita venir activado el acarreo si no es numérico el dato en A, esta es la forma normal de pasar valores leídos en línea.
SALIDAS: Se obtiene el número entero en BINVAL, Retorna si hay CARRY (si es distinto de numérico) y si es mayor de 63999 sale al basic con ‘SYNTAX’ ERROR. También previene que el acarreo de la multiplicación mas la suma del ultimo carácter este correcto aunque no veo para que puede servir ya que el el valor nunca llega a 64000 y por supuesto no pasara de 65536 simplemente sumando 0-9.
USA: Usa la variable CHARAC para almacenaje del ultimo valor leído.
PRECAUCIONES: No inicializa el acumulado V01 si usa LAF6B, Se puede inicializar en la rutina AF67
Código: Seleccionar todo
2192 AF67 9E 8A LAF67 LDX ZERO DEFAULT LINE NUMBER OF ZERO
2193 AF69 9F 2B STX BINVAL SAVE IT IN BINVAL
2194 *
2195 * CONVERT LINE NUMBER TO BINARY - RETURN VALUE IN BINVAL
2196 *
2197 AF6B 24 61 LAF6B BCC LAFCE RETURN IF NOT NUMERIC CHARACTER
2198 AF6D 80 30 SUBA #'0 MASK OFF ASCII
2199 AF6F 97 01 STA CHARAC SAVE DIGIT IN VO1
2200 AF71 DC 2B LDD BINVAL GET ACCUMULATED LINE NUMBER VALUE
2201 AF73 81 18 CMPA #24 LARGEST LINE NUMBER IS $F9FF (63999) -
2202 * (24*256+255)*10+9
2203 AF75 22 DB BHI LAF52 ‘SYNTAX’ ERROR IF TOO BIG
2204 * MULT ACCD X 10
2205 AF77 58 ASLB *
2206 AF78 49 ROLA * TIMES 2
2207 AF79 58 ASLB =
2208 AF7A 49 ROLA = TIMES 4
2209 AF7B D3 2B ADDD BINVAL ADD 1 = TIMES 5
2210 AF7D 58 ASLB *
2211 AF7E 49 ROLA * TIMES 10
2212 AF7F DB 01 ADDB CHARAC ADD NEXT DIGIT
2213 AF81 89 00 ADCA #0 PROPAGATE CARRY
2214 AF83 DD 2B STD BINVAL SAVE NEW ACCUMULATED LINE NUMBER
2215 AF85 9D 9F JSR GETNCH GET NEXT CHARACTER FROM BASIC
2216 AF87 20 E2 BRA LAF6B LOOP- PROCESS NEXT DIGIT