Post Reply 
(HP50g) HpPascal and contrast of the screen
10-26-2017, 11:31 PM (This post was last modified: 10-26-2017 11:40 PM by Gilles59.)
Post: #1
(HP50g) HpPascal and contrast of the screen
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
Find all posts by this user
Quote this message in a reply
Post Reply 


Messages In This Thread
(HP50g) HpPascal and contrast of the screen - Gilles59 - 10-26-2017 11:31 PM



User(s) browsing this thread: 1 Guest(s)