810Fermer
deephLe 03/06/2011 à 21:51
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).