Lors du précédent article sur la modification du Reset dit évolué, nous avions vu qu'elle n'était pas compatible avec les modèles Enhanced, faute de place suffisante dans les routines Monitor WRITE et READ. En effet, sur IIe Enhanced, le cœur de ces routines a été déporté vers la ROM interne en page $C5, la partie Monitor (en $FECD et $FEFD), ne servant qu'à faire la liaison vers les adresses $C5AA et $C5D1. De la même façon, nous allons donc utiliser pour nos propres besoins, ces mêmes emplacements mémoire et y placer notre routine Reset custom.

Pour accéder à la ROM interne en lecture, il faut utiliser un softswitch permettant de basculer l'accès mémoire vers cette zone. En effet, par défaut, l'espace $C100 à C$7FF est une partie de la mémoire normalement dédiée à l'interfaçage avec les cartes enfichées dans les slots d'un Apple II. Ici, par exemple, $C500 à $C5FF correspond à la ROM d'une carte en Slot 5. Il nous faut donc, avant de pouvoir lire les routines en ROM Interne, activer l'accès à ce contenu, et non plus à celui de la ROM Slot 5. C'est le rôle du softswitch $C007 (SETCXROM de son petit nom). Une fois notre routine utilisée, il faudra rebasculer l'accès vers les ROMS Slot par l'intermédiaire du softswitch $C006 (CLRCXROM) qui est l'inverse du premier. On comprend aisément que l'utilisation de ces softswitchs doit avoir lieu en dehors de la zone de ROM Interne, celle-ci ne pouvant s'activer ou se désactiver elle-même. Il nous faut donc une première partie de routine en Monitor qui, après avoir actionné SETCXROM, sautera en $C5AA, emplacement de notre Reset évolué. Et une fois celui-ci exécuté, il faudra revenir en ROM Monitor et utiliser CLRCXROM pour réactiver l'accès aux ROM Slot (sinon pas d'accès disque par exemple). C'est d'ailleurs exactement de cette façon que fonctionnent les routines WRITE et READ.

Nous allons donc devoir intervenir en différents endroits de la ROM : à la fois dans la partie Autostart et à la fois dans la partie ROM Interne en page $C5.

Le code en lui-même reste sensiblement le même  que celui de la modification d'un IIe non Enhanced. Je vous invite donc à consulter les articles précédents pour le détail.

Partie 1 (Rom Monitor) :

FA85- AD F2 03    LDA $03F2        ; test vecteur reset
FA88- D0 0C       BNE $FA96        ; non nul ?
FA8A- AD F3 03    LDA $03F3        ; idem
FA8D- D0 07       BNE $FA96        ;
FA8F- AD F4 03    LDA $03F4        ; test octet contrôle
FA92- C9 FF       CMP #$FF         ; égal à #$FF ?
FA94- F0 10       BEQ $FAA6        ; oui ? alors go COLDSTART !
FA96- 4C CE FE    JMP $FECE        ; non ? alors routine RESET custom
FA99- 00 00              	   ;
FA9B- 4C 00 E0	  JMP $E000        ; JMP BASIC (COLD) (pour modif Autostart)
FA9E- 00 00                        ;
FAA0- 8D 06 C0	  STA $C006 	   ; restore ROM SLOT (CLRCXROM)
FAA3- 4C 59 FF    JMP $FF59        ; puis saut monitor (sorties 1 et 2)

On retrouve ici le test complet du vecteur Reset pour essayer de déterminer si nous sommes en phase d'allumage de l'ordinateur ou pas. La fin a toutefois été modifiée afin de conserver le saut possible vers le BASIC (option utilisée par la modification Autostart). De plus, une sortie (en $FAA0) depuis la ROM interne est mise en place.

Partie 2 (Rom Monitor) :

FECD- 	60	  RTS 		   ; neutralisation SAVE
FECE-   8D 07 C0  STA $C007        ; utilisation ROM interne (SETCXROM)
FED1-   4C AA C5  JMP $C5AA        ; puis SAUT routine modifiée
 
FEFD-	60	  RTS		   ; neutralisation LOAD
FEFE-   8D 06 C0  STA $C006        ; restore SLOTXCROM (utilisation ROM Slot)
FF01-   B0 03	  BCS $FF06	   ; si carry = 1, saut Reset par défaut
FF03-   4C A6 FA  JMP $FAA6        ; sinon COLDSTART (reboot) (sortie 3)
FF06-   6C F2 03  JMP ($03F2)	   ; saut Vector Reset (sortie 4)
FF09-	EA	  NOP		   ; fin modifications

Il s'agit ici de la modification de la partie Monitor des routines WRITE et READ. On y insère notre point d'entrée vers la ROM Interne ainsi que le reste des sorties prévues. Le Bit de retenue (carry) est testé pour déterminer si l'on doit effectuer un Reboot ou sauter au Vector Reset. Ce Bit est positionné dans la routine qui suit. À noter les deux RTS utilisés une nouvelle fois pour neutraliser les commandes LOAD et SAVE du BASIC, évitant ainsi des résultats étranges en cas d'utilisation fortuite.

