Apéndice G
Subrutinas útiles
Rutinas del calculador
        Para una mejor comprensión y uso del calculador, las rutinas siguientes le
permitirán experimentar con él. El fin de la primera rutina es el de la
demostración :
A52F 	D9 	10 		EXX 	; 	siempre debe salvar H'L' si
A530	E5	20		PUSH	HL ;	quiere volver correctamente,
A531	D9	30		EXX
A532	CD32A5	40		CALL	IMP_PI ;	imprime el inicio y fin de la pila.
A535	0135A5	50		LD	BC,X ; 	primer numero
A538	C5	60		PUSH	BC ; 	lo salva
A539	CD2B2D	70		CALL	#2D2B ;	mete X en la pila
A53C	C1	80		POP	BC;	recupera X
A53D	CD2B2D	90		CALL	#2D2B ; 	lo mete de nuevo
A540	CDE32D	100		CALL	#2DE3 ;	imprime X
A543	3E20	110		LD	A, #20
A545	D7	120		RST	#10 ; 	imprime un espacio
A546	215EA5	130		LD	HL, NUMERO ;direccion de inicio del
		140	; 				numero en formato ASCII
A549	CD49A5	150		CALL	APILA ;	lo guarda en la pila (sera Y)
A54C	EF	160		RST	#28 ; 	llama al calculador
A54D	31	170		DEFB	#31 ; 	duplica Y
A54E	38	180		DEFB	#38 ; 	desconecta el calculador
A54F	CDE32D	190		CALL	#2DE3 ;	imprime	Y
A552	EF	200		RST	#28 ; 	llama al calculador
		210	; AQUI PUEDE INSERTAR UNA SERIE DE
		220	; BYTES PARA EXPERIMENTAR CON
		230	; EL CALCULADOR.
_______             103

        Esta subrutina imprimirá la dirección del inicio y del final de la pila del
calculador :
 
A553	38 	240 		DEFB 	#38;  	lo  desconecta
A554 	COE32D 	250 		CALL 	#2DE3  ;  	imprime  el  resultado
A557 	C032A5 	260 		CALL 	IMP_PI  ;	imprime  el  inicio  y  el  fin  de
		270	;  				la  pila  para  ver  si  esta
		280 	;  				bien.
A55A 	D9 	290 		EXX  ; 			 recupera  H'L'
A55B 	E1 	300 		POP 	HL
A55C 	D9 	310 		EXX
A55D 	C9 	320 		RET
A55E 	31323334 	330 	NUMERO 	DEFM 	"1234.567"
A566	0D 	340 		DEFB 	13  ; siempre  debe  haber  un
 		350	; 	DEFB 	13  ; despues  del  numero  para
		360	;  			       indicar  que  se  ha  terminado.
A210	ED4B635C	10	IMP_PI	LD	BC, (23651) ; esta es la base de la pila
A214	CD2B2D	20		CALL	#2D2B ;	   la guarda en la pila
A217	3E42	30		LD	A,"B"
A219	D7	40		RST	#10
A21A	3E20	50		LD	A," "
A21C	07	60		RST	#10
A21D	CDE32D	70		CALL	#2DE3 ; imprime la direccion de la base
A220	3E20	80		LD	A," "
A222	D7	90		RST	#10
A223	3E53	100		LD	A,"8"
A225	D7	110		RST	#10
A226	3E20	120		LD	A,"	
A228	D7	130		RST	#10
A229	ED4B655C	140		LD	BC, (23653) ; esta es la parte
		145	; 				   superior de la pila
A22D	CD2B2D	150		CALL	#2D2B
A230	CDE32D	160		CALL	#2DE3 ;	imprime la direccion
		165	; 				de la parte superior
A233	3EOD	170		LD	A,#OD
A235	D7	180		RST	#10
A236	C9	190		RET
Esta rutina apilará un número en formato ASCII :
	10	; al llamar a esta rutina, el registro HL
		20	; debe contener la direccion de inicio
		30	; del numero a meter en la pila.
A205	ED5B5D5C	40	APILA	LD	DE, (23645) ;esta es CH_ADD
A209	D5	50		PUSH	DE; 	  la salva
A20A	225D5C	60		LD	(23645), HL ; guarda en CH_ADD la direccion
		70	;				  del numero
A20D	7E	80		LD	A, (HL) ; 	pone el primer caracter en A
A20E	CD9B2C	90		CALL	#2C9B ; 	guarda el numero en lA pilA
A211	D1	100		POP	DE ;	devuelve
A212	ED535D5C	110		LD	(23645), DE ; el valor original a CH_ADD
A216	C9	120		RET
Rutinas de manejo de los interfaces
Morex y Kempston
        A la entrada de estas subrutinas, el código ASCII, que se quiere sacar por
el Centronics, debe estar en el registro A. No se expandirá ningún código; ver la
sección Expandiendo claves para la salida en el capítulo 2, si necesita hacerlo.
_______
104

 
        Esta es la rutina de salida por el interfaz Centronics de Morex.

