選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

287 行
6.1KB

  1. ; E02-S02: lexer token-dump test in x128.
  2. ;
  3. ; For each fixture: src_load, then lex_next until TOK_EOF, appending every
  4. ; token to `dump`. The host decodes the dump to text and compares it with the
  5. ; golden files in tests/lexer/golden/.
  6. ;
  7. ; Dump format:
  8. ; fixture: $FF, fixture index, src_load result
  9. ; token: kind, line lo, line hi, col, then by kind:
  10. ; EOL, EOF nothing
  11. ; ERROR error code
  12. ; IDENT, STRING raw length, text length, text bytes
  13. ; NUMBER raw length, value lo, value hi
  14. ; CHAR raw length, value
  15. ; other raw length
  16. ; end: $FE
  17. ; Mailbox: PASS if every fixture loaded and the dump did not overflow.
  18. ; MB_DATA+0/1 dump address, +2/3 dump length, +4 fixture count.
  19. .setcpu "6502"
  20. .include "../../src/common/c128.inc"
  21. .include "../../src/common/mailbox.inc"
  22. .include "../../src/common/tokens.inc"
  23. .import mmu_init, mmu_bank0, mmu_shutdown
  24. .import src_load
  25. .import lex_reset, lex_next
  26. .import tok_kind, tok_line, tok_col, tok_len, tok_value, tok_text, tok_text_len, tok_err
  27. DUMP_SIZE = $4000
  28. MAX_TOKENS_PER_FIXTURE = 3000
  29. .segment "LOADADDR"
  30. .word $1C01
  31. .segment "EXEHDR"
  32. .word basic_end
  33. .word 10
  34. .byte $9E
  35. .byte "7181"
  36. .byte $00
  37. basic_end:
  38. .word $0000
  39. .segment "MAILBOX"
  40. .res MB_SIZE
  41. .segment "ZEROPAGE"
  42. dump_ptr: .res 2
  43. fx_ptr: .res 2
  44. .segment "STARTUP"
  45. .export test_entry, dump
  46. test_entry:
  47. php
  48. sei
  49. ldx #MB_SIZE - 1
  50. lda #$00
  51. @clr: sta MB_BASE,x
  52. dex
  53. bpl @clr
  54. lda #MB_MAGIC0_VALUE
  55. sta MB_MAGIC0
  56. lda #MB_MAGIC1_VALUE
  57. sta MB_MAGIC1
  58. lda #MB_PROD_PLATFORM
  59. sta MB_PRODUCER
  60. lda #MB_ST_RUNNING
  61. sta MB_STATUS
  62. jsr mmu_init
  63. jsr mmu_bank0
  64. lda #<dump
  65. sta dump_ptr
  66. lda #>dump
  67. sta dump_ptr+1
  68. lda #<fixtures
  69. sta fx_ptr
  70. lda #>fixtures
  71. sta fx_ptr+1
  72. lda #$00
  73. sta failures
  74. sta overflow
  75. sta fx_index
  76. @fixture:
  77. lda #$FF
  78. jsr emit
  79. lda fx_index
  80. jsr emit
  81. ldy #0
  82. lda (fx_ptr),y
  83. sta name_lo
  84. iny
  85. lda (fx_ptr),y
  86. tax
  87. iny
  88. lda (fx_ptr),y
  89. tay
  90. lda name_lo
  91. jsr src_load
  92. pha
  93. jsr emit
  94. pla
  95. beq @lex
  96. inc failures
  97. jmp @advance
  98. @lex: jsr lex_fixture
  99. @advance:
  100. clc
  101. lda fx_ptr
  102. adc #3
  103. sta fx_ptr
  104. bcc :+
  105. inc fx_ptr+1
  106. : inc fx_index
  107. lda fx_index
  108. cmp #FIXTURE_COUNT
  109. bne @fixture
  110. lda #$FE
  111. jsr emit
  112. ; Report before mmu_shutdown: dump_ptr is in the private zero page,
  113. ; which the system mapping no longer shows.
  114. lda #<dump
  115. sta MB_DATA+0
  116. lda #>dump
  117. sta MB_DATA+1
  118. sec
  119. lda dump_ptr
  120. sbc #<dump
  121. sta MB_DATA+2
  122. lda dump_ptr+1
  123. sbc #>dump
  124. sta MB_DATA+3
  125. lda #FIXTURE_COUNT
  126. sta MB_DATA+4
  127. jsr mmu_shutdown
  128. lda failures
  129. ora overflow
  130. sta MB_CODE
  131. ldy #ok_msg - messages
  132. lda MB_CODE
  133. bne @fail
  134. lda #MB_ST_PASS
  135. bne @report
  136. @fail: ldy #fail_msg - messages
  137. lda #MB_ST_FAIL
  138. @report:
  139. sta MB_STATUS
  140. plp
  141. @print: lda messages,y
  142. beq @end
  143. sty print_y
  144. jsr CHROUT
  145. ldy print_y
  146. iny
  147. bne @print
  148. @end: rts
  149. .segment "CODE"
  150. lex_fixture:
  151. jsr lex_reset
  152. lda #<MAX_TOKENS_PER_FIXTURE
  153. sta budget
  154. lda #>MAX_TOKENS_PER_FIXTURE
  155. sta budget+1
  156. @token: jsr lex_next
  157. jsr emit_token
  158. lda tok_kind
  159. cmp #TOK_EOF
  160. beq @done
  161. lda budget ; runaway guard
  162. bne :+
  163. dec budget+1
  164. : dec budget
  165. lda budget
  166. ora budget+1
  167. bne @token
  168. inc failures
  169. @done: rts
  170. emit_token:
  171. lda tok_kind
  172. jsr emit
  173. lda tok_line
  174. jsr emit
  175. lda tok_line+1
  176. jsr emit
  177. lda tok_col
  178. jsr emit
  179. lda tok_kind
  180. cmp #TOK_EOF
  181. beq @none
  182. cmp #TOK_EOL
  183. beq @none
  184. cmp #TOK_ERROR
  185. bne @len
  186. lda tok_err
  187. jmp emit
  188. @none: rts
  189. @len: lda tok_len
  190. jsr emit
  191. lda tok_kind
  192. cmp #TOK_IDENT
  193. beq @text
  194. cmp #TOK_STRING
  195. beq @text
  196. cmp #TOK_NUMBER
  197. beq @number
  198. cmp #TOK_CHAR
  199. bne @none
  200. lda tok_value
  201. jmp emit
  202. @number:
  203. lda tok_value
  204. jsr emit
  205. lda tok_value+1
  206. jmp emit
  207. @text: lda tok_text_len
  208. jsr emit
  209. ldx #$00
  210. @byte: cpx tok_text_len
  211. beq @none
  212. lda tok_text,x
  213. stx emit_x
  214. jsr emit
  215. ldx emit_x
  216. inx
  217. bne @byte
  218. ; Append A to the dump; stop writing (and flag) once it is full.
  219. emit: ldy dump_ptr+1
  220. cpy #>(dump + DUMP_SIZE)
  221. bcc @room
  222. lda #$01
  223. sta overflow
  224. rts
  225. @room: ldy #$00
  226. sta (dump_ptr),y
  227. inc dump_ptr
  228. bne :+
  229. inc dump_ptr+1
  230. : rts
  231. .segment "RODATA"
  232. ; name address, name length
  233. fixtures:
  234. .macro FIXTURE name
  235. .local text, done
  236. .word text
  237. .byte done - text
  238. .pushseg
  239. .segment "DATA" ; names live apart from the table
  240. text: .byte name
  241. done:
  242. .popseg
  243. .endmacro
  244. FIXTURE "MINIMAL.N8"
  245. FIXTURE "DECLS.N8"
  246. FIXTURE "ARRAYS.N8"
  247. FIXTURE "EXPRS.N8"
  248. FIXTURE "FORWARD.N8"
  249. FIXTURE "NULLS.N8"
  250. FIXTURE "STMTS.N8"
  251. FIXTURE "TOKENS.N8"
  252. FIXTURE "ERRORS.N8"
  253. FIXTURE "BADCHAR.N8"
  254. FIXTURE_COUNT = 10
  255. messages:
  256. ok_msg: .byte "NOVA128 LEXER TEST OK", $0D, $00
  257. fail_msg: .byte "NOVA128 LEXER TEST FAIL", $0D, $00
  258. .segment "BSS"
  259. failures: .res 1
  260. overflow: .res 1
  261. fx_index: .res 1
  262. name_lo: .res 1
  263. budget: .res 2
  264. emit_x: .res 1
  265. print_y: .res 1
  266. dump: .res DUMP_SIZE

Powered by TurnKey Linux.