Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

585 wiersze
11KB

  1. ; E05-S01: free-list heap fixture in x128.
  2. ;
  3. ; Runs under CR=$0E with the heap at $4000-$4FFF (16 pages). All code and BSS
  4. ; stay below $4000. The fixture checks the allocator and records one flag per
  5. ; phase in MB_DATA; the final exhaustion check invokes the stable R005 fault
  6. ; path, so the mailbox intentionally ends FAIL with code 5.
  7. ;
  8. ; Expected screen:
  9. ; NOVA128 HEAP TEST
  10. ; HEAP OK
  11. ; RUNTIME FAULT R005
  12. .setcpu "6502"
  13. .include "../../src/common/c128.inc"
  14. .include "../../src/common/mailbox.inc"
  15. .include "../../src/common/print.inc"
  16. .include "../../src/common/faults.inc"
  17. .include "../../src/common/heap.inc"
  18. .import pr_char, pr_cr, pr_text
  19. .import flt_report
  20. .import heap_init, heap_alloc, heap_free
  21. .import heap_base, heap_end, heap_free_head, heap_free_total, heap_error
  22. HEAP_TEST_BASE = $4000
  23. HEAP_TEST_END = $5000
  24. HEAP_TEST_PAGES = 16
  25. HEAP_TEST_SIZE = $1000
  26. .macro TEXT src, len
  27. lda #<src
  28. ldx #>src
  29. ldy #len
  30. jsr pr_text
  31. .endmacro
  32. .macro PHASE number
  33. lda #number
  34. sta MB_CODE
  35. lda #$00
  36. sta MB_CODE+1
  37. .endmacro
  38. .macro FAIL_CS
  39. bcc :+
  40. jmp @fail
  41. :
  42. .endmacro
  43. .macro FAIL_CC
  44. bcs :+
  45. jmp @fail
  46. :
  47. .endmacro
  48. .macro FAIL_NE
  49. beq :+
  50. jmp @fail
  51. :
  52. .endmacro
  53. .macro FAIL_EQ
  54. bne :+
  55. jmp @fail
  56. :
  57. .endmacro
  58. .segment "LOADADDR"
  59. .word $1C01
  60. .segment "EXEHDR"
  61. .word basic_end
  62. .word 10
  63. .byte $9E
  64. .byte "7181"
  65. .byte $00
  66. basic_end:
  67. .word $0000
  68. .segment "MAILBOX"
  69. .res MB_SIZE
  70. .segment "ZEROPAGE"
  71. tptr: .res 2
  72. .segment "STARTUP"
  73. .export test_entry, test_end
  74. test_entry:
  75. php
  76. sei
  77. ldx #MB_SIZE - 1
  78. lda #$00
  79. @clr: sta MB_BASE,x
  80. dex
  81. bpl @clr
  82. lda #MB_MAGIC0_VALUE
  83. sta MB_MAGIC0
  84. lda #MB_MAGIC1_VALUE
  85. sta MB_MAGIC1
  86. lda #MB_PROD_PROGRAM
  87. sta MB_PRODUCER
  88. lda #MB_ST_RUNNING
  89. sta MB_STATUS
  90. lda MMU_CR
  91. sta saved_cr
  92. lda #CR_RAM0_KERNAL
  93. sta MMU_CR
  94. lda #PR_CLEAR
  95. jsr pr_char
  96. TEXT title, 17
  97. jsr pr_cr
  98. ; ------------------------------------------------------------- init
  99. PHASE 1
  100. lda #$00
  101. ldx #>HEAP_TEST_BASE
  102. ldy #HEAP_TEST_PAGES
  103. jsr heap_init
  104. FAIL_CS
  105. lda heap_free_total
  106. cmp #$00
  107. FAIL_NE
  108. lda heap_free_total+1
  109. cmp #$10
  110. FAIL_NE
  111. lda heap_free_head
  112. cmp #$00
  113. FAIL_NE
  114. lda heap_free_head+1
  115. cmp #$40
  116. FAIL_NE
  117. lda HEAP_TEST_BASE
  118. cmp #$00
  119. FAIL_NE
  120. lda HEAP_TEST_BASE+1
  121. cmp #$10
  122. FAIL_NE
  123. lda HEAP_TEST_BASE+2
  124. ora HEAP_TEST_BASE+3
  125. FAIL_NE
  126. lda #$01
  127. sta MB_DATA+0
  128. ; ------------------------------------------- one allocation and free
  129. PHASE 2
  130. lda #32
  131. ldx #0
  132. jsr heap_alloc
  133. FAIL_CS
  134. cmp #$04
  135. FAIL_NE
  136. cpx #$40
  137. FAIL_NE
  138. lda heap_free_total
  139. cmp #$DC
  140. FAIL_NE
  141. lda heap_free_total+1
  142. cmp #$0F
  143. FAIL_NE
  144. lda HEAP_TEST_BASE
  145. cmp #$24
  146. FAIL_NE
  147. lda HEAP_TEST_BASE+1
  148. cmp #$80
  149. FAIL_NE
  150. lda HEAP_TEST_BASE+2
  151. cmp #$5A
  152. FAIL_NE
  153. lda HEAP_TEST_BASE+3
  154. cmp #$A5
  155. FAIL_NE
  156. ldy #0
  157. @zero: lda HEAP_TEST_BASE+4,y
  158. FAIL_NE
  159. iny
  160. cpy #32
  161. bne @zero
  162. lda #$A5
  163. ldy #0
  164. @fill: sta HEAP_TEST_BASE+4,y
  165. iny
  166. cpy #32
  167. bne @fill
  168. lda #$04
  169. ldx #$40
  170. jsr heap_free
  171. FAIL_CS
  172. lda heap_free_total
  173. cmp #$00
  174. FAIL_NE
  175. lda heap_free_total+1
  176. cmp #$10
  177. FAIL_NE
  178. lda HEAP_TEST_BASE
  179. cmp #$00
  180. FAIL_NE
  181. lda HEAP_TEST_BASE+1
  182. cmp #$10
  183. FAIL_NE
  184. lda HEAP_TEST_BASE+2
  185. ora HEAP_TEST_BASE+3
  186. FAIL_NE
  187. lda #$01
  188. sta MB_DATA+1
  189. ; ------------------------------------------ split and coalesce twice
  190. PHASE 3
  191. lda #16
  192. ldx #0
  193. jsr heap_alloc
  194. FAIL_CS
  195. cmp #$04
  196. FAIL_NE
  197. cpx #$40
  198. FAIL_NE
  199. lda heap_free_total
  200. cmp #$EC
  201. FAIL_NE
  202. lda heap_free_total+1
  203. cmp #$0F
  204. FAIL_NE
  205. lda HEAP_TEST_BASE
  206. cmp #$14
  207. FAIL_NE
  208. lda HEAP_TEST_BASE+1
  209. cmp #$80
  210. FAIL_NE
  211. lda HEAP_TEST_BASE+$14
  212. cmp #$EC
  213. FAIL_NE
  214. lda HEAP_TEST_BASE+$15
  215. cmp #$0F
  216. FAIL_NE
  217. lda #16
  218. ldx #0
  219. jsr heap_alloc
  220. FAIL_CS
  221. cmp #$18
  222. FAIL_NE
  223. cpx #$40
  224. FAIL_NE
  225. lda heap_free_total
  226. cmp #$D8
  227. FAIL_NE
  228. lda heap_free_total+1
  229. cmp #$0F
  230. FAIL_NE
  231. lda HEAP_TEST_BASE+$28
  232. cmp #$D8
  233. FAIL_NE
  234. lda HEAP_TEST_BASE+$29
  235. cmp #$0F
  236. FAIL_NE
  237. lda #$04
  238. ldx #$40
  239. jsr heap_free
  240. FAIL_CS
  241. lda #$18
  242. ldx #$40
  243. jsr heap_free
  244. FAIL_CS
  245. lda heap_free_total
  246. cmp #$00
  247. FAIL_NE
  248. lda heap_free_total+1
  249. cmp #$10
  250. FAIL_NE
  251. lda HEAP_TEST_BASE
  252. cmp #$00
  253. FAIL_NE
  254. lda HEAP_TEST_BASE+1
  255. cmp #$10
  256. FAIL_NE
  257. lda HEAP_TEST_BASE+2
  258. ora HEAP_TEST_BASE+3
  259. FAIL_NE
  260. lda #$01
  261. sta MB_DATA+2
  262. ; ---------------------------------------------------- stress pass
  263. PHASE 4
  264. lda #0
  265. sta stress_i
  266. @alloc:
  267. lda #64
  268. ldx #0
  269. jsr heap_alloc
  270. FAIL_CS
  271. sta tptr
  272. stx tptr+1
  273. ldx stress_i
  274. lda tptr
  275. sta ptrs,x
  276. lda tptr+1
  277. sta ptrs+1,x
  278. ldy #0
  279. lda tptr
  280. sta (tptr),y
  281. ldy #63
  282. lda #$A5
  283. sta (tptr),y
  284. lda stress_i
  285. clc
  286. adc #2
  287. sta stress_i
  288. cmp #32
  289. bne @alloc
  290. lda #0
  291. sta stress_i
  292. @verify:
  293. ldx stress_i
  294. lda ptrs,x
  295. sta tptr
  296. lda ptrs+1,x
  297. sta tptr+1
  298. ldy #0
  299. lda (tptr),y
  300. cmp tptr
  301. FAIL_NE
  302. ldy #63
  303. lda (tptr),y
  304. cmp #$A5
  305. FAIL_NE
  306. lda stress_i
  307. clc
  308. adc #2
  309. sta stress_i
  310. cmp #32
  311. bne @verify
  312. lda #0
  313. sta stress_i
  314. @free_even:
  315. ldx stress_i
  316. lda ptrs,x
  317. sta tptr
  318. lda ptrs+1,x
  319. sta tptr+1
  320. lda tptr
  321. ldx tptr+1
  322. jsr heap_free
  323. FAIL_CS
  324. lda stress_i
  325. clc
  326. adc #4
  327. sta stress_i
  328. cmp #32
  329. bne @free_even
  330. lda #30
  331. sta stress_i
  332. @free_odd:
  333. ldx stress_i
  334. lda ptrs,x
  335. sta tptr
  336. lda ptrs+1,x
  337. sta tptr+1
  338. lda tptr
  339. ldx tptr+1
  340. jsr heap_free
  341. FAIL_CS
  342. lda stress_i
  343. sec
  344. sbc #4
  345. sta stress_i
  346. bcs @free_odd
  347. lda heap_free_total
  348. cmp #$00
  349. FAIL_NE
  350. lda heap_free_total+1
  351. cmp #$10
  352. FAIL_NE
  353. lda HEAP_TEST_BASE
  354. cmp #$00
  355. FAIL_NE
  356. lda HEAP_TEST_BASE+1
  357. cmp #$10
  358. FAIL_NE
  359. lda #$01
  360. sta MB_DATA+3
  361. ; --------------------------------------------------- double free
  362. PHASE 5
  363. lda #16
  364. ldx #0
  365. jsr heap_alloc
  366. FAIL_CS
  367. lda #$04
  368. ldx #$40
  369. jsr heap_free
  370. FAIL_CS
  371. lda #$04
  372. ldx #$40
  373. jsr heap_free
  374. FAIL_CC
  375. lda heap_error
  376. cmp #HEAP_ERR_DOUBLE
  377. FAIL_NE
  378. lda heap_free_total
  379. cmp #$00
  380. FAIL_NE
  381. lda heap_free_total+1
  382. cmp #$10
  383. FAIL_NE
  384. lda #$01
  385. sta MB_DATA+4
  386. ; ------------------------------------------------ corrupt header
  387. PHASE 6
  388. lda #16
  389. ldx #0
  390. jsr heap_alloc
  391. FAIL_CS
  392. lda #$00
  393. sta HEAP_TEST_BASE+2
  394. sta HEAP_TEST_BASE+3
  395. lda #$04
  396. ldx #$40
  397. jsr heap_free
  398. FAIL_CC
  399. lda heap_error
  400. cmp #HEAP_ERR_CORRUPT
  401. FAIL_NE
  402. lda heap_free_total
  403. cmp #$EC
  404. FAIL_NE
  405. lda heap_free_total+1
  406. cmp #$0F
  407. FAIL_NE
  408. lda #$5A
  409. sta HEAP_TEST_BASE+2
  410. lda #$A5
  411. sta HEAP_TEST_BASE+3
  412. lda #$04
  413. ldx #$40
  414. jsr heap_free
  415. FAIL_CS
  416. lda heap_free_total
  417. cmp #$00
  418. FAIL_NE
  419. lda heap_free_total+1
  420. cmp #$10
  421. FAIL_NE
  422. lda #$01
  423. sta MB_DATA+5
  424. ; ---------------------------------------- exhaustion and integrity
  425. PHASE 7
  426. lda #0
  427. sta stress_i
  428. @ex_alloc:
  429. lda #128
  430. ldx #0
  431. jsr heap_alloc
  432. FAIL_CS
  433. sta tptr
  434. stx tptr+1
  435. ldx stress_i
  436. lda tptr
  437. sta ptrs,x
  438. lda tptr+1
  439. sta ptrs+1,x
  440. ldy #0
  441. lda #$C3
  442. sta (tptr),y
  443. ldy #127
  444. lda #$A5
  445. sta (tptr),y
  446. lda stress_i
  447. clc
  448. adc #2
  449. sta stress_i
  450. cmp #6
  451. bne @ex_alloc
  452. lda heap_free_total
  453. cmp #$74
  454. FAIL_NE
  455. lda heap_free_total+1
  456. cmp #$0E
  457. FAIL_NE
  458. lda #$00
  459. ldx #$10
  460. jsr heap_alloc
  461. FAIL_CC
  462. lda heap_error
  463. cmp #HEAP_ERR_OOM
  464. FAIL_NE
  465. lda heap_free_total
  466. cmp #$74
  467. FAIL_NE
  468. lda heap_free_total+1
  469. cmp #$0E
  470. FAIL_NE
  471. lda #0
  472. sta stress_i
  473. @ex_verify:
  474. ldx stress_i
  475. lda ptrs,x
  476. sta tptr
  477. lda ptrs+1,x
  478. sta tptr+1
  479. ldy #0
  480. lda (tptr),y
  481. cmp #$C3
  482. FAIL_NE
  483. ldy #127
  484. lda (tptr),y
  485. cmp #$A5
  486. FAIL_NE
  487. lda stress_i
  488. clc
  489. adc #2
  490. sta stress_i
  491. cmp #6
  492. bne @ex_verify
  493. lda #0
  494. sta stress_i
  495. @ex_free:
  496. ldx stress_i
  497. lda ptrs,x
  498. sta tptr
  499. lda ptrs+1,x
  500. sta tptr+1
  501. lda tptr
  502. ldx tptr+1
  503. jsr heap_free
  504. FAIL_CS
  505. lda stress_i
  506. clc
  507. adc #2
  508. sta stress_i
  509. cmp #6
  510. bne @ex_free
  511. lda heap_free_total
  512. cmp #$00
  513. FAIL_NE
  514. lda heap_free_total+1
  515. cmp #$10
  516. FAIL_NE
  517. lda HEAP_TEST_BASE
  518. cmp #$00
  519. FAIL_NE
  520. lda HEAP_TEST_BASE+1
  521. cmp #$10
  522. FAIL_NE
  523. lda #$01
  524. sta MB_DATA+6
  525. lda #$01
  526. sta MB_DATA+7
  527. TEXT heap_ok, 7
  528. jsr pr_cr
  529. lda #FLT_HEAP
  530. ldx #$00
  531. ldy #$40
  532. jsr flt_report
  533. jmp @done
  534. @fail:
  535. lda #MB_ST_FAIL
  536. sta MB_STATUS
  537. @done:
  538. lda saved_cr
  539. sta MMU_CR
  540. plp
  541. rts
  542. .segment "RODATA"
  543. title: .byte "NOVA128 HEAP TEST"
  544. heap_ok: .byte "HEAP OK"
  545. .segment "BSS"
  546. saved_cr: .res 1
  547. stress_i: .res 1
  548. ptrs: .res 32
  549. test_end:

Powered by TurnKey Linux.