Bonjour,
je cherche à faire une routine toute simple qui serait l'équivalent d'un CLOAD"" mais je n'arrive pas à trouver les adresses.
Pouvez vous me conseiller à quel emplacement mémoire je pourrais mettre mes petites routines qui prennent une quinzaine d'octets, sans qu'elles gênent trop.
Autre chose, pour la lecture des valeurs de mon joystick numérique / analogique sur le port k7 j'utilise actuellement la page 0 mais bon je me doute que ça va poser problème si on charge un jeu ou autre...
L'esp32 envoie un octet vers l'Oric contenant le positionnement du joystick et des 2 boutons. Ca fonctionne bien, c'est plus rapide que je le pensait.
quinzaine d'octets, sans qu'elles gênent trop.
entre la fin de la page hires et le debut de la rom (une zone que symoon utilise pour ses routines)
@didier_v merci je vais essayer
Pour l'adresse de la routine cload j'ai trouvé ça : $E85B mais je ne sais pas comment on précise le nom, en l'occurrence ""
https://library.defence-force.org/books/content/oric_advanced_user_guide_rom_disassembly.pdf
La routine CLOAD"" $E85B, arrive en $E87A pour chercher le programme demandé JSR $E4AC
@atmosphere, te sers tu du livre l'Oric à Nu de Fabrice Broche ?
Il est dispo en PDF à la même adresse sur defence-force.org
@gliou oui j'ai le livre justement mais j'ai du mal. Je découvre l'assembleur petit à petit alors je décrypte au fur et à mesure, je dois dire que ça reste assez obscur pour moi 🤨
En fait je ne comprends pas comment on fait pour dire à la routine qu'on veut charger un programme sans nom...
@atmosphere Hihihi. moi non plus Je suis pas un pro de l'assembleur si péchu. 🤔
Je passe la main à d'autre bien plus connaisseur. 🤯
@atmosphere, lorsque la rom lit l'en-tête du fichier elle compare le nom qu'elle trouve à celui qui est indiqué dans la commande CLOAD, si on ne précise pas de nom alors la rom charge le premier programme qu'elle trouve.
Le nom cherché est copié à partir de $027F avec une rom Atmos et à partir de $0035 pour la rom Oric-1.
Si on fait simplement un CLOAD "" alors le nom cherché est une chaîne vide, il suffit donc de mettre une valeur 0 en $02DF ou $0035 en fonction de la version de la rom.
Pour information, la routine qui fait la comparaison se trouve en $E790 pour la rom Atmos et en $E6F0 pour la rom Oric-1
@assinie c'est ce qu'il m'a semblé comprendre, seulement si je mets 0 en $027F et que je fais un call#E85B j'obtiens syntax error comme quand je tape un cload sans les guillemets, j'en conclue qu'il manque des paramètres pour que la routine se lance correctement.
@atmosphere c'est normal, #E85B est l'adresse de l'instruction CLOAD et la première chose qu'elle afit est de vérifier les paramètres via la routine en #E7B2:
CLOAD:
php ; E85B 08
jsr GetTapeParams ; E85C 20 B2 E7
lda TAPE_MODE ; E85F AD AD 02
ora TAPE_TYPE ; E862 0D AE 02
bne _LE871 ; E865 D0 0A
lda MERGEFLG ; E867 AD 5A 02
beq _LE874 ; E86A F0 08
lda VERIFYFLG ; E86C AD 5B 02
beq _LE874 ; E86F F0 03
_LE871:
jmp SYNTAX_ERROR ; E871 4C 70 D0
Si tu places les bons paramètres aux bons endroits dans ce cas l'adresse à appeler est #E874 qui est l'adresse de la routine qui fait la lecture et le chargement d'un programme depuis une K7.
C'est cette routine qui est exécutée après la vérification des paramètres:
; ----------------------------------------------------------------------------
_LE874:
jsr SetupTape ; E874 20 6A E7
jsr PrintSearching ; E877 20 7D E5
@LE87A:
jsr TapeSync ; E87A 20 AC E4
bit TAPE_TYPE ; E87D 2C AE 02
bvs @LE87A ; E880 70 F8
lda MERGEFLG ; E882 AD 5A 02
beq @LE8B3 ; E885 F0 2C
lda TAPE_TYPE ; E887 AD AE 02
bne @LE87A ; E88A D0 EE
lda VARTAB ; E88C A5 9C
ldy VARTAB+1 ; E88E A4 9D
sec ; E890 38
sbc #$02 ; E891 E9 02
bcs @LE896 ; E893 B0 01
dey ; E895 88
@LE896:
sta TAPE_START ; E896 8D A9 02
sty TAPE_START+1 ; E899 8C AA 02
sec ; E89C 38
sbc BASTXT ; E89D E5 9A
tax ; E89F AA
tya ; E8A0 98
sbc BASTXT+1 ; E8A1 E5 9B
tay ; E8A3 A8
clc ; E8A4 18
txa ; E8A5 8A
adc TAPE_END ; E8A6 6D AB 02
sta TAPE_END ; E8A9 8D AB 02
tya ; E8AC 98
adc TAPE_END+1 ; E8AD 6D AC 02
sta TAPE_END+1 ; E8B0 8D AC 02
@LE8B3:
jsr LE59B ; E8B3 20 9B E5
jsr GetTapeData ; E8B6 20 E0 E4
jsr _LE93D ; E8B9 20 3D E9
plp ; E8BC 28
lda VERIFYFLG ; E8BD AD 5B 02
beq @LE8D3 ; E8C0 F0 11
ldx ERRORCOUNT ; E8C2 AE 5C 02
lda ERRORCOUNT+1 ; E8C5 AD 5D 02
jsr PrintInt ; E8C8 20 C5 E0
lda #<(VerifyerrorsMsg) ; E8CB A9 52
ldy #>(VerifyerrorsMsg) ; E8CD A0 E5
jsr PrintString ; E8CF 20 B0 CC
rts ; E8D2 60
; ----------------------------------------------------------------------------
@LE8D3:
jsr _LE651 ; E8D3 20 51 E6
lda TAPE_TYPE ; E8D6 AD AE 02
beq @LE8E9 ; E8D9 F0 0E
lda TAPE_MODE ; E8DB AD AD 02
beq @LE8E8 ; E8DE F0 08
lda TAPE_ERR ; E8E0 AD B1 02
.if VERSION > 110
; ----------------------------------------------------------------------------
; Version 1.1b (ne tient pas compte d'éventuelles erreurs de lecture)
; ----------------------------------------------------------------------------
nop ; E8E3 EA
nop ; E8E4 EA
.else
; ----------------------------------------------------------------------------
; Version 1.1 (pas d'éxécution en cas d'erreur de lecture)
; ----------------------------------------------------------------------------
bne @LE8E8 ; E8E3 D0 03
.endif
jmp (TAPE_START) ; E8E5 6C A9 02
; ----------------------------------------------------------------------------
@LE8E8:
rts ; E8E8 60
; ----------------------------------------------------------------------------
@LE8E9:
ldx TAPE_END ; E8E9 AE AB 02
lda TAPE_END+1 ; E8EC AD AC 02
stx VARTAB ; E8EF 86 9C
sta VARTAB+1 ; E8F1 85 9D
jsr SetLineLinkPtrs ; E8F3 20 5F C5
lda TAPE_MODE ; E8F6 AD AD 02
beq @LE903 ; E8F9 F0 08
lda TAPE_ERR ; E8FB AD B1 02
.if VERSION > 110
; ----------------------------------------------------------------------------
; Version 1.1b
; ----------------------------------------------------------------------------
nop ; E8FE EA
nop ; E8FF EA
.else
; ----------------------------------------------------------------------------
; Version 1.1
; ----------------------------------------------------------------------------
bne @LE903 ; E8FE D0 03
.endif
jmp _LC708 ; E900 4C 08 C7
; ----------------------------------------------------------------------------
@LE903:
jsr _LC708 ; E903 20 08 C7
jmp BackToBASIC ; E906 4C A8 C4
ATTENTION: il faut placer une valeur sur la pile avant de faire un jmp $E874 et ne pas y aller par un jsr $E874 sinon tu vas avoir un plantage à cause du PLP qui est en #E8BC
Suivant ce que tu veux faire,et le type de fichier que tu veux charger, le plus simple est peut-être de faire directement appels aux sous-routines utilisées par CLOAD c'est à dire SetupTape, TapeSync, GetTapeData, c'est ce que font pas mal de programmes du commerce à cause de leur système de protextion contre la copie entre autre.
.
Ne pas oublier un appel à la routine en #E93D à la fin, elle remet le VIA en état, c'est le pendant de SetupTape:
; ----------------------------------------------------------------------------
; /!\ Utilisé en dehors des routines K7 (par CreateArray en $D355)
_LE93D:
jsr ClrTapeStatus ; E93D 20 F5 E5
jsr ResetVIA ; E940 20 AA F9
jmp SetupTimer ; E943 4C E0 ED
La routine en #E59B affiche le nom du fichier trouvé ou vérifié (option V de CLOAD):
LE59B:
lda VERIFYFLG ; E59B AD 5B 02
bne PrintVerifying ; E59E D0 07
PrintLoading:
lda #<(LoadingMsg) ; E5A0 A9 1A
ldy #>(LoadingMsg) ; E5A2 A0 E5
jmp LE5AB ; E5A4 4C AB E5
; ----------------------------------------------------------------------------
PrintVerifying:
lda #<(VerifyingMsg) ; E5A7 A9 43
ldy #>(VerifyingMsg) ; E5A9 A0 E5
LE5AB:
jsr ClrStatus ; E5AB 20 EA E5
lda #<(TAPE_FNAME) ; E5AE A9 93
ldy #>(TAPE_FNAME) ; E5B0 A0 02
jsr PrintMsg ; E5B2 20 B6 E5
rts ; E5B5 60
@assinie merci pour cet exposé très complet ! Ca devient pus clair 🙂
Hello rapide
Attention toutefois aux appels de certaines sous-routines K7 de la ROM 1.1: comme la structure n'est pas du tout la même dans la ROM 1.0 (beaucoup moins "modulaire"), si vous faites des appels directs à la ROM, vous ne pourrez pas faire la même chose sur Oric-1. Et là, pas de solution !
En revanche si vous prenez modèle sur la ROM 1.1 pour créer votre propre code intégralement en RAM, tout va bien, of course 😉
Bref il faut bien étudier les deux ROM si on veut une solution compatible Oric-1/Atmos.
@symoon pour l'instant certaines fonctions de mon projet sont traitées différemment pour l'Oric 1 ou pas disponibles. Pour les routines asm je me contente pour l'instant de la rom1.1
J'arrive à lire le programme mais ça plante à la fin, j'ai pourtant essayé de suivre les conseils de Assinie mais sans succès...