La Arquitectura 6502

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 17

Caractersticas tcnicas

[editar] Consola
y y y

y y

CPU: MOS Technology 6507 @ 1,19 MHz Procesador de audio y video: TIA. 160 x ~190 pxeles, 128 colores en pantalla pero con un mximo de 4 colores por lnea; sonido monoaural de dos vas. Memoria de lectura y escritura (RAM): 128 octetos en la consola dentro del chip MOS Technology 6532, si bien algunos juegos pueden aadir hasta 256 octetos integrados en el cartucho. Memoria de slo lectura (ROM): 4 KB por cartucho (o ms de 32KB si el cartucho usa paginacin de memoria). Entrada: controlada por el chip RIOT incluye: o Dos puertos DE-9 sin tornillos para conectar joysticks, paddles, trackballs, pedaleras, volantes, teclados numricos de 12 teclas (0-9, # y *) y cualquier otro tipo de control con funciones adicionales desarrollado por terceras compaas. Este tipo de puerto se convirti en un estandar de facto para la conexin de joysticks y gamepads, la llamada norma Atari que utilizaron una inmensa mayora de equipos de 8 bits en los ochenta, e incluso algunos de 16 bits: Sinclair ZX Spectrum, Amstrad CPC, Commodore 64, MSX, Master System y Mega Drive, entre muchos otros. o Seis interruptores: Encendido (encendido/apagado), seal de TV (monocromo/color), Nivel de dificultad para cada jugador (A/B), Select y Reset. Exceptuando al interruptor de encendido, los juegos podan (y lo hicieron) asignar otros significados a los dems interruptores. En los modelos que siguieron al original, los interruptores de dificultad fueron reducidos y trasladados a la parte trasera de la consola. Salida: Seal de video y audio para TV a travs de un conector RCA (con normas NTSC, PAL o SECAM dependiendo de la regin; los cartuchos de juegos pueden ser usados indistintamente entre mquinas NTSC y PAL/SECAM, pero si la norma no coincide entonces suelen aparecen colores distorsionados o la imagen no permanece estable).

[editar] Perifricos de terceras compaas


y y y

Starpath Supercharger, un cartucho con un conector para reproductor de casettes. Gameline Master Module, un mdem que permite descargar juegos y disfrutarlos durante una limitada cantidad de tiempo. CompuMate, un teclado de Spectravideo que la convierte en ordenador.

** La arquitectura 6502 El 6502 es un microprocesador de orientado a memoria del Motorola popularidad por su bajo precio y primeras computadoras personales 800. ** La simplicidad es la clave El 6502 maneja la informacin a travs de sus registros, los cuales pueden contener 1 byte (8 bits) de datos. Hay tres registros de uso general y dos de uso especial: Acumulador A: maneja toda la aritmtica y la lgica. Es el verdadero corazn del chip. Registros X e Y: limitadas capacidades. son registros de propsitos generales y con 8 bits que sigue la filosofa de diseo 6800. El 6502 apareci en 1975, ganando convirtindose en el corazn de las como Apple II, Comodore 64 y ATARI 400 y

S: Stack Pointer, putero al Stack Memory (Porcin de memoria que acta como una pila de datos) P: Processor Status. Mantiene el estado de las banderas y las pruebas del microprocesador. * Stack Pointer Cuando el microprocesador ejecuta una instruccin JSR (ir a subrutina), necesita saber dnde retornar cuando sta finalice. Esta informacin se encuentra en la porcin baja de memoria desde $0100 hasta $01FF y el stack pointer se utiliza como un offset. El stack se va llenando desde $10FF hacia abajo y permite una acumulacin de subrutinas de hasta 128 niveles. En casi todos los casos no representa un problema. * Processor Status No es posible acceder directamente a este registro pero existen muchas instrucciones que nos permiten comprobar el estado de sus banderas: bit -> 7 0 +---+---+---+---+---+---+---+---+ | N | V | | B | D | I | Z | C | <-- banderas, 0/1 = reset/set +---+---+---+---+---+---+---+---+ N = NEGATIVO. Se setea cuando el bit 7 del acumulador est en 1.

V = OVERFLOW. Se setea cuando la suma de dos nmeros con signo o la resta de dos nmeros sin signo producen un resultado mayor a +127 o menor a 128. B = COMANDO BRK. Se setea en cuando hay una interrupcin causada por el comando BRK (corte) y se resetea si fue causada por una interrupcin

externa. D = MODO DECIMAL. Se setea al activar el modo decimal.

I = DESACTIVACION DE IRQ. Se setea si las interrupciones enmascarables (maskables) estn desactivadas. Z = CERO. Se setea si el resultado de la ltima operacin (load/inc/dec/add/sub) fue cero. C = CARRY. Se setea si una suma produce acarreo, o si una resta necesita un bit de la izquierda. Tambin mantiene bits luego de una operacin shift (rol/ror/asl/lsr). * Acumulador ---------Casi todas las operaciones del acumulador utilizan el registro acumulador. Todas las sumas y restas se hacen con este registro. Tambin maneja la mayor parte de las operaciones de comparacin (es A > B ?) y de desplazamiento lgico de bits. * Registros X e Y --------------Son registros ndices generalmente usados como offsets a direcciones de memoria. Tambin sirven para contener valores y su importancia radica en los modos de direccionamiento que pueden emplear. * Modos de Direccionamiento ------------------------El 6502 tiene 13 modos de direccionamiento o vas de acceso a memoria. El 65C02 tiene dos modos ms. +---------------------+--------------------------+ | modo | formato en assembler | +=====================+==========================+ | Immediate | #aa | | Absolute | aaaa | | Zero Page | aa | | Implied | | | Indirect Absolute | (aaaa) | | Absolute Indexed,X | aaaa,X | | Absolute Indexed,Y | aaaa,Y | | Zero Page Indexed,X | aa,X | | Zero Page Indexed,Y | aa,Y | | Indexed Indirect | (aa,X) | | Indirect Indexed | (aa),Y | | Relative | aaaa | | Accumulator | A | +---------------------+--------------------------+

Nota: aa = 2 dgitos hexa como $FF aaaa = 4 dgitos hexa como $FFFF tambin pueden ser etiquetas como var1, var2, etc.

(Tabla 2-3. _6502 Software Design_, Scanlon, 1980) Immediate (Inmediato) --------------------El valor dado es el que usar inmediatamente la instruccin. Por ejemplo, LDA #$99 carga el valor $99 en el acumulador. Absolute (Absoluto) ------------------El valor dado es la direccion de memoria (de 16 bits) que contiene el valor de 8 bits que debe usar la instruccin. Por ejemplo, STA $3E32 almacena el valor que hay en el acumulador en la direccin $3E32. Zero Page (Pgina cero) ----------------------Las primeras 256 direcciones de memoria ($0000-00FF) se dice que estn en la pgina cero. Las siguientes 256 ($0100-01FF) estn en pgina 1, etc. Las instrucciones que usan pgina cero ahorran memoria ya que no utilizan el $00 la parte superior (high) de la direccin. Por ejemplo, LDA $0023 LDA $23 -- funciona pero utiliza un byte extra -- direccin en pgina cero

Implied (Implicado) -----------------Hay instrucciones que solo ocupan un byte y no hacen referencia a memoria. Se dice que estas instrucciones usan direccin implicadao tcita. Por ejemplo, CLC DEX TYA -- resetea el carry del processor status -- decrementa el registro X en 1 -- transfiere el registro Y al acumulador

Indirect Absolute (Absoluto Indirecto) -------------------------------------Slo es usado por la instruccin JMP (JuMP - salto). Toma la direccin dada y la usa como un puntero a la parte inferior (low) de una direccin en memoria, luego hace que el programa salte a esa direccin. Por ejemplo, JMP ($2345) ; salta a la direccin cuya parte inferior es el valor en $2345 y cuya parte superior es el valor en $2346 O sea, si $2345 contiene $EA y $2346 contiene $12 entonces la prxima instruccin a ejecutar es la que se encentra en $12EA. El 6502 utiliza las direcciones en formato low/high (parte inferior/parte superior).

Absolute Indexed (Absoluto Indexado) -----------------------------------La direccin final se obtiene tomando la direccin dada como base y sumando el valor contenido en el registro X o Y como offset. O sea, LDA $F453,X ; suponiendo que X contiene un 3

Carga el acumulador con el contenido de la direccin $F453 + 3 = $F456. Zero Page Indexed (Pgina Cero Indexada) ---------------------------------------Es lo mismo que el anterior pero la direccin dada est en la pgina cero, ahorrando un byte. Indexed Indirect (Indexado Indirecto) ------------------------------------La direccin de 16 bits se encuentra comenzando por la direccin dada ms el contenido del registro X. El valor es el contenido de esa direccin. Por ejemplo, LDA ($B4,X) ; suponiendo que X contiene un 6

Dada la direccin $B4 + 6 = $BA. Si $BA y $BB contienen $12 y $EE respectivamente, entonces la direccin final es $EE12. El valor en $EE12 es el que se carga en el acumulador. Indirect Indexed (Indirecto Indexado) ------------------------------------Se toma la direccin de 16 bits contenida en la direccin dada (y en la siguiente). Se suma el contenido del registro Y. Se toma el valor almacenado en esta nueva direccin. Por ejemplo, LDA ($B4),Y ; suponiendo que Y contiene 6

Si $B4 contiene $EE y $B5 contiene $12 entonces el valor en la direccin $12EE + Y (6) = $12F4 es la que se almacena en el acumulador. Relative (Relativo) ------------------El direccionamiento relativo es usado por las instrucciones de salto del 6502. El byte dado se usa como un offset con signo a partir de la direccin actual y el resultado es la direccin de la prxima instruccin a ejecutar. Por ejemplo, BNE $7F (saltar si la bandera zero est en reset)

aadir 127 a la direccin en que se encuentra el PC (program counter) en

ese momento (que es la direccin donde est la instruccin BNE $7F) y comienza la ejecucin de la instruccin contenida en esta nueva direccin. Similarmente, BEQ $F9 (saltar si la bandera zero est en set)

aadir -7 a la direccin en que se encuentra el PC en ese momento y comienza la ejecucin de la instruccin contenida en esta nueva direccin. Recordemos que si tomamos el bit 7 (el ms alto o high) de un byte como el signo (0= positivo; 1= negativo) entonces es posible tener nmeros en el rango -128 ($80) a +127 (7F). Si el bit 7 est seteado, o sea si el nmero is > $7F, es un salto negativo (hacia atrs en el programa). Qu tan lejos es el salto? Si el valor es < $80 (positivo), simplemente es esa cantidad de bytes. Si el valor es > $7F (negativo) entonces es el complemento de 2 del valor dado en la direccin negativa. Complemento de 2 ---------------El complemento de 2 de un nmero se obtine intercambiando todos los bits de 0 -> 1 y de 1 -> 0, y luego sumando 1. Entonces, $FF = + 1111 1111 0000 0000 1 --------0000 0001 <-- original <-- complemento de 1 <-- complemento de 2, por lo tanto $FF = -1

Notar que QForth usa esto para nmeros mayores a 32768 as que 65535 = -1 y 32768 = -32768. En la prctica, el programador utiliza una etiqueta y el ensamblador se preocupa por los clculos. Notar que los saltos de programa solo pueden ser a direcciones entre -128 y +127 bytes a partir de la direccin actual. El 6502 no permite saltos a una direccin absoluta. Accumulator (Acumulador) -----------------------Como el direccionamiento implicado, el objeto de la instruccin es el acumulador y no necesita ser especificado. ** Conjunto de instrucciones del 6502 ---------------------------------Hay 56 instrucciones en el 6502, y ms en el 65C02. Muchas instrucciones utilizan ms de un modo de direccionamiento y cada combinacin de modo instruccin/direccionamiento tiene un opcode particular hexadecimal que lo especifica exactamente. Entonces, A9 AD = = LDA #$aa LDA $aaaa Carga el acumulador en modo inmediato Carga el acumulador en modo absoluto

etc. Algunas instrucciones utilizan lgica binaria. Estas son AND, OR y EOR (OR exclusivo). Las siguientes tablas muestran el efecto de estas instrucciones: AND 1 1 0 0 1 1 0 0 1 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 -> -> -> -> -> -> -> -> -> -> -> -> 1 0 0 0 1 1 1 0 0 1 1 0 = "ambos"

OR

"uno o ambos"

EOR

"uno u otro pero no ambos"

Por lo tanto, and

$FF AND $0F 1111 1111 0000 1111 --------0000 1111

$0F ya que,

$0F

AND es til para enmascarar bits. Por ejemplo, para enmascarar el primer nibble (4bits) de un valor AND con $0F: $36 AND $0F = $06

OR es til para setear un bit en particular: $80 OR $08 = $88 ($80) ($08) ($88)

ya que 1000 0000 0000 1000 or --------1000 1000

EOR es til para invertir bits: $AA EOR $FF = $55 ($AA) ($FF) ($55)

ya que 1010 1010 1111 1111 eor --------0101 0101

Otras instrucciones desplazan o rotan bits hacia la izquierda o hacia la derecha. Notar que desplazar una vez hacia la izquierda es lo mismo que multiplicar el valor por 2, y desplazarlo hacia la derecha equivale a dividirlo por 2.

Podemos diferenciar 11 grupos de instrucciones del 6502 de acuerdo a su funcin: Instrucciones de carga y acumulacin Instruciones aritmticas Instruciones de incrementacin y decrementacin Instruciones lgicas Instruciones de salto, ramificacin, comparacin y test de bits Instruciones de desplazamiento y rotacin Instruciones de transferencia Instruciones propias del stack Instruciones de subrutina Instruciones de set/reset Instruciones NOP/BRK (ninguna operacin/corte) * Instrucciones de carga y acumulacin -----------------------------------LDA LDX LDY STA STX STY - LoaD the Accumulator (cargar acumulador) - LoaD the X register (cargar registro X) - LoaD the Y register (cargar registro Y) - STore the Accumulator (almacenar en acumulador) - STore the X register (almacenar en registro X) - STore the Y register (almacenar en registro Y)

Los microprocesadores gastan mucho de su tiempo en mover informacin dentro de la memoria. Los datos se cargan desde una direccin a un registro y luego se los almacena en una nueva direccin, generalmente con algn proceso de suma o resta. El contenido de una direccin puede ser cargado directamente en el acumulador, en el registro X, y en el registro Y pero el acumulador es el que tiene disponibles ms modos de direccionamiento. Si el bit 7 (bit high) de un byte es 1 cuando se lo carga, entonces la bandera N del processor status se setea. Si el valor cargado es 0 se setea la bandera Z. * Instruciones aritmticas -----------------------ADC SBC - ADd to accumulator with Carry (suma al acumulador con carry) - SuBtract from accumulator with Carry (resta del acumulador con carry)

Carry es un bit del processor status que utilizan las operaciones que requieren acarreo de bits (suma o resta) y por las de desplazamiento. El 6502 tiene dos modos aritmticos, el binario y el decimal. Tanto la suma como la resta implementan el carry para manejar acarreo y pedido de bits para simplificar la aritmtica multi-byte. Notar que en el caso de la resta es necesario setear el carry ya que debe usarse el opuesto del carry cuando se resta (ver abajo).

La suma debera ser as: CLC ADC ... . . ADC ... . . . Limpiar el carry, luego realizar las sumas. El acarreo entre adiciones ser manejado por el carry. Simblicamente es: A + M + C ? A es decir, Acumulador + Valor + Carry ? Acumulador La resta debera ser as: SEC SBC ... . . SBC ... . . . en este caso se setea el carry primero y luego se realizn las restas. Simblicamente es: A - M - ~C Ej.1 ---Una rutina de suma en 16 bit. CLC LDA ADC STA LDA ADC STA $20 $22 $24 $21 $23 $25 $20,$21 + $22,$23 = $24,$25 limpiar el carry tomar el byte bajo (low) del primer nmero sumarle el byte low del segundo almacenar el byte low del resultado tomar el byte alto (high) del primer nmero sumarle el byte high del segundo, ms el carry almacenar el byte high del resultado --> A , donde ~C es l opuesto a C

... si el resultado no cabe en un nmero de 16 bit el carry quedar seteado. Ej.2 ---Una rutina de resta en 16 bit. SEC LDA SBC STA LDA $20 $22 $24 $21 $20,$21 - $22,$23 = $24,$25 setear el carry tomar el byte low del primer nmero restarle el byte low del segundo almacenar el byte low del resultado tomar el byte high del primer nmero

SBC $23 STA $25

restarle el byte high del segundo, con carry almacenar el byte high del resultado

... si el segundo nmero es mayor que el primero el carry quedar seteado. Las instrucciones aritmticas tambin afectan las banderas N, Z y V: Z = 1 N = 1 V = 1 si el resultado fue $00, 0 si fue otro valor si el bit 7 del resultado es 1, 0 si fue otro valor si cambi el bit 7 del acumulador, un cambio de signo

* Instruciones de incremento y decremento --------------------------------------INC INX INY DEC DEX DEY - INCrementar valor en memoria en uno - INcrementar X en uno - INcrementar Y en uno - DECrementar valor en memoria en uno - DEcrementar X en uno - DEcrementar Y en uno

El 6502 tiene instrucciones para incrementar/decrementar los registros ndices (X e Y) y valores en memoria. No hay instrucciones de este tipo para el acumulador. El 65C02 inclua las instrucciones INA y DEA. Las instrucciones para los registros ndices son en modo impicado por razones obvias, mientras que INC y DEC utilizan los modos de direccionamiento. Todas las instrucciones de inc/dec alteran las banderas del processor status: Z = 1 N = 1 si el resultado fue $00, 0 si fue otro valor si el bit 7 del resultado es 1, 0 si fue otro valor

* Instruciones lgicas -------------------AND ORA EOR - AND entre valor en memoria y el acumulador - OR entre valor en memoria y el acumulador - OR exclusivo entre valor en memoria y el acumulador

Estas instrucciones ya se describieron anteriormente. Setean la bandera Z si el resultado es 0 y la N si el bit 7 del resultado es 1. * Instrucciones Jump (salto), Branch (bifurcacin), Compare (comparacin) y Test Bits (pruebas de bits) ---------------------------------------------------------JMP BCC BCS BEQ - Saltar a otra direccin (GOTO) - bifurcar si el carry est en reset, - bifurcar si el carry est en set, - bifurcar si el resultado es 0, C = 0 C = 1 Z = 1

BNE BMI BPL BVS BVC CMP CPX CPY BIT

bifurcar bifurcar bifurcar bifurcar bifurcar

si si si si si

el resultado no es 0, el resultado es negativo, el resultado es positivo, overflow est en set, overflow est en reset,

Z N N V V

= = = = =

0 1 0 1 0

- Comparar memoria con acumulador - Comparar memoria con X - Comparar memoria con Y - Probar bits

Todas estas instrucciones alteran el flujo de un programa o realizan comparaciones de valores o bits. JMP simplemente sita el contador de programa (PC) en una direccin dada. La prxima instruccin ser la que se encuentre en esa nueva direccin. Las instrucciones de ramificacin son saltos relativos (JMP relativo). Causan una ramificacin o bifurcacin a una nueva direccin que puede ser 127 bytes ms delante de la posicin actual del PC o 128 hacia atrs. Un bloque de cdigo que slo utilice instrucciones de ramificacin puede ser relocalizado y ejecutado en cualquier lugar de la memoria porque utiliza direcciones relativas y no absolutas. Las tres instrucciones de comparacin se usan para setear bits del processor status. La relacin entre los valores comparados y los bits de status es, +-------------------------+---------------------+ | | N Z C | +-------------------------+---------------------+ | A, X, or Y < Memoria | 1 0 0 | | A, X, or Y = Memoria | 0 1 1 | | A, X, or Y > Memoria | 0 0 1 | +-----------------------------------------------+ La instruccin BIT prueba los bits en memoria con el acumulador pero no cambia ninguno. El contenido de la direccin se multiplica logicamente con el acumulador (AND), entonces se setean los bits de status segn lo siguiente, * N recibe el valor inicial sin multiplicar del bit 7 de la memoria * V recibe el valor inicial sin multiplicar del bit 6 de la memoria * Z se setea si el resultado de la multiplicacin (AND) es cero, se resetea con otro resultado. Entonces, si la direccin $23 contena $7F y el acumulador $80, una instruccin BIT $23 seteara las banderas V y Z y reseteara la N ya que el bit 7 de $7F es 0, el bit 6 de $7F es 1, y $7F AND $80 = 0. * Instrucciones de desplazamiento y rotacin -----------------------------------------ASL LSR - Desplazar hacia izquierda el acumulator - Desplazamiento lgico hacia derecha

ROL ROR

- Rotar hacia izquierda - Rotar hacia derecha

Estas instrucciones se usan para mover bits en el acumulador o en memoria. El efecto es el siguiente (C es la bandera carry): +-+-+-+-+-+-+-+-+ C <- |7|6|5|4|3|2|1|0| <- 0 +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ 0 -> |7|6|5|4|3|2|1|0| -> C +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ C <- |7|6|5|4|3|2|1|0| <- C +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ C -> |7|6|5|4|3|2|1|0| -> C +-+-+-+-+-+-+-+-+

ASL

LSR

ROL

ROR

Como antes, Z se setea si el resultado es cero y N si el bit 7 es 1. N siempre se resetea en una operacin LSR. Tambin hay que notar que ASL A es lo mismo que multiplicar por dos y LSR es lo mismo que dividir por dos. * Instrucciones de transferencia -----------------------------TAX TAY TXA TYA Transferir Transferir Transferir Transferir acumulator a X acumulator a Y X al acumulator Y al acumulator

Estas instrucciones mueven valores entre los registros del 6502. Tambin son afectadas las banderas Z y N. Por ejemplo: LDA #$80 TAX Provoca que N se setee ya que el bit 7 del valor movido es 1, mientras que LDX #$00 TXA Provoca que Z se setee ya que el valor es cero. * Instrucciones del Stack ----------------------TSX TXS - Transferir puntero stack a X - Transferir X al puntero stack

PHA PHP PLA PLP

Empujar Empujar Extraer Extraer

el el al al

acumulador al stack processor status al stack acumulador desde el stack processor status desde el stack

TSX y TXS hacen posible la manipulacin del stack. Las instrucciones push y pull (las cuatro restantes) son tiles para guardar valores de los registros y banderas de estados. Su utilizacin es directa. * Instrucciones de subrutinas --------------------------JSR RTS RTI - Saltar a una subrutina - Regresar desde una subrutina - Regresar desde una interrupcin

Tal como JMP, JSR causa que el programa contine su ejecucin desde la instruccin almacenada en la direccin dada. A diferencia de JMP, JSR utiliza el stack para almacenar la direccin a dnde retornar. Cuando se ejecuta una instruccin RTS, la direccin previamente empujada al stack se extrae y el programa contina a partir de esa direccin. Por ejemplo, LDA JSR LDA JSR . . . JSR JSR RTS #$C1 print #$C2 print ; ; ; ; cargar caracter 'A' imprimir el carcter y su cdigo en hexadecimal cargar 'B' e imprimirlo

print

$FDED $FDDA

; imprimir la letra ; y su cdigo ASCII ; regresar a la llamada

RTI es como RTS y debe ser usada al final de una rutina de interrupcin. * Instrucciones de seteo y reseteo (limpiar) -----------------------------------------CLC CLD CLI CLV SEC SED SEI resetear resetear resetear resetear (limpiar) bandera carry modo decimal deactivacin de interrupcin banera de overflow (desbordamiento)

- setear carry - setear modo decimal - setear desactivacin de interrupcin

Estas son instrucciones de un solo byte y sirven para configurar las banderas del processor status. CLC y SEC son muy usadas en la suma y la resta respectivamente. Antes de cualquier suma (ADC) se usa CLC para limpiar el carry o el resultado podra ser mayor en una unidad. Para la resta (SBC) se usa SEC para asegurarse que el carry est seteado. En restas o sumas multi-byte solo

se setea o resetea el carry una vez antes de la primera instruccin. Por ejemplo, para sumar un uno a un nmero de 16 bits en $23 y $24 hay que hacer lo siguiente: LDA $23 CLC ADC #$02 STA LDA ADC STA RTS $23 $24 #$00 $24 ; ; ; ; ; ; ; ; ; cargar el byte low resetear el carry sumar el nmero 2, el carry se setea si resultado > 255 guardar el byte low cargar el byte high sumar cero y el resultado anterior del carry guardar el byte high si el carry est en set el resultado fue > 65535

Lo mismo para la resta, LDA SEC SBC STA LDA SBC STA RTS $23 #$02 $23 $24 #$00 $24 ; ; ; ; ; ; ; ; cargar el byte low setear el carry restar 2 guardar el byte low cargar el byte high restar cero y el resultado del carry anterior guardar el byte high si el carry no est seteado el resultado fue < 0

* Otras Instrucciones ------------------NOP BRK - Ninguna Operacin - Corte de programa

NOP no realiza ninguna operacin pero utiliza ciclos de procesador. Es til para borrar viejas instrucciones, reservar espacio para futuras instrucciones o para ciertos conteos de ciclos de mquina (cycle counting) ya que utiliza 2 ciclos. BRK causa un corte forzado y obliga al procesador a comenzar desde el comienzo (esta direccin debe indicarse en la direccin $FFFE y $FFFF. ** Ejemplos simples de programacin -------------------------------Aqu se ilustrarn algunas de las tcnicas ms usadas en programacin. Al final hay ejemplos de sumas y restas. * Ciclo de conteo decreciente --------------------------; ; cuenta regresiva de un nmero de 8 bits ; start LDX #$FF loop DEX ; cargar X con $FF = 255 ; X = X - 1

BNE loop RTS

; si X no es cero, volver a loop ; regresar

(start y loop son etiquetas, podran tener otro nombre) La instruccin BNE no sabe si X llega a cero. Lo que hace es analizar la bandera Z del procesador, que estar seteada cuando X llegue a cero. ; ; cuenta regresiva de un nmero de 16 bits ; start LDY #$FF loop1 LDX #$FF loop2 DEX BNE loop2 DEY BNE loop1 RTS ; ; ; ; ; ; ; cargar Y con $FF cargar X con $FF X = X - 1 si X no es cero, volver a loop2 Y = Y - 1 si Y no es cero, volver a loop1 regresar

Aqu tenemos dos ciclos, X se carga con 255 y cuenta hasta cero cada vez que Y se decrementa. El resultado es una cuenta regresiva desde $FFFF = 65535 hasta $0000. ** Otros ejemplos -------------Nota: los siguientes ejemplos pertenecen al libro "6502 Software Design" ; ; ; ; ; ; Ejemplo 4-2. Borrar un elemento de una lista desordenada Borrar el contenido de $2F de una lista que comienza en la direccin $30 y $31. El primer byte de la lista es su tamao.

deluel

nextel

LDY LDA TAX LDA INY CMP BEQ DEX BNE RTS

#$00 ; ndice para la siguiente operacin ($30),Y ; transferir el tamao de la lista a X $2F ; elemento a borrar ; ndice al siguiente elemento ($30),Y ; coincide el elemento con el de la ; lista? delete ; si. Borrar elemento ; no. Decrementar el contador nextel ; hay ms elementos para comparar? ; no. El elemento no est en la lista. ; Regresar

; borrar el elemento moviendo los siguientes a la posicin ; anterior delete DEX ; decrementar contador

BEQ deccnt INY LDA DEY STA INY JMP LDA SBC STA RTS ($30),Y ($30),Y delete ($30,X) #$01 ($30,X)

; fin de lista? ; no. Mover el siguiente elemento hacia ; atrs

deccnt

; actualizar el tamao de la lista

; ; ; ; ; ; ;

Ejemplo 5-6. Multiplicacin de dos nmeros de 16 bits sin signo Multiplicar $22 (low) y $23 (high) por $20 (low) y $21 (high) para producir un resultado de 32 bits en $24 (low) a $27 (high) LDA STA STA LDX LSR ROR BCC LDA CLC ADC STA LDA ADC ROR STA ROR ROR ROR DEX BNE RTS #$00 $26 $27 #$16 $21 $20 align $26 $22 $26 $27 $23 A $27 $26 $25 $24 nxtbt ; limpiar p2 y p3 del producto ; contador de bits a multiplicar = 16 ; desplazar multiplicador de 2 bytes a la ; derecha ; multiplicador = 1? ; si. cargar p2 ; ; ; ; ; ; ; sumarle m0 almacenar el nuevo p2 cargar p3 sumarle m1 rotar el producto de 4 bytes a la derecha almacenar el nuevo p3

mlt16

nxtbt

align

; decrementar el contador de bits ; volver hasta que se hayan multiplicado ; los 16 bits

; ; ; ; ;

Ejemplo 5-14.

Raz cuadrada de 16 bits.

Escribir la raz cuadrada de 8 bits en $20 de un nmero de 16 bits en $20 (low) y $21 (high). El resto sigue en $21. LDY #$01 STY $22 DEY STY $23 ; byte menos significativo del primer ; nmero impar =1 ; byte ms significativo del primer

sqrt16

; nmero impar (raz = 0) again SEC LDA $20 TAX SBC $22 STA $20 LDA $21 SBC STA BCC INY LDA ADC STA BCC INC JMP nomore STY STX RTS $23 $21 nomore $22 #$01 $22 again $23 again $20 $21 ; guardar el resto en X ; restar el impar del entero ; (la parte low) ; restar el impar del entero ; (la parte high) ; resultado negativo? ; no. incrementar raz cuadrada ; calcular prximo impar

; listo, guardar raz cuadrada ; y el resto

Esto se basa en la observacin de que la raz cuadrada de un entero es igual al nmero de veces que un nmero impar incrementndose puede ser restado del nmero original manteniendo resto positivo. Por ejemplo, 25 1 -24 3 -21 5 -16 7 -9 9 -0 1 2 3 4 5 = raz cuadrada de 25

Si ests interesado en aprander ms, busca un libro sobre lenguaje de mquina para computadoras Apple. Nota del autor de este documento: Si la biblioteca de tu lugar es como la ma, habr muchos libros de computacin de los 80 en los estantes. Nota del traductor: Si la biblioteca de tu lugar es como la ma, no encontrars nada :) Traduccin por Gonzalo R. Fernndez Email: horcas@bbs.frc.utn.edu.ar 2001. Crdoba, Argentina.

También podría gustarte