Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

384 строки
8.4KB

  1. ; E03-S01/E03-S02: 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
  7. ; per declared top-level type: kind, line lo, line hi, spelling length,
  8. ; spelling bytes
  9. ; $FC
  10. ; per member row: owner name, member name, flags, type, parameter count,
  11. ; then each parameter's type. A name is a length and its spelling (length
  12. ; 0 = none); a type is base, name, length lo, length hi.
  13. ; $FD
  14. ; then $FE at the end. Mailbox: MB_DATA+0/1 dump address, +2/3 length.
  15. .setcpu "6502"
  16. .include "../../src/common/c128.inc"
  17. .include "../../src/common/mailbox.inc"
  18. .include "../../src/common/parser.inc"
  19. .import mmu_init, mmu_bank0, mmu_shutdown, mmu_peek1, kcall_inline
  20. .importzp mmu_ptr
  21. .import src_load
  22. .import names_init, name_get, names_count, name_out, name_out_len
  23. .import diag_init, diag_finish, diag_screen
  24. .import parse_file, type_kind, type_line_lo, type_line_hi
  25. .import tb_get, mem_count
  26. DUMP_SIZE = $2000
  27. .segment "LOADADDR"
  28. .word $1C01
  29. .segment "EXEHDR"
  30. .word basic_end
  31. .word 10
  32. .byte $9E
  33. .byte "7181"
  34. .byte $00
  35. basic_end:
  36. .word $0000
  37. .segment "MAILBOX"
  38. .res MB_SIZE
  39. .segment "ZEROPAGE"
  40. dump_ptr: .res 2
  41. fx_ptr: .res 2
  42. .segment "STARTUP"
  43. .export test_entry, dump
  44. test_entry:
  45. php
  46. sei
  47. ldx #MB_SIZE - 1
  48. lda #$00
  49. @clr: sta MB_BASE,x
  50. dex
  51. bpl @clr
  52. lda #MB_MAGIC0_VALUE
  53. sta MB_MAGIC0
  54. lda #MB_MAGIC1_VALUE
  55. sta MB_MAGIC1
  56. lda #MB_PROD_PLATFORM
  57. sta MB_PRODUCER
  58. lda #MB_ST_RUNNING
  59. sta MB_STATUS
  60. jsr mmu_init
  61. jsr mmu_bank0
  62. lda #<dump
  63. sta dump_ptr
  64. lda #>dump
  65. sta dump_ptr+1
  66. lda #<fixtures
  67. sta fx_ptr
  68. lda #>fixtures
  69. sta fx_ptr+1
  70. lda #$00
  71. sta failures
  72. sta overflow
  73. sta fx_index
  74. @fixture:
  75. lda #$FF
  76. jsr emit
  77. lda fx_index
  78. jsr emit
  79. ldy #0
  80. lda (fx_ptr),y
  81. sta name_lo
  82. iny
  83. lda (fx_ptr),y
  84. sta name_hi
  85. iny
  86. lda (fx_ptr),y
  87. sta name_len
  88. lda name_lo
  89. ldx name_hi
  90. ldy name_len
  91. jsr src_load
  92. pha
  93. jsr emit
  94. pla
  95. beq @parse
  96. inc failures
  97. lda #$00
  98. jsr emit
  99. jmp @advance
  100. @parse: jsr names_init
  101. lda name_lo
  102. ldx name_hi
  103. ldy name_len
  104. jsr diag_init
  105. lda #$00 ; ERR files are the evidence; keep it fast
  106. sta diag_screen
  107. jsr parse_file
  108. jsr diag_finish
  109. jsr emit
  110. jsr dump_types
  111. lda #$FC
  112. jsr emit
  113. jsr dump_members
  114. @advance:
  115. lda #$FD
  116. jsr emit
  117. clc
  118. lda fx_ptr
  119. adc #3
  120. sta fx_ptr
  121. bcc :+
  122. inc fx_ptr+1
  123. : inc fx_index
  124. lda fx_index
  125. cmp #FIXTURE_COUNT
  126. bne @fixture
  127. lda #$FE
  128. jsr emit
  129. lda #<dump ; report while the private ZP is mapped
  130. sta MB_DATA+0
  131. lda #>dump
  132. sta MB_DATA+1
  133. sec
  134. lda dump_ptr
  135. sbc #<dump
  136. sta MB_DATA+2
  137. lda dump_ptr+1
  138. sbc #>dump
  139. sta MB_DATA+3
  140. lda failures ; everything above $3FFF disappears behind
  141. ora overflow ; BASIC ROM after mmu_shutdown: report first
  142. sta MB_CODE
  143. bne @fail
  144. lda #MB_ST_PASS
  145. ldy #ok_msg - messages ; may be 0: do not branch on it
  146. jmp @report
  147. @fail: lda #MB_ST_FAIL
  148. ldy #fail_msg - messages
  149. @report:
  150. sta MB_STATUS
  151. : lda messages,y
  152. beq @end
  153. sty print_y
  154. jsr kcall_inline
  155. .word CHROUT
  156. ldy print_y
  157. iny
  158. bne :-
  159. @end: jsr mmu_shutdown
  160. plp
  161. rts
  162. .segment "CODE"
  163. ; Emit every name ID that the parser recorded as a top-level type.
  164. dump_types:
  165. lda #$01
  166. sta id
  167. @next: lda id
  168. cmp names_count
  169. beq :+
  170. bcs @done
  171. : lda #<type_kind
  172. sta mmu_ptr
  173. lda #>type_kind
  174. sta mmu_ptr+1
  175. ldy id
  176. jsr mmu_peek1
  177. beq @skip
  178. jsr emit
  179. lda #<type_line_lo
  180. sta mmu_ptr
  181. lda #>type_line_lo
  182. sta mmu_ptr+1
  183. ldy id
  184. jsr mmu_peek1
  185. jsr emit
  186. lda #<type_line_hi
  187. sta mmu_ptr
  188. lda #>type_line_hi
  189. sta mmu_ptr+1
  190. ldy id
  191. jsr mmu_peek1
  192. jsr emit
  193. lda id
  194. jsr name_get
  195. lda name_out_len
  196. jsr emit
  197. ldx #$00
  198. : cpx name_out_len
  199. beq @skip
  200. lda name_out,x
  201. stx emit_x
  202. jsr emit
  203. ldx emit_x
  204. inx
  205. bne :-
  206. @skip: inc id
  207. bne @next
  208. @done: rts
  209. ; Emit every member row with its parameter types.
  210. dump_members:
  211. lda #$00
  212. sta row
  213. @next: lda row
  214. cmp mem_count
  215. bcs @done
  216. ldy row
  217. lda #C_MEM_OWNER
  218. jsr tb_get
  219. jsr emit_name
  220. ldy row
  221. lda #C_MEM_NAME
  222. jsr tb_get
  223. jsr emit_name
  224. ldy row
  225. lda #C_MEM_FLAGS
  226. jsr tb_get
  227. jsr emit
  228. ldy row
  229. lda #C_MEM_TBASE
  230. jsr emit_type
  231. ldy row
  232. lda #C_MEM_PCOUNT
  233. jsr tb_get
  234. sta pleft
  235. jsr emit
  236. ldy row
  237. lda #C_MEM_PFIRST
  238. jsr tb_get
  239. sta prow
  240. @par: lda pleft
  241. beq @adv
  242. ldy prow
  243. lda #C_PAR_TBASE
  244. jsr emit_type
  245. inc prow
  246. dec pleft
  247. jmp @par
  248. @adv: inc row
  249. jmp @next
  250. @done: rts
  251. ; Emit the four type columns starting at column A for row Y.
  252. emit_type:
  253. sta col
  254. sty trow
  255. jsr tb_get ; base
  256. jsr emit
  257. inc col
  258. lda col
  259. ldy trow
  260. jsr tb_get ; name ID
  261. jsr emit_name
  262. inc col
  263. lda col
  264. ldy trow
  265. jsr tb_get ; length lo
  266. jsr emit
  267. inc col
  268. lda col
  269. ldy trow
  270. jsr tb_get ; length hi
  271. jmp emit
  272. ; Emit name ID A as length + spelling; 0 emits a zero length.
  273. emit_name:
  274. cmp #$00
  275. bne :+
  276. jmp emit
  277. : jsr name_get
  278. lda name_out_len
  279. jsr emit
  280. ldx #$00
  281. @byte: cpx name_out_len
  282. beq @done
  283. lda name_out,x
  284. stx emit_x
  285. jsr emit
  286. ldx emit_x
  287. inx
  288. bne @byte
  289. @done: rts
  290. emit: ldy dump_ptr+1
  291. cpy #>(dump + DUMP_SIZE)
  292. bcc @room
  293. lda #$01
  294. sta overflow
  295. rts
  296. @room: sty emit_y
  297. ldy #$00
  298. sta (dump_ptr),y
  299. ldy emit_y
  300. inc dump_ptr
  301. bne :+
  302. inc dump_ptr+1
  303. : rts
  304. .segment "RODATA"
  305. .macro FIXTURE name
  306. .local text, done
  307. .word text
  308. .byte done - text
  309. .pushseg
  310. .segment "DATA"
  311. text: .byte name
  312. done:
  313. .popseg
  314. .endmacro
  315. fixtures:
  316. FIXTURE "MINIMAL.N8"
  317. FIXTURE "DECLS.N8"
  318. FIXTURE "ARRAYS.N8"
  319. FIXTURE "EXPRS.N8"
  320. FIXTURE "FORWARD.N8"
  321. FIXTURE "NULLS.N8"
  322. FIXTURE "STMTS.N8"
  323. FIXTURE "BADCHAR.N8"
  324. FIXTURE "BADCLASS.N8"
  325. FIXTURE "BADIFACE.N8"
  326. FIXTURE "BADMETHOD.N8"
  327. FIXTURE "DUPDECL.N8"
  328. FIXTURE "IFACEBODY.N8"
  329. FIXTURE "LINECONT.N8"
  330. FIXTURE "MISSCLASS.N8"
  331. FIXTURE "MISSEND.N8"
  332. FIXTURE "MISSIF.N8"
  333. FIXTURE "MISSMETH.N8"
  334. FIXTURE "MULTISTMT.N8"
  335. FIXTURE "ORDER.N8"
  336. FIXTURE "UNKNOWN.N8"
  337. FIXTURE "RECOVER.N8"
  338. FIXTURE "NOPROG.N8"
  339. FIXTURE "EOFCLASS.N8"
  340. FIXTURE "MEMBERS.N8"
  341. FIXTURE "LIFECYCLE.N8"
  342. FIXTURE "SCOPES.N8"
  343. FIXTURE "PRIVATE.N8"
  344. FIXTURE_COUNT = 28
  345. messages:
  346. ok_msg: .byte "NOVA128 PARSER TEST OK", $0D, $00
  347. fail_msg: .byte "NOVA128 PARSER TEST FAIL", $0D, $00
  348. .segment "BSS"
  349. failures: .res 1
  350. overflow: .res 1
  351. fx_index: .res 1
  352. name_lo: .res 1
  353. name_hi: .res 1
  354. name_len: .res 1
  355. id: .res 1
  356. emit_x: .res 1
  357. emit_y: .res 1
  358. print_y: .res 1
  359. row: .res 1
  360. prow: .res 1
  361. pleft: .res 1
  362. col: .res 1
  363. trow: .res 1
  364. dump: .res DUMP_SIZE

Powered by TurnKey Linux.