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.

606 wiersze
13KB

  1. ; E03-S01..E03-S04: parser and type-checker test in x128.
  2. ;
  3. ; For each fixture: src_load, names_init, diag_init (screen off), parse_file,
  4. ; diag_finish. Rejected fixtures leave NAME.ERR on the disk for the host to
  5. ; compare; accepted fixtures must leave none. The dump records:
  6. ; $FF, fixture index, src_load result, diagnostic count, lowest SP seen
  7. ; by the expression parser ($FF if it never ran)
  8. ; per declared top-level type: kind, line lo, line hi, spelling length,
  9. ; spelling bytes
  10. ; $FC
  11. ; per member row: owner name, member name, flags, type, parameter count,
  12. ; then each parameter's type. A name is a length and its spelling (length
  13. ; 0 = none); a type is base, name, length lo, length hi.
  14. ; $F9
  15. ; per interface: name, slot count (member count), then each slot's number
  16. ; and method name in source order (E03-S06)
  17. ; $FA, per class: name, instance size, field count, fields and offsets
  18. ; for the TRACE_INDEX fixture only: $FB, length lo/hi, the expression
  19. ; trace (parser.inc TR_*)
  20. ; $FD
  21. ; then $FE at the end. Mailbox: MB_DATA+0/1 dump address, +2/3 length.
  22. .setcpu "6502"
  23. .include "../../src/common/c128.inc"
  24. .include "../../src/common/mailbox.inc"
  25. .include "../../src/common/parser.inc"
  26. .import mmu_init, mmu_bank0, mmu_shutdown, mmu_peek1, kcall_inline
  27. .importzp mmu_ptr
  28. .import src_load
  29. .import names_init, name_get, names_count, name_out, name_out_len
  30. .import diag_init, diag_finish, diag_screen
  31. .import parse_file, type_kind, type_line_lo, type_line_hi
  32. .import tb_get, mem_count, ex_trace_on, ex_min_sp
  33. .importzp ex_tp
  34. DUMP_SIZE = $2000
  35. .segment "LOADADDR"
  36. .word $1C01
  37. .segment "EXEHDR"
  38. .word basic_end
  39. .word 10
  40. .byte $9E
  41. .byte "7181"
  42. .byte $00
  43. basic_end:
  44. .word $0000
  45. .segment "MAILBOX"
  46. .res MB_SIZE
  47. .segment "ZEROPAGE"
  48. dump_ptr: .res 2
  49. fx_ptr: .res 2
  50. fx_tmp: .res 2
  51. .segment "STARTUP"
  52. .export test_entry, dump
  53. test_entry:
  54. php
  55. sei
  56. ldx #MB_SIZE - 1
  57. lda #$00
  58. @clr: sta MB_BASE,x
  59. dex
  60. bpl @clr
  61. lda #MB_MAGIC0_VALUE
  62. sta MB_MAGIC0
  63. lda #MB_MAGIC1_VALUE
  64. sta MB_MAGIC1
  65. lda #MB_PROD_PLATFORM
  66. sta MB_PRODUCER
  67. lda #MB_ST_RUNNING
  68. sta MB_STATUS
  69. jsr mmu_init
  70. jsr mmu_bank0
  71. lda #<dump
  72. sta dump_ptr
  73. lda #>dump
  74. sta dump_ptr+1
  75. lda #<fixtures
  76. sta fx_ptr
  77. lda #>fixtures
  78. sta fx_ptr+1
  79. lda #$00
  80. sta failures
  81. sta overflow
  82. sta fx_index
  83. @fixture:
  84. lda #$FF
  85. jsr emit
  86. lda fx_index
  87. jsr emit
  88. ldy #0
  89. lda (fx_ptr),y
  90. sta name_lo
  91. iny
  92. lda (fx_ptr),y
  93. sta name_hi
  94. iny
  95. lda (fx_ptr),y
  96. sta name_len
  97. lda name_lo
  98. ldx name_hi
  99. ldy name_len
  100. jsr src_load
  101. pha
  102. jsr emit
  103. pla
  104. beq @parse
  105. inc failures
  106. lda #$00
  107. jsr emit
  108. lda #$FF
  109. jsr emit
  110. jmp @advance
  111. @parse: jsr names_init
  112. lda name_lo
  113. ldx name_hi
  114. ldy name_len
  115. jsr diag_init
  116. lda #$00 ; ERR files are the evidence; keep it fast
  117. sta diag_screen
  118. lda #<trace_buf
  119. sta ex_tp
  120. lda #>trace_buf
  121. sta ex_tp+1
  122. lda #$00
  123. ldx fx_index
  124. cpx #TRACE_INDEX
  125. bne :+
  126. lda #$01
  127. : sta ex_trace_on
  128. jsr parse_file
  129. lda #$00
  130. sta ex_trace_on
  131. jsr diag_finish
  132. jsr emit
  133. lda ex_min_sp
  134. jsr emit
  135. jsr dump_types
  136. lda #$FC
  137. jsr emit
  138. jsr dump_members
  139. jsr dump_ifaces
  140. jsr dump_layout
  141. lda fx_index
  142. cmp #TRACE_INDEX
  143. bne @advance
  144. jsr dump_trace
  145. @advance:
  146. lda #$FD
  147. jsr emit
  148. clc
  149. lda fx_ptr
  150. adc #3
  151. sta fx_ptr
  152. bcc :+
  153. inc fx_ptr+1
  154. : inc fx_index
  155. lda fx_index
  156. cmp #FIXTURE_COUNT
  157. beq :+
  158. jmp @fixture
  159. : lda #$FE
  160. jsr emit
  161. lda #<dump ; report while the private ZP is mapped
  162. sta MB_DATA+0
  163. lda #>dump
  164. sta MB_DATA+1
  165. sec
  166. lda dump_ptr
  167. sbc #<dump
  168. sta MB_DATA+2
  169. lda dump_ptr+1
  170. sbc #>dump
  171. sta MB_DATA+3
  172. lda failures ; everything above $3FFF disappears behind
  173. ora overflow ; BASIC ROM after mmu_shutdown: report first
  174. sta MB_CODE
  175. bne @fail
  176. lda #MB_ST_PASS
  177. ldy #ok_msg - messages ; may be 0: do not branch on it
  178. jmp @report
  179. @fail: lda #MB_ST_FAIL
  180. ldy #fail_msg - messages
  181. @report:
  182. sta MB_STATUS
  183. : lda messages,y
  184. beq @end
  185. sty print_y
  186. jsr kcall_inline
  187. .word CHROUT
  188. ldy print_y
  189. iny
  190. bne :-
  191. @end: jsr mmu_shutdown
  192. plp
  193. rts
  194. .segment "CODE"
  195. ; Emit every name ID that the parser recorded as a top-level type.
  196. dump_types:
  197. lda #$01
  198. sta id
  199. @next: lda id
  200. cmp names_count
  201. beq :+
  202. bcs @done
  203. : lda #<type_kind
  204. sta mmu_ptr
  205. lda #>type_kind
  206. sta mmu_ptr+1
  207. ldy id
  208. jsr mmu_peek1
  209. beq @skip
  210. jsr emit
  211. lda #<type_line_lo
  212. sta mmu_ptr
  213. lda #>type_line_lo
  214. sta mmu_ptr+1
  215. ldy id
  216. jsr mmu_peek1
  217. jsr emit
  218. lda #<type_line_hi
  219. sta mmu_ptr
  220. lda #>type_line_hi
  221. sta mmu_ptr+1
  222. ldy id
  223. jsr mmu_peek1
  224. jsr emit
  225. lda id
  226. jsr name_get
  227. lda name_out_len
  228. jsr emit
  229. ldx #$00
  230. : cpx name_out_len
  231. beq @skip
  232. lda name_out,x
  233. stx emit_x
  234. jsr emit
  235. ldx emit_x
  236. inx
  237. bne :-
  238. @skip: inc id
  239. bne @next
  240. @done: rts
  241. ; Emit every member row with its parameter types.
  242. dump_members:
  243. lda #$00
  244. sta row
  245. @next: lda row
  246. cmp mem_count
  247. bcs @done
  248. ldy row
  249. lda #C_MEM_OWNER
  250. jsr tb_get
  251. jsr emit_name
  252. ldy row
  253. lda #C_MEM_NAME
  254. jsr tb_get
  255. jsr emit_name
  256. ldy row
  257. lda #C_MEM_FLAGS
  258. jsr tb_get
  259. jsr emit
  260. ldy row
  261. lda #C_MEM_TBASE
  262. jsr emit_type
  263. ldy row
  264. lda #C_MEM_PCOUNT
  265. jsr tb_get
  266. sta pleft
  267. jsr emit
  268. ldy row
  269. lda #C_MEM_PFIRST
  270. jsr tb_get
  271. sta prow
  272. @par: lda pleft
  273. beq @adv
  274. ldy prow
  275. lda #C_PAR_TBASE
  276. jsr emit_type
  277. inc prow
  278. dec pleft
  279. jmp @par
  280. @adv: inc row
  281. jmp @next
  282. @done: rts
  283. ; Emit $F9, then each interface: name, member count, and each member's slot
  284. ; number and method name in declaration order.
  285. dump_ifaces:
  286. lda #$F9
  287. jsr emit
  288. lda #$01
  289. sta id
  290. @next: lda id
  291. cmp names_count
  292. bcc :+
  293. jmp @done
  294. : ldy id
  295. lda #C_TYPE_KIND
  296. jsr tb_get
  297. cmp #TYPE_INTERFACE
  298. beq :+
  299. jmp @adv
  300. : lda id
  301. jsr emit_name
  302. ldy id
  303. lda #C_TYPE_MCOUNT
  304. jsr tb_get
  305. sta lk_n
  306. jsr emit
  307. ldy id
  308. lda #C_TYPE_MFIRST
  309. jsr tb_get
  310. sta lk_row
  311. @slot: lda lk_n
  312. beq @adv
  313. ldy lk_row
  314. lda #C_MEM_SLOT
  315. jsr tb_get
  316. jsr emit
  317. ldy lk_row
  318. lda #C_MEM_NAME
  319. jsr tb_get
  320. jsr emit_name
  321. inc lk_row
  322. dec lk_n
  323. jmp @slot
  324. @adv: inc id
  325. beq @done
  326. jmp @next
  327. @done: rts
  328. ; Emit $FA, then each class: name, instance size lo/hi, field count, and
  329. ; every field's name and offset lo/hi in declaration order.
  330. dump_layout:
  331. lda #$FA
  332. jsr emit
  333. lda #$01
  334. sta id
  335. @next: lda id
  336. cmp names_count
  337. bcc :+
  338. jmp @done
  339. : ldy id
  340. lda #C_TYPE_KIND
  341. jsr tb_get
  342. cmp #TYPE_CLASS
  343. bne @not_class
  344. lda id
  345. jsr emit_name
  346. ldy id
  347. lda #C_TYPE_SIZE_LO
  348. jsr tb_get
  349. jsr emit
  350. ldy id
  351. lda #C_TYPE_SIZE_HI
  352. jsr tb_get
  353. jsr emit
  354. lda id
  355. jsr count_fields
  356. jsr emit
  357. lda #$00
  358. sta lk_row
  359. @field_loop:
  360. lda lk_row
  361. cmp mem_count
  362. bcs @fields_done
  363. ldy lk_row
  364. lda #C_MEM_OWNER
  365. jsr tb_get
  366. cmp id
  367. bne @fnext
  368. ldy lk_row
  369. lda #C_MEM_FLAGS
  370. jsr tb_get
  371. and #MF_METHOD
  372. bne @fnext
  373. ldy lk_row
  374. lda #C_MEM_NAME
  375. jsr tb_get
  376. jsr emit_name
  377. ldy lk_row
  378. lda #C_MEM_OFFSET_LO
  379. jsr tb_get
  380. jsr emit
  381. ldy lk_row
  382. lda #C_MEM_OFFSET_HI
  383. jsr tb_get
  384. jsr emit
  385. @fnext: inc lk_row
  386. jmp @field_loop
  387. @fields_done:
  388. @not_class:
  389. inc id
  390. beq @done
  391. jmp @next
  392. @done: rts
  393. ; A = class name ID; A = number of field rows it owns.
  394. count_fields:
  395. sta lk_owner
  396. lda #$00
  397. sta lk_n
  398. sta lk_row
  399. @loop: lda lk_row
  400. cmp mem_count
  401. bcs @done
  402. ldy lk_row
  403. lda #C_MEM_OWNER
  404. jsr tb_get
  405. cmp lk_owner
  406. bne @next
  407. ldy lk_row
  408. lda #C_MEM_FLAGS
  409. jsr tb_get
  410. and #MF_METHOD
  411. bne @next
  412. inc lk_n
  413. @next: inc lk_row
  414. jmp @loop
  415. @done: lda lk_n
  416. rts
  417. ; Emit $FB, the trace length, and the trace bytes.
  418. dump_trace:
  419. lda #$FB
  420. jsr emit
  421. sec ; both bytes before emit: it clears C
  422. lda ex_tp
  423. sbc #<trace_buf
  424. sta trace_len
  425. lda ex_tp+1
  426. sbc #>trace_buf
  427. sta trace_len+1
  428. lda trace_len
  429. jsr emit
  430. lda trace_len+1
  431. jsr emit
  432. lda #<trace_buf
  433. sta fx_tmp
  434. lda #>trace_buf
  435. sta fx_tmp+1
  436. @byte: lda fx_tmp
  437. cmp ex_tp
  438. bne :+
  439. lda fx_tmp+1
  440. cmp ex_tp+1
  441. beq @done
  442. : ldy #$00
  443. lda (fx_tmp),y
  444. jsr emit
  445. inc fx_tmp
  446. bne @byte
  447. inc fx_tmp+1
  448. bne @byte
  449. @done: rts
  450. ; Emit the four type columns starting at column A for row Y.
  451. emit_type:
  452. sta col
  453. sty trow
  454. jsr tb_get ; base
  455. jsr emit
  456. inc col
  457. lda col
  458. ldy trow
  459. jsr tb_get ; name ID
  460. jsr emit_name
  461. inc col
  462. lda col
  463. ldy trow
  464. jsr tb_get ; length lo
  465. jsr emit
  466. inc col
  467. lda col
  468. ldy trow
  469. jsr tb_get ; length hi
  470. jmp emit
  471. ; Emit name ID A as length + spelling; 0 emits a zero length.
  472. emit_name:
  473. cmp #$00
  474. bne :+
  475. jmp emit
  476. : jsr name_get
  477. lda name_out_len
  478. jsr emit
  479. ldx #$00
  480. @byte: cpx name_out_len
  481. beq @done
  482. lda name_out,x
  483. stx emit_x
  484. jsr emit
  485. ldx emit_x
  486. inx
  487. bne @byte
  488. @done: rts
  489. emit: ldy dump_ptr+1
  490. cpy #>(dump + DUMP_SIZE)
  491. bcc @room
  492. lda #$01
  493. sta overflow
  494. rts
  495. @room: sty emit_y
  496. ldy #$00
  497. sta (dump_ptr),y
  498. ldy emit_y
  499. inc dump_ptr
  500. bne :+
  501. inc dump_ptr+1
  502. : rts
  503. .segment "RODATA"
  504. .macro FIXTURE name
  505. .local text, done
  506. .word text
  507. .byte done - text
  508. .pushseg
  509. .segment "DATA"
  510. text: .byte name
  511. done:
  512. .popseg
  513. .endmacro
  514. fixtures:
  515. FIXTURE "MINIMAL.N8"
  516. FIXTURE "DECLS.N8"
  517. FIXTURE "ARRAYS.N8"
  518. FIXTURE "EXPRS.N8"
  519. FIXTURE "FORWARD.N8"
  520. FIXTURE "NULLS.N8"
  521. FIXTURE "STMTS.N8"
  522. FIXTURE "BADCHAR.N8"
  523. FIXTURE "BADCLASS.N8"
  524. FIXTURE "BADIFACE.N8"
  525. FIXTURE "BADMETHOD.N8"
  526. FIXTURE "DUPDECL.N8"
  527. FIXTURE "IFACEBODY.N8"
  528. FIXTURE "LINECONT.N8"
  529. FIXTURE "MISSCLASS.N8"
  530. FIXTURE "MISSEND.N8"
  531. FIXTURE "MISSIF.N8"
  532. FIXTURE "MISSMETH.N8"
  533. FIXTURE "MULTISTMT.N8"
  534. FIXTURE "ORDER.N8"
  535. FIXTURE "UNKNOWN.N8"
  536. FIXTURE "RECOVER.N8"
  537. FIXTURE "NOPROG.N8"
  538. FIXTURE "EOFCLASS.N8"
  539. FIXTURE "MEMBERS.N8"
  540. FIXTURE "LIFECYCLE.N8"
  541. FIXTURE "SCOPES.N8"
  542. FIXTURE "PRIVATE.N8"
  543. FIXTURE "PREC.N8"
  544. FIXTURE "FORMS.N8"
  545. FIXTURE "SYNTAX.N8"
  546. FIXTURE "TYPESOK.N8"
  547. FIXTURE "CONVERT.N8"
  548. FIXTURE "REFS.N8"
  549. FIXTURE "OPS.N8"
  550. FIXTURE "USES.N8"
  551. FIXTURE "CALLS.N8"
  552. FIXTURE "LAYOUT.N8"
  553. FIXTURE "TOOBIG.N8"
  554. FIXTURE "INTERFACES.N8"
  555. FIXTURE "IFACEBAD.N8"
  556. FIXTURE_COUNT = 41
  557. TRACE_INDEX = 28 ; PREC.N8
  558. messages:
  559. ok_msg: .byte "NOVA128 PARSER TEST OK", $0D, $00
  560. fail_msg: .byte "NOVA128 PARSER TEST FAIL", $0D, $00
  561. .segment "BSS"
  562. failures: .res 1
  563. overflow: .res 1
  564. fx_index: .res 1
  565. name_lo: .res 1
  566. name_hi: .res 1
  567. name_len: .res 1
  568. id: .res 1
  569. emit_x: .res 1
  570. emit_y: .res 1
  571. print_y: .res 1
  572. row: .res 1
  573. prow: .res 1
  574. pleft: .res 1
  575. col: .res 1
  576. trow: .res 1
  577. lk_owner: .res 1
  578. lk_row: .res 1
  579. lk_n: .res 1
  580. trace_len: .res 2
  581. trace_buf: .res 1024
  582. dump: .res DUMP_SIZE

Powered by TurnKey Linux.