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.

551 lignes
12KB

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

Powered by TurnKey Linux.