25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

235 lines
5.0KB

  1. ; E07-S03: tokenize the SEQ file the editor created on this session's disk.
  2. ;
  3. ; One fixture, ROUNDTRIP.N8, loaded through the normal source reader so the
  4. ; C128 side never sees a host conversion. The dump matches the format of
  5. ; tests/lexer/lexer-test.s, so the host can decode it with the reference
  6. ; lexer's ConvertFrom-TokenDump:
  7. ; fixture: $FF, fixture index (0), src_load result
  8. ; token: kind, line lo, line hi, col, then by kind:
  9. ; EOL, EOF nothing
  10. ; ERROR error code
  11. ; IDENT, STRING raw length, text length, text bytes
  12. ; NUMBER raw length, value lo, value hi
  13. ; CHAR raw length, value
  14. ; other raw length
  15. ; end: $FE
  16. ; Mailbox: PASS when the file loaded and the dump did not overflow;
  17. ; MB_DATA+0/1 dump address, +2/3 dump length.
  18. .setcpu "6502"
  19. .include "../../src/common/c128.inc"
  20. .include "../../src/common/mailbox.inc"
  21. .include "../../src/common/tokens.inc"
  22. .import mmu_init, mmu_bank0, mmu_shutdown
  23. .import src_load
  24. .import lex_reset, lex_next
  25. .import tok_kind, tok_line, tok_col, tok_len, tok_value, tok_text, tok_text_len, tok_err
  26. DUMP_SIZE = $2000
  27. MAX_TOKENS = 2000
  28. .segment "LOADADDR"
  29. .word $1C01
  30. .segment "EXEHDR"
  31. .word basic_end
  32. .word 10
  33. .byte $9E
  34. .byte "7181"
  35. .byte $00
  36. basic_end:
  37. .word $0000
  38. .segment "MAILBOX"
  39. .res MB_SIZE
  40. .segment "ZEROPAGE"
  41. dump_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 #$00
  67. sta failures
  68. sta overflow
  69. lda #$FF
  70. jsr emit
  71. lda #$00
  72. jsr emit
  73. lda #<f_name
  74. ldx #>f_name
  75. ldy #f_name_end - f_name
  76. jsr src_load
  77. pha
  78. jsr emit
  79. pla
  80. beq @lex
  81. inc failures
  82. jmp @end
  83. @lex: jsr lex_run
  84. @end: lda #$FE
  85. jsr emit
  86. ; Report before mmu_shutdown: dump_ptr lives in the private zero page,
  87. ; which the system mapping no longer shows.
  88. lda #<dump
  89. sta MB_DATA+0
  90. lda #>dump
  91. sta MB_DATA+1
  92. sec
  93. lda dump_ptr
  94. sbc #<dump
  95. sta MB_DATA+2
  96. lda dump_ptr+1
  97. sbc #>dump
  98. sta MB_DATA+3
  99. jsr mmu_shutdown
  100. lda failures
  101. ora overflow
  102. sta MB_CODE
  103. ldy #ok_msg - messages
  104. lda MB_CODE
  105. bne @fail
  106. lda #MB_ST_PASS
  107. bne @report
  108. @fail: ldy #fail_msg - messages
  109. lda #MB_ST_FAIL
  110. @report:
  111. sta MB_STATUS
  112. plp
  113. @print: lda messages,y
  114. beq @done
  115. sty print_y
  116. jsr CHROUT
  117. ldy print_y
  118. iny
  119. bne @print
  120. @done: rts
  121. .segment "CODE"
  122. lex_run:
  123. jsr lex_reset
  124. lda #<MAX_TOKENS
  125. sta budget
  126. lda #>MAX_TOKENS
  127. sta budget+1
  128. @token: jsr lex_next
  129. jsr emit_token
  130. lda tok_kind
  131. cmp #TOK_EOF
  132. beq @done
  133. lda budget
  134. bne :+
  135. dec budget+1
  136. : dec budget
  137. lda budget
  138. ora budget+1
  139. bne @token
  140. inc failures
  141. @done: rts
  142. emit_token:
  143. lda tok_kind
  144. jsr emit
  145. lda tok_line
  146. jsr emit
  147. lda tok_line+1
  148. jsr emit
  149. lda tok_col
  150. jsr emit
  151. lda tok_kind
  152. cmp #TOK_EOF
  153. beq @none
  154. cmp #TOK_EOL
  155. beq @none
  156. cmp #TOK_ERROR
  157. bne @len
  158. lda tok_err
  159. jmp emit
  160. @none: rts
  161. @len: lda tok_len
  162. jsr emit
  163. lda tok_kind
  164. cmp #TOK_IDENT
  165. beq @text
  166. cmp #TOK_STRING
  167. beq @text
  168. cmp #TOK_NUMBER
  169. beq @number
  170. cmp #TOK_CHAR
  171. bne @none
  172. lda tok_value
  173. jmp emit
  174. @number:
  175. lda tok_value
  176. jsr emit
  177. lda tok_value+1
  178. jmp emit
  179. @text: lda tok_text_len
  180. jsr emit
  181. ldx #$00
  182. @byte: cpx tok_text_len
  183. beq @none
  184. lda tok_text,x
  185. stx emit_x
  186. jsr emit
  187. ldx emit_x
  188. inx
  189. bne @byte
  190. ; Append A to the dump; stop writing (and flag) once it is full.
  191. emit: ldy dump_ptr+1
  192. cpy #>(dump + DUMP_SIZE)
  193. bcc @room
  194. lda #$01
  195. sta overflow
  196. rts
  197. @room: ldy #$00
  198. sta (dump_ptr),y
  199. inc dump_ptr
  200. bne :+
  201. inc dump_ptr+1
  202. : rts
  203. .segment "RODATA"
  204. f_name: .byte "ROUNDTRIP.N8"
  205. f_name_end:
  206. messages:
  207. ok_msg: .byte "NOVA128 TOKENIZE OK", $0D, $00
  208. fail_msg: .byte "NOVA128 TOKENIZE FAIL", $0D, $00
  209. .segment "BSS"
  210. failures: .res 1
  211. overflow: .res 1
  212. budget: .res 2
  213. emit_x: .res 1
  214. print_y: .res 1
  215. dump: .res DUMP_SIZE

Powered by TurnKey Linux.