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.

448 lignes
9.8KB

  1. ; E03-S01..E03-S03: parser 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. lda fx_index
  136. cmp #TRACE_INDEX
  137. bne @advance
  138. jsr dump_trace
  139. @advance:
  140. lda #$FD
  141. jsr emit
  142. clc
  143. lda fx_ptr
  144. adc #3
  145. sta fx_ptr
  146. bcc :+
  147. inc fx_ptr+1
  148. : inc fx_index
  149. lda fx_index
  150. cmp #FIXTURE_COUNT
  151. beq :+
  152. jmp @fixture
  153. : lda #$FE
  154. jsr emit
  155. lda #<dump ; report while the private ZP is mapped
  156. sta MB_DATA+0
  157. lda #>dump
  158. sta MB_DATA+1
  159. sec
  160. lda dump_ptr
  161. sbc #<dump
  162. sta MB_DATA+2
  163. lda dump_ptr+1
  164. sbc #>dump
  165. sta MB_DATA+3
  166. lda failures ; everything above $3FFF disappears behind
  167. ora overflow ; BASIC ROM after mmu_shutdown: report first
  168. sta MB_CODE
  169. bne @fail
  170. lda #MB_ST_PASS
  171. ldy #ok_msg - messages ; may be 0: do not branch on it
  172. jmp @report
  173. @fail: lda #MB_ST_FAIL
  174. ldy #fail_msg - messages
  175. @report:
  176. sta MB_STATUS
  177. : lda messages,y
  178. beq @end
  179. sty print_y
  180. jsr kcall_inline
  181. .word CHROUT
  182. ldy print_y
  183. iny
  184. bne :-
  185. @end: jsr mmu_shutdown
  186. plp
  187. rts
  188. .segment "CODE"
  189. ; Emit every name ID that the parser recorded as a top-level type.
  190. dump_types:
  191. lda #$01
  192. sta id
  193. @next: lda id
  194. cmp names_count
  195. beq :+
  196. bcs @done
  197. : lda #<type_kind
  198. sta mmu_ptr
  199. lda #>type_kind
  200. sta mmu_ptr+1
  201. ldy id
  202. jsr mmu_peek1
  203. beq @skip
  204. jsr emit
  205. lda #<type_line_lo
  206. sta mmu_ptr
  207. lda #>type_line_lo
  208. sta mmu_ptr+1
  209. ldy id
  210. jsr mmu_peek1
  211. jsr emit
  212. lda #<type_line_hi
  213. sta mmu_ptr
  214. lda #>type_line_hi
  215. sta mmu_ptr+1
  216. ldy id
  217. jsr mmu_peek1
  218. jsr emit
  219. lda id
  220. jsr name_get
  221. lda name_out_len
  222. jsr emit
  223. ldx #$00
  224. : cpx name_out_len
  225. beq @skip
  226. lda name_out,x
  227. stx emit_x
  228. jsr emit
  229. ldx emit_x
  230. inx
  231. bne :-
  232. @skip: inc id
  233. bne @next
  234. @done: rts
  235. ; Emit every member row with its parameter types.
  236. dump_members:
  237. lda #$00
  238. sta row
  239. @next: lda row
  240. cmp mem_count
  241. bcs @done
  242. ldy row
  243. lda #C_MEM_OWNER
  244. jsr tb_get
  245. jsr emit_name
  246. ldy row
  247. lda #C_MEM_NAME
  248. jsr tb_get
  249. jsr emit_name
  250. ldy row
  251. lda #C_MEM_FLAGS
  252. jsr tb_get
  253. jsr emit
  254. ldy row
  255. lda #C_MEM_TBASE
  256. jsr emit_type
  257. ldy row
  258. lda #C_MEM_PCOUNT
  259. jsr tb_get
  260. sta pleft
  261. jsr emit
  262. ldy row
  263. lda #C_MEM_PFIRST
  264. jsr tb_get
  265. sta prow
  266. @par: lda pleft
  267. beq @adv
  268. ldy prow
  269. lda #C_PAR_TBASE
  270. jsr emit_type
  271. inc prow
  272. dec pleft
  273. jmp @par
  274. @adv: inc row
  275. jmp @next
  276. @done: rts
  277. ; Emit $FB, the trace length, and the trace bytes.
  278. dump_trace:
  279. lda #$FB
  280. jsr emit
  281. sec
  282. lda ex_tp
  283. sbc #<trace_buf
  284. sta trace_len
  285. jsr emit
  286. lda ex_tp+1
  287. sbc #>trace_buf
  288. sta trace_len+1
  289. jsr emit
  290. lda #<trace_buf
  291. sta fx_tmp
  292. lda #>trace_buf
  293. sta fx_tmp+1
  294. @byte: lda fx_tmp
  295. cmp ex_tp
  296. bne :+
  297. lda fx_tmp+1
  298. cmp ex_tp+1
  299. beq @done
  300. : ldy #$00
  301. lda (fx_tmp),y
  302. jsr emit
  303. inc fx_tmp
  304. bne @byte
  305. inc fx_tmp+1
  306. bne @byte
  307. @done: rts
  308. ; Emit the four type columns starting at column A for row Y.
  309. emit_type:
  310. sta col
  311. sty trow
  312. jsr tb_get ; base
  313. jsr emit
  314. inc col
  315. lda col
  316. ldy trow
  317. jsr tb_get ; name ID
  318. jsr emit_name
  319. inc col
  320. lda col
  321. ldy trow
  322. jsr tb_get ; length lo
  323. jsr emit
  324. inc col
  325. lda col
  326. ldy trow
  327. jsr tb_get ; length hi
  328. jmp emit
  329. ; Emit name ID A as length + spelling; 0 emits a zero length.
  330. emit_name:
  331. cmp #$00
  332. bne :+
  333. jmp emit
  334. : jsr name_get
  335. lda name_out_len
  336. jsr emit
  337. ldx #$00
  338. @byte: cpx name_out_len
  339. beq @done
  340. lda name_out,x
  341. stx emit_x
  342. jsr emit
  343. ldx emit_x
  344. inx
  345. bne @byte
  346. @done: rts
  347. emit: ldy dump_ptr+1
  348. cpy #>(dump + DUMP_SIZE)
  349. bcc @room
  350. lda #$01
  351. sta overflow
  352. rts
  353. @room: sty emit_y
  354. ldy #$00
  355. sta (dump_ptr),y
  356. ldy emit_y
  357. inc dump_ptr
  358. bne :+
  359. inc dump_ptr+1
  360. : rts
  361. .segment "RODATA"
  362. .macro FIXTURE name
  363. .local text, done
  364. .word text
  365. .byte done - text
  366. .pushseg
  367. .segment "DATA"
  368. text: .byte name
  369. done:
  370. .popseg
  371. .endmacro
  372. fixtures:
  373. FIXTURE "MINIMAL.N8"
  374. FIXTURE "DECLS.N8"
  375. FIXTURE "ARRAYS.N8"
  376. FIXTURE "EXPRS.N8"
  377. FIXTURE "FORWARD.N8"
  378. FIXTURE "NULLS.N8"
  379. FIXTURE "STMTS.N8"
  380. FIXTURE "BADCHAR.N8"
  381. FIXTURE "BADCLASS.N8"
  382. FIXTURE "BADIFACE.N8"
  383. FIXTURE "BADMETHOD.N8"
  384. FIXTURE "DUPDECL.N8"
  385. FIXTURE "IFACEBODY.N8"
  386. FIXTURE "LINECONT.N8"
  387. FIXTURE "MISSCLASS.N8"
  388. FIXTURE "MISSEND.N8"
  389. FIXTURE "MISSIF.N8"
  390. FIXTURE "MISSMETH.N8"
  391. FIXTURE "MULTISTMT.N8"
  392. FIXTURE "ORDER.N8"
  393. FIXTURE "UNKNOWN.N8"
  394. FIXTURE "RECOVER.N8"
  395. FIXTURE "NOPROG.N8"
  396. FIXTURE "EOFCLASS.N8"
  397. FIXTURE "MEMBERS.N8"
  398. FIXTURE "LIFECYCLE.N8"
  399. FIXTURE "SCOPES.N8"
  400. FIXTURE "PRIVATE.N8"
  401. FIXTURE "PREC.N8"
  402. FIXTURE "FORMS.N8"
  403. FIXTURE "SYNTAX.N8"
  404. FIXTURE_COUNT = 31
  405. TRACE_INDEX = 28 ; PREC.N8
  406. messages:
  407. ok_msg: .byte "NOVA128 PARSER TEST OK", $0D, $00
  408. fail_msg: .byte "NOVA128 PARSER TEST FAIL", $0D, $00
  409. .segment "BSS"
  410. failures: .res 1
  411. overflow: .res 1
  412. fx_index: .res 1
  413. name_lo: .res 1
  414. name_hi: .res 1
  415. name_len: .res 1
  416. id: .res 1
  417. emit_x: .res 1
  418. emit_y: .res 1
  419. print_y: .res 1
  420. row: .res 1
  421. prow: .res 1
  422. pleft: .res 1
  423. col: .res 1
  424. trow: .res 1
  425. trace_len: .res 2
  426. trace_buf: .res 1024
  427. dump: .res DUMP_SIZE

Powered by TurnKey Linux.