Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- TEXT
- ;
- ;
- ; mem lib THIS VERSION WORK, the return
- ;
- ;; exemple d'utilisation
- ; move.l #buffer,d0
- ; move.l #8*65536,d1 taille totale du buffer aligné sur 64k
- ; jsr getmem1
- ; lea -16*4(a0),a0
- ; nop
- ; nop
- ; nop
- ; nop
- ; illegal
- ; format de memoire
- ;toto ; le label toto est la pour verifier l'algo
- ; ds.b 65536
- ;buffer ds.l 65536*2 8*64k ; buffer sera aligné sur 64k donc un peu avant
- ;fin ; et apres un peu de memoire libre entre fin buffer et label fin
- getmem1:
- ; d0 = adresse segment 64k non aligné
- ; d1 = nombre de segment a la suite*64k
- ; retour: a0 = liste d'adresse
- ; (a0)+ = 32k buffer
- ; (a0)+ = 16k buffer
- ; (a0)+ = 8k buffer
- ; (a0)+ = 4k buffer
- ; (a0)+ = 2k
- ; (a0)+ = 1k
- ; (a0)+ = 512
- ; (a0)+ = 256
- ; (a0)+ = 128
- ; (a0)+ = 64 octet
- ;
- ; a0: 64 octet = 16 adresses
- ; metre le buffer start dans d4
- moveq.l #1,d5
- swap d5
- move.l d0,d4
- sub.l d5,d4 ; start memoire basse
- move.l d0,d3
- clr.w d3 ; debut multiple de 64k fin memoire basse
- ; d3 = start segment
- move.l d4,d7
- sub.l d3,d7 ; d7 = taille en bas
- ; d4 = start bas
- add.l d1,d3 ; d3+ 4*64k = adresse start haut
- lea ptrMem,a0
- moveq #0,d6
- move.w #$8000,d6
- .loop
- move.w d6,d1
- and.w d7,d1
- ; bit 15 a 0 ?
- tst.w d1
- beq.s .before ; was beq
- move.l d3,(a0)+
- add.l d6,d3
- bra.s .suite
- .before
- move.l d4,(a0)+
- add.l d6,d4
- .suite
- lsr #1,d6
- tst.w d6
- bne.s .loop ; ici ca s'arrete a un buffer de 1 octet il faudrai faire un meilleur test
- lea -64(a0),a0 ; et s'arreter a un plus gros buffer
- rts
- BSS
- ptrMem ds.l 16 ; dans ram apres l'appel de getmem1 adresses contenant les bloc memoire utilisable comme on veut
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement