Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

546 lignes
13KB

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

Powered by TurnKey Linux.