Hi All,
I wrote a breakout for the HP50g in HPPascal. See
http://www.hpcalc.org/details/8662
For this program I have to change the contrast of the screen. So I use the procedure 'Contraste' in the "systemHP" unit of HPPascal. I would like that my program reset the initial contrast when it ends. The procedure to change the constrast in HPPascal is define like this :
Code:
procedure Contraste (c: byte);
begin
asm
A=R1
D1=A
A=DAT1 B
LC(5) #101
D1=C
DAT1=A P
D1=D1+ 1
A=DAT1 P
LC(1) #E
A=C&A P
DAT1=A P
end;
A function (that returns a value in Pascal) is define in HPPascal like this (for example) :
Code:
function Keypressed : boolean;
begin
asm
gosbvl #4999 *KeyInBuff?
la(1) 1
goc yaunetouche
la(1) 0
:yaunetouche
c=r1
d1=c
dat1=a p
end;
end;
I know nothing about saturn ASM. I want to create a function that returns the value of the contast of the screen, Something like :
Code:
Function GetContrast : Byte;
Begin
Asm
....
End;
Could somenone help me for the ASM code ?
In the documentation (in french) I found this : :
Quote:Appel d'une fonction ou d'une procédure
Pour appeler une fonction ou une procédure, HP PASCAL opère de la manière suivante :
Dans le cas d'une fonction, le pointeur de pile subit un incrément de la taille du résultat de la fonction.
L'appel d'une fonction de type BYTEBYTE, par exemple, sera précédé de l'instruction assembleur
D0=D0+ 2
* Réserve 2 quartets pour le résultat de la fonction
Ensuite, aussi bien pour les fonctions que pour les procédures, HP PASCAL place dans la pile tous les paramètres (facultatifs) qui sont à transmettre à la fonction ou la procédure.
Par exemple, pour appeler une fonction ADD définie par :
FUNCTION ADD (n1, n2: BYTE) : BYTE;
HP PASCAL placera sur la pile deux BYTEBYTE, par exemple:
LA(2) #45
DAT0=A B
D0=D0+ 2 * Place le BYTE 69 sur la pile
LA(2) #4E
DAT0=A B
D0=D0+ 2 * Place le BYTE 78 sur la pile
Enfin, la fonction ou la procédure est appelée par un simple GOSUBL suivi de son nom.
L'appel de la fonction ADD s'effectuera :
GOSUBL ADD * Appel de la fonction
Après le retour d'une procédure, D0 pointe sur sa valeur initiale, avant l'empilement des paramètres éventuels. Il n'y a donc aucune opération supplémentaire à effectuer.
Après le retour d'une fonction, le résultat renvoyé par celle-ci se retrouve sur la pile, à l'emplacement réservé au départ par l'instruction D0=D0+ ?
Les paramètres éventuels sont automatiquement dépilés.
Pour utiliser le résultat de la fonction, il suffit donc de dépiler ce résultat par les instructions prévues à cet effet.
Dans notre exemple de la fonction ADD, le résultat est placé dans le registre A champ B à l'aide des simples instructions suivantes :
D0=D0- 2
A=DAT0 B
* Prend le résultat sur la pile et le place dans A:B