Para aquellos que no pueden conseguir por ningun lado las listas de interrupciones, les hago un resumen de las mas importantes (muy breve, Sorry) para salir del programa: int 20h ah=4c otros int 21 f 00 int 21 (recuerden que funcion, o "f" "oficial" es el valor que tenemos que cargar en ah al llamar a la interrupcion) #A equivale al codigo ascii de un caracter E: valores que hay que poner al entrar en la interrupcion S: valores que devuelve la interrupcion en la salida est: establecer pid: pedir pos: posicion pag: pagina de video (generalmente 0) fil: fila (0-24) col: columna (0-79) lin: linea inicial lif: linea final des: desplazamiento (offset) sal: salida st: standard sec: secundaria ppal: principal seg: segmento INT 5: imprime el contenido de la pantalla INT 10: f 00 f 02 / 03 est. modo de video est./pid. pos. del cursor al=modo de video 02-E: 0-1 40x25 texto bh=pag dh=fil dl=col 2-3 80x25 texto 03-E: S: 4-5 320x200 graficos bh=pag ch=lin cursor 6 640x200 graficos hercules cl=lif cursor 7 80x25 texto " dh=fil dl=col f 0a f 0e escribir un caracter en la escribir un caracter en posicion del cursor sin modo teletipo (en pos modificarla del cursor, avanza el al=#A bh=pag cx=# caracteres cursor) f09 al=#A bh=pag bl=color fondo idem f0a pero bl=color para definir el color, im- primir un #A=27h (blank) con los atributos y sobre escribirla (con ) int 16 int 18: pasa control a f00 (=10h) ROM basic lee caracter del teclado int 19: Reset S: AH=codigo de tecla al=#A int 17 f 00 f 01 f02 manda caracter a printer inicializa pid.estado impresora impresora al=#A dx=# port lpt1=0 dx=#port dx=#port lpt2=1 , etc. salida (f=00,01,02) ah: estado del port bit: 7 1 libre 0 ocupado 6 1 reconocimiento 5 1 sin papel 4 1 selecionado 3 1 error e/s 0 no responde int 21 entradas f 01 f 03 f 07/08 f 0A de entr. de COM 1 de teclado de teclado standard sin eco a buffer S: al=#A idem idem E: dx=des buffer nota int 21 f 0a: tama¤o maximo buffer: 256 bytes 1§ car: # max de car 2§ car: # car recibidos (sin cr) salidas f02 f04 f05 a sal st. a com1 a prn E: dl=#A idem idem f06 ent/sal de/a consola E: dl= ff lee consola (teclado) #A esc consola (display) S: al= #A fecha/hora/version del dos f 2b f 2a f 2d f 2c est fecha pide fecha est hora pide hora E: S: E: S: cx=a¤o 1980-2099 al=dia ch=hora 1-23 ch/cl/dh/dl dh=mes 1-12 (domingo=0) cl=min 0-59 idem E: de f 2c dl=dia 1-31 cx/dh/dl dh=seg 0-59 S: idem f 2b dl=centesimas al=00 valida S: idem f 2b ff no valida f 30 f 35 f 25 pide version del dos pide vector de int est vector de int E: al=00 E: al= # int E: al= # int S: ah=version sec. S: es=seg es/bx idem S: f 35 al=version ppal bx=desp directorios f 39 (MD) f 3a (RD) crear subdirectorio eliminar subdirectorio E: E:y S: idem f 39 ds= seg de nombre (asciiz) dx= desp del nombre f 3b (CD) S: cambiar de directorio exito Carry flag=0 E: y S: idem f 39 fracaso " " =1 ax=codigo de error las interrupciones para cargar y salvar archivos se las explico mejor con un ejemplo, 2 rutinitas: inarch y salvar (ojo tienen basura) De estas rutinas dijo B.Gates: "es el peor codigo que se halla escrito nunca" INARCH PROC NEAR mov bx,080h ;va al psp donde guarda nombre de arch. mov al,[bx] cmp al,00 ; si en 80 hay 00 no hay nombre je normal ; me voy a pedirlo MSG2 DB 'INTRODUZCA NOMBRE DEL PROGRAMA ',0DH,0ah,'$' HANDLE DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0dh,0ah,'$' HAND# DW 0000H INARCH PROC NEAR mov bx,080h ;va al psp donde guarda nombre de arch. mov al,[bx] cmp al,00 ; si en 80 hay 00 no hay nombre je normal ; me voy a pedirlo tis inc bx ; si llegue aca habia un nombre mov al,[bx] cmp al,020h je tis dec bx mov dx,offset(handle) opy inc bx mov al,[bx] cmp al,0dh je vimfra push bx mov bx,dx mov [bx],al inc bx mov dx,bx pop bx jmp opy vimfra jmp termina normal MOVW DX,OFFSET(MSG2) mov ah,09 int 21h ;saca mensaje 'INTRO NOMBRE' MOVW BX,OFFSET(HANDLE) ;entra nombre de archivo DEC BX ;una posicion menos OTROs XOR AH,AH ;ah=0 INC BX ;la posicion siguiente (ppio) INT 16H ;lee 1 caracter PUSH BX ;guarda bx=caracter actual MOVB AH,0EH ;mostrar caracter XOR BH,BH ;bh=0 INT 10H POP BX ;recupera posicion actual CMPB AL,0DH ;al=cr? JZ TERMINA ;si->termina MOV [BX],AL ;no->graba caracter JMP OTROs ;otro caracter termina push ax push bx mov bx,00 mov ah,0eh mov al,0dh int 10h mov al,0ah int 10h pop bx pop ax MOVW DX,OFFSET(HANDLE) ;dx=ppio nombre archivo MOVB AH,3DH ;abrir fichero MOVB AL,00H ;solo lectura INT 21H jc inarch MOV BX,AX ;bx=ax=handle MOVW CX,0F000H ;leer F000h bytes MOVW DX,OFFSET(ARCH) ;grabarlo en buffer save MOVB AH,3FH INT 21H ADD DX,AX ;dx=offset+N' de caracteres leidos MOV FA,DX ;en txtunf final de lo grabado MOVB AH,3EH ;cerrar fichero INT 21H RET men9 db 'archivo cargado',0dh,0ah,'$' ENDP SALVA PROC NEAR MOV BX,HAND# ;BX=1' POSICION DESPUES DEL . MOVB [BX],'A' INC BX MOVB [BX],'S' INC BX MOVB [BX],'M' ;pongo .COM MOVW DX,OFFSET(HANDLE) ;imprimo nombre archivo MOVB AH,09H INT 21H XOR AL,AL ;ARCHIVO MOVB AH,3CH ;CREA archivo INT 21H MOV BX,AX ;bx=ax=handle MOVB AH,40H ;escribe MOV CX,STACK ;cx=final archivo MOV DX,fa ;dx=ppio SUB CX,DX ;largo del archivo INT 21H MOVB AH,3EH INT 21H RET ENDP STACK DW 0,0 FA DW 0,0 faltarian f 41 f 43 borrar archivo pedir/establecer atributos archivo E: ds= segmento del nombre E: al=00 pedir atributos dx= desp del nombre =01 establecer (ASCIIZ) cx=valor del byte de atributos deseado S: idem f 39 ds/dx idem f 41 S: idem f 39 atributos:01 solo lectura 02 oculto 04 del sistema 08 etiqueta de volumen 10 directorio (continuara?) 20 archivo "No tire su vieja computadora: donela al museo de computacion!"