Partie 3 (ROM Interne) :

C5AA-   A0 30	  LDY #$30         ; sonorisation...
C5AC-   A9 20     LDA #$20         ; ...custom...
C5AE-   20 A8 FC  JSR $FCA8
C5B1-   AD 30 C0  LDA $C030	   ; ...pour signaler...
C5B4-   88        DEY
C5B5-   D0 F5     BNE $C5AC        ; ...une attente touche
C5B7-   AD 00 C0  LDA $C000        ; attente touche
C5BA-   10 FB     BPL $C5B7
C5BC-   8D 10 C0  STA $C010        ; keystrobe
C5BF-   C9 C4     CMP #$C4         ; "D" (dump) ?
C5C1-   D0 2B     BNE $C5EE        ; non ? alors test autre touche
C5C3-   A0 00     LDY #$00         ; sinon, début dump...
C5C5-   B9 00 00  LDA $0000,Y      ; avec sauvegarde Page 0...
C5C8-   99 00 20  STA $2000,Y
C5CB-   C8        INY
C5CC-   D0 F7     BNE $C5C5
C5CE-   84 00     STY $00
C5D0-   84 02     STY $02
C5D2-   A9 01     LDA #$01
C5D4-   85 03     STA $03
C5D6-   A9 21     LDA #$21         ; ...avant copie Page 1 à 8...
C5D8-   85 01     STA $01
C5DA-   B1 02     LDA ($02),Y
C5DC-   91 00     STA ($00),Y      ; ...vers $2100+
C5DE-   C8        INY
C5DF-   D0 F9     BNE $C5DA
C5E1-   E6 01     INC $01
C5E3-   E6 03     INC $03
C5E5-   A5 03     LDA $03
C5E7-   C9 09     CMP #$09
C5E9-   D0 EF     BNE $C5DA
C5EB-   4C A0 FA  JMP $FAA0        ; retour en ROM F8 (sorties 1 et 2)
C5EE-   C9 CD     CMP #$CD 	   ; "M" (monitor)?
C5F0-   F0 F9     BEQ $C5EB
C5F2-   C9 D2	  CMP #$D2	   ; "R" (reboot) ?
C5F4-   D0 03	  BNE $C5F9        ; non ? reset par défaut alors
C5F6-	18        CLC              ; on clear la Carry (go reboot)
C5F7-	90 01	  BCC $C5FA        ; et on sort (sortie 3)
C5F9-	38	  SEC              ; carry = 1 (use vector reset)
C5FA-   4C FE FE  JMP $FEFE        ; on sort (sortie 4)
C5FD-   xx xx xx                   ; fin des modifications

On retrouve ici le cœur de notre routine, exécutée en cas de Reset, avec l'attente de l'appui d'une touche pour décider de l'action à suivre : les options R (Reboot), M (saut direct au Monitor), D (Dump des pages 0 à 8 puis saut au Monitor) sont possibles. Toute autre touche entrainera le saut au Vector Reset, et donc effectuera l'action par défaut prévue par le programme en cours (avec les réserves énoncées dans le précédent article).

Partie 4 (ROM Monitor) :

Si vous avez appliqué la modification Autostart, l'appui sur la touche 0 continuera à mener au BASIC. Mais on peut également forcer le saut au Monitor par cette touche 0 en appliquant ce petit correctif :

FACE-   F0 D3     BEQ $FAA3        ; saut monitor si touche 0

À noter :

Attention : faute de place, l'octet $3F2 n'est plus positionné à 03 avant d'effectuer le COLDSTART BASIC (par le JMP $E000). Ce qui signifie qu'un autre Reset (pour lequel on utilisera le saut par défaut du vector) effectuera de nouveau un COLDSTART BASIC et non pas un WAMRSTART comme prévu à l'origine. Avec l’effacement du programme qui en résulte...

Mise en pratique :

Le fait de devoir modifier à la fois la ROM Monitor et la ROM Interne pour y inclure nos routines, va entraîner quelques différences par rapport à ce que nous avions rencontré jusqu'à présent :

  • Pour un Apple IIe Enhanced physique, il va en effet falloir maintenant brûler deux EPROM : une pour la ROM CD (avec la modification de la page $C5) et une pour la ROM EF (avec les modifications en pages $FA,$FE et $FF). Dans le cas d'un IIe Platinum, il n'y a qu'une seule puce CF donc le problème ne se pose pas. Tout se fera sur la même ROM.
  • Pour une utilisation avec AppleWin, modifier la ROM F8 et la charger au lancement ne suffira plus. Il faudra modifier directement la ressource contenant la ROM complète et effectuer le remplacement dans l'Exe. La modification est bien évidemment permanente. À n'effectuer que sur une copie d'AppleWin donc.