geogeo Le 10/04/2003 à 21:38Edité par Zeph le 15/10/2014 à 23:31 Voici le code source:; Programme Fargo II
;=============================================================================
; Date de création: Lundi 27 mai 2002
; 45.8 233.32 292.0 292.0 292.0 292.0
;=============================================================================
; Ce programme permet d'utiliser des fonctions de l'assembleur sans connaître l'assembleur avec
; une ligne de commande comportant une chaîne de caractère:
; Ex: Blib ("version")
;
; Auteur: Geoffrey ANNEHEIM
; Dernière modification: Mercredi 3 juillet 2002
;
; Remerciements à
; Gareth James pour son fichier files.txt
; David Ellsworth pour avoir implanté Fargo et pour son fichier testfunc.asm
INCLUDE "tios.h" ;Insére la bibliothèque TIOS
XDEF _main ;Définit la fonction Main
;XDEF _Proc_table ;Table des fonctions
XDEF _comment ;Commentaire sur BasicLib
XDEF _tibasic ;Définit les adresses du TI-Basic
writeStr MACRO ; X, Y, COL, STR Macro d'affichage d'un texte
move.l \1,-(a7) ; Déplace le paramètre 1 (mot) dans la pile SP
jsr tios::ST_showHelp ; Appelle la fonction tios@0001
lea 4(a7),a7 ; Restaure SP de 4 pointeurs soit 4=4
jsr ngetchx ; Appelle la fonction Idle_loop flib@000B
ENDM ;Fin de la macro
WriteStr2 MACRO ; X, Y, COL, STR Macro d'affichage d'un caractère
move.w #4,-(sp) ; Déplace le nombre hexa (Long mot) dans la pile SP
move.l \1,-(sp) ; Déplace le nombre hexa (Long mot) dans la pile SP
;Pea \1(PC)
move.w #50,-(sp) ; Déplace le paramètre 2 (mot) dans la pile SP
move.w #50,-(sp) ; Déplace le paramètre 3 (mot) dans la pile SP
jsr tios::DrawStrXY ; Appele la fonction tios@0011
lea 10(sp),sp ; Restaure SP de 14 pointeurs soit 4+4+2+2+2=14
jsr ngetchx ; Appelle la fonction Idle_loop flib@000B
ENDM ;Fin de la macro
WriteChar MACRO
MOVE.w #$00FF,-(A7) ; empile une valeur
MOVE.w #$0000,-(A7) ; empile une valeur
MOVE.w #$00FF,-(A7) ; empile une valeur
MOVE.w #4,-(A7) ; empile la couleur
MOVE.w #50,-(A7) ; empile l'ordonnée
MOVE.w #50,-(A7) ; empile l'abscisse
MOVE.w \1,-(A7) ; empile le code du caractère, ici '0'
JSR tios::DrawCharXY ; appelle la fonction
LEA 14(A7),A7 ; restaure la pile de 2+2+2+2+2+2+2=14
jsr ngetchx
ENDM
;==============================================================================================
; Procédure de table
;
; Cette procédure contient les fonctions de cette librairie, max_func=Nombre maximal de fonction -1 car commence par 0
; Exec_Table=Table d'exécution des fonction.
;
;lea.l f_fonction(pc),a0 ;Enregistre l'adresse de la fonction dans A0 pour une comparaison sur 32 Bits
;dc.b fonction ;Enregistre la chaîne de caractère dans A0
;
;N'OUBLIEZ PAS DE CREER LES LABELS POUR UNE FONCTIONS IL EN FAUT 3.
;
;==============================================================================================
_Proc_table
lea.l version_str(pc),a0
bsr cmp_str
tst.w d0
beq version
lea.l font_str(pc),a0
bsr cmp_str
tst.w d0
beq font
lea.l fontgetsys_str(pc),a0
bsr cmp_str
tst.w d0
beq fontgetsys
lea.l off_str(pc),a0
bsr cmp_str
tst.w d0
beq off
lea.l contrast_str(pc),a0
bsr cmp_str
tst.w d0
beq contrast
lea.l getcontrast_str(pc),a0
bsr cmp_str
tst.w d0
beq getcontrast
lea.l showhelp_str(pc),a0
bsr cmp_str
tst.w d0
beq showhelp
lea.l erasehelp_str(pc),a0
bsr cmp_str
tst.w d0
beq erasehelp
lea.l linehelp_str(pc),a0
bsr cmp_str
tst.w d0
beq linehelp
lea.l stbusy_str(pc),a0
bsr cmp_str
tst.w d0
beq stbusy
lea.l drawstr_str(pc),a0
bsr cmp_str
tst.w d0
beq drawstr
lea.l pause_str(pc),a0
bsr cmp_str
tst.w d0
beq pause
lea.l getkey_str(pc),a0
bsr cmp_str
tst.w d0
beq getkey
lea.l setapd_str(pc),a0
bsr cmp_str
tst.w d0
beq setapd
lea.l rstapd_str(pc),a0
bsr cmp_str
tst.w d0
beq rstapd
lea.l clrscr_str(pc),a0
bsr cmp_str
tst.w d0
beq clrscr
;S'il ne trouve aucune fonction alors afficher 'Syntaxe' et quitter
bra err2
rts
;-----------------------------------------------------
;Ecriture des fonctions (de préférence en minuscule
;Pour faciliter la programmation sous le TI-Basic).
version_str dc.b "version",0
font_str dc.b "font",0
fontgetsys_str dc.b "fontgetsys",0
off_str dc.b "off",0
contrast_str dc.b "contrast",0
getcontrast_str dc.b "getcontrast",0
showhelp_str dc.b "showhelp",0
erasehelp_str dc.b "erasehelp",0
linehelp_str dc.b "linehelp",0
stbusy_str dc.b "stbusy",0
drawstr_str dc.b "drawstr",0
pause_str dc.b "pause",0
getkey_str dc.b "getkey",0
setapd_str dc.b "setapd",0
rstapd_str dc.b "rstapd",0
clrscr_str dc.b "clrscr",0
; cmp_str
; Compare des adresse et met dans D0 une valeur
; D0.w=0 s1=s2
; D0.w<0 s1<s2
; D0.w>0 s1>s2
cmp_str: move.l a0,str_cmp
move.l str_cmp,a1
\loop tst.b (a0)
beq.s \bon
move.b (a0)+,(a1)+
bne.s \loop
\bon move.l str_cmp,-(a7)
move.l str,-(a7)
jsr tios::strcmp
lea 8(a7),a7
rts
; printf_nbr
; Prépare l'affichage d'un nombre sous forme d'expression
; Convertie un nombre sur 16 bits en chaîne de caractère
; INPUT: D0.B Nombre
; OUTPUT: A2.l Pointe sur la chaîne de caractère 'aff_nbr'
printf_nbr: move.b #1,ind_aff_nbr
clr.b d1
move.w #10,d2
cmp.w #9999,d0 ; Vérifie si le nombre dépasse 9999 car indice de multiplication ne peut pas dépasser 16 bits
bls \calc_digits ; Sinon calculer digits
Bra \digit5 ; Dans ce cas digits=5 D1=5
\calc_digits
addq.b #1,d1 ; Ajoute 1 dans D1 car un nombre simple comporte au minimum 1 digits
cmp.w d0,d2 ; Vérifie si multipliacteur D2 > à D0
bgt \suite ; Si D2 < D0 alors aller à la Conversion en chaîne de caractère
mulu.w #10,d2 ; Sinon multiplier par 10 D2
bra \calc_digits ; Continuer le calcule des digits
\digit5 moveq.b #5,d1
\suite clr aff_nbr
lea aff_nbr(pc),a2
subq.b #1,d1
\print_loop divu #10,d0
swap d0
add.b #48,d0
move.b d0,-(a2)
clr.w d0
swap d0
dbra.b d1,\print_loop
bsr show_printf_nbr
rts
;show_printf_nbr
;Affiche un chaîne de caractère sous forme d'expression
;INPUT: A2.l Registre ou se trouve les caractères à enregistrer
show_printf_nbr
moveq #0,d0
bsr PushToken
\loop tst.b (a2)
beq.s \bon
move.b (a2)+,d0
bsr PushToken
bne.s \loop
\bon moveq #0,d0
bsr PushToken
rts
; Affiche un texte en tant que fonction
; Input: A2.L Registre ou se trouve les caractères à enregistrer
printf_str:
moveq #0,d0
bsr PushToken
\loop tst.b (a2)
beq.s \bon
move.b (a2)+,d0
bsr PushToken
bne.s \loop
\bon move.b #0,d0
bsr PushToken
moveq #$2D,d0
bsr PushToken
move.b #2,tios::globals+$126E
rts
;newstr Procédure de départ
;Trouve la fonction et l'enregistre dans str
;S'arrête avant un ":" et un "|" ou fin de la chaîne
;":"=Fonctions avec paramètres
;"|"=Fonctions sans paramètres
;#0=Fin de la chaîne de caractère
newstr:
\loop tst.b (a0) ;Vérifie si la chaîne est atteinte
beq.s \bon ;Si opérateur Z=0 alors aller à bon
cmp.b #58,(a0) ;Si caractère=:
beq.s \bon ;alors aller à bon
cmp.b #124,(a0) ;Si caractère=|
beq.s \bon ;Alors aller à bon
move.b (a0)+,(a1)+ ;Copie le caractère courant dans le registre A1 8 bits (A1 est un registre temporaire, en effait il permet d'incrémenter A0 mais le caractère en enregistré dans str
bra.b \loop ;Va à loop
\bon clr.b (a1) ;Efface le caractère nul
bra _Proc_table
exit rts ;Fin de la procédure
;copy_string
;Copy un argument texte dans str jusqu'à | ou ,
copy_string: move.l str,a1 ; Va au caractère suivant
tst.w idle_check_data ; Vérifie si l'indicateur de fichier est à 1
bne copy_string2 ; Si 1 alors aller à copy_string2
\loop move.b (a0),(a1)+ ; Déplace le caractère suivant dans A1 soit str
tst.b (a0)+ ; Vérifie si la fin de la chaîne est atteinte
beq.s \bon ; Si le cas alors aller à \bon
cmp.b #124,(a0) ; Vérifie si le caractère en cours est un "|"
beq.s \bon ; Si le cas alors aller à \bon
cmp.b #44,(a0) ; Vérifie si le caractère en cours est un ","
beq.s \bon ; Si le cas alors aller à \bon
bne.s \loop ; Sinon copier le caractère suivant dans str soit \loop
\bon clr.b (a1) ; Efface le caractère nul ou | ou ,
move.l str,-(a7)
jsr tios::strlen
lea 4(a7),a7
move.l addr_str,a0
add.l d0,a0
move.l a0,addr_str
rts ; Revient au sous-programme
:copy_string2
;Copy un argument texte dans str
copy_string2:
\loop move.b (a0),(a1)+ ; Déplce le caractère suivant dans A1 soit str
tst.b (a0)+ ; Vérifie si la chaîne de caractères est atteinte
beq.s \bon ; Si le cas alors aller à \bon
bne.s \loop ; Sinon continuer à \loop
\bon clr.b (a1) ; Efface le caractère nul
rts ; Revient au sous-programme
;convert_nbr
;Convertie un argument en nombre dans D0
convert_nbr: move.l a0,a1 ; Prépare la gestion de A0
clr.w d1 ; Efface D1
\loopn addq.l #1,d1 ; Ajoute 1 à D1
addq.l #1,a1 ; Avnce de 1 A1
tst.b (a1) ; Vérifie si la fin de la chaîne est atteinte
beq.s \begin ; Si s'est le cas alors commençer le traitement
cmp.b #',',(a1) ; Vérifie si le caractère en cours est un ","
beq.s \begin ; Si s'est le cas alors commençer le traitement
cmp.b #124,(a1) ; Vérifie si le caractère en cours est un "|"
bne.s \loopn ; Si pas le cas alors revenir à \loopn
\begin subq.w #1,d1 ; Soustrait de 1 d1
clr.w d0 ; Efface D0
\loop mulu #10,d0 ; Multiplie par 10 D0
add.b (a0)+,d0 ; Ajoute le caratcère en cours dans D0
tst.w idle_check_data ; Vérifie si fichier
beq.s \add_check_str ; alors toujours incrémenter de 1 addr_str
\suite sub.w #48,d0 ; convertie caractère en nombre entier
dbra.s d1,\loop ; Si fin non atteinte alors aller à \loop
rts ; Revenir au sous-programme
\add_check_str:
move.l addr_str,a1 ; Déplace addr_str dans A1
addq.l #1,a1 ; Incrémente de 1 A1
move.l a1,addr_str ; Redéplace A1 dans addr_str
bra \suite ; Va à /suite
;check_data
;Vérifie si l'utilisateur à entrez un argument fichier,répertoire et fichier ou autre
check_data: move.w #0,idle_check_data
move.l a0,addr_str ; Sauvegarde A0 dans addr_str
cmp.b #32,(a0) ; Vérifie si le caractère en cours est un " "
beq search_read_file ; Si c'est le cas alors lire le fichier spécifié
move.b #1,d0 ; Sinon mettre 1 dans le témoin D0
rts ; Revenir au sous-programme
;search_read_file
;Recherche un fichier selon folder/file ou file, place le pointeur A0 selon son type
;Input: A0 pointeur de l'argument suivant
;
;Output: D0
; 0=Fichier non trouvé
; 0=Dépassement de capacité (EXPR > 16 bits)
; 1=Argument en cours ne spécifie pas un fichier ou dossier (check_data)
; 2=Fichier STR
; 3=Fichier PIC
; 4=Fichier LIST
; 5=Fichier EXPR
search_read_file:
move.w #0,idle_check_data ; Place 0 dans le témoin idle_check_data (argument fichier)
addq.l #1,a0 ; Saut l'espace
moveq.w #7,d7 ; Témoin pour la taille max d'un dossier et fichier
lea folder_name(pc),a2 ; Charge l'adresse de folder_name dans A2
\search_folder
move.l a0,a1 ; Déplace A0 dans A1
lea folder_name(pc),a3 ; Charge l'addresse de folder_name dans A3
\mode
move.b (a1)+,(a3) ; Va au caractère suivant et l'enregistre dans A3
tst.b (a3) ; Vérifie si la chaîne de caractère est atteinte
beq FileMode ; Si c'est le cas alors l'argument en cours est un fichier
cmp.b #',',(a3) ; Vérifie si le caractère en cours est un ","
beq FileMode ; Si c'est le cas alors l'argument en cours est un fichier
cmp.b #'|',(a3) ; Vérifie si le caractère en cours est un "|"
beq FileMode ; Si c'est le cas alors l'argument en cours est un fichier
cmp.b #'\',(a3) ; Vérifie si le caractère en cours est un "\"
beq DirMode ; Si c'est le cas alors l'argument en cours est un dossier\fichier
addq #1,a3 ; Sinon aller au caratcère suivant pour A3
bra \mode ; Revenir à \mode
FileMode: move.b #0,(a3) ; Ajoute le caractère nul dans A3
lea folder_name(pc),a3 ; Charge l'addresse de folder_name dans A3
lea file_name(pc),a4 ; Charge l'addresse de file_name dans A4
\strcpy
move.b (a3),(a4)+ ; Va au caractère suivant est l'enregistre dans A4 soit file_name
tst.b (a3)+ ; Vérifie si la fin de la chaîne est atteinte
bne \strcpy ; Sinon revenir à \strcpy
move.b #1,d5 ; Met 1 dans le témoin D5 soit fichier
bra endcopy2 ; Va à endcopy2
DirMode:
move.b #0,(a3) ; Ajoute le caractère nul dans A3
move.b #0,d5 ; Met 0 dans le témoin D5 soit dossier\fichier
lea file_name(pc),a3 ; Charge l'addresse de folder_name dans A3
\copy2
move.b (a1)+,(a3) ; Va au caractère suivant est l'enregistre dans A3 soit file_name
cmp.b #',',(a3) ; Vérifie si le caractère est un ","
beq EndFileCopy ; Si cas alors aller à EndFileCopy
cmp.b #'|',(a3) ; Vérifie si le cractère est un "|"
beq EndFileCopy ; Si cas alors aller à EndFileCopy
tst.b (a3) ; Vérifie si la fin est atteinte
beq endcopy2 ; Alors aller à endcopy2
addq #1,a3 ; Va au caractère suivant dans A3 soit file_name
bra \copy2 ; Revient à \copy2
EndFileCopy:
move.b #0,(a3) ; Ajoute le caractère nul dans A3
endcopy2
tst.b d5 ; Vérifie si le témoin D5 est à 0
beq Arg_Folder ; Si 0 alors l'argument est du type dossier\fichier
bra Arg_File ; Sinon l'argument est du type fichier
Arg_Folder: pea folder_name(pc) ;Etape de restauration de addr_str
jsr tios::strlen
lea 4(a7),a7
move.l addr_str,a0
add.l d0,a0
addq.l #2,a0 ; Avance de 2 caractère a0 car exemple : main=n donc + 1 et \ =2
move.l a0,addr_str
pea file_name(pc)
jsr tios::strlen
lea 4(a7),a7
move.l addr_str,a0
add.l d0,a0
move.l a0,addr_str
pea folder_name(pc) ; Charge l'addresse de folder_name dans SP
move.w FOLDER_LIST_HANDLE,-(a7) ; Charge le Handle de la table des dossier dans SP
jsr tios::FindSymEntry ; Lance la focntion
lea 6(a7),a7 ; Restaure SP de 6 soit 4+2=6
tst.b d0 ; Si D0=0 alors le dossier à était trouvé dans la table des dossier
bne no_found ; Sinon aller à no_found
move.w tios::SYM_ENTRY.hVal(a0),d1 ; Charge le Handle de la table des fichier du dossier spécifié dans d1
bra search_file ; Va à la recherche du fichier
Arg_File:
pea file_name(pc) ; Etape de restauration de addr_str
jsr tios::strlen
lea 4(a7),a7
move.l addr_str,a0
add.l d0,a0
addq.l #1,a0
move.l a0,addr_str
move.w $05D8E,d1 ; Charge le Handle du dossier Main dans D1
search_file:
pea file_name(pc) ; Identique que search_fold sauf que la recherche se fait dans la table des fichiers
move.w d1,-(a7)
jsr tios::FindSymEntry
lea 6(a7),a7
tst.w d0
bne no_found
move.w tios::SYM_ENTRY.hVal(a0),d0
tios::DEREF d0,a0
bra file_found
no_found: moveq.b #0,d0 ; Met le témoin D0 à 0
lea error_5(pc),a2 ; Charge l'erreur 5 dans A2
rts ; Revient au sous-programme
file_found:
move.w (a0),d1 ; Enregistre la taille du type dans D1
cmpi.b #$2D,1(a0,d1) ; Si type du fichier = STRING
beq is_string
cmpi.b #$DF,1(a0,d1) ; Si type du fichier = PIC
beq is_pic
cmpi.b #$D9,1(a0,d1) ; Si type du fichier = LIST
beq is_list
bra is_expr ; Sinon type = EXPR soit aller à is_expr
is_string: moveq.b #2,d0 ; Témoin à 2
addq.l #3,a0 ; Avance de 3 A0 soit début de la chaîne de caractère
bra new_pointer
is_pic: moveq.b #3,d0
bra new_pointer
is_list: moveq.b #4,d0
addq.l #3,a0
bra new_pointer
is_expr: moveq.b #5,d4 ; Enregistre le témoin à 5 dans d4 car d0 est utilisé
bsr convert_expr ; Va convertir l'expression en nombre
clr nbr_expr
lea nbr_expr(pc),a0
bsr ConvStr ; Convertie le nombre dans D0 en chaîne de caractère
move.b d4,d0 ; Restaure le témoin dans D0
bra new_pointer ; Va à la fin de check_data
new_pointer:
move.w #1,idle_check_data ; Argument en cours et du type fichier ou dossier\fichier
rts ; Revient au sous-programme
toobig: moveq.b #0,d4 ; Enregistre le témoin dans D4 car D0 est utilisé
lea.l error_6(pc),a2 ; Charge l'erreur 6 dans a2
rts ; Revient au sous-programme
;convert_expr
;Convertie une EXPR en chiffre sur 16 bits
;INPUT:
; A0=Pointeur de début de l'expression
;OUTPUT:
; D0=Nombre sur 16 bits (attention à zero et 512)
convert_expr:
clr.l d0 ; Efface D0 sur 32 bits
move.w (a0),d1 ; Enregistre la taille de l'EXPR dans D1
lea 1(a0,d1.w),a0 ; Se pointe au caractère d'identification du nombre
cmp.b #$1F,(a0) ; Vérifie si le nombre est un entier positif
bne toobig ; Sinon va à toobig (dépassement de capacité)
cmp.b #2,-(a0) ; Vérifie si le nombre est sur 16 bits
bhi toobig ; Sinon va à toobig (dépassement de capacité)
cmp.b #1,(a0) ; Vérifie si le nombre tient sur 8 bits
beq onedigit ; Va à onedigit
move.b -(a0),d0 ; sinon ...
lsl.w #8,d0
onedigit:
move.b -(a0),d0 ; Convertie l'EXPR en nombre dans D0
rts ; Revient au sous-programme
;ConvStr
;Convertie un nombre en chaîne de caractère
;INPUT:
; D0=Le nombre en 16 bits
; A0=Pointeur de la chaîne de caractère
;OUTPUT:
; A0=Chaîne de caractère terminé par 0
ConvStr: cmp.w #512,d0 ; Il y a un BUG ici car 0=512 et 512=512
beq \nbr_is_zero ; Si trouve le nombre 512 alors convertie en 0 donc 0=0 et 512=0
move.w #10,d2 ; Indice de multiplication
clr.w d1 ; Efface indice de digits D1
cmp.w #9999,d0 ; Vérifie si le nombre dépasse 9999 car indice de multiplication ne peut pas dépasser 16 bits
bls \calc_digits ; Sinon calculer digits
Bra \digit5 ; Dans ce cas digits=5 D1=5
\calc_digits
addq.b #1,d1 ; Ajoute 1 dans D1 car un nombre simple comporte au minimum 1 digits
cmp.w d0,d2 ; Vérifie si multipliacteur D2 > à D0
bgt ConvStr_suite ; Si D2 < D0 alors aller à la Conversion en chaîne de caractère
mulu.w #10,d2 ; Sinon multiplier par 10 D2
bra \calc_digits ; Continuer le calcule des digits
\nbr_is_zero
clr.w d0 ; Efface D0
moveq.w #1,d1 ; Indicataeur de digit = 1 car 0 = 1 digit
bra ConvStr_suite ; Va à la convertion en chaîne de caractère
\digit5 moveq.w #5,d1 ; Déplace l'indicateur de 5 car nbr > 9999 = 5 digits
ConvStr_suite:
adda.l d1,a0
subq.b #1,d1
RepConv:
divu #10,d0
move.l d0,d2
lsr.l #8,d2
lsr.l #8,d2
add.b #48,d2
move.b d2,-(a0)
and.l #$FFFF,d0
dbra d1,RepConv
rts
; arg_suite
; Va à l'argument suivant
arg_suite: move.l addr_str,a0 ; Déplace la sauvegarde de la chaîne dans A0
addq.l #1,a0 ; Incrément de 1 A0
move.l a0,addr_str ; Enregistre A0 dans addr_str
rts
; falc_arg
; Vérifie si l'utilisateur à entré un argument
; OUTPUT:
; D0=0 argument entré par l'utilisateur
; D0=1 argument falcultatif
falc_arg: tst.b (a0)
beq \arg_falc_find
cmp.b #124,(a0)
beq \arg_falc_find
cmp.b #44,(a0)
beq \arg_falc_find
moveq.w #0,d0
rts
\arg_falc_find
moveq.w #1,d0
rts
;verify_arg
;Verifie si l'argument en cours est correcte
verify_arg: move.l addr_str,a0
tst.b (a0)
beq \arg_inc
cmp.b #124,-(a0)
beq \arg_inc
moveq.w #1,d0
rts
\arg_inc
moveq.w #0,d0
rts
;printf_eror
;Affiche une erreur tout en sortant d'un sous-programme
printf_error:
bra printf_str
; MAIN
; D1 longeur de la variable
; D0 Numéro de l'erreur
; A0 Pointeur du caractère suivant
_main
pea ArgName(PC) ; Charge la variable dans SP
move.w tios::DefTempHandle,-(a7) ; Charge le Handle du dossier temporaire dans SP
jsr tios::FindSymEntry ; Lance la fonction
addq.l #6,a7 ; Restaure SP de 6 car 4+2=6
move.w tios::SYM_ENTRY.hVal(a0),d0 ; D0= Handle de la variable S
tios::DEREF d0,a0 ; Enregistre le poinetur de ce Handle dans A0
move.l a0,str ; Pointeur de début de la chaîne de caractère 32 bits
move.l str,a1 ; Charge cette addresse dans le registre A1 soit str
move.w (a0),d1
cmpi.b #$2D,1(a0,d1) ; Vérifie si la variable est du type STRING
bne Error ; Si pas le cas alors aller à Error
addq.l #3,a0 ; Va au début de la chaîne de caractères
move.l a0,addr_str ; Enregistre A0 dans addr_str (sauvegarde)
bra newstr ; Va au traitement de la chaîne
Error: lea.l error_1(pc),a2 ; Charge l'erreur 1 dans A2
bra printf_str ; Affiche l'erreur
rts ; Fin du programme
;**********************************************************************************************
; Table des fonctions
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
;Pour la restauration de A0 (Lea nbr(a0),a0
;Fonctions avec paramètres:
;nbr=Taille en lettre de la fonction sans ":" + 1
;Avant d'éxécuter la fonction mettre :Move.l a0,addr_str
;
;Fonctions sans paramètres:
;nbr=Taille en lettre de la fonction
;Avant Bra good mettre :Move.l a0,addr_str
;**********************************************************************************************
;**********************************************************************************************
;VERSION
;Affiche la version de BasicLib
;**********************************************************************************************
version lea.l _comment(pc),a2
bsr printf_str
rts
;**********************************************************************************************
;FONT:[nbr]
;Sélectionne un font pour drawstr...
;**********************************************************************************************
font move.l addr_str,a0
lea 5(a0),a0
move.l a0,addr_str
bsr falc_arg
tst.w d0
bne \arg1
bsr check_data
tst.b d0
beq printf_error
bsr convert_nbr
cmp.w #2,d0
bgt err3
\suite1 move.w d0,-(a7)
jsr tios::FontSetSys
lea 2(a7),a7
bra good
\arg1 move.w #1,d0
bra \suite1
;**********************************************************************************************
;FONTGETSYS
;Renvoie le font courant
;**********************************************************************************************
fontgetsys move.l addr_str,a0
lea 10(a0),a0
move.l a0,addr_str
jsr tios::FontGetSys
bsr printf_nbr
bra good
;**********************************************************************************************
;OFF
;Eteint la TI-92
;**********************************************************************************************
off move.l addr_str,a0
lea 3(a0),a0
move.l a0,addr_str
trap #4
bra good
;**********************************************************************************************
;CONTRAST:[+ ou -] ou [valeur]
;Ajuste le contrast
;**********************************************************************************************
contrast move.l addr_str,a0
lea 9(a0),a0
move.l a0,addr_str
bsr falc_arg
tst.w d0
bne \arg_falc
bsr check_data
tst.b d0
beq printf_error
move.b (a0),d0
cmp.b #'+',d0 ; +
beq \is_up
cmp.b #'-',d0 ; -
beq \is_down
bra \is_value
\is_down bsr arg_suite
moveq #10,d0
bra \trap
\is_up bsr arg_suite
moveq #9,d0
bra \trap
\is_value
bsr convert_nbr
cmp.b #15,d0
bge err3
\value_arg_falc
move.b d0,($05340)
moveq #0,d0
trap #9
jsr (a0)
bra good
\arg_falc
moveq.b #8,d0
bra \value_arg_falc
\trap trap #9
jsr (a0)
bra good
;**********************************************************************************************
;GETCONTRAST
;Renvoie la valeur du contrast en cours
;**********************************************************************************************
getcontrast move.l addr_str,a0
lea 11(a0),a0
move.l a0,addr_str
move.b ($05340),d0
subq.b #1,d0
cmp.b #255,d0
beq \is_zero
\suite bsr printf_nbr
bra good
\is_zero moveq #0,d0
bra \suite
;**********************************************************************************************
;SHOWHELP:texte
;Affiche le texte dans la status ligne
;**********************************************************************************************
showhelp move.l addr_str,a0 ; Permet la recherche des caractères suivant
lea 9(a0),a0 ; Saute le nom de la fonction + :
bsr check_data
tst.b d0
beq printf_error
bsr copy_string ; Enregistre l'argument texte dans str
move.l str,-(a7) ; Enregistre le texte pour ST_showHelp
jsr tios::ST_showHelp ; Affiche le texte
lea 4(a7),a7 ; Restaure SP
bra good ; Va à good
;**********************************************************************************************
;ERASEHELP
;Efface le contenu de la status ligne
;**********************************************************************************************
erasehelp move.l addr_str,a0
lea 9(a0),a0
move.l a0,addr_str
bra good
;**********************************************************************************************
;LINEHELP
;Dessine la ligne de la status ligne
;**********************************************************************************************
linehelp move.l addr_str,a0
lea 8(a0),a0
move.l a0,addr_str
bra good
;**********************************************************************************************
;STBUSY:[type]
;Met dans la status ligne le type d'indicateur
;**********************************************************************************************
stbusy move.l addr_str,a0
lea 8(a0),a0
move.l a0,addr_str
bsr falc_arg
tst.w d0
bne \arg_falc
bsr check_data
tst.b d0
beq printf_error
bsr convert_nbr
cmp.b #3,d0
bge err3
\suite
move.w d0,-(sp)
jsr tios::ST_busy
lea 2(a7),a7
bra good
\arg_falc moveq.w #0,d0
bra \suite
;**********************************************************************************************
;DRAWSTR:[x],[y],[mode],texte
;Affiche sur l'écran le texte en mode choisit dans le font courant
;**********************************************************************************************
drawstr move.l addr_str,a0
lea 8(a0),a0
move.l a0,addr_str
bsr falc_arg
tst.w d0
bne \arg1
bsr check_data
tst.b d0
beq printf_error
bsr convert_nbr
move.w d0,-(a6) ;d2
\suite1 bsr arg_suite
bsr falc_arg
tst.w d0
bne \arg2
bsr check_data
tst.b d0
beq printf_error
bsr convert_nbr
move.w d0,-(a6) ;d3
\suite2 bsr arg_suite
bsr falc_arg
tst.w d0
bne \arg3
bsr check_data
tst.b d0
beq printf_error
bsr convert_nbr
cmp.b #5,d0
bge err4
move.w d0,-(a6) ;d5
\suite3 bsr verify_arg
tst.w d0
beq err7
bsr arg_suite
bsr check_data
tst.b d0
beq printf_error
bsr copy_string
move.w (a6)+,-(a7)
move.l str,-(a7)
move.w (a6)+,-(a7)
move.w (a6)+,-(a7)
jsr tios::DrawStrXY
lea 10(a7),a7
bra good
\arg1 move.w #0,-(a6)
bra \suite1
\arg2 move.w #0,-(a6)
bra \suite2
\arg3 move.w #4,-(a6)
bra \suite3
;**********************************************************************************************
;PAUSE
;Attend l'appuye de la touche ENTER ou ESC
;Supporte l'APD
;**********************************************************************************************
pause move.l addr_str,a0
lea 9(a0),a0
move.l a0,addr_str
\idle_loop move.l $5b10,$5b14
clr.w $5b42
\wait_idle
tst.w $5b42
beq.s \no_apd
\do_apd trap #4
bra.s \idle_loop
\no_apd tst.w $75Ba
beq.s \wait_idle
move.l $5b10,$5b14
move.w $75bc,d0
clr.w $75ba
\try_key_off
cmp.w #16651,d0
beq.s \do_apd
cmp.w #13,d0
beq good
cmp.w #264,d0
bne.s \idle_loop
bra good
;**********************************************************************************************
;GETKEY
;Renvoie la touche pressé (L'APD fonctionne avec cette fonctionne)
;**********************************************************************************************
getkey move.l addr_str,a0
lea 6(a0),a0
move.l a0,addr_str
bra good
;**********************************************************************************************
;SETAPD:[time]
;Régle l'APD selon le temps choisit
;**********************************************************************************************
setapd move.l addr_str,a0
lea 7(a0),a0
bra good
;**********************************************************************************************
;RSTAPD
;Restore l'APD à sa valeur d'usine (5 min 15
;**********************************************************************************************
rstapd move.l addr_str,a0
lea 6(a0),a0
move.l a0,addr_str
bra good
;**********************************************************************************************
;CLRSCR
;Efface totalement l'écran
;**********************************************************************************************
clrscr move.l addr_str,a0
lea 6(a0),a0
move.l a0,addr_str
bra good
;*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/
good: ;jsr ngetchx
move.l addr_str,a0
cmp.b #124,(a0)
bne.s \end
addq.l #1,a0
move.l a0,addr_str
move.l str,a1
bra newstr
\end cmp.b #'',ind_aff_nbr
bne print_bon
lea status_good(pc),a2
bsr show_printf_nbr ;printf_nbr
rts
print_bon clr.b ind_aff_nbr
rts
; PushToken
; Enregistre le caractère pour les fonctions printf
; Input: D0.B
PushToken: move.w d0,-(a7)
jsr tios::push_quantum
lea 2(a7),a7
rts
;==============================================================================================
; Data
;==============================================================================================
ArgName: dc.b "s",0 ; Nom de la variable temporaire
status_good dc.b 171,15,187,0 ; = "<check>"
str dc.l 0 ; Contient le nom de la fonction
addr_str dc.l 0 ; Contient l'adresse de départ de la chaîne
EVEN
str_cmp dc.l 0
EVEN
aff_nbr dc.b 0
EVEN
ind_aff_nbr dc.b 0
EVEN
folder_name dc.b "pathname",0
EVEN
file_name dc.b "filename",0
EVEN
taille dc.w 0
idle_check_data dc.w 0
check_str dc.l 0
EVEN
nbr_str dc.l 0
EVEN
;**********************************************************************************************
;Données pour la convertion d'expression en String car BUG!!!
;**********************************************************************************************
nbr_expr dc.l 0
;=============================================================================================
;Erreur
;=============================================================================================
err2 lea error_2(pc),a2
bra printf_str
err3 lea error_3(pc),a2
bra printf_str
err4 lea error_4(pc),a2
bra printf_str
err7 lea error_7(pc),a2
bra printf_str
error_1 dc.b "Error 01: Arguments sous forme de STRING manquant.",0
error_2 dc.b "Error 02: Syntaxe dans une fonction ou argument.",0
error_3 dc.b "Error 03: Nombre invalide pour cette fonction.",0
error_4 dc.b "Error 04: Couleur invalide pour cette fonction.",0
error_5 dc.b "Error 05: Le dossier ou fichier spécifié est introuvable.",0
error_6 dc.b "Error 06: Dépassement de capacité!!!",0
error_7 dc.b "Error 07: Argument(s) incorrecte dans une fonction.",0
;=============================================================================================
;Commentaires
;=============================================================================================
_comment dc.b "BasicLib® V1.0 by Anneheim G",160,0 ; Le caractère 160 correspond à "..."
;==============================================================================================
; Function Definition
;==============================================================================================
SECTION _tibasic
dc.b $E9
dc.b $0F,$E4 ; EndFunc
dc.b $00,$E8 ; :
dc.b $17,$E4 ; Func
dc.b $E5,$03 ; (s)
dc.b $00,$00,$40,$DC
_tibasic:
END
Il est assez long donc je conseil de copier le contenu est de le coller dans notepad ou autre.
Dans BAsicLib toutes les fonctions de base comme convertir une expr en nombre... sont faite et sans bug mais il reste la partie de rajjout de fonctions pour le basic pour celle du réglages de l'APD... BasicLib au point de vue vitesse et plus puissant que Vertel et au point de vue de ligne de commande plus compressé car en faite on est pas obliger de rentrer tout les paramatrès par exemple pour la fonction contraste on peut faire ceci.
basiclib ("constrast:") Met par défaut le contraste
basiclib ("constrast:+") incrémente le constrate
basiclib ("constrast:-") décrémente le constrate
basiclib ("constrast:valeur") Fixe le constrate à valeur
basiclib peut prendre aussi plusieurs fonctions et sort des valeurs non pas dans un fichiers mais à l'écran home donc il est possible de faire basiclib ("getfontsys")->font
...
Si un possesszeurs de TI-92 reprend ce programme je pense que ceci amélioreras grandement les programmes Basic sur TI-92.
Pour plus d'informations sur des focntions ou sur l'utilisation:
geoffrey.anneheim@wanadoo.fr
