Programa para Listar los Datos de una Cinta

Programa que Lista TODOS los Ficheros que se encuentran en la Cinta, mostrando el Tipo de Programa y Direcciones de Inicio, Final y Ejecución.
Luego todo lo que encuentra puede grabarse en Basic con Líneas “Rem”.

10 KEY OFF:SCREEN 0:WIDTH40
20 COLOR15,4,4
30 ON ERROR GOTO 620
40 CY=2:NL=899
50 U=&HF610:DEFUSR=U
60 FORI=UTOU+62
70 READK:POKEI,K
80 NEXT
90 REM **********************
100 CLS
110 LOCATE4,0:PRINT"*** Listar bloques de caset ***"
120 LOCATE10,1:PRINT"(C)Phoenix Software"
130 LOCATE12,22:PRINT"pulsa una tecla"
140 A$=INKEY$:IFA$=""THEN140
150 LOCATE12,22:PRINT"                "
160 REM **********************
170 A=USR(0)
180 F$="":CY=CY+1:NL=NL+1
190 IFCY>21THENCY=2
200 B=&HF600
210 T=PEEK(B)
220 IF(T<>&HD0)AND(T<>&HD3)AND(T<>&HEA)THENGOTO 340
230 FORI=B+1TOB+6
240 F$=F$+CHR$(PEEK(I))
250 NEXT
260 LOCATE0,CY:PRINT NL;"' ";F$
270 IFT=&HD0THENGOTO 360
280 IFT=&HD3THENGOTO 320
290 REM *******************
300 LOCATE 13,CY:PRINT" .sav"
310 GOTO 170
320 LOCATE 13,CY:PRINT" .csav"
330 GOTO 170
340 LOCATE 13,CY:PRINT" .???"
350 GOTO 170
360 LOCATE 13,CY:PRINT" .bsav"
370 S=PEEK(B+7)+PEEK(B+8)*256
380 E=PEEK(B+9)+PEEK(B+10)*256
390 X=PEEK(B+11)+PEEK(B+12)*256
400 LOCATE22,CY:PRINT HEX$(S)
410 LOCATE28,CY:PRINT HEX$(E)
420 LOCATE34,CY:PRINT HEX$(X)
430 GOTO 170
440 REM ********************
450 DATA &H21,&H00,&HF6,&HE5
460 DATA &HCD,&HE1,&H00,&H38
470 DATA &H24,&HCD,&H47,&HF6
480 DATA &H4F,&H06,&H09,&HCD
490 DATA &H47,&HF6,&HB9,&H20
500 DATA &HEF,&H10,&HF8,&HE1
510 DATA &H71,&HCD,&H31,&HF6
520 DATA &HE5,&HCD,&HE1,&H00
530 DATA &HE1,&H06,&H06,&HCD
540 DATA &H47,&HF6,&H23,&H77
550 DATA &H10,&HF9,&HC3,&HE7
560 DATA &H00,&HCD,&HE7,&H00
570 DATA &HDD,&H21,&HB2,&H73
580 DATA &HC3,&H59,&H01,&HD9
590 DATA &HCD,&HE4,&H00,&H38
600 DATA &HF0,&HD9,&HC9
610 REM *******************
620 LOCATE12,22:PRINT"Fin de la cinta?"

Versión “preliminar” y equivalente en Código Máquina:

CSAVE_FILE		equ	0xD3		; eof = n data hasta 7bytes 0x0
SAVE_FILE		equ	0xEA		; eof = n bloques 256 bytes hasta CTRL+Z
BSAVE_FILE		equ	0xD0

INI_BASIC	 	equ	0x8001		; lol!
INI_PRG			equ	0xF000

; --------------------------------------				
			.bios
			.basic
			.org INI_PRG
			.start MAIN				

MAIN:			di
			
			xor	a			; limpiando la casa
			ld	hl, iniram
			ld	bc, endram-iniram-1
			call	CLSRAM	

			call	LHEADER			; leemos una cabecera

			ret

; --------------------------------------				
; inicia o detiene el motor del cassette
MOTORON:		ld	a, 1
bmotor:			call	STMOTR      
			ret 
MOTOROFF:		xor	a
			jr	bmotor

; --------------------------------------
; salimos (por error de lectura) o paramos el cassete
EXIT:			pop	hl
STOP:			call	TAPIOF      
			ret 

