Les interruptions du z80 sont plus ou moins expliquées un peu partout sur internet, comme sur
Quasar Net dans le cas des CPC, mais c'est vrai que trouver un code source prêt à l'emploi c'est un peu compliqué, et encore plus lorsqu'il s'agit de la TI 83+. Aussi je recopie l'exemple d'SNG pour TI 82 au cas où :
NEW_INTERRUPT: ;DE=adresse de l'interuption
DI
PUSH AF
PUSH BC
PUSH HL
PUSH DE
LD A,(APD_BUF) ; APD_BUF = nombre d'interruptions
INC A
LD (APD_BUF),A
CP 1
JR NZ,rajoute_int
ld hl,TABLE
ld de,TABLE+1
ld (hl),CODE8
ld bc,$0100
ldir
LD HL,instal_interruptions
ld de,CODE
LD BC,instal_interruptions_fin - instal_interruptions
LDIR
EX DE,HL
JR ajoute_code
rajoute_int:
DEC A
LD H,0
LD L,A
LD BC,3
CALL MUL_HL_BC
LD BC,CODE+$1A
ADD HL,BC
ajoute_code:
POP DE
PUSH DE
ld (hl),$CD ;=call
inc hl
ld (hl),E
inc hl
ld (hl),D
inc hl
EX DE,HL
LD HL,instal_interruptions2
LD BC,instal_interruptions_fin2 - instal_interruptions2
LDIR
ld a,TABLE8
ld i,a
im 2
POP DE
POP HL
POP BC
POP AF
EI
ret
STOP_INTERRUPT: ;A=numero de l'instruction
DI
LD H,0
LD L,A
LD A,(APD_BUF)
DEC A
LD (APD_BUF),A
OR A
JR Z,arrete_interrupt
LD BC,3
CALL MUL_HL_BC
LD BC,CODE+$1A
ADD HL,BC
LD D,H
LD E,L
INC HL
INC HL
DEC DE
ecrase_appel:
INC HL
INC DE
LD A,(HL)
LD (DE),A
CP $4D
JR Z,teste_arret_ecrase_appel
LD C,B
LD B,A
JR ecrase_appel
teste_arret_ecrase_appel:
PUSH HL
LD HL,$EDFB
CALL CP_HL_BC
POP HL
JR NZ,ecrase_appel
EI
ret
arrete_interrupt:
im 1
EI
ret
Quant à utiliser l'horloge je pense que c'est inutile, déjà parce qu'elle n'est pas présente sur les calculettes antérieures et ensuite parce qu'elle est sûrement basée sur les interruptions et très difficilement utilisable en ASM...
Ensuite pour ma part je pense que le plus simple est bien d'utiliser halt pour ralentir le programme (l'optimum ce serait justement de l'allier aux interruptions pour avoir un fps +/- constant).