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...