; --------------------------------------				
; leemos datos (un byte) del cassete; C si se produce un error
READ:			exx               
			call	TAPIN     
			jr	c, EXIT
			exx               
			ret               

; --------------------------------------			
; leemos la cabecera larga del cassete; tipo = 10 bytes + nombre = 6 bytes
LHEADER:		call	TAPION
			jr	c, EXIT

			ld	b, 10				; 10 bytes
			ld	hl, tipo_fichero
bucH:			call	READ   
			ld	[hl], a				
			djnz	bucH

			ld	b, 6				; 6 bytes
			ld	hl, nom_fichero
bucN:			call 	READ
			ld	[hl], a
			inc	hl
			djnz	bucN
				
			call 	STOP
			
			ld	a, [tipo_fichero]		; tipo de fichero

			cp	BSAVE_FILE
			jp	z, BLOAD			; cargamos binario

			cp	SAVE_FILE
			jp	z, LOAD				; cargamos basic SAVE
				
			cp	CSAVE_FILE
			jp	z, CLOAD			; cargamos basic CSAVE

			; TODO: fichero desconocido

			; TODO: presentar informacion
			; TODO: grabar fichero a disco

			ret

; --------------------------------------
; cload tiene una cabecera corta que leemos con TAPION y luego 
; los datos hasta encontrar 7 ceros seguidos
CLOAD:			call	rstzeros
			xor	a
			ld	[INI_BASIC-1], a		; 0 en 0x8000; requerido

			ld	hl, INI_BASIC			
			push	hl
			call	TAPION
			pop	hl
			jr	c, EXIT

bcld:			call	READ
			ld	[hl], a
			inc	hl
			cp	0
			call	nz, rstzeros
			call	z, inczeros
			ld	a, [temp1]
			cp	7				; termina con 7 ceros	
			jr	nz, bcld

			jr	STOP

rstzeros:		xor	a
			ld	[temp1], a
			ret

inczeros:		ld	a, [temp1]
			inc	a
			ld	[temp1], a
			ret

; --------------------------------------
; load contiene multiples bloques de 256 bytes hasta 0x1a (ctrl+z)
; cada bloque tiene su cabecera corta que leemos con TAPION
LOAD:			xor	a
			ld	[INI_BASIC-1], a		; 0 en 0x8000; requerido

			ld	hl, INI_BASIC				

bld1:			push	hl				
			call	TAPION
			pop	hl
			jp	c, EXIT

			ld	b, 0				; carga bloques de 256 bytes			
bld2:			call	READ
			cp	0x1a				; ctrl + z
			jp	z, STOP
			ld	[hl], a
			inc	hl
			djnz	bld2				; fin de bloque
				
			push	hl
			call	TAPIOF
			pop	hl
			jr	bld1

; --------------------------------------
; bload tiene una cabecera corta seguida de 6 bytes con 
; las direcciones de inicio, fin y ejecución del programa
; a continuación va el bloque de datos, todo seguido
BLOAD:			xor	a
			ld	hl, inifile
			ld	bc, finfile-inifile-1
			call	CLSRAM				; borra dirs fichero
		
			call	TAPION
			jp	c, EXIT
				
			ld	b, 6				; 6 bytes
			ld	hl, inifile
bblh:			call 	READ
			ld	[hl], a
			inc	hl
			djnz	bblh
				
			call	MOTOROFF			
			call	calclng				; calculamos longitud
			push	hl
			call	MOTORON
			pop	bc				; longitud
			ld	hl,INI_BASIC			; inicio (temporal)

bbld:			call	READ
			ld	[hl], a
			inc	hl
			dec	bc
			ld	a, b
			or	c
			jr	nz, bbld

			jp	STOP

calclng:		ld	ix,inifile
			ld	e, [ix+0]
			ld	d, [ix+1]			; de = ini (real)
			ld	l, [ix+2]
			ld	h, [ix+3]			; hl = fin (real)
			sbc	hl, de				; longitud = fin - ini 
			ret
				
; -------------------------------------
; rellenamos bc+1 bytes de ram con el valor de A
CLSRAM:			ld	[hl], a				
			ld	d, h
			ld	e, l
			inc	de
			ldir
			ret

; --------------------------------------
iniram:			defb	0

tipo_fichero:		defs	1				
nom_fichero:		defs	6

inifile:		defs	2
finfile:		defs	2
exefile:		defs	2

temp1:			defs	1

endram:			defb	0

 

 

 

Anuncios
Esta entrada fue publicada en Sin categoría. Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s