Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

495 řádky
12KB

  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
  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.
  313. @p7:
  314. STEP $23
  315. CHK it_used, 10
  316. CHK it_used+1, 0
  317. CHK it_count, 3
  318. lda #$01
  319. sta MB_DATA+7
  320. @report:
  321. ; fail_mask and the messages live above $4000 (MAIN), so decide the
  322. ; status and copy the text while MAIN is still mapped: mmu_shutdown
  323. ; restores the system mapping, and only SCRATCH ($1B00) stays put.
  324. lda fail_mask
  325. sta msg_fail
  326. lda #MB_ST_FAIL
  327. ldx fail_mask
  328. bne @status
  329. lda #MB_ST_PASS
  330. @status:
  331. sta MB_STATUS
  332. lda #<ok_message
  333. sta p
  334. lda #>ok_message
  335. sta p+1
  336. lda msg_fail
  337. beq @copy
  338. lda #<fail_message
  339. sta p
  340. lda #>fail_message
  341. sta p+1
  342. @copy: ldy #$00
  343. @cp: lda (p),y
  344. sta msg_buf,y
  345. beq @copied
  346. iny
  347. bne @cp
  348. @copied:
  349. jsr mmu_shutdown
  350. ldy #$00
  351. @print: lda msg_buf,y
  352. beq @end
  353. sty msg_idx
  354. jsr CHROUT
  355. ldy msg_idx
  356. iny
  357. bne @print
  358. @end: rts
  359. @fail:
  360. lda #$01
  361. sta fail_mask
  362. jmp @report
  363. .segment "CODE"
  364. ; Method stubs the tables point at.
  365. m_alpha_a:
  366. rts
  367. m_beta_a:
  368. rts
  369. m_gamma_a:
  370. rts
  371. m_alpha_b:
  372. rts
  373. m_beta_b:
  374. rts
  375. ; X = table index -> out_table_addr/slots/data/iface.
  376. set_out_table:
  377. stx rec_i
  378. lda #<it_table_addrs
  379. sta p
  380. lda #>it_table_addrs
  381. sta p+1
  382. jsr add_2x
  383. ldy #0
  384. lda (p),y
  385. sta out_table_addr
  386. iny
  387. lda (p),y
  388. sta out_table_addr+1
  389. ldx rec_i
  390. lda it_slots,x
  391. sta out_table_slots
  392. lda #<it_offsets
  393. sta p
  394. lda #>it_offsets
  395. sta p+1
  396. jsr add_2x
  397. ldy #0
  398. lda (p),y
  399. sta q
  400. iny
  401. lda (p),y
  402. sta q+1
  403. clc
  404. lda #<it_data
  405. adc q
  406. sta out_table_data
  407. lda #>it_data
  408. adc q+1
  409. sta out_table_data+1
  410. ldx rec_i
  411. cpx #1
  412. beq @ibar
  413. lda #<name_ifoo
  414. sta out_table_iface
  415. lda #>name_ifoo
  416. sta out_table_iface+1
  417. lda #name_ifoo_len
  418. sta out_table_iface_len
  419. rts
  420. @ibar:
  421. lda #<name_ibar
  422. sta out_table_iface
  423. lda #>name_ibar
  424. sta out_table_iface+1
  425. lda #name_ibar_len
  426. sta out_table_iface_len
  427. rts
  428. ; p = p + 2 * rec_i.
  429. add_2x:
  430. lda rec_i
  431. asl a
  432. clc
  433. adc p
  434. sta p
  435. bcc :+
  436. inc p+1
  437. : rts
  438. .segment "RODATA"
  439. name_source: .byte "IFTTEST.N8"
  440. name_source_len = * - name_source
  441. name_a: .byte "A"
  442. name_a_len = * - name_a
  443. name_b: .byte "B"
  444. name_b_len = * - name_b
  445. name_ifoo: .byte "IFOO"
  446. name_ifoo_len = * - name_ifoo
  447. name_ibar: .byte "IBAR"
  448. name_ibar_len = * - name_ibar
  449. messages:
  450. ok_message: .byte "NOVA128 IFTABLE TEST OK", $0D, $00
  451. fail_message: .byte "NOVA128 IFTABLE TEST FAIL", $0D, $00
  452. .segment "SCRATCH"
  453. msg_buf: .res 32
  454. msg_fail: .res 1
  455. msg_idx: .res 1
  456. .segment "BSS"
  457. fail_mask: .res 1
  458. rec_i: .res 1
  459. test_end:

Powered by TurnKey Linux.