No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

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

Powered by TurnKey Linux.