Código ensamblador 68000: funciones SCAN y PRINT con buffers circulares

Informática y Telecomunicaciones4,24 KB

Rutinas SCAN y PRINT en ensamblador 68000

A continuación se muestra el código de dos subrutinas escritas en ensamblador del Motorola 68000: SCAN, encargada de leer caracteres desde los buffers, y PRINT, encargada de escribir caracteres en los buffers de salida.

Rutina SCAN

SCAN: LINK A6,#0 *Crea el marco de pila
MOVE.L 8(A6),A3 *Cargamos el buffer destino
MOVE.W 12(A6),D2 *Cargamos el descriptor
MOVE.W 12(A6),D2 *Cargamos el descriptor
MOVE.W 14(A6),D3 *CARGO EL NUMERO DE CARACTERES A LEER
MOVE.L #0,D0 *inicializo el contador

OTS: CMP.W D3,D0 *comparo el contador con el tamaño de caracteres a leer, si son iguales fin
BEQ FINS
CMP.W #0,D2 *miro qué descriptor es el que ha entrado como parámetro; si no es 0 o 1, salta a error
BEQ CA
CMP.W #1,D2
BEQ CB
BNE FINSES

CA: MOVE.W (CCLA),D5
MOVE.W (CCRA),D6
CMP.W D5,D6
BEQ FINS
MOVE.L (PBLAA),A4
MOVE.L (PBLAF),A5
MOVE.B (A4),(A3)+
CMP.L A4,A5
BEQ IGA
BNE DESIGA

IGA: MOVE.L #BLA,PBLAA
SUB.W #1,CCTA
ADD.W #1,CCLA
ADD.W #1,D0
CMP.W D0,D3
BNE OTS
BEQ FINS

DESIGA: ADD.L #1,(PBLAA)
SUB.W #1,CCTA
ADD.W #1,CCLA
ADD.W #1,D0
CMP.W D0,D3
BNE OTS
BEQ FINS

CB: MOVE.W (CCLB),D5
MOVE.W (CCRB),D6
CMP.W D5,D6
BEQ FINS
MOVE.L (PBLBA),A4
MOVE.L (PBLBF),A5
MOVE.B (A4),(A3)+
CMP.L A4,A5
BEQ IGB
BNE DESIGB

IGB: MOVE.L #BLB,PBLBA
SUB.W #1,CCTB
ADD.W #1,CCLB
ADD.W #1,D0
CMP.W D0,D3
BNE OTS
BEQ FINS

DESIGB: ADD.L #1,(PBLBA)
SUB.W #1,CCTB
ADD.W #1,CCLB
ADD.W #1,D0
CMP.W D0,D3
BNE OTS
BEQ FINS

FINSES: MOVE.L #$ffffffff,D0

FINS: UNLK A6
RTS
FINSCAN

Rutina PRINT

PRINT: LINK A6,#0
MOVE.L 8(A6),A3
MOVE.W 12(A6),D2
MOVE.W 14(A6),D3
MOVE.L #0,D0
CMP.W D3,D0
BEQ SALPA

VESC: CMP.W #0,D2
BEQ EA
CMP.W #1,D2
BEQ EB
BNE FINPAEP

EA: CMP.W #2000,CCEA
BEQ FINPA
MOVE.L (PBEAA),A4
MOVE.L (PBEAF),A5
MOVE.B (A3)+,(A4)
CMP.L A4,A5
BNE NIGAE
BEQ IGAE

IGAE: MOVE.L #BEA,PBEAA
ADD.W #1,CCEA
ADD.W #1,D0
CMP.W D0,D3
BNE VESC
BEQ FINPA

NIGAE: ADD.L #1,(PBEAA)
ADD.W #1,CCEA
ADD.W #1,D0
CMP.W D0,D3
BNE VESC
BEQ FINPA

FINPA: CMP.W #0,D0
BEQ SALPA
MOVE.B #%00100011,CMASK
MOVE.B #%00100011,IMR

SALPA: UNLK A6
RTS

EB: CMP.W #2000,CCEB *#1999,CCEB
BEQ FINPB
MOVE.L (PBEBA),A4
MOVE.L (PBEBF),A5
MOVE.B (A3)+,(A4)
CMP.L A4,A5
BNE NIGBE
BEQ IGBE

IGBE: MOVE.L #BEB,PBEBA
ADD.W #1,CCEB
ADD.W #1,D0
CMP.W D0,D3
BNE VESC
BEQ FINPB

NIGBE: ADD.L #1,(PBEBA)
ADD.W #1,CCEB
ADD.W #1,D0
CMP.W D0,D3
BNE VESC
BEQ FINPB

FINPB: CMP.W #0,D0
BEQ SALPB
MOVE.B #%00110010,CMASK
MOVE.B #%00110010,IMR

SALPB: UNLK A6
RTS

FINPAEP: MOVE.L #$ffffffff,D0
UNLK A6
RTS

FINPRINT

Descargar

PDF Word HTML