Advertisement
glokyfull

mymem.s

Dec 18th, 2015
552
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.94 KB | None | 0 0
  1. ;
  2. ; mymem.s:
  3. ;
  4. ; gestion basique de memoire
  5. ;
  6. ; fichier provenant du repertoire 2pix
  7. ;
  8. TEXT
  9. * ifeq _FLAGMYMEM
  10. *_FLAGMYMEM set true
  11. * endc
  12. * IFND _lib_mem_on
  13. *_lib_mem_on equ 1
  14.  
  15. safemem equ 1
  16. bssmemorytl equ 630*1024 346*1024
  17.  
  18. _S_MY_MEM jmp initmemall
  19.  
  20. initmemall:
  21. ; d0 = taille maximal que l'effet demande
  22. ; retour: d0 = -1 si pas asser de memoire
  23.  
  24. ifeq safemem
  25. move.l d0,-(sp)
  26. move.w #72,-(sp)
  27. trap #1
  28. addq.l #2,sp
  29. move.l d0,ptr_mem
  30. move.l d0,basemem
  31. move.l (sp)+,d1
  32. add d1,d0
  33. move.l d0,ptr_highmem
  34. endc
  35.  
  36. ifne safemem
  37. move.l #bssmemory,d0
  38. move.l d0,ptr_mem
  39. move.l d0,basemem
  40. add.l #bssmemorytl,d0
  41. move.l d0,ptr_highmem
  42. endc
  43.  
  44. lea whatzone,a0
  45. move.l #freebloc32k,d0
  46. move.l d0,(a0)
  47. move.l d0,a0
  48.  
  49. moveq #-1,d0
  50. moveq #0,d1
  51. move.l d0,(a0)+
  52. move.l d1,(a0)+
  53.  
  54. rts
  55. setnewbasemem:
  56. move.l ptr_mem,d0
  57. move.l d0,basemem
  58. rts
  59. dezinitmem:
  60. ifeq safemem
  61. move.l basemem,a0
  62. move.l (a0),-(sp)
  63. move.w #73,-(sp)
  64. trap #1
  65. addq.l #6,sp
  66. endc
  67. rts
  68. addzoneram32256:
  69. rts
  70. ; d0 = adresse contenant 32256 octet de libre
  71.  
  72. ;??? ou whatzone? je me melange les pinceau lstadrzone,a2
  73. move.l d0,(a2)+
  74. move.l #32256,(a2)+
  75. ;move.l a2,lstadrzone
  76. moveq #-1,d1
  77. move.l d1,(a2)+
  78. clr.l (a2)+ ; taille zero au cas ou
  79.  
  80. ; il faut ajouter des truc, comment on gere whatzone
  81. rts
  82. testzonelibre:
  83. ; d0 = taille demand�
  84. ; retour = d1=adresse= ok
  85. ; d1=-1: aucune zone libre de cette tailles
  86. move.l whatzone,a2
  87. move.l (a2),d2
  88. tst.l d2
  89. bmi.s .finnomatch
  90. move.l (a2)+,a1 ; a1 = adresse
  91. move.l (a2)+,d2 ; d2=taille ram
  92. cmp.l d0,d2
  93. bmi.s .notmatch
  94. .match:
  95. ; ici, il y'a de la place
  96. move.l a1,d3 ; adresse ram
  97. move.l a1,d1
  98. add.l d0,d3 ; nouvelle adresse ram libre
  99. sub.l d0,d2 ; de taille d2-d0
  100. move.l d3,-8(a2)
  101. move.l d2,-4(a2)
  102. ; d1=adresse ram de taille d0
  103. ; mission accomplie
  104. rts
  105.  
  106.  
  107. .notmatch:
  108. ; ici il n'ya pas de place
  109. .1 move.l (a2),d3 ; adresse ?
  110. bmi.s .finnomatch
  111. move.l (a2)+,a1
  112. move.l (a2)+,d2
  113. cmp.l d0,d2
  114. bpl.s .match
  115. bra.s .1
  116. .finnomatch:
  117. moveq #-1,d1
  118. rts
  119.  
  120. _pushgetvalue:
  121. lea ptr_mem,a6
  122. move.l (a6),a0
  123. rts
  124. getMem:
  125. ; d0 = taille demandé
  126. ; retour: a0 = adresse buffer
  127. move.l a6,-(sp)
  128. move.l d1,-(sp)
  129.  
  130. lea ptr_mem,a6
  131. move.l (a6),a0
  132. move.l a0,d1
  133. add.l d0,d1
  134. move.l d1,(a6) ; ptr_mem pointera sur nouveau buffer memoire
  135.  
  136. move.l (sp)+,d1
  137. move.l (sp)+,a6
  138. rts
  139.  
  140. freeMem:
  141. ; d0 = taille a enlever
  142. move.l a6,-(sp)
  143. move.l d1,-(sp)
  144. lea ptr_mem,a6
  145. move.l (a6),d1
  146. sub.l d0,d1
  147. move.l d1,(a6)
  148. move.l (sp)+,d1
  149. move.l (sp)+,a6
  150. rts
  151.  
  152.  
  153.  
  154. convertallptr:
  155. ; a0,a2 = plusieurs adresse liste de dc.l taille qui seront remplacé par dc.l adresse buffer de taille elemnent(b w ou l)
  156. ; valeur de fin: -1
  157. ; valeur declenchement align 64k:
  158. ; =$8 000 0000 -> valeur remplacé=e rts
  159. ; suivit
  160. ; retour:
  161. ; d7 = taille total aloué
  162. ; (a5)+ = d7
  163.  
  164.  
  165. move.l ptrdernierdelaliste,a5
  166.  
  167. move.l a5,a4
  168. moveq #0,d6
  169.  
  170. moveq #0,d7
  171. move.l a0,a2
  172. .loop:
  173. move.l (a2),d0
  174. tst.l d0
  175. bmi.s .negative
  176. add.l d0,d7
  177. jsr getMem
  178.  
  179. move.l a0,(a2)+
  180. ; d0 contient toujours la taille
  181. move.l d0,(a5)+ ; a5 est une (pile? file ?) qui contient l'ensemble des valeurs
  182. addq.l #1,d6
  183. bra.s .loop
  184. .negative
  185. cmp.l #$80000000,d0
  186. beq.s .align64k
  187. * cmp.l #$80000001,d0 ; push emplacement memoire
  188. * beq.s .push
  189. bra.s .finptrbufferconvert
  190. .align64k
  191. jsr aligne64k
  192. move.l a0,(a2)+ ; adresse de buffer taille variable
  193. neg.l d2
  194. move.l d2,(a5)+
  195. sub.l d2,d7
  196. addq.l #1,d6
  197. bra.s .loop
  198. *.push
  199. * jsr pushgetvalue
  200. * move.l a0,
  201. .finptrbufferconvert
  202. ; d7 = taille total aloué
  203. ; move.l d7,(a5)+
  204. neg.l d6
  205. move.l d6,(a5)+ si par exemple = -12 : retirer 12 element lors d'un popmem
  206. move.l a5,ptrdernierdelaliste
  207. rts
  208.  
  209.  
  210. aligne64k: ; positionne l'adresse du futur buffer sur une page de 64k
  211. lea ptr_mem,a6
  212. move.l (a6),a0
  213. move.l a0,d1
  214. moveq #0,d2
  215. tst.w d1
  216. beq.s .alreadyaligned ; 2 align 64k ne bouffera pas 64k suplementaire
  217. move.l d1,d2
  218. add.l #$10000,d1
  219. clr.w d1
  220. sub.l d1,d2
  221. move.l d1,(a6)
  222. ; d2 = nombre d'octet sauté
  223. .alreadyaligned:
  224. rts
  225. tempvar dc.l 0
  226. getMemSameBase: ; idem que getMem sauf que la plage d'adresse de l'ensemble du buffer doit avoir la same base c'est a dire le mot de poid fort de chaque adresse pointant dans le buffer est le meme
  227. clr.l tempvar
  228. lea ptr_mem,a6
  229. move.l (a6),a0
  230. move.l a0,d1 ; d1 = adresse de depart
  231. move.l d1,d2
  232. add.l d0,d2 ; on ajoute la taille en octet demander du buffer
  233. subq.l #1,d2 ; -1 car par exemple 64k-200 + 200 = valeur differente
  234. swap d1
  235. swap d2
  236. cmp.w d1,d2
  237. beq.s .itsok
  238. ; cas problematique
  239.  
  240. move.l d0,-(sp)
  241. jsr aligne64k
  242. move.l d2,tempvar
  243. movem.l (sp)+,d0
  244. .itsok
  245.  
  246. jsr getMem ; d0 = taille ptr_mem pointe sur aligné 64k ou le truc classique
  247. move.l tempvar,d2 ; le kasé chéhan, d2 contient le nombre d'octet suplementaire aloué si on doit faire un aligne64k
  248. ; si d2 non nul, l'adresse du debut du buffer est du type $xxxx0000
  249. move.l a0,d3 ; d3 = adresse buffer
  250. swap d3 ; d3.W = base d3.HW = offset du premier element
  251.  
  252. ; retour: a0 = adresse buffer same base
  253. ; d2.l = extra octet utilisé
  254. ; d3.w = base utilisé
  255.  
  256. rts
  257.  
  258. *getMem:
  259. *; d0 = taille demandé
  260. *; retour: a0 = adresse buffer
  261. * move.l a6,-(sp*)
  262. * move.l d1,-(sp)
  263. *
  264. * lea ptr_mem,a6
  265. * move.l (a6),a0
  266. * move.l a0,d1
  267. * add.l d0,d1
  268. * move.l d1,(a6) ; ptr_mem pointera sur nouveau buffer memoire
  269. *
  270. * move.l (sp)+,d1
  271. * move.l (sp)+,a6
  272. * rts
  273.  
  274.  
  275. getTempMem:
  276. ; d0 = taille
  277. ; idem que getMem sauf que en haut de la memoire
  278. move.l a6,-(sp)
  279. move.l d1,-(sp)
  280. lea ptr_highmem,a6
  281. move.l (a6),d1
  282. sub.l d0,d1
  283. move.l d1,a0
  284. move.l d1,(a6)
  285. move.l (sp)+,d1
  286. move.l (sp)+,a6
  287. rts
  288.  
  289. freeTempMem:
  290. ; d0 = taille
  291. move.l a6,-(sp)
  292. move.l d1,-(sp)
  293. lea ptr_highmem,a6
  294. move.l (a6),d1
  295. add.l d0,d1
  296. move.l d1,(a6)
  297. move.l (sp)+,d1
  298. move.l (sp)+,a6
  299. rts
  300.  
  301. *preparetable:
  302. *; a1: table de depart 32767*sinus(x)
  303. *; d0: nombre d'element de la table de depart 1024 ou 1013
  304. *; d1: amplitude
  305. *; d2: modulo
  306. *; d3: lsl value
  307. *; a2: table d'arrivé
  308. *
  309. *; fait tablea2[x]=(Amp*a1(x) mod d2) lsl d3
  310. *
  311. * add d1,d1
  312. *
  313. * move.w d0,-(sp)
  314. * move.w d0,d6
  315. * subq #1,d6
  316. *.loop
  317. * move (a1)+,d4
  318. * muls d1,d4
  319. * swap d4
  320. * and d2,d4
  321. * lsl d3,d4
  322. * move d4,(a2)+
  323. * dbf d6,.loop
  324. * rts
  325.  
  326.  
  327. ***************
  328. popmem:
  329. ; a2=adresse liste ptr avec adresse buffer
  330. move.l ptrdernierdelaliste,a0
  331. move.l -(a0),d0
  332. bmi.s .xfois
  333. jsr freeMem
  334. *subq.l #4,a0
  335. move.l a0,ptrdernierdelaliste
  336. rts
  337. .xfois
  338. neg.l d0 ; repeter d0 fois:
  339. ; a0=dernier de la liste
  340. move.l d0,d1
  341. add.l d1,d1
  342. add.l d1,d1 ; *4
  343. sub.l d1,a0 ; dernierdelaliste-12element*4
  344. clr.l d3
  345. move.l d0,d4
  346. add d4,d4
  347. add d4,d4 ; *4
  348. subq #1,d0
  349. .loop:
  350. move.l (a0)+,d2 ; taille
  351. tst.l d2 ; taille negative ?
  352. bpl.s .1
  353. neg.l d2
  354. add.l d2,d3
  355. move.l #$80000000,(a2)+ ; marqueur align 64k
  356. bra.s .2
  357. .1 add.l d2,d3
  358. move.l d2,(a2)+ ; remplacer buffer par sa taille pour une utilisation ulterieur a2 = liste de ptr
  359. .2 dbf d0,.loop
  360. move.l d3,d0
  361. jsr freeMem
  362.  
  363. sub.l d4,a0
  364. subq.l #4,a0 ; ???? a voir
  365. move.l a0,ptrdernierdelaliste
  366. rts
  367. **************************
  368.  
  369. ;bloc32kgestion:
  370. ; a0 = adresse listebloc
  371. ; d0 = taille demand�
  372. ; move.l (a0)+,d1
  373. ; bmi.s .finliste
  374. ; move.l d1,a1 ; a1 = adresse memoire
  375. ; move.l (a1)+,d2 ; amount of free space
  376. ; sub.l #taille_descripteur,d2
  377. ; cmp.l d0,d2
  378. ; bpl.s .declareblochere
  379. ; add.l #taille_descripteur,d2
  380. ; add.l d2,a1 ; a1 nouveau descripteur
  381. ;
  382. ;declare_buffer: ; d0= taille demander
  383. ; ; d1 = flag type
  384. ; ; a2 = adresse pointeur variable
  385. ; rts
  386. ;
  387. ;
  388. outofmemorypanic: ds.l 1 ; adresse a aller en cas de out of memory
  389. ; typiquement fermer le programme dans de bonne condition
  390. ; choisie par le demosysteme en setant cette variable au cours du temps
  391.  
  392. DATA
  393. ptrdernierdelaliste dc.l bufferlistetaille
  394. BSS
  395. ptr_mem ds.l 1
  396. ptr_highmem ds.l 1
  397. *ptrdernierdelaliste: ds.l 1
  398.  
  399. bufferlistetaille
  400. ; ds.l 1000 400 etiquettetaille max
  401.  
  402. ; L: negatif: =-nombre de truc a enlever
  403. ; L: positif: taille memoire a suprimer
  404. whatzone ds.l 1
  405. freebloc32k:
  406. ds.l 4 ; 4 adresse max 32k
  407. ds.l 1 ; -1 a la fin de la liste
  408. ds.l 1 ; -2
  409.  
  410. basemem ds.l 1
  411. ifne safemem
  412. bssmemory ds.b bssmemorytl
  413. endc
  414.  
  415. adrfirstblocramfree ds.l 1
  416. adrfirstblocramused ds.l 1
  417.  
  418. ;organisation de la memoire:
  419. ;bloc: dc.l nextbloc ou -1 20 octet pour le descripteur
  420. ; dc.l predbloc ou -1 pas besoin en fait on stoque ou est le predbloc pendant la recherche
  421. ; dc.l flag_deplacable type zone libre ou non type boundary64k ou non type bound256octet ou non
  422. ; dc.l adresse pointeur variable associ�
  423. ; dc.l taille du bloc
  424. ; ds.b taille : le bloc en question
  425. ;
  426. ; different flag: valeur bit
  427. ; ram free ou buffer used 1
  428. ; 64k boundary 2
  429. ; 256 octet boundary 3
  430. ; deplacable ou non 4
  431. ;
  432.  
  433. premierdescripteurbuffer: ds.l 1
  434. premierdescripteurfree: ds.l 1
  435.  
  436. ;liste chain� adresse par ordre croissant
  437. rsreset
  438. nextdescriptor rs.l 1
  439. flagmem rs.w 1
  440. taille rs.l 1
  441. linkvar rs.l 1 ; variable associ�= adresse pointeur
  442.  
  443. ;flag samebasesameoffset : le buffer qui peut etre deplacer doit
  444. ;non seulement etre samebase sur l'ensemble mais doit commencer au meme
  445. ;offset pour la valeur d'indice 0 (exemple convx dans demo4k.s)
  446.  
  447.  
  448. ;parcoursdescriptorfreemem:
  449. ; ; d0= taille demand�
  450. ; move.l firstdescriptorfreemem,a0
  451. ;.loop move.l a0,preddesc
  452. ;
  453. ; move.l taille(a0),d1 ; taille de la zone libre
  454. ; cmp.l d0,d1 ; d1-d0>=0 = d1>=d0
  455. ; bge.s .itfits
  456. ; move.l nextdescriptor(a0),d1
  457. ; cmp.l #-1,d1
  458. ; beq.s .outofmemorypanic
  459. ;
  460. ; bra.s .loop
  461. ;.itfits:
  462. ; ; ici on a trouver une zone memoire valable
  463. ; ; dont le descripteur est dans a0
  464. ; ; on a d1 octet libre on va prendre d0 sur d1 octet
  465. ; ; et creer un nouveau descripteur intermediaire
  466. ; lea tlofdescriptor(a0),a2 ; a2 = adresse zone ram
  467. ; move.l nextdescriptor(a0),d2 ; adresse du descripteur suivant
  468. ;
  469. ; move.l d0,taille(a0)
  470. ;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement