Je viens de faire une dernière conversion et c'était beaucoup plus long que je le croyais, et un peu plus compliqué avec la reprogrammation en assembleur d'une partie du jeu qui était en Basic, les appels au moniteur mon un peu fait c***r (chanter)
J'ai du contourner 3 problèmes pour cette conversion :
- Binaire écrassant le DOS
- Programme basic gérant la partie ( lancement du jeu et recommencer une partie après être mort, ...)
- Impossible d'implanter une routine en RAM vidéo car lors des retours => possible pagination et la un beau CRASH
Dans ce contexte impossible de faire comme précédemment charger le binaire en écrasant bêtement le DOS, car lors du retour au Basic plantage assuré, de plus impossible avec le DOS de faire un CLEAR inférieur à $5000, et vu que le binaire ce charge en $3100
Donc j'ai trouvé comme seul solution de refaire le programme Basic en Assembleur pour ne faire aucun retour au Basic et éviter les plantages, et ca fonctionne très bien
Voici le code Basic original:
Code : Tout sélectionner
10 CLEAR 100,&H31FF,2:POKE &H2019,8:PRINT CHR$(20):CLS:SCREEN 3,0,0
12 LOCATE 14,12:PRINT "PATIENCE..."
15 DEFGR$(0)=12,24,60,114,126,112,60,0
16 DEFGR$(1)=24,36,60,114,126,112,60,0
20 LOADM "PAGE":ADR=&H6000:POKE ADR-6,0:POKE ADR-5,0:POKE ADR-4,40:POKE ADR-3,200:POKE ADR-2,97:POKE ADR-1,0:EXEC ADR:FOR I=1 TO 3000:NEXT:POKE ADR-2,107:EXEC ADR
50 LOADM "JAMES",-&H3000:LOADM "GRAPHIS"
60 A0=PEEK(&H2073):A1=PEEK(&H2074):POKE &H2073,&H59:POKE &H2074,&H00
100 CLS:ADR=&H3203:ATTRB 1,1:LOCATE 4,8:PRINT "1- AVEC MANETTE":LOCATE 4,12:PRINT "2- SANS MANETTE"
110 A$=INKEY$:IF A$="1" THEN POKE ADR,0 ELSE IF A$="2" THEN POKE ADR,1 ELSE 110
150 CLS:EXEC &H3200:A=PEEK(ADR)
152 IF A=0 THEN 200
155 IF A=1 THEN A$=" Gagn"+GR$(0)+"! mission accomplie. ":X=6:GOTO 160
156 IF A=2 THEN A$="Perdu! vous n'avez pas tenu vos d"+GR$(0)+"lais.":X=0:GOTO 160
157 IF A=3 THEN A$=" Perdu! vous "+GR$(1)+"tes "+GR$(0)+"puis"+GR$(0)+"... ":X=6
160 ATTRB 0,1:LOCATE X,4:PRINT A$
170 A$=INKEY$:IF A$="" THEN 170
200 CLS:ATTRB 0,1:LOCATE 2,10:PRINT "Voulez-vous une autre partie (O/N) ?"
210 A$=INKEY$:IF A$="O" OR A$="o" THEN 100 ELSE IF A$<>"N" AND A$<>"n" THEN 210
220 ATTRB 0,0:POKE &H2073,A0:POKE &H2074,A1:CLS:NEW
On voit bien qu'il y a un retour au Basic à chaque mort et aussi pour choisir clavier ou manettes
Pourquoi n'ont ils pas inclus cette partie dans le code ASM
Bon j'ai opté pour un loader du binaire en RAM vidéo et la gestion du jeu en $3010 avec la PILE en $3000
En faite je charge le binaire avec le loader et après je copie en $3010 le code gérant la partie
j'aurais aussi pu faire plus simple sauvegarder mon binaire en intégrant ce code, mais c'est moins marrant à faire
Voici le LOADER en VRAM:
Code : Tout sélectionner
; 6502man
; (c) 2015
;
; LECTURE ET ECRITURE D'UN BINAIRE
; DANS DES SECTEURS D'UN DISK
;-------------------
;FDD
;-------------------
REGISTER EQU $2048
EXECUTE EQU $26
DRIVE EQU $2049
PISTE EQU $204A ;( 16 bits)
SECTEUR EQU $204C
BUFFER EQU $204F ;(16 bits)
STATE EQU $204E
INIT EQU $01
READ EQU $02
WRITE EQU $08
; PROG
DEBUT EQU $3100
FIN EQU $A0FF
EXEC EQU $3200
PILE EQU $3000
ORG $1EE0
LDS #PILE
LDX #DEBUT
LDY #30
PISTEADD
LDB #$01
READSECTOR
STX BUFFER
STY PISTE
STB SECTEUR
LDA #$00
STA DRIVE
LDA #READ
STA REGISTER
PSHS X,B
SWI
FCB $26
PULS B,X
TBA
LDB #$FF
ABX
INX
CPX #FIN
BHS DUMPGO
TAB
INCB
CMPB #17
BNE READSECTOR
INY
CPY #$99
BNE PISTEADD
DUMPGO
LDB #FINDUMP-GO
LDX #$3010
LDY #GO
BOUCLEDUMP
LDA 0,Y+
STA 0,X+
DECB
BNE BOUCLEDUMP
JMP $3010
GO
FCB $BD,$30,$64,$7E,$30,$39,$BD,$32,$00,$B6,$32,$03,$81,$01,$27,$09
FCB $8E,$30,$85,$BD,$30,$59,$7E,$30,$2F,$8E,$30,$69,$BD,$30,$59,$8E
FCB $30,$8E,$BD,$30,$59,$3F,$0C,$27,$FC,$8E,$30,$AA,$BD,$30,$59,$3F
FCB $0A,$C1,$31,$27,$06,$C1,$32,$27,$09,$20,$F4,$86,$00,$B7,$32,$03
FCB $20,$C4,$86,$01,$B7,$32,$03,$20,$BD,$E6,$84,$27,$06,$3F,$02,$30
FCB $01,$20,$F6,$39,$C6,$0C,$3F,$02,$39,$0C,$0A,$0A,$47,$41,$47,$4E
FCB $45,$21,$20,$4D,$49,$53,$53,$49,$4F,$4E,$20,$41,$43,$43,$4F,$4D
FCB $50,$4C,$49,$45,$00,$0C,$0A,$0A,$50,$45,$52,$44,$55,$00,$0A,$0D
FCB $0A,$56,$41,$4C,$49,$44,$45,$52,$20,$50,$4F,$55,$52,$20,$52,$45
FCB $43,$4F,$4D,$4D,$45,$4E,$43,$45,$52,$00,$0A,$0A,$0A,$0D,$31,$3D
FCB $4D,$41,$4E,$45,$54,$54,$45,$20,$20,$32,$3D,$43,$4C,$41,$56,$49
FCB $45,$52,$00
FINDUMP
Pour les curieux voici le code gérant la partie (remplacement du code Basic):
Code : Tout sélectionner
ORG $3010
JSR CLS
JMP CHOIXMANCLA
GO
JSR EXEC
LDA $3203
CMPA #01
BEQ AFFICHEGAGNE
LDX #PERDU
JSR AFFICHE
JMP AFFICHERECOM
AFFICHEGAGNE
LDX #GAGNE
JSR AFFICHE
AFFICHERECOM
LDX #RECOMMENCE
JSR AFFICHE
TOUCHE
SWI
FCB $0C
BEQ TOUCHE
CHOIXMANCLA
LDX #MANETTE
JSR AFFICHE
TOUCHEM
SWI
FCB $0A
CMPB #$31
BEQ SELMAN
CMPB #$32
BEQ SELCLA
BRA TOUCHEM
SELMAN
LDA #00
STA $3203
BRA GO
SELCLA
LDA #01
STA $3203
BRA GO
AFFICHE
LDB 0,X
BEQ FINAFFICHE
SWI
FCB $02
INX
BRA AFFICHE
FINAFFICHE
RTS
CLS
LDB #12 ; CLS
SWI
FCB $02
RTS
GAGNE
FCB 12,10,10
FCB "GAGNE! MISSION ACCOMPLIE"
FCB 0
PERDU
FCB 12,10,10
FCB "PERDU"
FCB 0
RECOMMENCE
FCB 10,13,10
FCB "VALIDER POUR RECOMMENCER"
FCB 0
MANETTE
FCB 10,10,10,13
FCB "1=MANETTE 2=CLAVIER"
;FCB 27,64,31,64
FCB 0
Voila je me suis encore bien amusé et merci de m'avoir lu
J'ai était agréablement surpris par les animations du personnage, malheureusement les déplacements sont très lents
Les décors sont très beau je trouve pour la machine, et très coloré
A l'époque ca à du marquer les joueurs Thomson
Bon cette fois je retourne à mes autres projets, je laisse ce post un peu aux autres