El siguiente programa es la versión "HOLA MUNDO" para MNBIOS.... que como
sabrán es un sistema multitasking y acá demostramos como se programa y prevee
este sistema.
NOTA: no se incluyeron en el código acentos para no molestar con el tema de los
códigos ASCII.
Cualquier pregunta me dicen....
org $4000
;
header:
;
.exec: dw code.exec,0 ; parte EXEC
.task: dw code.task,0 ; parte TASK
.fkey: dw code.fkey,0 ; parte FKEY
.stop: dw code.stop,0 ; parte STOP
.ftask: dw code.ftask,0 ; parte FTASK
.close: dw code.close,0 ; parte CLOSE
;
.nac:
.nac.length: equ $ - .nac
ds 28 - .nac.length," "
;
.ver: db 0
.sver: db 0
.mver: db 0
.msver: db 0
;
.mark:
.mark.length: equ $ - .mark
ds 16 - .mark.length," "
;
.prog:
.prog.length: equ $ - .prog
ds 16 - .prog.length," "
;
.nidea:
.nidea.length: equ $ - .nidea
ds 16 - .nidea.length," "
;
.ngrp:
.ngrp.length: equ $ - .ngrp
ds 16 - .ngrp.length," "
;
.nsnd:
.nsnd.length: equ $ - .nsnd
ds 16 - .nsnd.length," "
;
.date: db "DD/MM/YYYY"
.fdate: db "DD/MM/YYYY"
;
.btask: dw code.btask,0 ; parte BTASK
;
; Variables que usaremos en la aplicación.
FlagTask: db 0
Text: db "Hola mundo!!!",0
TextAgain: db "Hola mundo de nuevo!!!",0
TextWait: db "<pulse cualquier tecla para continuar o Q para
salir>",0
code:
;
.exec: LD A,18h
LD HL,text
CALL 0C260h ; funcion WR_CHRS
.JUMP2: LD A,18h
LD HL,TextWait
CALL 0C260h ; funcion WR_CHRS
.Loop: CALL 0C27Ch ; funcion INPUT$(1)
JR C,.Errored
CP "Q"
ret z ; si "Q" es presionada sale del
programa.
JP .exec
.Errored: CP 61h ; Verifica el codigo de error devuelto
JR z,.bige
xor a ; Si no es un evento mayor entonces
; puede
que sea un error del buffer del teclado.
CALL 0C2E0h ; SET_BUFFER_KEY
(activa el buffer del teclado si A=0)
Jp .Loop
.bige: LD a,(FlagTask) ; Apareció un evento mayor
CP 0FFh ; verifica si el evento mayor
es del sistema multitasking
jr nz,.Loop
; es un evento del sistema
multitasking...
; y
como el programa no tiene nada que hacer
;
simplemente devuelve rapidamente el control al
;
sistema multitasking
xor a
LD (FlagTask),a ; Esto borra la variable que acabamos
de usar.
LD IY,00FDh
LD C,01h
RST 30h ; función DRIVER
JP .exec ; Normalmente el sistema
multitasking no retorna
; el
control a este codigo nunca mas.
; Pero
si ocurre un error en la llamada al sistema
;
retornara un codigo de error....
; como
cuando el sistema multitasking
; no
tiene suficientes recursos del sistema
; Que
hacer aquí? NADA....o....
; tal vez intentar liberar recursos y
volver a llamar al sistema
; o re
ejecutar esta aplicación para que el usuario pueda
;
intentar después.
.task:
LD A,18h
LD HL,TextAgain
CALL 0C260h ; funcion WR_CHRS
JP .JUMP2
.fkey: ret ; ON KEY GOSUB sin uso
.stop: ret ; ON STOP GOSUB sin uso
.ftask: LD A,0FFh
LD (FlagTask),A ; esto setea la variable bandera que
usamos cuando el usuario
; presiona CTRL+GRPH+CODE para abrir la ventana
; multitarea o cambiar de aplicación.
ret
.close: ; Esto es llamado cuando el usuario usa
; un
comando de cierre externo de la aplicacion
; Sin
nada que hacer, la aplicacion devuelve el control.
; En realidad aca solo se esta permitido asignar un valor a una variable,
; y que el proceso normal de la aplicacion de la misma forma que atiende
; al cambio de aplicacion, atienda al cierre de la aplicacion guardando datos
; y archivos que necesite salvar.
ret
.btask: ret ; Para procesos de fondo, sin uso en la
version DEMO mnbios..
[Se han eliminado los trozos de este mensaje que no contenían texto]