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.

600 wiersze
14KB

  1. ; E06-S03: interface method table fixture in x128.
  2. ;
  3. ; The fixture fills the real parser tables (tb_set) with two interfaces and two
  4. ; classes, supplies method addresses, and runs src/compiler/iftables.s:
  5. ;
  6. ; IFOO slots: 0 ALPHA, 1 BETA IBAR slots: 0 ALPHA (same signature)
  7. ; A implements IFOO, IBAR B implements IFOO
  8. ;
  9. ; It checks:
  10. ; - one table per implemented interface, in implements order, slots in
  11. ; interface order, two bytes per slot;
  12. ; - class B emits its own distinct table;
  13. ; - A's single ALPHA method fills IFOO slot 0 and IBAR slot 0;
  14. ; - a missing address is IT_ERR_UNSET and leaves no table or watermark change;
  15. ; - a table that cannot fit the buffer is IT_ERR_SPACE, also rolled back;
  16. ; - the MAP gains one TABLE record per table with its address and slots.
  17. ;
  18. ; MB_DATA flags 0..7 report the eight phases; MB_ADDR holds the last step.
  19. .setcpu "6502"
  20. .include "../../src/common/c128.inc"
  21. .include "../../src/common/mailbox.inc"
  22. .include "../../src/common/formats.inc"
  23. .include "../../src/common/parser.inc"
  24. .include "../../src/common/iftables.inc"
  25. .include "../../src/common/ifcalls.inc"
  26. .import mmu_init, mmu_bank0, mmu_shutdown
  27. .import out_begin, out_startup, out_finish, out_abort
  28. .import out_load, out_entry, out_err, out_table_count
  29. .import out_table, out_table_iface, out_table_iface_len
  30. .import out_table_addr, out_table_slots, out_table_data
  31. .import tb_get, tb_set
  32. .import it_begin, it_set_addr, it_class, it_find
  33. .import it_error, it_count, it_used, it_data
  34. .import it_class_ids, it_iface_ids, it_table_addrs, it_slots, it_offsets
  35. .import iface_slot, is_error
  36. TABLE_BASE = $B000
  37. .macro STEP n
  38. lda #n
  39. sta MB_ADDR
  40. .endmacro
  41. .macro TBSET col, row, val
  42. lda #col
  43. ldy #row
  44. ldx #val
  45. jsr tb_set
  46. .endmacro
  47. .macro SETADDR label, row
  48. lda #<label
  49. ldx #>label
  50. ldy #row
  51. jsr it_set_addr
  52. .endmacro
  53. .macro ABORT code
  54. bcc :+
  55. lda #code
  56. sta MB_ADDR+1
  57. jmp @p6_abort
  58. :
  59. .endmacro
  60. .macro CHK addr, val
  61. lda addr
  62. cmp #val
  63. beq :+
  64. pha
  65. lda #<addr
  66. sta MB_ADDR
  67. lda #>addr
  68. sta MB_ADDR+1
  69. pla
  70. sta MB_CODE
  71. lda #$00
  72. sta MB_CODE+1
  73. jmp @fail
  74. :
  75. .endmacro
  76. .segment "LOADADDR"
  77. .word $1C01
  78. .segment "EXEHDR"
  79. .word basic_end
  80. .word 10
  81. .byte $9E
  82. .byte "7181"
  83. .byte $00
  84. basic_end:
  85. .word $0000
  86. .segment "MAILBOX"
  87. .res MB_SIZE
  88. .segment "ZEROPAGE"
  89. p: .res 2
  90. q: .res 2
  91. .segment "STARTUP"
  92. .export test_entry, test_end
  93. .export m_alpha_a, m_beta_a, m_gamma_a, m_alpha_b, m_beta_b
  94. test_entry:
  95. php
  96. sei
  97. ldx #MB_SIZE - 1
  98. lda #$00
  99. @clr: sta MB_BASE,x
  100. dex
  101. bpl @clr
  102. lda #MB_MAGIC0_VALUE
  103. sta MB_MAGIC0
  104. lda #MB_MAGIC1_VALUE
  105. sta MB_MAGIC1
  106. lda #MB_PROD_PROGRAM
  107. sta MB_PRODUCER
  108. lda #MB_ST_RUNNING
  109. sta MB_STATUS
  110. lda #$00
  111. sta MB_CODE
  112. sta MB_CODE+1
  113. sta MB_ADDR+1
  114. sta fail_mask
  115. ldx #$07
  116. lda #$00
  117. @flags: sta MB_DATA,x
  118. dex
  119. bpl @flags
  120. jsr mmu_init
  121. jsr mmu_bank0
  122. ; -------------------------------------------------- parser tables
  123. STEP $01
  124. ; IFOO (row 1), IBAR (row 2), A (row 3), B (row 4)
  125. TBSET C_TYPE_KIND, 1, TYPE_INTERFACE
  126. TBSET C_TYPE_MFIRST, 1, 0
  127. TBSET C_TYPE_MCOUNT, 1, 2
  128. TBSET C_TYPE_KIND, 2, TYPE_INTERFACE
  129. TBSET C_TYPE_MFIRST, 2, 2
  130. TBSET C_TYPE_MCOUNT, 2, 1
  131. TBSET C_TYPE_KIND, 3, TYPE_CLASS
  132. TBSET C_TYPE_MFIRST, 3, 3
  133. TBSET C_TYPE_MCOUNT, 3, 3
  134. TBSET C_TYPE_IFIRST, 3, 0
  135. TBSET C_TYPE_ICOUNT, 3, 2
  136. TBSET C_TYPE_KIND, 4, TYPE_CLASS
  137. TBSET C_TYPE_MFIRST, 4, 6
  138. TBSET C_TYPE_MCOUNT, 4, 2
  139. TBSET C_TYPE_IFIRST, 4, 2
  140. TBSET C_TYPE_ICOUNT, 4, 1
  141. ; members: 0,1 IFOO ALPHA/BETA; 2 IBAR ALPHA; 3-5 A; 6,7 B
  142. TBSET C_MEM_NAME, 0, 1
  143. TBSET C_MEM_FLAGS, 0, MF_METHOD
  144. TBSET C_MEM_SLOT, 0, 0
  145. TBSET C_MEM_NAME, 1, 2
  146. TBSET C_MEM_FLAGS, 1, MF_METHOD
  147. TBSET C_MEM_SLOT, 1, 1
  148. TBSET C_MEM_NAME, 2, 1
  149. TBSET C_MEM_FLAGS, 2, MF_METHOD
  150. TBSET C_MEM_SLOT, 2, 0
  151. TBSET C_MEM_NAME, 3, 1
  152. TBSET C_MEM_FLAGS, 3, MF_METHOD
  153. TBSET C_MEM_NAME, 4, 2
  154. TBSET C_MEM_FLAGS, 4, MF_METHOD
  155. TBSET C_MEM_NAME, 5, 3
  156. TBSET C_MEM_FLAGS, 5, MF_METHOD
  157. TBSET C_MEM_NAME, 6, 1
  158. TBSET C_MEM_FLAGS, 6, MF_METHOD
  159. TBSET C_MEM_NAME, 7, 2
  160. TBSET C_MEM_FLAGS, 7, MF_METHOD
  161. ; implements rows: A->IFOO, A->IBAR, B->IFOO
  162. TBSET C_IMPL_IFACE, 0, 1
  163. TBSET C_IMPL_IFACE, 1, 2
  164. TBSET C_IMPL_IFACE, 2, 1
  165. STEP $02
  166. lda #<TABLE_BASE
  167. ldx #>TABLE_BASE
  168. jsr it_begin
  169. SETADDR m_alpha_a, 3
  170. SETADDR m_beta_a, 4
  171. SETADDR m_gamma_a, 5
  172. SETADDR m_alpha_b, 6
  173. SETADDR m_beta_b, 7
  174. lda #3
  175. jsr it_class
  176. bcc :+
  177. jmp @fail
  178. : lda #4
  179. jsr it_class
  180. bcc :+
  181. jmp @fail
  182. :
  183. ; 0: class A's two tables are ALPHA/BETA then ALPHA.
  184. STEP $10
  185. CHK it_data+0, <m_alpha_a
  186. CHK it_data+1, >m_alpha_a
  187. CHK it_data+2, <m_beta_a
  188. CHK it_data+3, >m_beta_a
  189. CHK it_data+4, <m_alpha_a
  190. CHK it_data+5, >m_alpha_a
  191. lda #$01
  192. sta MB_DATA+0
  193. ; 1: three records with the expected classes, interfaces, addresses.
  194. STEP $11
  195. CHK it_count, 3
  196. CHK it_class_ids+0, 3
  197. CHK it_class_ids+1, 3
  198. CHK it_class_ids+2, 4
  199. CHK it_iface_ids+0, 1
  200. CHK it_iface_ids+1, 2
  201. CHK it_iface_ids+2, 1
  202. CHK it_slots+0, 2
  203. CHK it_slots+1, 1
  204. CHK it_slots+2, 2
  205. CHK it_table_addrs+0, <TABLE_BASE
  206. CHK it_table_addrs+1, >TABLE_BASE
  207. CHK it_table_addrs+2, <(TABLE_BASE + 4)
  208. CHK it_table_addrs+3, >(TABLE_BASE + 4)
  209. CHK it_table_addrs+4, <(TABLE_BASE + 6)
  210. CHK it_table_addrs+5, >(TABLE_BASE + 6)
  211. CHK it_offsets+0, 0
  212. CHK it_offsets+1, 0
  213. CHK it_offsets+2, 4
  214. CHK it_offsets+3, 0
  215. CHK it_offsets+4, 6
  216. CHK it_offsets+5, 0
  217. lda #$01
  218. sta MB_DATA+1
  219. ; 2: class B's table is distinct and uses its own methods.
  220. STEP $12
  221. CHK it_data+6, <m_alpha_b
  222. CHK it_data+7, >m_alpha_b
  223. CHK it_data+8, <m_beta_b
  224. CHK it_data+9, >m_beta_b
  225. lda #$01
  226. sta MB_DATA+2
  227. ; 3: one method populated IFOO slot 0 and IBAR slot 0.
  228. STEP $13
  229. CHK it_data+4, <m_alpha_a
  230. CHK it_data+5, >m_alpha_a
  231. lda #$01
  232. sta MB_DATA+3
  233. ; 4: a missing address refuses the class and rolls back.
  234. STEP $20
  235. lda #$00
  236. ldx #$00
  237. ldy #4
  238. jsr it_set_addr
  239. lda #3
  240. jsr it_class
  241. bcs :+
  242. jmp @fail
  243. :
  244. CHK it_error, IT_ERR_UNSET
  245. CHK it_count, 3
  246. CHK it_used, 10
  247. CHK it_used+1, 0
  248. SETADDR m_beta_a, 4
  249. lda #$01
  250. sta MB_DATA+4
  251. ; 5: a table larger than the buffer refuses the class.
  252. STEP $21
  253. TBSET C_TYPE_MCOUNT, 1, 255
  254. lda #3
  255. jsr it_class
  256. bcs :+
  257. jmp @fail
  258. :
  259. CHK it_error, IT_ERR_SPACE
  260. CHK it_count, 3
  261. CHK it_used, 10
  262. TBSET C_TYPE_MCOUNT, 1, 2
  263. lda #$01
  264. sta MB_DATA+5
  265. ; 6: the MAP gains one TABLE record per emitted table.
  266. STEP $22
  267. lda #<PRG_LOAD_ADDR
  268. sta out_load
  269. lda #>PRG_LOAD_ADDR
  270. sta out_load+1
  271. lda #<PRG_ENTRY_ADDR
  272. sta out_entry
  273. lda #>PRG_ENTRY_ADDR
  274. sta out_entry+1
  275. lda #<name_source
  276. ldx #>name_source
  277. ldy #name_source_len
  278. jsr out_begin
  279. ABORT $C1
  280. jsr out_startup
  281. ABORT $C2
  282. ldx #0
  283. jsr set_out_table
  284. lda #<name_a
  285. ldx #>name_a
  286. ldy #name_a_len
  287. jsr out_table
  288. ABORT $C3
  289. ldx #1
  290. jsr set_out_table
  291. lda #<name_a
  292. ldx #>name_a
  293. ldy #name_a_len
  294. jsr out_table
  295. ABORT $C4
  296. ldx #2
  297. jsr set_out_table
  298. lda #<name_b
  299. ldx #>name_b
  300. ldy #name_b_len
  301. jsr out_table
  302. ABORT $C5
  303. jsr out_finish
  304. ABORT $C6
  305. CHK out_table_count, 3
  306. lda #$01
  307. sta MB_DATA+6
  308. jmp @p7
  309. @p6_abort:
  310. lda out_err
  311. sta MB_ADDR
  312. jsr out_abort
  313. jmp @fail
  314. ; 7: the watermark and record count match the three tables, and
  315. ; it_find selects a table by class and interface.
  316. @p7:
  317. STEP $23
  318. CHK it_used, 10
  319. CHK it_used+1, 0
  320. CHK it_count, 3
  321. ; A implements IFOO at $B000 and IBAR at $B004.
  322. STEP $30
  323. lda #3
  324. ldx #1
  325. jsr it_find
  326. bcc :+
  327. jmp @fail
  328. : cmp #<TABLE_BASE
  329. beq :+
  330. jmp @fail
  331. : cpx #>TABLE_BASE
  332. beq :+
  333. jmp @fail
  334. :
  335. STEP $31
  336. lda #3
  337. ldx #2
  338. jsr it_find
  339. bcc :+
  340. jmp @fail
  341. : cmp #<(TABLE_BASE + 4)
  342. beq :+
  343. jmp @fail
  344. : cpx #>(TABLE_BASE + 4)
  345. beq :+
  346. jmp @fail
  347. :
  348. ; B implements IFOO at $B006, not IBAR.
  349. STEP $32
  350. lda #4
  351. ldx #1
  352. jsr it_find
  353. bcc :+
  354. jmp @fail
  355. : cmp #<(TABLE_BASE + 6)
  356. beq :+
  357. jmp @fail
  358. : cpx #>(TABLE_BASE + 6)
  359. beq :+
  360. jmp @fail
  361. :
  362. STEP $33
  363. lda #4
  364. ldx #2
  365. jsr it_find
  366. bcs :+ ; a refusal is the expected result here
  367. jmp @fail
  368. : CHK it_error, IT_ERR_IFACE
  369. CHK it_count, 3
  370. ; A call site resolves its slot from the interface declaration:
  371. ; IFOO ALPHA=0, BETA=1; IBAR ALPHA=0; IBAR GAMMA does not exist, and a
  372. ; class name is not an interface.
  373. STEP $34
  374. lda #1
  375. ldx #1
  376. jsr iface_slot
  377. bcc :+
  378. jmp @fail
  379. : cmp #0
  380. beq :+
  381. jmp @fail
  382. : CHK is_error, IS_OK
  383. STEP $35
  384. lda #1
  385. ldx #2
  386. jsr iface_slot
  387. bcc :+
  388. jmp @fail
  389. : cmp #1
  390. beq :+
  391. jmp @fail
  392. : CHK is_error, IS_OK
  393. STEP $36
  394. lda #2
  395. ldx #1
  396. jsr iface_slot
  397. bcc :+
  398. jmp @fail
  399. : cmp #0
  400. beq :+
  401. jmp @fail
  402. : CHK is_error, IS_OK
  403. STEP $37
  404. lda #2
  405. ldx #3
  406. jsr iface_slot
  407. bcs :+ ; no such method: a refusal is expected
  408. jmp @fail
  409. : CHK is_error, IS_ERR_METHOD
  410. STEP $38
  411. lda #3
  412. ldx #1
  413. jsr iface_slot
  414. bcs :+ ; a class is not an interface
  415. jmp @fail
  416. : CHK is_error, IS_ERR_METHOD
  417. lda #$01
  418. sta MB_DATA+7
  419. @report:
  420. ; fail_mask and the messages live above $4000 (MAIN), so decide the
  421. ; status and copy the text while MAIN is still mapped: mmu_shutdown
  422. ; restores the system mapping, and only SCRATCH ($1B00) stays put.
  423. lda fail_mask
  424. sta msg_fail
  425. lda #MB_ST_FAIL
  426. ldx fail_mask
  427. bne @status
  428. lda #MB_ST_PASS
  429. @status:
  430. sta MB_STATUS
  431. lda #<ok_message
  432. sta p
  433. lda #>ok_message
  434. sta p+1
  435. lda msg_fail
  436. beq @copy
  437. lda #<fail_message
  438. sta p
  439. lda #>fail_message
  440. sta p+1
  441. @copy: ldy #$00
  442. @cp: lda (p),y
  443. sta msg_buf,y
  444. beq @copied
  445. iny
  446. bne @cp
  447. @copied:
  448. jsr mmu_shutdown
  449. ldy #$00
  450. @print: lda msg_buf,y
  451. beq @end
  452. sty msg_idx
  453. jsr CHROUT
  454. ldy msg_idx
  455. iny
  456. bne @print
  457. @end: rts
  458. @fail:
  459. lda #$01
  460. sta fail_mask
  461. jmp @report
  462. .segment "CODE"
  463. ; Method stubs the tables point at.
  464. m_alpha_a:
  465. rts
  466. m_beta_a:
  467. rts
  468. m_gamma_a:
  469. rts
  470. m_alpha_b:
  471. rts
  472. m_beta_b:
  473. rts
  474. ; X = table index -> out_table_addr/slots/data/iface.
  475. set_out_table:
  476. stx rec_i
  477. lda #<it_table_addrs
  478. sta p
  479. lda #>it_table_addrs
  480. sta p+1
  481. jsr add_2x
  482. ldy #0
  483. lda (p),y
  484. sta out_table_addr
  485. iny
  486. lda (p),y
  487. sta out_table_addr+1
  488. ldx rec_i
  489. lda it_slots,x
  490. sta out_table_slots
  491. lda #<it_offsets
  492. sta p
  493. lda #>it_offsets
  494. sta p+1
  495. jsr add_2x
  496. ldy #0
  497. lda (p),y
  498. sta q
  499. iny
  500. lda (p),y
  501. sta q+1
  502. clc
  503. lda #<it_data
  504. adc q
  505. sta out_table_data
  506. lda #>it_data
  507. adc q+1
  508. sta out_table_data+1
  509. ldx rec_i
  510. cpx #1
  511. beq @ibar
  512. lda #<name_ifoo
  513. sta out_table_iface
  514. lda #>name_ifoo
  515. sta out_table_iface+1
  516. lda #name_ifoo_len
  517. sta out_table_iface_len
  518. rts
  519. @ibar:
  520. lda #<name_ibar
  521. sta out_table_iface
  522. lda #>name_ibar
  523. sta out_table_iface+1
  524. lda #name_ibar_len
  525. sta out_table_iface_len
  526. rts
  527. ; p = p + 2 * rec_i.
  528. add_2x:
  529. lda rec_i
  530. asl a
  531. clc
  532. adc p
  533. sta p
  534. bcc :+
  535. inc p+1
  536. : rts
  537. .segment "RODATA"
  538. name_source: .byte "IFTTEST.N8"
  539. name_source_len = * - name_source
  540. name_a: .byte "A"
  541. name_a_len = * - name_a
  542. name_b: .byte "B"
  543. name_b_len = * - name_b
  544. name_ifoo: .byte "IFOO"
  545. name_ifoo_len = * - name_ifoo
  546. name_ibar: .byte "IBAR"
  547. name_ibar_len = * - name_ibar
  548. messages:
  549. ok_message: .byte "NOVA128 IFTABLE TEST OK", $0D, $00
  550. fail_message: .byte "NOVA128 IFTABLE TEST FAIL", $0D, $00
  551. .segment "SCRATCH"
  552. msg_buf: .res 32
  553. msg_fail: .res 1
  554. msg_idx: .res 1
  555. .segment "BSS"
  556. fail_mask: .res 1
  557. rec_i: .res 1
  558. test_end:

Powered by TurnKey Linux.