1

Bonjour,


Voila, j'aimerais faire un programme en assembleur, qui puisse éteindre à tout moment la calcu en appuyant sur alpha + off.
la calcu se rallumerais directement à l'endroit ou l'on a quitté, ce qui permettrais au programmeurs en basic un gain de temps considérable.

Seulement voila je ne sais pas du tout comment mis prendre :s ...

merci à tous ceux qui me mettront sur la piste.

2

Soit tu as juste à installer une [cite=http://marcplouhinec.free.fr/calculatrices/ti/ti-82/tutoriel/progasm/guide/lesson20.html]interruption[/cite] (dans lequel cas tu n'as pas besoin de toujours faire appel à un programme pour éteindre la TI, juste une fois pour l'installer, et si ça ce trouve t'as juste à activer l'APD comme ça : http://www.ticalc.org/archives/files/fileinfo/369/36934.html). Ou soit il faut appeler ton programme ( avec 'send(9prgm' je suppose) comme ça :

;=========================================================================;
;          			Eteindre la TI				  ;
;=========================================================================;

fonction03:
        di				; désactive les interruptions
        ld	a, 001h
        out	(003h), a		; éteint la calto
        ld	a ,000h
        out	(004h),a
        ex	af, af'
        exx
        ei				; active les interruptions
        ret


(ça viens de Tlib)

3

C'est possible d'installer une interruption avec send(9prgm ?

4

Peut être, suffit d'essayer :

========================BELZEBLUB for ION=============================
===========================by Texameije===============================
======================texameije@belgacom.net==========================
======================================================================
===============================c2002==================================
	.nolist

#include	"ion.inc"
	.list
#ifdef TI83P
	.org	progstart-2
	.db		$BB,$6D
#else
	.org	progstart
#endif
	ret
	jr		nc,prgrmstart
	.db		"Tougoudah",0

prgrmstart:
        im      1
        ld      hl,interrupt_start
        ex      de,hl
        ld      hl,$8484
        ld      b,5
compareloop:
        ld      a,(de)
        cp      (hl)
        jr      nz,enable
        inc     hl
        inc     de
        djnz    compareloop
        ld      ($8486),a
        ret

enable:
        ld      b,1
        ld      hl,$8300
        ld      a,h
        ld      (hl),$84
        ld      d,h
        ld      e,b
        ldir
        ld      hl,interrupt_start
        ld      de,$8484
        ld      bc,interrupt_end-interrupt_start
        ldir
        ld      i,a
        im      2

interrupt_start:
        
        di
        ex      af,af'
        exx
        ld      a,($800A)               ; check for apd
        dec     a
        jp      z,interrupt_off         ; if apd is about to happen, then
                                        ; prevent it and shutdown the calc.

(met ton code ici pour voir)

interrupt_off:
        ld      a,$74                   ; Turn calculator off
        ld      ($800A),a
        ld      a,$08
        out     (3),a
        ld      a,$01
        out     (3),a
        pop     hl
        exx
        ex      af,af'
        ei
        halt
        jp      $0038                   ; call standard interrupt handler


delay:
		push	hl
        inc     hl
        dec     hl
		pop		hl
        ret

interrupt_end:

.end
END


(d'après le code source de Belzeblub.)

Sinon je te conseil d'utilise le direct input pour la détection des touches.

5

heu ? comment on detecte que alpha est activé ?

6

Bah avec le direct input :

.nolist

;Groupe6	:	$DF (c'est le groupe des touches qui contient ALPHA)
#define		kAlpha		191

.list
[ton header]

Start:
	ld a,$FF	; on réinitialise le port
	out (1),a

	ld a,$DF	; on veux détecter les touches du groupe 6 ($DF)
	out (1),a
	in a,(1)

	cp kAlpha	; Si Alpha est appuyé
	call z,DetectOn	; On va détecter si On est presser

	jr Start

DetectOn:
[etc...]

.end
END


(Bon bien sur il faut inclure ça dans l'autre programme là où j'avais mis 'met ton code ici', et sans oublier de définir 'kAlpha')

Sinon juste comme ça, je te conseil de choisir une autre combinaison que Alpha+On car On sert déjà à quitter les programmes Basic, ça pourrai faire un mélange des deux et c'est pas très bon ça... (Fait pluto un truc du genre Alpha+Mode)

7

Tu veux dire la même fonction que MirageOs???

8

Surement mais MirageOS marche sur TI 83+, et là je suppose que c'est pour une TI 82 STATS (83 donc) et, en plus, en héxa.

9

CA MARCHE !!!!

10

C'est vrai ? (Tu peux poster le code source en entier pour voir ?)

11

Bha le voila mais il est pas encore finit smile (pour l'instant il suffit d'appuyer sur alpha pour que la calcu s'éteigne)




;========================ALPHA MODE============================= 

.NOLIST
#define equ .equ
#define EQU .equ
#define end .end

.LIST
.org 9327h


	di				;disable interrupts (don't want an interrupt before we're ready)
	ld	hl,$9900		;start of interrupt table
	ld	de,$9901		;start of interrupt table +1
	ld	bc,256			;257 - 1 bytes to copy
	ld	(hl),$9a		;load $9a into (hl)
	ldir				;ld (hl) into (de), inc hl and de, ld (hl) into (de)...

	;now you have a 257 byte table starting at $9900 filled with $9a

	ld	hl,interrupt_start			;\
	ld	de,$9a9a				; | copy interrupt routine to $9a9a
	ld	bc,interrupt_end-interrupt_start	; |
	ldir						;/
	ld	a,$99
	ld	i,a			;load $99 into I
	im	2			;switch to mode 2
	ei				;enable interrupts


interrupt_start:
	exx				;swap registers...
	ex	af,af'			;swap registers...

	ld	a,$ff			;\
	out	(1),a			; |
	ld	a,$df			; |hopefully you understand direct input
	out	(1),a			; |
	in	a,(1)			;/

	bit	7,a			;si le bit 7 est zero, ALPHA est pressé
	jr	nz,interrupt_done	;si ALPHA n'est pas pressé, on va à interrupt_done
 
					;sinon, on éteint la ti

        di				; disable interrupts
        ld a,001h
        out (003h),A  ; turn off screen
        ld A,000H
        out (004H),A
        ex af,af'
        exx
        ei   ; enable interrupts



interrupt_done:
	exx				;swap registers back
	ex	af,af'			;swap registers back
	jp	$0038			;go to normal interrupt routine
interrupt_end:


.end
END



En vérité je sais pas si ca marche : la fonction pour éteindre la calcu ne marche pas sous vti (mais je pense que c'est uniquement du à l'émulateur, j'avais deja repéré ca avant).

Et puis il y a un truc qui me semble assez bizarre, ce sont les 2 lignes lorsqu'on rallume la calcu, pourquoi aurait on besoin de changer les registres ?? (t'as pas une idée) :

        ex af,af'
        exx

12

J'en sais rien du tout (mais si ça marche tant mieu).

13

bha en fait je sais pas si la fonction "éteindre la ti" fonctionne, mais le reste marche ca c'est sur

d'autant plus que je ne vois aucune utilité à swapper les registres, et ca pourrait d'autant plus buguer la calcu puisque à ce moment la les deux swaps suivant seraient annulés... sad

        di				; disable interrupts 
        ld a,001h 
        out (003h),A  ; turn off screen 
        ld A,000H 
        out (004H),A 
        ex af,af' 
        exx 
        ei   ; enable interrupts 



(mais bon d'un autre coté ca vient de asm guru et donc je sais pas trop...)


EDIT : C'est bon je crois que le pb est résolu