it regularly difficult to spot, aside from maybe by a genuine Rolex replica history specialist, in light of the fact that the best phony Rolex are 95% made by Rolex. If you want to know how often you should optimally be winding your rolex replica watch, Click Here.

Notifications
Retirer tout

Adresse routine CLOAD

15 Posts
5 Utilisateurs
3 Reactions
324 Vu
Atmosphere
(@atmosphere)
Trusted Member
Inscription: Il y a 7 mois
Posts: 56
Début du sujet  

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.



   
Citation
didier_v
(@didier_v)
Membre Admin
Inscription: Il y a 6 ans
Posts: 561
 

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)



   
RépondreCitation
Atmosphere
(@atmosphere)
Trusted Member
Inscription: Il y a 7 mois
Posts: 56
Début du sujet  

@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 ""


Ce message a été modifié Il y a 1 mois parAtmosphere

   
RépondreCitation
Gliou
(@gliou)
Eminent Member Adhérent
Inscription: Il y a 4 ans
Posts: 35
 

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



   
RépondreCitation
Atmosphere
(@atmosphere)
Trusted Member
Inscription: Il y a 7 mois
Posts: 56
Début du sujet  

@gliou Super, merci !



   
RépondreCitation
Gliou
(@gliou)
Eminent Member Adhérent
Inscription: Il y a 4 ans
Posts: 35
 

@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



   
RépondreCitation
Atmosphere
(@atmosphere)
Trusted Member
Inscription: Il y a 7 mois
Posts: 56
Début du sujet  

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



   
RépondreCitation
Gliou
(@gliou)
Eminent Member Adhérent
Inscription: Il y a 4 ans
Posts: 35
 

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



   
RépondreCitation
assinie
(@assinie)
Membre
Inscription: Il y a 6 ans
Posts: 71
 

@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



   
Dany reacted
RépondreCitation
Atmosphere
(@atmosphere)
Trusted Member
Inscription: Il y a 7 mois
Posts: 56
Début du sujet  

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



   
RépondreCitation
assinie
(@assinie)
Membre
Inscription: Il y a 6 ans
Posts: 71
 

@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



   
Dany reacted
RépondreCitation
Atmosphere
(@atmosphere)
Trusted Member
Inscription: Il y a 7 mois
Posts: 56
Début du sujet  

@assinie merci pour cet exposé très complet ! Ca devient pus clair 🙂



   
RépondreCitation
Symoon
(@symoon)
Reputable Member Adhérent
Inscription: Il y a 6 ans
Posts: 219
 

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.


Ce message a été modifié Il y a 1 mois parSymoon

   
RépondreCitation
Atmosphere
(@atmosphere)
Trusted Member
Inscription: Il y a 7 mois
Posts: 56
Début du sujet  

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



   
RépondreCitation
Atmosphere
(@atmosphere)
Trusted Member
Inscription: Il y a 7 mois
Posts: 56
Début du sujet  

@assinie ça marche merci !! j'avais briolé un truc faux dans mon code, maintenant c'est top, je vais pouvoir continuer 😉



   
Dany reacted
RépondreCitation
Share: