;**************************************** ;* AceEmu * ;* Emulateur du shell ACE pour SNG * ;* 18/07/2004 * ;* par Marc Plouhinec * ;* site: http://www.thebestof.tk * ;* Email: mailto://m_plouhinec@yahoo.fr * ;* * ;**************************************** ; This program is free software; you can redistribute it and/or ; modify it under the terms of the GNU General Public License ; as published by the Free Software Foundation; either version 2 ; of the License, or (at your option) any later version. ;Ce programme lance les jeux programmés pour ACE, il modifie le début de SNG pour ;émuler l'environnement de ACE. ;Comme ACE est plus grand que SNG, on créer un zone libre juste après SNG pour le ;"compléter" et ainsi avoir un shell de la même taille que ACE. ;Ensuite on écrase les données de SNG (on les sauvegarde dans ce programme) ;pour y stockerl'environnement de ACE. #include "sng10.inc" DEBUT_PROG = $9880-5 DEBUT_PROG_1 = $98 DEBUT_PROG_2 = $80-5 COMPLETESNG = $941C SEARCHPROG = $213E-$1A ;entrée: nom du programme dans OP1; sortie: BC-VAT HL->programme SH_BUF = $9000 CODEACE = $8D4D CODEACEAPRESSH_BUF = $9800 CLEAR_LCD_ACE = TEXT_MEM2 + 15 GET_KEY_ACE = TEXT_MEM2 + 18 DEL_MEM_ACE = TEXT_MEM2 + 33 INSERT_MEM_ACE = TEXT_MEM2 + 36 DEL_TMP_ACE = TEXT_MEM2 + 42 CREATE_TMP_ACE = TEXT_MEM2 + 45 KEY_HAND_ACE = $8D4D #Define DELBUFFERACE(Taille,AdresseBuffer) CALL DEL_TMP_ACE\ LD DE,Taille\ LD HL,AdresseBuffer\ CALL DEL_MEM_ACE\ CALL CREATE_TMP_ACE .ORG START_ADDR Commentaire .DB "AceEmu par Marc Plouhinec",0 ;-------------------------------------- ;1-On créer une liste de programmes ; compatibles avec ACE ;-------------------------------------- CALL ChercheProgTEXT_MEM ;Place dans TEXT_MEM les adresses dans la VAT des programmes compatibles LD A,(NombreDeProgrammes) OR A RET Z CALL AfficheListe XOR A LD (ProgrammeSelectionne),A CALL AfficheUnrectangleSurLeAemeProg CALL GRB_COPY Touches: ROM_CALL(GET_KEY) cp G_CLEAR RET Z cp G_UP CALL Z,Haut cp G_DOWN CALL Z,Bas cp G_ENTER JR Z,Entree halt jr Touches Haut: LD A,(ProgrammeSelectionne) OR A RET Z CALL AfficheUnrectangleSurLeAemeProg LD A,(ProgrammeSelectionne) DEC A LD (ProgrammeSelectionne),A CALL AfficheUnrectangleSurLeAemeProg CALL GRB_COPY RET Bas: LD A,(NombreDeProgrammes) LD B,A LD A,(ProgrammeSelectionne) DEC B CP B RET Z CALL AfficheUnrectangleSurLeAemeProg LD A,(ProgrammeSelectionne) INC A LD (ProgrammeSelectionne),A CALL AfficheUnrectangleSurLeAemeProg CALL GRB_COPY RET Entree: LD A,(ProgrammeSelectionne) LD H,0 LD L,A ADD HL,HL LD BC,TEXT_MEM ADD HL,BC CALL LD_HL_MHL INC HL LD (AdresseProgALancer),HL ;HL->06 JP LanceProg ChercheProgTEXT_MEM: LD HL,TEXT_MEM LD DE,TEXT_MEM+1 LD (HL),0 LD BC,127 LDIR XOR A LD (NombreDeProgrammes),A LD HL,TEXT_MEM LD (ListeIndex),HL LD HL,VAT_START PUSH HL ChercheProg: POP HL LD A,6 LD BC,$ffff CPDR LD DE,(VAT_END) CALL CP_HL_DE RET C OnAPasFini: DEC HL PUSH HL LD (AdresseProgVAT),HL LD D,(HL) INC HL LD E,(HL) EX DE,HL INC HL INC HL LD A,(HL) CP $D5 JR NZ,ChercheProg INC HL LD A,(HL) CP $00 JR NZ,ChercheProg INC HL LD A,(HL) CP $A0 JR NZ,ChercheProg POP HL PUSH HL LD HL,(ListeIndex) LD (HL),E INC HL LD (HL),D INC HL LD (ListeIndex),HL LD A,(NombreDeProgrammes) INC A CP 11 JR Z,TropDeProgrammes LD (NombreDeProgrammes),A JR ChercheProg TropDeProgrammes: POP HL RET AfficheListe: SET 7,(IY+$14) ;Ecrit du texte de menu seulement dans la mémoire graphique (GRAPH_MEM) et pas sur l'écran LCD LD HL,0 LD (GRAF_CURS),HL LD HL,TEXT_MEM LD (ListeIndex),HL AfficheNom: LD HL,(ListeIndex) CALL LD_HL_MHL LD E,(HL) DEC HL LD D,(HL) EX DE,HL LD BC,5 ADD HL,BC ROM_CALL(D_ZM_STR) LD HL,(GRAF_CURS) LD L,0 LD A,H ADD A,6 LD H,A LD (GRAF_CURS),HL LD HL,(ListeIndex) INC HL INC HL LD (ListeIndex),HL XOR A CP (HL) RET Z INC HL CP (HL) RET Z JR AfficheNom AfficheUnrectangleSurLeAemeProg: LD HL,6*12 LD C,A LD B,0 CALL MUL_HL_BC LD BC,GRAPH_MEM ADD HL,BC LD B,6*12 AfficheRectangle: LD A,(HL) XOR $FF LD (HL),A INC HL DJNZ AfficheRectangle RET ListeIndex .DW 0 NombreDeProgrammes .DB 0 ProgrammeSelectionne .DB 0 ;-------------------------------------- ;2-On place et on lance dans le buffer ; TEXT_MEM un petit code qui créer le ; buffer COMPLETESNG de la taille de ; $98D4-$9457 = 1209 octets ; et qui recherche AceEmu pour ; copier à la place de SNG le code ; de l'émulateur (CodeEmulateur). ;-------------------------------------- LanceProg: LD HL,PetitCode LD DE,TEXT_MEM LD BC,PetitCodeFin-PetitCode JP EXT_INSTR PetitCode: CREATEBUFFER(1209,COMPLETESNG) ;On créer COMPLETESNG ;On cherche dans la ram le programme ACEEMU LD HL,(VAT_END) ChercheACEEMU: LD BC,$ffff LD A,6 CPIR PUSH HL LD BC,5 SBC HL,BC LD DE,AceEmuChaine-PetitCode+TEXT_MEM LD C,1 CALL CP_STRING POP HL OR A JR Z,ChercheACEEMU DEC HL DEC HL LD E,(HL) DEC HL LD D,(HL) EX DE,HL ;HL->ACEEMU LD D,H ; LD E,L ; LD BC,AdresseACEEMUDansRam-Commentaire+39+2 ;LD (AdresseACEEMUDansRam),HL ADD HL,BC ; LD (HL),E ; INC HL ; LD (HL),D ; EX DE,HL ; LD DE,CodeEmulateur-Commentaire+39+2 ADD HL,DE ;HL->CodeEmulateur ;----------------------------------- ;2.1-On créer la table des sauts et ; on y met le code correspondant ;---------------------------------- PUSH HL LD DE,CODEACE LD BC,CodeEmulateurFin-CodeEmulateur EchangeDonnees: PUSH BC LD A,(DE) LD C,(HL) EX DE,HL LD (DE),A LD (HL),C EX DE,HL INC DE INC HL POP BC DEC BC XOR A CP B JR NZ,EchangeDonnees CP C JR NZ,EchangeDonnees POP HL LD DE,TailleCodeEmulateur ADD HL,DE LD DE,CODEACEAPRESSH_BUF LD BC,CodeEmulateurApresSH_BUFFin-CodeEmulateurApresSH_BUF LDIR JP CODEEMU-CodeEmulateur+CODEACE AceEmuChaine .DB "ACEEMU",0 PetitCodeFin: TaillePetitCode = PetitCodeFin-PetitCode ;--------------------------- ;CodeEmulateur contient le ;code qui va écraser SNG ;--------------------------- CodeEmulateur: jp $0000 jp FILL_ACE-CodeEmulateur+CODEACE jp GET_RAND-CodeEmulateur+CODEACE jp PAUSE-CodeEmulateur+CODEACE jp HL_DECI-CodeEmulateur+CODEACE jp GRB_COPY_ACE-CodeEmulateur+CODEACE jp GRB_FILL_ACE-CodeEmulateur+CODEACE jp DIRECT_KEY-CodeEmulateur+CODEACE DISP_DELAY_ACE: push hl pop hl ret jp FIND_PIXEL_ACE-CodeEmulateur+CODEACE jp SPRITE-CodeEmulateur+CODEACE jp LINK_SEND-CodeEmulateur+CODEACE jp LINK_UPDATE-CodeEmulateur+CODEACE jp LINK_GET-CodeEmulateur+CODEACE jp EXIT_TIOS-CodeEmulateur+CODEACE jp FIND_INIT-CodeEmulateur+CODEACE jp FIND_NEXT-CodeEmulateur+CODEACE jp KHAND_ACE-CodeEmulateur+CODEACE GRB_FILL_ACE: ld hl,GRAPH_MEM ld bc,$0300 FILL_ACE: ld d,h ld e,l ld (hl),a inc de dec bc ldir ret GET_RAND: ;Donne un nombre entre 0 et 255 ld a,$A6 ; <----------------------------------------------------------------I push hl ; I RAND1: ; I ld hl,$8243 ;<--------------------------------------------------------I I inc l ; I I dec h ; I I add a,(hl) ; I I ld (RAND1+1-CodeEmulateur+CODEACE),hl ; Modifie le nombre '$8243'-----I I rlca ; I rlca ; I sub h ; I add a,l ; I pop hl ; I ld (GET_RAND+1-CodeEmulateur+CODEACE),a ; Modifie le nombre '$A6'-----------I ret PAUSE: call GET_KEY_ACE ;$8bf1 cp G_ENTER ;$09 ret z halt jr PAUSE ;$8f04 HL_DECI: push de ld bc,$0504 ld de,$8064 ;pointe vers OP6+5 xor a ld (de),a ETIQUETTE5: call UNPACK_HL ;$8bfa add a,$30 dec de ld (de),a djnz ETIQUETTE5 ;$8f16 ex de,hl pop de ld a,$30 ETIQUETTE6: cp (hl) jr nz,ETIQUETTE7 ;$8f2a inc hl dec c jr nz,ETIQUETTE6 ;$8f23 ETIQUETTE7: ld a,$04 sub c ret GRB_COPY_ACE: ;-copie GRAPH_MEM à l'écran push hl ld hl,GRAPH_MEM push af ld a,$80 out ($10),a push bc push de rlca or a ret z dec hl ld c,$20 out ($10),a inc (hl) dec (hl) inc hl dec hl ld de,$000b ld a,c ETIQUETTE1: out ($10),a inc c ld b,$40 ETIQUETTE2: ld a,(hl) inc a inc hl ld a,(hl) add hl,de out ($11),a djnz ETIQUETTE2 ;$8db3 dec h dec h dec h inc hl ld a,c cp $2c jr nz,ETIQUETTE1 ;$8dae pop de pop bc pop af pop hl ret DIRECT_KEY: ld a,$ff out ($01),a dec a out ($01),a in a,($01) ld d,a ld a,$bf out ($01),a in a,($01) or $0f xor d ret ;Routines jamais terminées FIND_PIXEL_ACE: SPRITE: LINK_SEND: LINK_UPDATE: LINK_GET: EXIT_TIOS: ;Inutile pour SNG car on quitte toujours vers TIOS ret FIND_INIT: ld hl,$fe6e ;pointe vers VAT_START ld (VAR2),hl ;($8d84) ret FIND_NEXT: ld hl,(VAR2) ld bc,($8d18) inc bc ETIQUETTE8: ld a,(hl) dec hl ld e,(hl) dec hl ld d,(hl) dec hl and $0f sbc hl,bc ret c add hl,bc cp $05 jr z,ETIQUETTE9 cp $06 jr z,ETIQUETTE9 dec hl dec hl dec hl jr ETIQUETTE8 ETIQUETTE9: push de ld de,OP1 ld (de),a inc de ld b,(hl) dec hl ETIQUETTE9_2: ld a,(hl) ld (de),a dec hl inc de djnz ETIQUETTE9_2 xor a ld (de),a ld de,(VAR2) ld (VAR2),hl ex de,hl pop de ret VAR .DW 0 VAR2 = VAR-CodeEmulateur+CODEACE KHAND_ACE: JP KEY_HAND_ACE ;---------------------------------- ;CODEEMU ;Il contient le code qui ;adaptera les appels et qui lancera ;le programme. ;---------------------------------- CODEEMU: ;-------------------------------------- ;3-On commence par remplir TEXT_MEM2 ; par les adresses des appels vers ; la rom. ;-------------------------------------- LD A,($29D0) ;pour rom |16.0:36| |17.0:37| |18.0:38| |19.0:6D| |19.006:18| CP $6D JR Z,Rom190 CP $18 JR Z,Rom19006 ;Rom160 170 180 LD HL,AppelsRom160-CodeEmulateur+CODEACE LD DE,TEXT_MEM2 LD BC,$20 LD A,$C3 JR RempliTEXT_MEM2 Rom190: LD HL,AppelsRom190-CodeEmulateur+CODEACE LD DE,TEXT_MEM2 LD BC,$20 LD A,$C3 JR RempliTEXT_MEM2 Rom19006: LD HL,AppelsRom19006-CodeEmulateur+CODEACE LD DE,TEXT_MEM2 LD BC,$20 LD A,$C3 RempliTEXT_MEM2: LD (DE),A INC DE LDI LDI JP PE,RempliTEXT_MEM2-CodeEmulateur+CODEACE TEXT_MEM2Complet: LD DE,KEY_HAND_ACE LD (DE),A INC DE LDI LDI ;-------------------------------------- ;5-On sauve le code de SNG qui se trouve ; à l'emplacement de SH_BUF ;-------------------------------------- ;On sauve donc les donées entre l'adresse $9000 et l'adresse $9458 LD HL,(AdresseACEEMUDansRam-CodeEmulateur+CODEACE) LD DE,SauveSH_BUF-Commentaire+41 ADD HL,DE EX DE,HL LD HL,SH_BUF LD BC,$458 LDIR ;On efface SH_BUF LD HL,SH_BUF LD DE,SH_BUF+1 LD (HL),0 LD BC,2048-1 LDIR ;-------------------------------------- ;6-tout est prêt, on déplace le ; programme à l'adresse DEBUT_PROG ;-------------------------------------- CALL DEL_TMP_ACE LD HL,(AdresseProgALancer-CodeEmulateur+CODEACE) DEC HL LD E,(HL) DEC HL LD D,(HL) LD (AdresseProgVAT-CodeEmulateurApresSH_BUF+CODEACEAPRESSH_BUF),HL EX DE,HL CALL PlaceLeProg-CodeEmulateur+CODEACE LD HL,DEBUT_PROG LD BC,5 ADD HL,BC LD BC,100 XOR A CPIR ;HL->Adresse de la première instruction du programme LD (ApelProg-CodeEmulateur+CODEACE),HL XOR A CALL GRB_FILL_ACE-CodeEmulateur+CODEACE CALL $0000 ;On lance le programme ApelProg = $-2 ;-------------------------------------- ;7-Le programme vient de quitter, on ; remet tout en ordre ;-------------------------------------- ;-------------------------------------- ;7.1-On replace le prog à son ; emplacement d'origine ;-------------------------------------- SET 1,(IY+$0D) RES 3,(IY+$05) CALL DEL_TMP_ACE CALL CODEACEAPRESSH_BUF ;RePlaceLeProg ;On remet SNG comme avant grace à PetitCode2 LD HL,(AdresseACEEMUDansRam-CodeEmulateur+CODEACE) LD DE,PetitCode2-Commentaire+41 ADD HL,DE LD DE,TEXT_MEM LD BC,PetitCode2Fin-PetitCode2 LDIR JP TEXT_MEM AdresseProgALancer .DW 0 AdresseACEEMUDansRam .DW 0 AppelsRom160: .DW $39D2 .DW $37CE .DW $38FA .DW $37D4 .DW $37A4 .DW $38CA .DW $01D4 .DW $01C7 .DW $2124 .DW $00A1 .DW $2397 .DW $258D .DW $2258 .DW $22AE .DW $3606 .DW $38D0 .DW $3924 AppelsRom190: .DW $39D2+$1A .DW $37CE+$1A .DW $38FA+$1A .DW $37D4+$1A .DW $37A4+$1A .DW $38CA+$1A .DW $01D4 .DW $01C7 .DW $2124+$1A .DW $00A1 .DW $2397+$1A .DW $258D+$1A .DW $2258+$1A .DW $22AE+$1A .DW $3606+$1A .DW $38D0+$1A .DW $3924+$1A AppelsRom19006: .DW $3B35 .DW $3907 .DW $3A2D .DW $390D .DW $38E9 .DW $39F1 .DW $01F3 .DW $01E6 .DW $2269 .DW $00A1 .DW $24DC .DW $26D2 .DW $239D .DW $23F3 .DW $374B .DW $3A03 .DW $3A87 PlaceLeProg: ;Pour déplacer le programme, on créer une zone libre juste après SNG et on détruit le programme original après l'avoir copié. ;Pour ne pas gaspiller de la mémoire, on augmente la taille de la zone libre en même temps qu'on réduit la taille du programme. ;initialisation LD (AdresseInitProg),HL LD C,(HL) INC HL LD B,(HL) INC BC INC BC LD (TailleDonnesADeplacer),BC LD (TailleProg),BC DEC HL LD (AdresseProgDetruit),HL LD HL,DEBUT_PROG LD (AdresseProgDeplace),HL CreationDeZoneLibre: ;On créer une zone de mémoire à l'adresse AdresseProgDeplace de HL octets ;HL est { = 768 si TailleDonnesADeplacer>768 ; = TailleDonnesADeplacer sinon LD HL,(TailleDonnesADeplacer) LD BC,768 SBC HL,BC JP P,TaillePositive-CodeEmulateur+CODEACE LD HL,(TailleDonnesADeplacer) JR TailleCalculee TaillePositive: LD HL,768 TailleCalculee: PUSH HL LD DE,(TailleDonnesADeplacer) EX DE,HL SBC HL,DE LD (TailleDonnesADeplacer),HL POP HL ;On a calculé la taille de la mémoire à allouer PUSH HL LD DE,(AdresseProgDeplace) CALL INSERT_MEM_ACE ;Allocates a region of memory: HL = size DE = address ;Cette routine modifie l'adresse du programme à copier, on modifie donc l'adresse AdresseProgDetruit POP HL PUSH HL EX DE,HL LD HL,(AdresseProgDetruit) Add HL,DE LD (AdresseProgDetruit),HL ;On copie maintenant les données vers la nouvelle adresse POP HL PUSH HL LD B,H LD C,L LD HL,(AdresseProgDetruit) LD DE,(AdresseProgDeplace) LDIR POP HL ;On detruit la zone copiée du programme EX DE,HL PUSH DE LD HL,(AdresseProgDetruit) CALL DEL_MEM_ACE ;Deletes a region of allocated memory: HL = address DE = size POP DE ;On met à jour AdresseProgDeplace ;ici DE = taille des données copiées LD HL,(AdresseProgDeplace) ADD HL,DE LD (AdresseProgDeplace),HL ;On regarde s'il reste des données à copier LD HL,(TailleDonnesADeplacer) LD A,H CP $FF JR NZ,CreationDeZoneLibre LD A,L CP $FF JR NZ,CreationDeZoneLibre ;On modifie l'adresse du programme dans la VAT LD HL,(AdresseProgVAT-CodeEmulateurApresSH_BUF+CODEACEAPRESSH_BUF) LD (HL),DEBUT_PROG_1 INC HL LD (HL),DEBUT_PROG_2 CALL CREATE_TMP_ACE RET AdresseInitProg2 .DW 0 TailleDonnesADeplacer2 .DW 0 TailleProg2 .DW 0 AdresseProgDetruit2 .DW 0 AdresseProgDeplace2 .DW 0 AdresseInitProg = AdresseInitProg2 -CodeEmulateur+CODEACE TailleDonnesADeplacer = TailleDonnesADeplacer2-CodeEmulateur+CODEACE TailleProg = TailleProg2 -CodeEmulateur+CODEACE AdresseProgDetruit = AdresseProgDetruit2 -CodeEmulateur+CODEACE AdresseProgDeplace = AdresseProgDeplace2 -CodeEmulateur+CODEACE CodeEmulateurFin: CodeEmulateurApresSH_BUF: RePlaceLeProg: ;initialisation LD HL,(TailleProg) LD (TailleDonnesADeplacer),HL LD HL,DEBUT_PROG LD (AdresseProgDetruit),HL LD HL,(AdresseInitProg) LD BC,(TailleProg) ADD HL,BC LD (AdresseProgDeplace),HL CreationDeZoneLibre_2: ;On créer une zone de mémoire à l'adresse AdresseProgDeplace de HL octets ;HL est { = 768 si TailleDonnesADeplacer>768 ; = TailleDonnesADeplacer sinon LD HL,(TailleDonnesADeplacer) LD BC,768 SBC HL,BC JP P,TaillePositive_2-CodeEmulateurApresSH_BUF+CODEACEAPRESSH_BUF LD HL,(TailleDonnesADeplacer) JR TailleCalculee_2 TaillePositive_2: LD HL,768 TailleCalculee_2: PUSH HL LD DE,(TailleDonnesADeplacer) EX DE,HL SBC HL,DE LD (TailleDonnesADeplacer),HL POP HL ;On a calculé la taille de la mémoire à allouer PUSH HL LD DE,(AdresseProgDeplace) CALL INSERT_MEM_ACE ;Allocates a region of memory: HL = size DE = address ;On copie maintenant les données vers la nouvelle adresse POP HL PUSH HL LD B,H LD C,L LD HL,(AdresseProgDetruit) LD DE,(AdresseProgDeplace) LDIR POP HL ;On detruit la zone copiée du programme EX DE,HL PUSH DE LD HL,(AdresseProgDetruit) CALL DEL_MEM_ACE ;Deletes a region of allocated memory: HL = address DE = size POP DE ;On regarde s'il reste des données à copier LD HL,(TailleDonnesADeplacer) LD A,H CP $FF JR NZ,CreationDeZoneLibre_2 LD A,L CP $FF JR NZ,CreationDeZoneLibre_2 ;On modifie l'adresse du programme dans la VAT LD HL,(AdresseProgVAT-CodeEmulateurApresSH_BUF+CODEACEAPRESSH_BUF) LD A,(AdresseInitProg+1) LD (HL),A INC HL LD A,(AdresseInitProg) LD (HL),A CALL CREATE_TMP_ACE RET AdresseProgVAT .DW 0 CodeEmulateurApresSH_BUFFin: PetitCode2: ;-------------------------------------- ;7.2-On restore SNG ;-------------------------------------- LD HL,(AdresseACEEMUDansRam-CodeEmulateur+CODEACE) PUSH HL ;On détruit COMPLETESNG DELBUFFERACE(1209,COMPLETESNG) ;On restore le code qui se trouvait sous SH_BUF POP HL PUSH HL LD DE,SauveSH_BUF-Commentaire+41 ADD HL,DE LD DE,SH_BUF LD BC,$458 LDIR ;On restore le début de SNG POP HL LD DE,CodeEmulateur-Commentaire+41 ADD HL,DE LD DE,CODEACE LD BC,CodeEmulateurFin-CodeEmulateur CALL EchangeDonnees2-PetitCode2+TEXT_MEM ;On a tout restoré! ;On quitte RET EchangeDonnees2: PUSH BC LD A,(DE) LD C,(HL) EX DE,HL LD (DE),A LD (HL),C EX DE,HL INC DE INC HL POP BC DEC BC XOR A CP B JR NZ,EchangeDonnees2 CP C JR NZ,EchangeDonnees2 RET PetitCode2Fin: TaillePetitCode2 = PetitCode2Fin-PetitCode2 ;-------------------------------------- ;SauveSH_BUF ;Ce buffer contiendra le code de SNG ;écrasé par SH_BUF ;-------------------------------------- SauveSH_BUF .DS $458 .DB 0 TailleCodeEmulateur = CodeEmulateurFin-CodeEmulateur TailleCodeEmulateurApresSH_BUF = CodeEmulateurApresSH_BUFFin-CodeEmulateurApresSH_BUF ;--------------------- ;Quelques précautions ;--------------------- #IF TaillePetitCode > 128 .echo "TaillePetitCode est trop grand!!\n" .echo "Enlevez " .echo TaillePetitCode - 128 .echo " octets!\n" #ELSE .echo TaillePetitCode .echo " octets seront copies dans TEXT_MEM.\n" #ENDIF #IF TaillePetitCode2 > 128 .echo "TaillePetitCode2 est trop grand!!\n" .echo "Enlevez " .echo TaillePetitCode2 - 128 .echo " octets!\n" #ELSE .echo TaillePetitCode2 .echo " octets seront copies dans TEXT_MEM.\n" #ENDIF #IF TailleCodeEmulateur > 2867 .echo "CodeEmulateur est trop grand!!\n" .echo "Enlevez " .echo TailleCodeEmulateur - 2867 .echo " octets!\n" #ELSE .echo TailleCodeEmulateur .echo " octets de SNG seront ecrases.\n" #ENDIF #IF TailleCodeEmulateurApresSH_BUF > $7A .echo "TailleCodeEmulateurApresSH_BUF est trop grand!!\n" .echo "Enlevez " .echo TailleCodeEmulateurApresSH_BUF - $7A .echo " octets!\n" #ELSE .echo TailleCodeEmulateurApresSH_BUF .echo " octets de SNG seront ecrases.\n" #ENDIF .echo $9000-CODEACE-TailleCodeEmulateur .echo " octets restant avant SH_BUF.\n" .END