A1D3	F5	10		PUSH	AF 	; salva el codigo del caracter
A1D4	DBFB	20	OCUPAD	IN	A, (#OFB) ; lee la linea de
		25	; 			        ocupado de la impresora
A1D6	E601	30		AND 	1 ; 		comprueba el bit 0
A1D8	20FA	40		JR 	NZ,OCUPADA ;	si esta a 1, la impresora esta
		50	;				ocupada.
A1DA	F1	60		POP 	AF;		 recupera el caracter
A1DB	D3FB	70		OUT 	(#OFB), A ;	lo envia
A1DD	3E01	80		LD 	A, 1 ; 		envia marca de validez
A1DF	D37F	90		OUT 	(#7F), A
A1E1	AF	10O		XOR 	A
A1E2	D37F	110		OUT	(#7F), A
A1E4	C9	120		RET	;fin
Esta es la rutina de salida por el interfaz Centronics de Kempston :
A342	C5	10		PUSH	BC ;  	salva los registros BC
		20	; 		          	ya que se usan para entrada/salida
A343	F5	30		PUSH	AF ;	salva el codigo del caracter
A344	01BFE2	40		LD	BC, #0E2BF ; 	puerto de la linea de ocupado
A347	ED78	50	OCUPAD	IN	A, (C) ; 	lee la linea de ocupado
A349	1F	60		RRA	;		pasa el bit cero a la
		65	;				bandera de acarreo
A34A	38FB	70		JR	C, OCUPADO ;	si esta a 1 la impresora
		75	; 				esta ocupada
A34C	F1	80		POP	AF; 		recupera el caracter
A34D	05	90		DEC	B; 		cambia el puerto a 02BFh
A34E	05	100		DEC	B
A34F	ED79	110		OUT	(C), A ; 	envia el caracter
A351	3EOE	120		LD	A, #OE ; 	marca de validez a enviar
A353	06E3	130		LD	B, #OE3 ;	cambia el puerto a E3BFh,
		135	; 				puerto de validez
A355	ED79	140		OUT	(C), A; 		envia la marca
A357	3C	150		INC	A
A358	ED79	160		OUT	(C), A
A35A	C1	170		POP	BC; 		recupera el par BC
A35B	C9	180		RET	; fin
Rutina de sprites basada en interrupciones
		10	;  programa de demostrAcion de sprites
	20	;  ver Capitulo 6
C8FF		30		ORG	51455
C8FF		40		ENT	51455
		50
		60	; 51455 contiene el vector de interrupciones
		70	;
C8FF	2CC9	80		DEFW	51500
		90	;
C901	3EC8	100	INICIA	LD	A, 200
C903	ED47	110		LD	I,A
C905	ED4B83C9	120		LD	BC, (COORD)
C909	CD87C9	130		CALL	DIBUJA
C90C	ED5E	140		IM	2
C90E	C9	150		RET
		160
		170	; este es el programa real
		180	; que empieza en el vector de interrupciones
		190
_______             105

 
	
		200
C92C		210		ORG	51500
		220	;
		230	; primero se salvan los registros a usar
		240	;
C92C	E5	250		PUSH	HL
C92D	C5	260		PUSH	BC
C92E	D5	270		PUSH	DE
C92F	F5	280		PUSH	AF
		290
		300	; Salva TV_FLAG ya que puede ser alterada despues
		310	;
C930	3A3C5C	320		LD	A,  (23612)
C933	F5	330		PUSH	AF
		340
		350	; salva CO_ORDS ya que sera cambiada y debe ser
		360	; recuperada antes de volver
		370	;
C934	2A7D5C	380		LD	HL, (23677)
C937	E5	390		PUSH	HL
C938	ED4B83C9	400		LD	BC,  (COORD)  ; las coordenadas de los sprites
C93C	C5	410		PUSH	BC ; las salva
		420	; llama a la rutina que dibuja la
		430	; sprite y como el dibujo se hace
		435	; con OVER 1, se borrara
		440	; la posicion anterior
C93D	CD87C9	450		CALL	DIBUJA
C940	C1	460		POP	BC ; recupera las coordenadas de la sprite
		470	;
		480	; L es usada como un registro de banderas
		490	; para ver hacia donde se mueve la sprite
		500	; si el bit cero esta alto se mueve hacia arriba,
		505	; a cero indica hacia abajo.
		510	; bit 1 alto para izquierda,
		515	; bajo para derecha.
		520	;
		530	;
C941	2A85C9	540		LD	HL,  (BANDERA)
C944	CB45	550		BIT	O, L
C946	2807	560		R	Z, ARRIBA
C948	05	570	ABAJO	DEC	B; 		mueve la sprite hacia
		575	; 				abajo I puntos.
C949	200C	580		JR	NZ, IZQUIERDA ;	si la bandera cero esta puesta
C94B	CB85	590		RES	O, L ; 		ha llegado a la parte
		595	; 				inferior de la
C94D	1808	600		JR	IZQUIE ; 	pantalla y se cambia
		605	;	la			direccion
C94F	04	610	ARRIBA	INC	B ;		hacia arriba un punto
C950	78	620		LD	A, B ; 		ha alcanzado la parte
			625				; 	superior?
C953	2002	640		JR	NZ, IZQUIERDA
C955	CBC5	650		SET	O, L ;		si es asi, cambia la direccion
C957	CB4D	660	IZQUIE	BIT	1, L ; 		lo mismo pero para
		665	; 				izquierda/derecha
C959	2807	670		JR	Z, DERECH
C95B	0D	680		DEC	C
C95C	200C	690		JR	NZ, CDIBUJ
C95E	CB8D	700		RES	1, L
C960	1808	710		JR	CDIBUJ
C962	0C	720	DERECH	INC	C
C963	79	730		LD	A, C
C964	FEFE	740		CP	254
C966	2002	750		JR	NZ,CDIBUJ
C968	CBCD	760		SET	1, L
		770
		780	; se salvan las nuevas
_______
106

		
_______             107
	
		785	; coordenadas de la sprite
		790	;
C96A	ED4383C9	800	CDIBUJ	LD	(COORD),BC ; asi como las banderas
C96E	2285C9	810		LD	(BANDERA),HL
		820
C971	CD87C9	830		CALL	DIBUJA ; dibuja la nueva posicion de la sprite
		840	;
		850	;
		860	; ya se ha realizado todo el dibujo por lo que
		870	; se devuelve su valor a las variables del sistema
		880	;
		890	;
C974	E1	900	NRECU	POP	HL
C975	227D5C	910		LD	(23677),HL
C978	F1	920		POP	AF
C979	323C5C	930		LD	(23612),A
		940
		950	; se recuperan ahora los registros
C97C	F1	960		POP	AF
C97D	D1	970		POP	DE
C97E	C1	980		POP	BC
C97F	E1	990		POP	HL
		1000
		1010	; se explora el teclado ya que no se habia hecho antes
		1020	; debido a que las interrupciones estaban relocalizadas
		1030	;
C980	FF	1040		RST	#38
C981	ED4D	1050		RETI
C983	0000	1060	COORD	DEFW	0
C985	0000	1070	BANDER	DEFW	0
		1080	;
		1090	; se va a usar D como contador,
		1100	; ya que se esta usando B
		1110	;
C987	1604	1120	DIBUJA	LD	D,4
		1130	;
		1140	;
		1150	; salva las coordenadas ya que las rutinas
		1155	; de ROM las destruyen
		1160	;
		1170	;
		1180	;
C989	C5	1190		PUSH	BC
C98A	7A	1200	BUCLE	LD	A,D
C98B	D5	1210		PUSH	DE	; salva el contador
		1220
		1230	; el dibujo es hecho cuatro veces para crear una
		1240	; sprite mas grande
C98C	FE04	1250		CP	4
C98E	280F	1260		JR	Z,BUCLE4
C990	FE03	1270		CP	3
C992	2001	1280		JR	NZ,BUCLE1
C994	0C	1290		INC	C
C995	FE02	1300	BUCLE1	CP	2
C997	2001	1310		INC	B
C99A	FE01	1330	BUCLE2	CP	1
C99C	2001	1340		JR	NZ,BUCLE4
C99E	0D	1350		DEC	C
		1360
		1370	; se comprueba ahora que ROM esta presente
		1380	;
C99F	3A1400	1390	BUCLE4	LD	A, (#14) ; 	coge una posicion de memoria
		1400	; 				que tiene un valor distinto en
		1410	;				cada	ROM
C9A2	FDCB0286	1420		RES	O, (IY+2) ;	indica los colores de la pantalla
C9A6	C5	1430		PUSH	BC

C9A7	FED5	1440		CP	#D5
C9A9	28OC	1450		JR	Z, ROM2 ; 	la ROM del interfaz 1 esta puesta
		1460	;			      	de modo que no se llama a la rutina
		1470	;			      	de la ROM principal directamente,
		1480	;			      	sino que se debe activar antes.
		1490
C9AB	CD4DOD	1500		CALL	#D4D ; 	coge los colores con los que
		1501	;				dibujar
C9AE	FDCB57C6	1510		SET	O, (IY+87) ; 	activa OVER 1 con la bandera P
C9B2	CDE522	1520		CALL	8933 ; 	        	dibuja
C9B5	1808	1530		JR	CONT1 ;       	se salta el cambio de la ROM de 8K
		1540	; 			        	a la de 16K
		1550
		1560	; si se llega aqui, la ROM del interfaz esta conectada
C9B7	D7	1570	ROM2	RST	16; 		las rutinas de la ROM de
C9B8	4D0D	1580		DEFW	#D4D ;		16K deben ser llamadas indirectamente.
C9BA	FDCB57C6	1590		SET	O, (IY+87)
C9BE	D7	1600		RST	16
C9BF	FDCB5786	1610	CONT1	RES	O, (IY+87) ;	quita el OVER 1
C9C3	C1	1620		POP	BC; 		recupera la ultima posicion de
C9C4	D1	1630		POP	DE; 		dibujo y el contador
C9C5	15	1640		DEC	D
C9C6	20C2	1650		JR	NZ, BUCLE
		1660
C9C8	C1	1670		POP	BC ; 		recupera la posicion inicial de
C9C9	78	1680		LD	A, B ; 		dibujo y mira si se ha alcanzado
C9CA	A7	1690		AND	A ; 		un borde.
C9CB	280D	1700		JR	Z, PING ;	si es asi ejecuta la accion
C9CD	FEAE	1710		CP	174 ;		correspondiente
C9CF	2809	1720		JR	Z, PING
C9D1	79	1730		LD	A, C
C9D2	A7	1740		AND	A
C9D3	2805	1750		JR	Z, PING
C9D5	FEFE	1760		CP	254
C9D7	2801	1770		JR	Z, PING
C9D9	C9	1780		RET	; sino es asi, vuelve.
		1790
C9DA	C5	1800	PING	PUSH	BC ; 		salva las coordenadas del punto
C9DB	0600	1810		LD	B, O; 		para usar B como contador y
C9DD	78	1820	PINGL	LD	A, B; 		envia la salida al altavoz
		1830
		1840	; envia la salida al altavoz
C9DE	D3FE	1850		OUT	(#FE), A ;	cambia el estado repetidamente
C9E0	10FB	1860		DJNZ	PINGL	; 	para conseguir un ruido
C9E2	C1	1870		POP	BC
		1880
		1890	; veamos de donde viene la llamada
		1900	;
C9E3	2174C9	1910		LD	HL, NRECU
 C9E6	7D	1920		LD	A, L
C9E7	E1	1930		POP	HL
C9E8	E5	1940		PUSH	HL
C9E9	AD	1950		XOR	L
		1960
		1970	; si no se ejecutara este retorno,
		1980	; solo se pondrian los colores impares del borde
		1990	;
		2000	;
C9EA	C8	2010		RET	Z
		2020
		2030	; incrementa el color del borde (bits 0-2)
		2040	;
C9EB	3AF5C9	2050		LD	A, (COL)
C9EE	3C	2060		INC	A
C9EF	32F5C9	2070		LD	(COL), A
		2080	;
		2090	; y lo COLOCA

_______
108

        El programa DeBASE está formado por un conjunto de rutinas separadas
que constituye un tosco pero eficiente programa de base de datos, con rutinas
para salvar y cargar en cinta y Microdrive.
        El programa permitirá introducir datos, imprimir, buscar, borrar y modifi-
car. No hay limitación en el número de registros ni en el tamaño de cada uno,
excepto que deben caber en la pantalla. Se puede encontrar cualquier parte de
cualquier ficha, y el cursor se colocará al principio de los datos que se
estuviesen buscando. Una ficha puede cambiarse, ampliarse o reducirse después
de su creación, sin destruir o alterar cualquier otra. Después de borrar una,
todo el espacio usado por ella es liberado.
        El programa usa sólo 1 byte de memoria por carácter, más 1 byte por
ficha para marcar su final; se dispone de 32.000 bytes para escribir fichas y hay
espacio para añadir otras utilidades.
		2100	;
C9F2	D3FE	2110		OUT	(#FE) ,A
C9F4	C9	2120		RET
C9F5	00	2130	COL	DEFB	0

DeBASE

		10 	; Esta subrutina imprimira cualquier cosa que empiece
		20	; con un byte con el bit 7 Alto y terminara en
		30 	; el siguiente byte con el bit 7 Alto.
		40 	; Tiene tres puntos de entrada y dos formas de uso. Si
		50 	; el registro A contiene 255 (#FF) en la entrada, entonces
		60 	; DE debe contener la direccion de inicio
		70	; de un mensaje que
		80 	; debe estar precedido por un byte con el bit 7 alto
		90 	; para los otros valores de A se imprimira el mensaje
		100 	; cuyo numero se indica en A de una tabla de mensajes
		110 	; que empiece con un byte de marca
		120	;
F424		130	MC1	ORG	62500
F424	F5	140	PMENSA	PUSH	AF ; esta entrada imprime en la
F425	D5	150		PUSH	DE; parte superior izquierda de la
		155	;	pantalla
F426	3E02	160		LD	A,2
F428	CD0116	170		CALL	#1601 ; comprueba que esta en la pantalla
		180	;			 principal, sino modificaria la
		190	; 			 pantalla erronea, dejando la
		195	;			 principal en su posicion anterior
		200	;
		210	;
		220	;
F42B	012118	230		LD	BC,#1821
F42E	CDD90D	240		CALL	3545 ;	usa la llamada a la ROM descrita en el
F431	D1	250		POP	DE; 	capitulo 2
F432	F1	260		POP	AF
F433	F5	270	IMPRIA	PUSH	AF ; 	esta entrada imprime en la posicion
F434	D5	280		PUSH	DE; 	actual de la pantalla principal.
F435	3E02	290		LD	A,2
F437	CD0116	300		CALL	#1601
F43A	3EFF	310		LD	A,255; 		permite el scroll
F43C	328C5C	320		LD	(23692), A ; 	esta es la variable del
		330	; 				sistema SCR CT
F43F	3E0D	340		LD	A, 13 ; 		ENTER (salta de linea a1

_______             109

  _______
  110

		350	; 			principio de la siguiente)
F441	D7	360		RST	16; 	el RESTART de impresion
F442	D1	370		POP	DE
F443	F1	380		POP	AF
F444	3C	390	IMPRI	INC	A; 	esta entrada usa el canal actual
F445	1B	400		DEC	DE; 	carga DE con la direccion de
		410	; 			inicio de la tabla
F446	2804	420		JR	Z,IMPRIP ; si A era #FF usa la direccion en DE
F448	3D	430		DEC	A 
F449	110000	440		LD	DE,MENSA-1 ; 	apunta al principio de los
		445	; 				mensajes
F44C	CD0A0C	450	IMPRIP	CALL	3082 ; 	rutina de impresion de la ROM
F44F	C9	460	RET
0001		470	MENSA	EQU

		10	; Esta subrutina buscara en memoria una
		20	; linea de caracteres que coincidan con
		30	; los que empiezan en BCAR (Busca CARacter) y que
		40	; termine con la marca 255 (#FF)
		50	; si  hay alguna que coincida, se vuelve al principio
		60	; de la ficha retrocediendo hasta que
		70	; se encuentra un byte con el bit 7 alto. Entonces
		80	; se la imprime con la rutina anterior.
90	;
100	; si el final de cada ficha es #8D entonces
110	; si el contenido de BCAR es #FF (no buscar nada) se
120	; encontrara el final de cada ficha
130	;
140	; A la salida el registro BC contendra la direccion
150	; de inicio de la ficha o cero si no se ha hallado
160	;
170	;
F450		180	MC2	ORG	#F450
F450	21CBF4	190	ENCUEN	LD	HL,BCAR ; la entrada principal
F453	7E	200		LD	A, (HL)
F454	FEFF	210		CP	#FF
F456	2006	220		JR	NZ,BUSCA
F458	23	230		INC	HL
F459	77	240		LD	(HL),A
F45A	2B	250		DEC	HL
F45B	3E8D	260		LD	A,#8D
F45D	77	270		LD	(HL),A
F45E	E5	280	BUSCA	PUSH	HL
F45F	213275	290		LD	HL,30002
F462	01D084	300		LD	BC,34000
F465	D1	310		POP	DE
F466	D5	320	MIRAMO	PUSH	DE
F467	EDB1	330	MIRAEN	CPIR	; 		mira el primer caracter
F469	2046	340		JR	NZ, NOHAY ;	si no se encuentra
F46B	2B	350		DEC	HL
F46C	22EEF4	360		LD	(POSEN), HL ; 	guarda la posicion donde lo
F46F	ED43ECF4	370		LD	(POSCON), BC ;	hallo y la cuenta de
		375	; 				los que faltan.
F473	D1	380		POP	DE
F474	D5	390		PUSH	DE
F475	23	400	QUIZAS	INC	HL ; 	ahora se comprueba cada caracter
F476	EB	410		EX	DE,HL
F477	23	420		INC	HL
F478	7E	430		LD	A, (HL)
F479	FEFF	440		CP	255; 		si se llega al final de
		445	; 				la linea, entonces
F47B	280D	450		JR	Z,HALLADO ;	la hemos hallado
F47D	EB	460		EX	DE,HL
F47E	BE	470		CP	(HL)
F47F	28F4	480		JR	Z,QUIZAS
F481	2AEEF4	490		LD	HL, (POSEN) ; si la comprobacion falla

	
		500	; busca desde el primer carácter
		505	; de nuevo.
F484	23	510		INC	HL
F485	3ACBF4	520		LD	A, (BCAR)
F488	18DD	530		JR	MIRAEN
		540	;
F48A	E1	550	HALLAD	POP	HL
F48B	2AEEF4	560		LD	HL, (POSEN) ;	primero comprueba si hallado en
F48E	2B	570	ATRAS	DEC	HL; 		el area permitida
F48F	22F0F4	580		LD	(MEMPOS),HL
F492	23	590		INC	HL
F493	E5	600		PUSH	HL
F494	ED5BF2F4	610		LD	DE, (LIMITE)
F498	A7	620		AND	A
F499	ED52	630		SBC	HL,DE
F49B	3014	640		JR	NC,NOHAY ;	y si no no le hace caso
F49D	El	650		POP	HL
F49E	2B	660	ATRASM	DEC	HL; 		antes de imprimir la entrada se
F49F	CB7E	670		BIT	7, (HL)	;	debe buscar el inicio
F4A1	28FB	675		JR	Z,ATRASM
F4A3	23	680		INC	HL
F4A4	E5	690		PUSH	HL
F4A5	E5	700		PUSH	HL
F4A6	CD6B0D	710		CALL	3435; 		borra toda la pantalla
F4A9	D1	720		POP	DE
F4AA	3EFF	730		LD	A,#FF ;		le indica a la rutina de impresion
F4AC	CD24F4	740		CALL	PMENSA ;	que se use la direccion en DE
F4AF	C1	750		POP	BC
F4B0	C9	760		RET
F4B1	3E03	770	NOHAY	LD	A,3; 		imprime mensaje 3
F4B3	CD33F4	780		CALL	IMPRIA
F4B6	El	790		POP	HL
F4B7	010000	800	LD	BC,O
F4BA	C9	810		RET
		820	;
F4BB	21CBF4	830	CONBUS	LD	HL,BCAR ;	esta es la entrada para buscar
F4BE	E5	840		PUSH	HL ; 		otra aparicion de la linea
F4BF	7E	850		LD	A, (HL)
F4CO	ED4BECF4	860		LD	BC, (POSCON)
F4C4	2AEEF4	870		LD	HL, (POSEN)
F4C7	23	880		INC	HL
F4C8	C367F4	890		JP	MIRAEN
		900	;
		910	;
F4CB		920	BCAR	DEF 833
F4EC	0000	930	POSCON	DEFW	0; 	el contador despues de una busqueda
F4EE	3275	940	POSEN	DEFW	30002; 	la posicion donde
		945	;			lo hemos hallado
F4F0	3175	950	MEMPOS	DEFW	30001 ; uno antes de
		955	; 			la posicion anterior
F4F2	C0F3	960	LIMITE	DEFW	62400; el limite de la memoria
		965	; 			que se usa
F424		970	PMENSA	EQU	#F424. rutina de impresion. ver listado
F433		980	IMPRIA	EQU	#F433; anterior en este apendice

		10	; esta rutina borra una ficha cuando se usa en
		 20	; union de la anterior.
  		30	;
  		40	; a la salida el par de registros BC contendra la
  		50	; memoria que ha quedado libre.
  		60	;
F4CB		70	MC3	ORG	#F4CB
F4CB	CDCBF4	80	XFIC	CALL	ENCUEN ; 	se usa para encontrar
F4CE	78	90	XFICEN	LD	A,B; 		la ficha a borrar.
F4CF	B1	100		OR	C
F4D0	C8	110		RET	Z ; BC=O si no existe
		111

_______             111

F4D1	E5	120		PUSH	HL
F4D2	C5	130		PUSH	BC
F4D3	3E02	140		LD	A,2; 	mensaje 2
F4D5	CDD5F4	150		CALL	IMPRIA
F4D8	3E7F	160	MTECLA	LD	A,127;	este es un metodo de
		170	; 			mirar si una tecla esta pulsada
F4DA	DBFE	180		IN	A, (#FE)
F4DC	1F	190		RRA
F4DD	3030	200		JR	NC,PARA
F4DF	3E7F	210		LD	A, 127	
F4E1	DBFE	220		IN	A, (#FE)
F4E3	CB5F	230		BIT	3,A
F4E5	282E	240		JR	Z,SIGFIC
F4E7	3EFE	250		LD	A,254
F4E9	DBFE	26O		IN	A, (#FE)
F4EB	CB57	270		BIT	2,A
F4ED	20E9	280		JR	NZ,MTECLA
F4EF	C1	290		POP	BC
F4F0	E1	300		POP	HL
F4F1	C5	310		PUSH	BC
F4F2	C5	320		PUSH	BC	; BC= inicio de la ficha
F4F3	E1	330		POP	HL
F4F4	010000	340		LD	BC,O
F4F7	CB7E	350	F_FIN	BIT	7, (HL)
F4F9	23	360		INC	HL
F4FA	03	370		INC	BC ; 		el final de la ficha
F4FB	28FA	380		JR	Z,F_FIN; 	debe ser hallado.
F4FD	D1	390		POP	DE ; 		ahora se mueve todo
F4FE	C5	400		PUSH	BC ; 		lo que esta por
F4FF	E5	410		PUSH	HL ; 		encima hacia abajo
F500	C1	420		POP	BC ; 		para borrar la ficha
F501	E5	430		PUSH	HL
F502	2A02F5	440		LD	HL, (LIMITE)
F505	A7	450		AND	A
F506	ED42	460		SBC	HL,BC
F508	E5	470		PUSH	HL
F509	C1	480		POP	BC
F50A	E1	490		POP	HL
F50B	EDBO	500		LDIR
F50D	C1	510		POP	BC ; la cantidad de espacio ganado.
F50E	C9	520		RET
F50F	E1	530	PARA	POP	HL ; limpia la pila y muestra no hallado
F510	C1	540		POP	BC
F511	010000	550		LD	BC,O
F514	C9	560		RET
F515	El	570	SIGFIC	POP	HL ; recupera los detalles y sigue
F516	C1	580		POP	BC ; buscando.
F517	CD17F5	590		CALL	CONBUS
F51A	C3CEF4	600		JP	XFICEN

		10	; esta rutina permite guardar la entrada del teclado
		20	; en memoria a la vez que se saca a pantalla.
		30	;
		40	;
		50	; permite el movimiento izda/dcha del cursor asi
		60	; como insertar y borrar caracteres.
		70	;
		80	; tambien ofrece una ayuda y un menu.
		90	;
		100	; como se muestra aqui es para usar con otras
		110	; rutinas de esta seccion.
		120	; pero se puede modificar para otros fines.
		130	,
		140	; comprueba la memoria disponible y  para la
		150	; entrada si se llega al limite.
		160	;

_______
112

		170	; hay una rutina extra de entrada para busqueda
		180	; asi como rutinas de seleccion de opciones
		190	; esto se hace asi para mostrar los diferentes
		200	; metodos de entrada y ver los problemas
		210	; mencionados en el texto.
		220	;
230	;
240	; esta es la direccion de entrada desde BASIC
		250	;
F51D		260	MC4	ORG	#F51D
F51D	3EA0	270	USR	LD	A,#AO ; se comprueba la memoria libre
F51F	2A1FF5	280		LD	HL, (LIMITE)
F522	ED5B22F5	290		LD	DE, (CARPOS)
F526	A7	300		AND	A
F527	ED52	310		SBC	HL,DE
F529	D234F5	320		JP	NC,NOLLEN
F52C	3E09	330		LD	A, 9 ; 	mensaje 9
F52E	CD2EF5	340		CALL	IMPRIA
F531	C3DFF6	350		JP	MENS4
F534	E5	360	NOLLEN	PUSH	HL ; 	toda la memoria por encima
F535	C1	370		POP	BC ; 	de la ultima ficha hasta el limite
F536	D5	380		PUSH	DE ; 	es limpiada y marcada libre.
F537	E1	390		POP	HL
F538	13	400		INC	DE
F539	77	410		LD	(HL), A
F53A	EDB0	420		LDIR
F53C	2A22F5	430	COGEA	LD	HL, (CARPOS) ; el inicio de la sig. ficha
F53F	2B	440		DEC	HL
F540	7E	450		LD	A, (HL)
F541	FE8D	460		CP	#8D
F543	2801	470		JR	Z,AINIC
F545	23	480		INC	HL
F546	368D	490	AINIC	LD	(HL),#8D
F548	2248F5	500		LD	(CUPOS),HL ; 	es marcado como inicio
F54B	CD6B0D	510		CALL	3435 ; 		la pantalla es borrada
F54E	CD4EF5	520		CALL	ABRE1
F551	012118	530		LD	BC,#1821 ;	la posicion de impresion de la
F554	CDD90D	540		CALL	3545 ; 		pantalla inferior es puesta arriba a
		550	; 				la izquierda.
F557	3E07	560		LD	A,7 ;  	mensaje 7
F559	CD59F5	570		CALL	IMPRI
F55C	3E01	580		LD	A,l ; el copyright
F55E	CD5EF5	590		CALL	PMENSA
F561	AF	600		XOR	A; la bandera del modo de edicion es bajada.
F562	3262F5	610		LD	(BANDE),A
F565	012116	620		LD	BC,#1621 ; pone la linea 2, columna 0
F568	CDD90D	630		CALL	3545
F56B	3E3E	640		LD	A,">"
F56D	D7	650		RST	16
F56E	CD02F7	660		CALL	CURSOR
F571	CD4EF5	670	ENTRA	CALL	ABRE1
F574	CDA810	680	ENT1	CALL	#10A8	; 	esta es la rutina de entrada del
F577	3806	690		JR	C,PULSAD; 	teclado, el acarreo puesto
		700	; 				si se pulsa otra tecla
F579	FDCB029E	710		RES	3, (IY+2) ; 	esta es TV FLAG, ver cap. 2
F57D	18F5	720		JR	ENT1
F57F	FE08	730	PULSAD	CP	8 ; 		se comprueban las teclas de funciones
F581	284E	740		JR	Z,ATRAS1
F583	FE09	750		CP	9
F585	CA11F7	760		JP	Z,DER1
F588	FE0C	770		CP	12; CAPS SHIFT y 0
F58A	CA5CF7	780		JP	Z,BORRA
F58D	FEC5	790		CP	197 ; OR
F58F	C8	800		RET	Z
F590	FECD	810		CP	205; STEP
F592	CACFF7	820		JP	Z,AYUDA

_______             113

F595	FEC6	830		CP	198
F597	CA8EF7	840		JP	Z,Y
F59A	FEC3	850		CP	195; NOT
F59C	CAD9F6	860		JP	Z,MIRAM
F59F	FECC	870		CP	204; TO
F5A1	CAB7F7	880		JP	Z,LIMPRE
F5A4	2A48F5	890		LD	HL, (CUPOS)
F5A7	23	900		INC	HL ; 		ahora se mira si se ha llegado
F5A8	F5	910		PUSH	AF ; 		al final de una ficha y si es
F5A9	3A62F5	920		LD	A, (BANDE) ; 	asi no se permite nada mas.
F5AC	A7	930		AND	A
F5AD	2806	940		JR	Z,VALE_Y ; 	si no se debe estar en edicion
F5AF	7E	950		LD	A, (HL) ;	 memoria libre
F5B0	FE8D	960		CP	#8D
F5B2	CA40F7	970		JP	Z,FINFIC
F5B5	F1	980	VALE_Y	POP	AF
F5B6	FEE2	990		CP	226; 		el STOP que para la entrada
F5B8	283B	1000		JR	Z,PARA
F5BA	77	1010		LD	(HL),A; 	el codigo del caracter es
F5BB	2248F5	1020		LD	(CUPOS),HL ; 	puesto en la posicion de memoria
		1030	; 				actual y esta se
		1040	; 				actualiza para la siguiente.
F5BE	FE0D	1050		CP	13
F5C0	2006	1060		JR	NZ,SACALE ; 	si una entrada mueve el cursar
F5C2	CDC2F5	1070		CALL	ABRE2
F5C5	CD02F7	1080		CALL	CURSOR
F5C8	CDC2F5	1090	SACALE	CALL	ABRE2
F5CB	D7	1100		RST	16; 		imprime la tecla y mueve el cursar
F5CC	CD02F7	1110		CALL	CURSOR ;
F5CF	18A0	1120		JR	ENTRA; 	va a por la siguiente tecla.
		1130	;
		1140	;
F5D1	2A48F5	1150	ATRAS1	LD	HL, (CUPOS) ; 	mueve el cursor
		1160	; 				atrás y  borra
F5D4	7E	1170		LD	A, (HL) ; 	la memoria correspondiente.
F5D5	CB7F	1180		BIT	7,A
F5D7	2098	1190		JR	NZ,ENTRA
F5D9	FE0D	1200		CP	13
F5DB	2B	1210		DEC	HL
F5DC	2248F5	1220		LD	(CUPOS),HL
F5DF	2005	1230		JR	NZ,RETRO
F5E1	CDE1F5	1240		CALL	ATRÁS ; 	pero ir atras
		1250	; 				de un ENTER significa
F5E4	186F	1260		JR	ENCRET ; 	volver atras y reimprimir.
F5E6	CDC2F5	1270	RETRO	CALL	ABRE2
F5E9	CD02F7	1280		CALL	CURSOR
F5EC	3E08	1290		LD	A,8
F5EE	D7	1300		RST	16
F5EF	CD02F7	1310		CALL	CURSOR
F5F2	C371F5	1320		JP	ENTRA ; 	lee el siguiente caracter
		1330	;
		1340	;
F5F5	E5	1350	PARA	PUSH	HL ; 		si se pulsa STOP solo se marcar el
F5F6	2B	1360		DEC	HL ; 		final de la ficha si es nueva,  pero
F5F7	7E 	1370	FININ	LD	A, (HL) ; 	en todo caso se debe
		1380	;				 hallar el  inicio
F5F8	23	1390		INC	HL; 		de la memoria libre y actualizar el
F5F9	FEA0	1400		CP	#AO; 		puntero.
F5FB	20FA	1410		JR	NZ,FININ
F5FD	2B	1420		DEC	HL
F5FE	2222F5	1430		LD	(CARPOS),HL
F601	E1	1440		POP	HL
F602	3A62F5	1450		LD	A, (BANDE)
F605	A7	1460		AND	A
F606	23	1470		INC	HL
F607	2007	1480		JR	NZ,PARAEN
F609	2222F5	1490		LD	(CARPOS),HL

_______
114

	
F60C	2B	1500		DEC	HL
F60D	3E8D	1510		LD	A,#8D
F60F	77	1520		LD	(HL),A
F610	CD6B0D	1530	PARAEN	CALL	3435 ; 		se limpia la pantalla
F613	AF	1540		XOR	A ; 		pone normal la bandera del modo
F614	3262F5	1550		LD	(BANDE),A
F617	3E04	1560		LD	A,4; 		se muestra el menu
F619	CD5EF5	1570		CALL	PMENSA
F61C	CD4EF5	1580	ENMENU	CALL	ABRE1
F61F	CDDE15	1590		CALL	#15DE	; 	la rutina de esperar entrada.
		1600	; 				ver capitulo 2
F622	FE0D	1610		CP	13
F624	CA1DF5	1620		JP	Z,USR
F627	F620	1630		OR	#20
F629	FE62	1640		CP	"b"
F62B	2810	1650		JR	Z,BENTRA
F62D	FE65	1660		CP	"e"
F62F	281E	1670		JR	Z,EENTRA
F631	FE63	1680		CP	"c"
F633	CAD9F6	1690		JP	Z,MIRAM
F636	FE73	1700		CP	"s"
F638	CA38F6	1710		JP	Z,SALCAR
F63B	18DF	1720		JR	ENMENU
		1730	;
		1740	;
F63D	CDA0F6	1750	BENTRA	CALL	ENCPT
F640	CD40F6	1760		CALL	XFICH
F643	2A22F5	1770		LD	HL, (CARPOS) ; 	se recupera el espacio ganado
F646	A7	1780		AND	A ; 		moviendo el inicio
		1790	; 				de la memoria libre
F647	ED42	1800		SBC	HL,BC ;	hacia abajo todas
		1810	; 				esas posiciones.
F649	2222F5	1820		LD	(CARPOS),HL
F64C	C3DFF6	1830		JP	MENS4
		1840	;
		1850	;
F64F	CDA0F6	1860	EENTRA	CALL	ENCPT	; 	empiece de la rutina
		1870	; 				de encontrar
F652	CD52F6	1880		CALL	ENCUEN
F655	78	1890	ENCRET	LD	A,B; 		si no se halla el dato
		1900	; 				vuelve al menu
F656	B1	1910		OR	C
F657	CADFF6	1920		JP	Z,MENS4
F65A	0B	1930		DEC	BC
F65B	ED4348F5	1940		LD	(CUPOS),BC; 	sino se pone en edicion al
F65F	2A5FF6	1950		LD	HL, (POSMEM) ; 	principio de la ficha dada.
F662	A7	1960		AND	A
F663	ED42	1970		SBC	HL,BC
F665	2265F6	1980		LD	(CURESP),HL
F668	3E01	1990		LD	A,1
F66A	3262F5	2000		LD	(BANDE),A
F66D	CD4EF5	2010		CALL	ABRE1
F670	012118	2020		LD	BC,#1821
F673	CDD90D	2030		CALL	3545
F676	3E08	2040		LD	A,8
F678	CD59F5	2050		CALL	IMPRI
F67B	3E07	2060		LD	A,7
F67D	CD59F5	2070		CALL	IMPRI
F680	CDC2F5	2080		CALL	ABRE2
F683	012118	2090		LD	BC,#1821
F686	CDD90D	2100		CALL	3545
F689	3EOD	2110		LD	A,13
F68B	D7	2120		RST	16
F68C	CD02F7	2130		CALL	CURSOR
F68F	ED4B65F6	2140		LD	BC, (CURESP)
F693	78	2150	R1MAS	LD	A,B
F694	B1	2160		OR	C

_______             115

F695	CA71F5	2170		JP	Z,ENTRA
F698	C5	2180		PUSH	BC
F699	CD17F7	2190		CALL	DERCUR
F69C	C1	2200		POP	BC
F69D	0B	2210		DEC	BC
F69E	18F3	2220		JR	R1MAS
		2230	;
		2240	;
F6A0	CD6B0D	2250	ENCPT	CALL	3435; 		es similar a la rutina de entrada
F6A3	3E05	2260		LD	A,5 ; 		anterior pero no permite
		2270	; 				realizar ninguna
F6A5	CD5EF5	2280		CALL	PMENSA ; 	alteracion y limita la entrada
F6A8	3E3E	2290		LD	A,62; 		cuando se alcanza LIM_EN
F6AA	D7	2300		RST	16
F6AB	21CBF6	2310		LD	HL,BCAR+32
F6AE	22AEF6	2320		LD	(LIM_EN),HL
F6B1	21ABF6	2330		LD	HL,BCAR
		2340	;
		2350	;
F6B4	E5	2360	ENTRAF	PUSH	HL ; 	la rutina real de entrada
F6B5	CD4EF5	2370		CALL	ABRE1
F6B8	CDDE15	2380		CALL	#15DE
F6BB	E1	2390		POP	HL
F6BC	FE0D	2400		CP	13; 	se termina al pulsar ENTER
F6BE	2816	2410		JR	Z,PONFIN
F6C0	FE20	2420		CP	32
F6C2	38F0	2430		JR	C,ENTRAF
F6C4	77	2440		LD	(HL),A
F6C5	23	2450		INC	HL
F6C6	E5	2460		PUSH	HL
F6C7	CDC2F5	2470		CALL	ABRE2
F6CA	D7	2480		RST	16
F6CB	E1	2490		POP	HL
F6CC	EB	2500		EX	DE,HL
F6CD	2AAEF6	2510		LD	HL,(LIM_EN)
F6D0	A7	2520		AND	A
F6D1	ED52	2530		SBC	HL,DE
F6D3	EB	2540		EX	DE,HL
F6D4	20DE	2550		JR	NZ,ENTRAF
F6D6	36FF	2560	PONFIN	LD	(HL),255
F6D8	C9	2570		RET
		2580	;
		2590	;
F6D9	CDD9F6	2600	MIRAM	CALL	CONBUS ; busca otra aparicion del texto
F6DC	C355F6	2610		JP	ENCRET
		2620	;
		2630	;
F6DF	0603	2640	MENS4	LD	B,3; 	borra las tres lineas inferiores de
F6E1	CD440E	2650		CALL	3652; 	la pantalla como se dice en el cap.	2

F6E4	3E04	2660		LD	A,4 ; 	el menu
F6E6	CD2EF5	2670		CALL	IMPRIA
F6E9	C31CF6	2680		JP	ENMENU
		2690	;
		2700	;
		2710	;
		2720	; OVER 1 y OVER 0 ejecutan los mismos comandos que
		2730	; el BASIC imprimiendo los codigos de control
F6EC	F5	2740		OVER1	PUSH	AF
F6ED	E5	2750		PUSH	HL
F6EE	3E15	2760		LD	A,21
F6F0	D7	2770		RST	16
F6F1	3E01	2780		LD	A,1
F6F3	D7	2790		RST	16
F6F4	El	2800		POP	HL
F6F5	F1	2810		POP	AF
F6F6	C9	2820		RET

_______
116

	
F6F7	F5	2830	OVERO	PUSH	AF
F6F8	E5	2840		PUSH	HL
F6F9	3E15	2850		LD	A,21
F6F8	D7	2860		RST	16
F6FC	3E00	2870		LD	A,O
F6FE	D7	2880		RST	16
F6FF	E1	2890		POP	HL
F700	F1	2900		POP	AF
F701	C9	2910		RET
F702	F5	2920	CURSOR	PUSH	AF ; 		aqui se imprime el cursor y se
F703	CDECF6	2930		CALL	OVER1 ; 	retrocede la posicion de impresion
F706	3E5F	2940		LD	A,95 ; 		para colocarla encima de el.
F708	D7	2950		RST	16
F709	3EO8	2960		LD	A,8
F708	D7	2970		RST	16
F70C	CDF7F6	2980		CALL	OVERO
F70F	F1	2990		POP	AF
F710	C9	3000		RET
F711	CD17F7	3010	DER1	CALL	DERCUR
F714	C371F5	3020		JP	ENTRA
F717	CDC2F5	3030	DERCUR	CALL	A8RE2	; 	esta rutina mueve el cursor
F71A	2A48F5	3040		LD	HL, (CUPOS) ; 	a la derecha una
		3050	; 				posicion y cambia
F71D	23	3060		INC	HL ; 		el puntero de memoria al nuevo
		3070	; 				caracter.
F71E	7E	3080		LD	A, (HL)
F71F	C87F	3090		BIT	7,A
F721	CO	3100		RET	NZ
F722	FE7F	3110		CP	127
F724	C8	3120		RET	Z
F725	FE0D	3130		CP	13
F727	2803	3140		JR	Z,ENRET
F729	FE20	3150		CP	32
F72B	D8	3160		RET	C
F72C	2248F5	3170	ENRET	LD	(CUPOS),HL
F72F	CD02F7	3180		CALL	CURSOR
F732	FE0D	3190		CP	13
	F7342805	3200		JR	Z,RETSI
F736	CDECF6	3210		CALL	OVER1
	F7393E20	3220		LD	A,32
F738	D7	3230	RETSI	RST	16
F73C	CD02F7	3240		CALL	CURSOR
F73F	C9	3250		RET
		3260	;
		3270	;
F740	E5	3280	FINFIC	PUSH	HL ; 		si se intentan introducir datos
F741	0603	3290		LD	B,3 ; 		despues del final de
		3300	; 				la ficha se produce
F743	CD440E	3310		CALL	3652 ; 		un aviso parpadeante y se borra 1a
F746	3E06	3320		LD	A,6 ; 		parte inferior de la pantalla.
F748	CD5EF5	3330		CALL	PMENSA
F74B	FB	3340		El  	; 		si estuviesen interrumpidas
F74C	0632	3350		LD	8,50 ; 		esta pausa de un segundo seria para
F74E	76	3360		ESPE1	HALT ; 	siempre.
F74F	10FD	3370		DJNZ	ESPE1
F751	E1	3380		POP	HL
F752	F1	3390		POP	AF
F753	2153F7	3400	REENT	LD	HL,POSEN
F756	35	3410		DEC	(HL)
F757	2B	3420		DEC	HL
F758	34	3430		INC	(HL)
F759	C3D9F6	3440		JP	MIRAM
		3450	;
		3460	;
F75C	2A48F5	3470	BORRA	LD	HL, (CUPOS) ; 	 funciona igual que
		3480	; 				1a de borrar
F75F	23	3490		INC	HL ; 		una ficha pero con un caracter.

_______             117

F760	7E	3500		LD	A, (HL)
F761	CB7F	3510		BIT	7,A
F763	C271F5	3520		JP	NZ,ENTRA
F766	E5	3530		PUSH	HL
F767	E5	3540		PUSH	HL
F768	2A1FF5	3550		LD	HL, (LIMITE)
F76B	D1	3560		POP	DE
F76C	A7	3570		AND	A
F76D	ED52	3580		SBC	HL,DE
F76F	E5	3590		PUSH	HL
F770	C1	3600		POP	BC
F771	D1	3610		POP	DE
F772	DA71F5	3620		JP	C,ENTRA
F775	CA71F5	3630		JP	Z,ENTRA
F778	D5	3640		PUSH	DE
F779	E1	3650		POP	HL
F77A	23	3660		INC	HL
F77B	EDB0	3670		LDIR
F77D	2A22F5	3680		LD	HL, (CARPOS)
F780	28	3690		DEC	HL
F781	2222F5	3700		LD	(CARPOS),HL
F784	2A48F5	3710		LD	HL, (CUPOS)
F787	23	3720		INC	HL
F788	CDE1F5	3730		CALL	ATRAS
F78B	C355F6	3740		JP	ENCRET
		3750	;
		3760	;
F78E	2A48F5	3770	Y	LD	HL, (CUPOS) ; 	esta es la contraria.
F791	23	3780		INC	HL
F792	E5	3790		PUSH	HL
F793	2A1FF5	3800		LD	HL, (LIMITE)
F796	D1	3810		POP	DE
F797	A7	3820		AND	A
F798	ED52	3830		SBC	HL,DE
F79A	E5	3840		PUSH	HL
F79B	C1	3850		POP	BC
F79C	D5	3860		PUSH	DE
F79D	ED5B1FF5	3870		LD	DE, (LIMITE)
F7A1	D5	3880		PUSH	DE
F7A2	E1	3890		POP	HL
F7A3	2B	3900		DEC	HL
F7A4	EDB8	3910		LDDR
F7A6	2A22F5	3920		LD	HL, (CARPOS)
F7A9	23	3930		INC	HL
F7AA	2222F5	3940		LD	(CARPOS),HL
F7AD	E1	3950		POP	HL
F7AE	3E20	3960		LD	A,32
F7B0	77	3970		LD	(HL),A
F7B1	CDE1F5	3980		CALL	ATRAS
F7B4	C355F6	3990		JP	ENCRET
		4000	;
		4010	;
F7B7	2A48F5	4020	LIMPRE	LD	HL,(CUPOS) ;	esta usa la corriente
		4030	; 				tres de un modo similar
F7BA	23	4040		INC	HL; 		al canal 2 para la pantalla
F7BB	CDE1F5	4050		CALL	ATRÁS ; 	si hay conectado un interfAz que
F7BE	C5	4060		PUSH	BC ; 		reconoce LPRINT, funcionara.
F7BF 	3E03	4070		LD	A,3
F7C1	CD0116	4080		CALL	#1601
F7C4	D1	4090		POP	DE
F7C5	D5	4100		PUSH	DE
F7C6	1B	4110		DEC	DE
F7C7	AF	4120		XOR	A
F7C8	CDC8F7	4130		CALL	IMPRIP
F7CB	C1	4140		POP	BC
F7CC	C355F6	4150		JP	ENCRET
		4160	;

_______
118

	
		4170	;
F7CF	CD6B0D	4180	AYUDA	CALL	3435
F7D2	3EOA	4190		LD	A,10;	 la pagina de ayuda
F7D4	CD5EF5	4200		CALL	PMENSA
F7D7	3EBF	4210	ESPERE	LD	A,#BF
F7D9	DBFE	4220		IN	A, (#FE)
F7DB	E601	4230		AND	1
F7DD	20F8	4240		JR	NZ,ESPERE
F7DF	2A48F5	4250		LD	HL, (CUPOS)
F7E2	2253F7	4260		LD	(POSEN),HL
F7E5	23	4270		INC	HL
F7E6	7E	4280		LD	A, (HL)
F7E7	21ABF6	4290		LD	HL,BCAR
F7EA	77	4300		LD	(HL),A
F7EB	23	4310		INC	HL
F7EC	36FF	4320		LD	(HL),#FF
F7EE	C353F7	4330		JP	REENT

	10	; este es el inicio de las rutinas de salvar y cargar 
	20	; primero se calcula la longitud incluyendo un espacio 
	30	; para marcar el final y la longitud en bytes para
	40	; reentrar despues de cargar.
		50	;
		60	;
		70	;
F7F1		80	MC5	ORG	#F7F1
F7F1	2AF1F7	90	SALCAR	LD	HL, (CARPOS) ; 	primero se pone el final
F7F4	222E75	100		LD	(29998), HL ;	de las fichas en el
		110	; 				inicio del area
F7F7	112E75	120		LD	DE, 29998 ; 	que se va a salvar o cargar.
F7FA	A7	130		AND	A
F7FB	ED52	140		SBC	HL,DE
F7FD	23	150		INC	HL
F7FE	23	160		INC	HL
F7FF	E5	170		PUSH	HL
F800	3EOB	180		LD	A,11
F802	CD02F8	190		CALL	PMENSA
F805	0619	200		LD	B,25 ; 		25 interrupciones
F807	FB	210		El
		220	;
		230
		240	; esto esta mal hecho pero es para demostrar el
	250	; uso del HALT para retardar
		260	;
		270	;
F808	76	280	MANTEN 	HALT 	;		para asegurarse que no se coge
F809	10FD	290		DJNZ	MANTEN ; 	la S del menu principal
300	;				ahora se explora el teclado
310	;
F80B	3EBF	320	SAOLEE	LD	A,#BF
F80D	DBFE	330		IN	A, (#FE)
F80F	E602	340		AND	2
F811	CA11F8	350		JP	Z,LEE
F814	3EFD	360		LD	A,#FD
F816	DBFE	370		IN	A, (#FE)
F818	E602	380		AND	2
F81A	20EF	390		JR	NZ,SAOLEE

		10	; aqui se elige entre cinta y microdrive
		20	;
		30	;
F81C		40		ORG	#F81C
F81C	C1	50	SALVA	POP	BC
F81D	CD1DF8	60		CALL	M_O_C ; 	vuelve con el acarreo a 1 si se
			70	;				 pulsa M y  pone la cabecera
			80	;

_______             119

F820	38FE	90		JR	C,MSALVA
100	;
110	; esto salva una cabecera y un bloque de datos a
120	; cinta. La cabecera es especial, ver salvando y
130	; cargando en el capitulo 2
		140	;
F822	C5	150	CSALVA	PUSH	BC ; 	 BC= longitud del bloque principal
		160	; 			 IX apunta ya al inicio
F823	110D00	170		LD	DE, 13 ; la cabecera solo ocupa 13 bytes
F826	AF	180		XOR	A ; 	  si A es cero indica cabecera
F827	CDC604	190		CALL	1222 ; 	  rutina descrita en el cap. 2 que
		200	; 			  salva la cabecera.
F82A	D1	210		POP	DE ; 	  recupera la longitud del bloque
		220	; 			  principal
F82B	DD212E75	230		LD	IX, 29998;  	direccion de inicio del bloque
		240	; 				principal de datos a salvar
F82F	3EFF	250		LD	A,#FF; 		indica bloque principal
F831	CDC604	260		CALL	1222; 		usa la rutina de ROM de nuevo
F834	FB	270		El	; 		vuelve con las interrupciones
		280	;				desconectadas.
F835	C335F8	290		JP	RETBA

		10	;
20	; esto quita la ROM de 16 K
30	; ver detalles en capitulo 3
		40	;
		50	;
F838		60		ORG	#F838
F838	2149F8	70	CAMROM	LD	HL,ROMFUE
F83B	22ED5C	80		LD	(23789),HL ; 	la rutina de la ROM es accedida
90	; 				con el codigo de enlace 32 de
		100	; 				modo que la pila se puede
		105	; 				corromper.
F83E	D9	110		EXX ; 			este es un metodo mas seguro.
F83F	223FF8	120		LD	(HLSAL),HL
F842	D9	130		EXX
F843	ED4343F8	140		LD	(BCSAL),BC
F847	CF	150		RST	8 ; 		usa el codigo de enlace
F848	32	160		DEFB	#32
F849	E1	170	ROMFUE	POP	HL ; 		se deben quitar las dos
F84A	E1	180		POP	HL; 		direcciones de retorno y
F84B	D1	190		POP	DE; 		la de esta rutina
F84C	2A3D5C	200		LD	HL, (23613) ; 	esta es ERR_SP ver cap. 4
F84F	E5	210		PUSH	HL ; 		salva la posicion del retorno
			220	; 				de error en la pila para mas
F850		2150F8	230		LD	HL,MSLRET; 	tarde
F853	E5	240		PUSH	HL ; 		pone en la pila la nueva
F854	ED733D5C	250		LD	(23613),SP; 	direccion de error
F858	D5	260		PUSH	DE ; 		y apunta SP para que
			270	; 				recupere la direccion
F859	C9	280		RET ; 			de retorno.

10	; esta es la rutina de salvar a microdrive. ver cap. 3
20	;
		30	;
F85A		40		ORG	#F85A
F85A	CD5AF8	50	M	SALVA	CALL	CAMROM
F85D	CD5DF8	60		CALL	MCABE ; 	pone la cabecera
F860	CD60F8	70		CALL	PONVAR ; 	y las variables del sistema
F863	FDCB7CEE	80		SET	5, (IY+124) ; 	indica que salva con FLAGS 3
F867	CD7F1E	90		CALL	#1E7F ; 	en realidad no se
100	; 				necesita una llamada
110	; 				ya que el retorno es por medio
		120	; 				del error 0 de la ROM de 16 K
F86A	El	130	MSLRET	POP	HL; 		recupera la variable
		140	; 				del sistema ERR_SP
_______
120

	
F86B	223D5C	150		LD	(23613),HL; 	ERR_SP
F86E	FB	160		El ; 			totalmente innecesario pero
		170	; 				seguro.
F86F	D9	180		EXX
F870	2A70F8	190		LD	HL,(HLSAL) ; 	recupera el registro HL'
F873	D9	200		EXX ; 			fijese que la ROM de 16 K
		210	; 				esta activa ya que
F874	C374F8	220		JP	LORET; 	el retorno es por medio de un
		230		; 			error del BASIC en la ROM de 16K
			240

F877		10		ORG	#F877
F877	21D95C	20	PONVAR	LD	HL,23769 ; esto se explica en el cap. 3
F87A	364D	30		LD	(HL),"M"
F87C	210AOO	40		LD	HL,10
F87F	22DA5C	50		LD	(23770),HL
F8822	172F9	60		LD	HL,BCAR+1
F8852	2DC5C	70		LD	(23772),HL
F8882	10100	80		LD	HL,1
F88B	22D65C	90		LD	(23766),HL
F88E	C9	100		RET
		110	;
		120	;
130	;
140	; esta es la rutina de leer del microdrive
150	; todos los detalles se dan en el capitulo 3
		160	;
		170	;
F88F	010000	180	MLEE	LD	BC,O ; 		los datos de la cabecera se tienen
F892	CD92F8	190		CALL	CAMROM ; 	que usar ya que no son conocidos
F895	CDA5F8	200		CALL	MCABE	
F898	CD77F8	210		CALL	PONVAR
F89B	FDCB7CE6	220		SET	4, (IY+124) ; 	esto indica leer
F89F	CDAF08	230		CALL	#8AF ; 		llama a la rutina de leer
F8A2	C3A2F8	240		JP	MSLRET; 	en realidad es dificil llegar
		250	; 				aqui
		260	;
		270	;
		280	; esta pone la cabecera del microdrive
		290	; mas detalles en el capitulo 3.
		300	;
		310	;
F8A521E65C	320	MCABE	LD	HL,23782
F8A8	3603	330		LD	(HL),3
F8AA	23	340		INC	HL
F8AB	ED5B5CF9	350		LD	DE, (BCSAL)
F8AF	73	360		LD	(HL),E
F8B0	23	370		INC	HL
F8B1	72	380		LD	(HL),D
F8B2	23	390		INC	HL
F8B3	112E75	400		LD	DE, 29998	
F8B6	73	410		LD	(HL),E
F8B7	23	420		INC	HL
F8B8	72	430		LD	(HL),D
F8B9	23	440		INC	HL
F8BA	3680	450		LD	(HL),#80
F8BC	C9	460		RET
		470	;
		480	;
		490	;
		500	;
		510	; decide leer de cinta o microdrive
		520	;
		530	;
		540	; lee de cinta como se indica en el cap. 2
		550	;

_______             121

F8BD	C1	560	LEE	POP	BC
F8BE	CD05F9	570		CALL	M_O_T
F8C1	38CC	580		JR	C,MLEE
F8C3	AF	590	TLEE	XOR	A;	indica cabecera
F8C4	37	600		SCF	; 	indica leer
F8C5	110D00	610		LD	DE,13
F8C8	14	620		INC	D
F8C9	08	630		EX	AF,AF'
F8CA	15	640		DEC	D
F8C8	F3	650		DI
F8CC	DD2180F9	660		LD	IX,BCAR+15
F8D0	CD6205	670		CALL	#562
F8D3	FB	680		El
F8D4	CD541F	690		CALL	8020
F8D7	D0	700		RET	NC ; 		BREAK pulsado
F8D8	DD2171F9	71O	MIRCAB	LD	IX,BCAR ; 	se comprueba la cabecera
F8DC	2180F9	720		LD	HL,BCAR+15
F8DF	060B	730		LD	B,11
F8E1	7E	740	MIRLP	LD	A, (HL)
F8E2	DDBE00	750		CP	(IX+OO)
F8E5	20DC	760		JR	NZ,TLEE; 	equivocado. Cabecera mal
F8E7	DD23	770		INC	IX;		la cabecera esta bien.
		775	;				Lee los datos.
F8E9	23	780		INC	HL
F8EA	10F5	790		DJNZ	MIRLP
F8EC	DD212E75	800		LD	IX,29998
F8F0	5E	810		LD	E, (HL)
F8F1	23	820		INC	HL
F8F2	56	830		LD	D, (HL)
F8F3	37	840		SCF	; 		indica lectura
F8F4	3EFF	850		LD	A,#FF; 		bloque de datos principal
F8F6	14	860		INC	D
F8F7	08	870		EX	AF,AF'
F8F8	15	880		DEC	D
F8F9	F3	890		DI
F8FA	CD6205	900		CALL	#562
F8FD	FB	910		El
F8FE	CD541F	920		CALL	802O
F901	D0	930		RET	NC; 		BREAK pulsado
F902	C325F9	940		JP	RETBA; 	cargado, vuelve a entrar
		950	;
		960	;
		970	;
		980	; esta rutina pide el nombre del fichero y si se
		990	; lee de microdrive o de cinta
		1000	;
		1010	;
F905	CD2EF9	1020	M-O-T	CALL	SALVAT
F908	C5	1030		PUSH	BC
F909	DDE5	1040		PUSH	IX
F90B	3EOC	1050		LD	A,12
F90D	CDODF9	1060		CALL	IMPRIA
F910	3E7F	1070	MIOCIN	LD	A,#7F
F912	DBFE	1080		IN	A, (#FE)
F914	E604	1090		AND	4
F916	37	1100		SCF
F917	2808	1110		JR	Z,MOTSI
F919	3EFB	1120		LD	A,#FB
F91B	DBFE	1130		IN	A, (8FE)
F91D	E610	1140		AND	16
F91F	20EF	1150		JR	NZ,MIOCIN
F921	DDE1	1160	MOTSI	POP	IX
F923	C1	1170		POP	BC
F924	C9	1180		RET
		1190	;
		1200	;
		1210	;

_______
122

	
1220	; aqui se cogen los detalles de longitud del inicio
1230	; del area leida o de lo que se puso ahi cuando
1240	; se salvo.
1250	;
F9252	A2E75	1260	RETBA	LD	HL, (29998)
F9282	60F9	1270		LD	(CARPOS),HL
F92B	C32BF9	1280		JP	USR
		1290	;
		1300	;
		1310	;
		1320	; esta rutina crea una cabecera en el area
		1330	; BCAR de la memoria
		1340	;
F92E	2171F9	1350	SALVAT	LD	HL,BCAR
F931	C5	1360		PUSH	BC
F932	E5	1370		PUSH	HL
F933	E5	1380		PUSH	HL
F934	3603	1390		LD	(HL),3
F936	C5	1400		PUSH	BC
F937	060A	1410		LD	B,10
F939	3E20	1420		LD	A,32
F93B	23	1430	PONCAB	INC	HL
F93C	77	1440		LD	(HL),A
F93D	10FC	1450		DJNZ	PONCAB
F93F	E5	1460		PUSH	HL
F940	2264F9	1470		LD	(LIM_EN),HL
F943	E1	1480		POP	HL
F944	C1	1490		POP	BC
F945	23	1500		INC	HL
F946	71	1510		LD	(HL),C
F947	23	1520		INC	HL
F948	70	1530		LD	(HL),B
F949	CD6BOD	1540		CALL	3435
F94C	3E0D	1550		LD	A,13
F94E	CD4EF9	1560		CALL	PMENSA
F951	E1	1570		POP	HL
F952	23	1580		INC	HL
F953	CD53F9	1590		CALL	ENTRAF
F956	3620	1600		LD	(HL),32
F958	DDE1	1610		POP	IX
F95A	C1	1620		POP	BC
F95B	C9	1630		RET
		1640	;
		1650	;
		1660	;
F95C	0000	1670	BCSAL	DEFW	0
F95E	0000	1680	CUPOS	DEFW	0
F960	3175	1690	CARPOS	DEFW	30001
F962	0000	1700	HLSAL	DEFW	0
F964	0000	1710	LIM_EN	DEFW	0
F966	30F2	1720	LIMITE	DEFW	62000
F968	0000	1730	POSCON	DEFW	0
F96A	0000	1740	POSEN	DEFW	0
F96C	00	1750	BANDE	DEFB	0
F96D	3175	1760	POSMEM	DEFW	300O1
F96F	2118	1770	CURESP	DEFW	#1821
F971		1780	BCAR	DEFS	33
F992	80	1790	MENSM1	DEFB	#80
F993	80	1800	MENS	DEFB	#80
F994	44654241	1810	MENS1	DEFM	"DeBASE. ANAYA MULTIMEDIA 1985"
F9B1	8D	1820		DEFB	#8D
F9B2	1001	1830	MENS2	DEFW	#110
F9B4	50554C53	1840		DEFM	"PULSE ESPACIO PARA PARAR"
F9CC	0D	1850		DEFB	13
F9CD	58205041	1860		DEFM	"X PARA BORRAR O N PARA LA SIGUIENTE FICHA"
F9F6	1000	1870		DEFW	#10
F9F8	8D	1880		DEFB	#8D

_______             123

F9F9	1002	1890	MENS3	DEFW	#210
F9FB	4E4F2O48	1900		DEFM	"NO HALLADO"
FA05	1000	1910		DEFW	#10
FA07	8D	1920		DEFB	#8D
FA08	1001	1930	MENS4	DEFW	#110
FA0A	20202020	1940		DEFM"	MENU"
FA19	0D0D	1950		DEFW	#0D0D
FA1B	50554C53	1960		DEFM	"PULSE:"
FA21	0DOD	1970		DEFW	#ODOD
FA23	45205041	1980		DEFM	"E PARA ENCONTRAR"
FA33	0DOD	1990		DEFW	#0D0D
FA35	42205041	2000		DEFM	"B PARA BORRAR"
FA42	0DOD	2010		DEFW	#0D0D
FA44	4320434F	2020		DEFM	"C CONTINUA LA BUSQUEDA"
FA5A	0D0D	2030		DEFW	#0D0D
FA5C	454E5445	2040		DEFM	"ENTER PARA METER OTRA FICHA"
FA77	0DOD	2050		DEFW	#0D0D
FA79	53205041	206O		DEFM	"S PARA SALVAR O LEER"
FA8D	1000	2070		DEFW	#10
FA8F	8D	2080		DEFB	#8D
FA90	5445434C	2090	MENS5	DEFM	"TECLEE LOS DETALLES A	 HALLAR"
FAAC	8D	2100		DEFB	#8D
FAAD	1002	2110	MENS6	DEFW	#210
FAAF	0D	2120		DEFB	13
FAB0	46494E20	2130		DEFM	"FIN DE LA FICHA, NO MAS  DATOS"
FACD	0D	2140		DEFB	13
FACE	41434550	2150		DEFM	"ACEPTABLES"
FAD8	8D	2160		DEFB	#8D
FAD9	1001	2170	MENS7	DEFW	#110
FADB	50554C53	2180		DEFM	"PULSE:"
FAE1	1002	2190		DEFW	#210
FAE3	53544F50	2200		DEFM	"STOP"
FAE7	1001	2210		DEFW	#110
FAE9	50415241	2220		DEFM	"PARA	 EL MENU,"
FAF6	1002	2230		DEFW	#210
FAF8	02	2240		DEFB	2
FAF9	544F	2250		DEFM	"TO"
FAFB	1001	2260		DEFW	#110
FAFD	50415241	2270		DEFM	"PARA  IMPRIMIR O"
FB0C	1002	2280		DEFW	#210
FB0E	53544550	2290		DEFM	"STEP"
FB12	1001	2300		DEFW	#110
FB14	50415241	2310		DEFM	"PARA AYUDA"
FB1E	A0	2320		DEFB	#AO
FB1F	1003	2330	MENS8	DEFW	#310
FB21	45535441	2340		DEFM	"ESTA EN MODO DE EDICION"
FB38	8D	2350	MC9	DEFB	#8D
FB39	1002	2360	MENS9	DEFW	#210
FB3B	53452051	2370		DEFM	"SE QUEDO SIN MEMORIA"
FB4F	0D	2380		DEFB	13
FB50	53414C56	2390		DEFM	"SALVE LAS FICHAS 0 SIMILAR"
FB6A	1000	2400		DEFW	#lO
FB6C	8D	2410		DEFB	#8D
FB6D	4355414E	2420	MENS10	DEFM	"CUANDO ESTA EN MODO EDICION"
FB88	0D	2430		DEFB	13
FB89	50554C53	2440		DEFM	"PULSANDO"
FB91	1002	2450		DEFW	#210
FB93	4E4F54	2460		DEFM	"NOT"
FB96	1000	2470		DEFW	#010
FB98	454E434F	2480		DEFM	"ENCONTRARA LA SIGUIENTE APARICION"
FBB9	4445204C	2490		DEFM	"DE LA ULTIMA CADENA QUE SE BUSCO"
FBD9	0D0D	2500		DEFW	#0D0D
FBDB	1002	2510		DEFW	#210
FBDD	414E44	2520		DEFM	"AND"
FBE0	1000	2530		DEFW	#010
FBE2	494E5345	2540		DEFM	"INSERTARA UN CARACTER"
FBF7	0D	2550		DEFB	13

_______
124

	
FBF8	454E204C	2560		DEFM	"EN LA POSICION DEL CURSOR"
FC11	0D0D	257O		DEFW	#ODOD
FC13	44454C45	2580		DEFM	"DELETE BORRARA EL CARACTER"
FC2D	0D	2590		DEFB	13
FC2E	454E204C	2600		DEFM	"EN LA POSICION DEL CURSOR"
FC47	0DOD	2610		DEFW	#0D0D
FC49	5349204E	2620		DEFM	"SI NO HAY ESPACIO EN UNA FICHA"
FC67	0D	2630		DEFB	13
FC68	51554520	2640		DEFM	"QUE ESTA MODIFICANDO, USE LA"
FC84	0D	2650		DEFB	13
FC85	46554E43	2660		DEFM	"FUNCION INSERTAR PARA HACER SITIO"
FCA6	0DOD	2670		DEFW	#0D0D
FCA8	4C415320	2680		DEFM	"LAS TECLAS DE CURSOR PERMITEN"
FCC5	0D	2690		DEFB	13
FCC6	4D4F5645	2700		DEFM	"MOVERSE POR EL TEXTO PERO"
FCDF	0D	2710		DEFB	13
FCE0	4E4F2050	2720		DEFM	"NO PUEDE IR ATRAS DE UN ENTER"
FCFD	0D0D	2730		DEFW	#0D0D
FCFF	1004	2740		DEFW	#410
FD01	50554C53	2750		DEFM	"PULSE ENTER PARA VOLVER AL TEXTO'.
FD21	1000	2760		DEFW	#10
FD23	8D	2770		DEFB	#8D
FD24	50554C53	2780	MENS11	DEFM	"PULSE S=SALVAR, L=LEER"
FD3A	8D	2790		DEFB	#8D
FD3B	50554C53	2800	MENS12	DEFM	"PULSE M PARA M/DRIVE"
FD4F	0D	2810		DEFB	13
FD50	4F205420	2820		DEFM	"O T PARA CINTA"
FD5E	8D	2830		DEFB	#8D
FD5F	5445434C	2840	MENS13	DEFM	"TECLEE EL NOMBRE:"
FD70	8D	2850		DEFB	#8D
FD71	8D	2860	ZFIN	DEFB	#8D

_______             125

   Indice alfabético
Abrir canal, 34, 35.
Abrir fichero, 35. 
Alfanumérico, 48.
Altavoz, 61, 63.
AND, 17.
Apilar número, 90.
Area de edición, 17.
ASCII, 14, 33, 46, 47, 83, 85, 
99, 100, 104.
AT, 99, 100.
Atributos, 13, 54.
ATTR P, 54.
ATTR T, 54.
AVANCE, 99.
Bandera "SINT AX-R UN", 39. 
Bandera, 55, 56, 64, 75. 
Bandera de acarreo, 17, 25, 
27, 28, 32, 38, 39, 84. 
BASIC, 8, II, 13, 19,20,23, 
25, 39, 50, 55, 61, 70, 72, 75. 
BAUD, 32, 33, 56.
BBC, 31, 62.
BEEP, 18, 72.
BELL, 99.
BIN, 90.
Binario, 72.
BIT, 14, 15, 16, 19, 22, 48. 
BORD CR, 49.
BORDER, 61.
Borrado de la memoria in-
termedia, 18.
Borrado de la pila, 23. 
Borrado de pantalla, 13, 22. 
Borrado del área de trabajo, 
23.
Borrar, 100.
Borrar fichero, 37.
BREAK, 12, 23, 25, 26, 28, 
32, 52, 62.
_______
126
BREG, 51.
BRIGHT, 99, 100.
Buffer, 17, 18.
Bus, 31, 61, 64, 69, 70. 
BYTES, 14, 15, 21, 22, 23, 
26, 35, 45, 81.
Cabecera de Microdrive, 40. 
Cabecera del programa, 23, 
24, 26, 34, 57, 58. 
Cabecera ficticia, 26, 27. 
Cadenas, 88, 91.
Calculador, 21, 22, 55, 76, 77, 
81, 103.
CALL, 7, 14, 17, 39, 71, 77. 
Cambio de pila, 88, 89. 
Canal, 65.
CAPS SHIFT, 12, 16, 17,46, 
62, 99, 100.
Caracteres, 15, 16, 47.
Carga, 26.
Cartucho, 64, 72.
Catálogo del cartucho, 39. 
Centronics, 12, 64, 65, 104. 
Cerrar canal de la red local, 
35.
Cerrar canal de Microdrive, 
37.
CHADD, 51, 57, 76, 77. 
CHANS, 34, 50.
CHARS, 47.
CHR$, 51, 89, 100.
Cinta, 61.
CIRCLE, 53.
CLEAR, 55.
CODE, 58, 88.
Código máquina, 7, 41, 54, 
81, 84.
Código SI, 100.
Código SO, 100.
Códigos de enlace, 32, 33, 34, 
35, 36, 37, 38, 39, 40. 
Color, 28, 63.
Complete Spectrum ROM Dis-
assembly, 8.
CONTINUE, 52.
Control, 17.
Conversión hexadecimal a 
decimal, 93.
COORDS, 21, 22, 53. 
COPIES, 58.
Corrientes estándar, 65. 
CPU, 31, 69, 70.
CPU 2-80, 61.
CURCHL, 17, 34, 50. 
DATADD, 50.
Datos, 58, 61.
DeBASE, 17, 19, 26, 28, 39, 
41, 100.
DEC JR N2, 90.
Decimal, 14, 15, 18. 
Decodificación, 26, 63.
DEF ADD, 47.
DEFB, 32, 43.
DEFW, 42.
Desplazamiento de pantalla, 
23.
DEST, 50.
DF SZ, 52.
DFCC, 53.
DFCCL, 54.
Dibujo de circulos, 21. 
Dibujo de lineas, 22.
Dibujos en pantalla, 13. 
Dirección de salto, 71. 
Dirección de un punto de la 
pantalla, 22.
Direcciones de llamadas, II. 
DJNZ, 90.

 
DRAW, 22, 54.
DTR (Terminal de Datos 
Preparada), 33.
Duplicar, 89.
Duración, 18.
D_STRI, 57.
D_STR2, 58.
E A FP, 90.
E LINE, 50.
E PPC, 49.
EAR, 63.
ECHO E, 53.
EDIT, 99.
Ejecución, 40.
ENDCALC, 86, 90. 
Ensamblador, 72.
ENTER, 16, 62, 75, 100. 
Entrada de la red local, 32. 
Entrada desde el canal ac-
tual, 23.
Entrada desde el Microdrive, 
37.
Entradas, 32.
Enviar paquete, 34.
Envío a la impresora, 33. 
ERR NR, 11, 16, 21, 43, 48. 
ERR SP, 39, 41, 48, 55. 
Errores, 31, 76, 88.
Escribir registro, 36.
Escribir sector, 37.
Etiqueta, 17.
Expansión de claves para la 
salida, 19, 20.
Expansión de gráficos de 
bloque, 21.
Exponencial, 84.
Exponente, 82.
Fichero, 57, 58.
FILE NOT FOUND, 37. 
FLAGS, 15, 39, 46, 48, 52. 
FLAGS, 2, 51.
FLAGS 3, 55.
FLAGX, 52.
FLASH, 99, 100. 
FOR-NEXT, 72.
Forma decimal, 14.
Formatear cartucho, 40.
FP CALC 2, 90.
FRAMES, 15, 53, 69.
FRE, 77.
Frecuencia, 18.
Funciones algebraicas, 88. 
GET, 32.
GOTO, 72.
Gráficos, 18, 20, 49.
HD_OO, 58.
HD_OB, 58.
Hertzio, 15, 18.
Hexadecimal, 16, 72.
HOOK CODE, 32.
IMI, 80.
IM2, 70.
Impresión de mensajes, 19. 
Impresión en pantalla, 33. 
Impresora, 17, 20, 65, 99. 
Impresora 2X, 61, 63.
IN, 62, 89.
IN/OUT, 61, 64.
INK, 11, 13, 55, 99, 100. 
INPUT, 17, 52.
INPUT LINE, 52.
INPUTF, 17.
Insertar variables, 39. 
Instrucción DI, 71. 
Instrucción El, 70, 71. 
Instrucción IN A, 16. 
Instrucción, IP, 77. 
Instrucción, LD HL, 15. 
Instrucción LDE, 15. 
Instrucción RES 5, 15. 
Instrucción RST 56, 15. 
INTERFA2 I, 61, 75. 
INTERFA2, 20, 31, 33, 39, 
40, 50, 55, 64, 69. 
Intérprete, 45, 48, 75, 76, 77. 
Interrupciones, 15, 18, 26, 62, 
69, 70, 105.
INVERSE, 55, 99, 100. 
IOBORD, 56.
ISSUE3, 62.
ISSUEI, 71.
ISSUE2, 71.
JP (Salto), 14, 20.
Juego de caracteres del Spec-
trum, 99.
K (Kilo), 7, 18.
K CUR, 50.
K DATA, 47.
Kempston, 12, 64, 104.
KSTATE, 45.
LAST K, 15, 46.
Leer un registro de caracte-
res, 37, 38.
LEN, 88.
Lenguaje Ensamblador, 7. 
LET, 8.
Liberar el canal del Micro-
drive, 38.
Línea CTS, 64.
Línea MREQ, 70.
LIST, 52.
LOAD, 23, 27, 36, 40, 55, 58.
LOAD BYTES, 27.
LSB, 94.
L_STRI, 58.
Mantisa, 82.
Mapa de memoria del Spec-
trum, 95.
Mapa de pantalla del Spec-
trum, 96.
Mapa del teclado, 98.
MASK P, 54.
MASK T, 54.
Matriz, 58.
Mayúsculas, 58.
MEM,51.
MEMBOT, 55.
Memoria, 14, 69.
Memoria intermedia, 17, 18, 
34, 35, 36, 38, 53.
Mensaje DEFB, 19.
Mensaje DEFM, 19.
Mensaje start tape then press 
any key, 25.
MERGE, 36, 40, 56.
MIC, 63.
Microdrive, 8, 12, 31, 36, 39, 
40, 55, 56, 57, 61, 72. 
Microordenador, 31.
Mirar teclado, 39.
MODE, 49.
Modo extendido, 17. 
MOREX, 64, 104.
Motor encendido/apagado, 
38.
MOVE, 58.
NEW, 20.
NEWPPC, 49.
N ibbles, 94.
NOT,89.
NSPPC, 49.
NSTAS, 34.
NTDCS, 57.
NTDTEST, 57.
NTHCS, 57.
NTLEN, 57.
NTNUMB, 57.
NTRESP, 57.
NTSTAT, 35, 56.
NTTYPE, 57.
Numérico, 48.
NXTLIN, 50.
N_STR1, 58.
OLDPPC, 52.
Operadores lógicos, 17.
OR, 17.
OUT, 28, 63.
OUT OF DATA, 50.
_______             127

 
OVER, II, 13, 55, 99, 100.
P FLAG, 55.
P POSN, 53.
P-RAMT, 55.
Palabra temporal, 14. 
Pantalla, 22, 23, 70.
PAPER, 13, 55, 99, 100. 
Parámetros, 26.
Paridad, 24.
PEEK, 70, 89.
Periféricos, 61.
Picturesque Editor Assembler, 8. 
Pila, 14, 15, 21, 22, 25, 27, 
31, 39, 41, 49, 51, 70, 71, 
77, 83, 86.
PIP, 47.
Pixels, 53, 73.
PLOT, 22, 54, 71.
POKE, 7, 49.
Polinomio de Chebyshev, 90. 
POP, 14.
PPC, 49.
PRCC, 53.
PRINT, 8.
PRINT USR, 8.
PROG, 34, 50.
Programa DeBASE, 109. 
Programa monitor/desen-
samblador, 8.
Programa principal, 25. 
Programación del Z-80, 8. 
Programadores, 7.
Programas Hisoft Devpack3, 
8.
Protocolos, 61.
Puerto Kempston, 64, 65. 
Puertos Morex 251, 64. 
Puertos y canales de entrada 
y salida, 61.
Puntero, 49, 84.
Punto flotante, 81, 82. 
PUSH, 14.
RAM, 18, 45, 55, 70, 75, 76. 
RAMTOP, 34, 38, 55,65, 85. 
RANDOMIZE, 53. 
RANDOMIZE U SR, 8, 72. 
RASP, 47.
REC MEM, 91.
Refresco de la memoria, 70. 
Registro A, 11, 16, 17, 20, 21, 
22, 25, 27, 32, 38.
Registro B, 12, 13,21,22,23. 
Registro C, 13.
Registro E, 14.
Registro I, 70.
Registros, 14.
Registros AF, 21,
Registros BC, 8, 15, 21, 22. 
Registros DE, 15, 18, 19, 22, 
26, 27.
Registros HL, 8, 11, 15, 18, 
21, 25, 27, 36.
Registros IX, 24, 25, 26, 27. 
Registros IY, 8,11, 15,16, 
21.
Reloj del Spectrum, 56. 
REPPER, 45, 47, 
Representación de enteros, 81. 
RESTORE, 50.
RET, 39, 41.
RETI, 70, 71.
Retroceso, 99. 
ROM, 7,8, 11,14,16,19,31, 
32, 39, 41, 69, 70, 71, 72. 
ROM 8K, 64.
RST 8, 31, 27, 32, 39.
RST 16, 11, 12, 18, 19, 54. 
RST 56,69.
Rutina de grabación y repro-
ducción, 65.
Rutina entrada de tecla, 17. 
Rutinas, 7, 14, 15, 16, 17, 18, 
81.
S POSNL, 54.
Sacar un número por una 
corriente, 14.
Salida de la red local, 32, 34. 
Salida del Microdrive, 35. 
Salidas, 33.
Salto, 89.
SAVE, 23, 24, 25, 28, 36, 
40, 55, 58.
SBRT, 56.
SCR CT, 54.
SCROLL, 12.
Scroll?, 54.
SECTOR, 56.
SEDD, 52.
SER_FL, 32, 56.
SET, 13.
SETUP, 72.
Sinclair, 31.
Sintaxis, 75.
Sistema BREG, 90.
Sistema CH_ADD, 84. 
Sistema CURCHL, 36. 
Sistema DF S2, 13.
Sistema D_STR, 35.
Sistema E LINE-PROG, 24. 
Sistema IOBORD, 33. 
Sistema K CUR, 65.
Sistema REPPDEL, 46.
Sistema T ADDR, 27. 
Sistema V ARS-PROG, 24. 
Sonido, 71.
SPACE, 12, 13, 16, 62. 
Spectrum, 7,8, 15,16,17,19, 
21, 23, 26, 32, 45, 47, 53, 
56, 61, 69, 100.
Spectrum Pocket Book, 14, 
15.
Sprites, 7, 71, 72, 73, 105.
ST MEM, 90.
STK DATA, 90.
STKBOT, 51, 85.
STKEND, 34, 51.
STOP, 52.
STR$, 89.
STRLEN, 52.
STRMS, 47.
SUBPPC, 49.
Subrutina, 17, 25.
Subrutinas útiles, 103. 
SYMBOL SHIFT, 17. 
S_STR1, 58.
T ADDR, 52.
TAB, 11, 99, 100.
Teclado, 61, 62,
Teclas, 46, 62.
Transferencia del control,
42.
TV FLAG, 17, 48. 
TVDATA, 47.
T_STR1, 58.
UDG, 53.
ULA, 18, 69, 70.
Uso del calculador, 86.
USR NO, 89.
USR$, 88.
VAL, 86, 88.
VAL$, 88,
Variables, 45, 69
Variables del sistema 8K, 55. 
VARS, 50.
VECTOR, 56, 75, 76. 
Vectores de interrupción de 
la ROM, 101.
Velocidad de transmisión, 56, 
57.
Verificación, 26.
VERIFY, 27, 36, 40, 56. 
Volcados de pantalla, 17, 
18.
X MOD Y, 89.
XPTR,51.
Z-80, 14, 31, 69, 71, 86, 
90.

_______
128