Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

249 lines
5.7KB

  1. ; n8check.s - DEMO driver: check one Nova128 source file on the C128.
  2. ;
  3. ; This is not the Nova128 compiler (N128C, still to come). It runs the
  4. ; front end that exists today - source reader, lexer, name table, and the
  5. ; declaration/member/scope parser (E02, E03-S01, E03-S02) - on a file named
  6. ; at the prompt, shows any diagnostics on screen, and writes NAME.ERR. It
  7. ; generates no code: the code generator is epic E04.
  8. ;
  9. ; Mailbox: producer $02, status PASS (no errors) or FAIL, code = errors.
  10. .setcpu "6502"
  11. .include "../src/common/c128.inc"
  12. .include "../src/common/mailbox.inc"
  13. .include "../src/common/source.inc"
  14. .include "../src/common/errors.inc"
  15. .import mmu_init, mmu_bank0, mmu_shutdown, kcall_inline
  16. .import src_load, src_err_line, src_err_col, src_dos_code
  17. .import names_init
  18. .import diag_init, diag_report, diag_finish, diag_line, diag_col
  19. .import diag_arg1, diag_arg1_len
  20. .import parse_file
  21. NAME_MAX = 16
  22. .segment "LOADADDR"
  23. .word $1C01
  24. .segment "EXEHDR"
  25. .word basic_end
  26. .word 10
  27. .byte $9E
  28. .byte "7181"
  29. .byte $00
  30. basic_end:
  31. .word $0000
  32. .segment "MAILBOX"
  33. .res MB_SIZE
  34. .segment "STARTUP"
  35. entry:
  36. php
  37. sei
  38. ldx #MB_SIZE - 1
  39. lda #$00
  40. @clr: sta MB_BASE,x
  41. dex
  42. bpl @clr
  43. lda #MB_MAGIC0_VALUE
  44. sta MB_MAGIC0
  45. lda #MB_MAGIC1_VALUE
  46. sta MB_MAGIC1
  47. lda #MB_PROD_COMPILER
  48. sta MB_PRODUCER
  49. lda #MB_ST_RUNNING
  50. sta MB_STATUS
  51. jsr mmu_init
  52. jsr mmu_bank0
  53. jsr main
  54. jsr mmu_shutdown
  55. plp
  56. rts
  57. .segment "CODE"
  58. main: ldx #msg_title - msgs
  59. jsr print
  60. ldx #msg_prompt - msgs
  61. jsr print
  62. jsr read_name
  63. lda name_len
  64. bne :+
  65. rts ; empty name: nothing to do
  66. : ldx #msg_checking - msgs
  67. jsr print
  68. jsr names_init
  69. lda #<name_buf
  70. ldx #>name_buf
  71. ldy name_len
  72. jsr diag_init ; scratches a stale NAME.ERR
  73. lda #<name_buf
  74. ldx #>name_buf
  75. ldy name_len
  76. jsr src_load
  77. bcc @parse
  78. jsr report_load ; A = SRC_ERR_*
  79. jmp @done
  80. @parse: jsr parse_file
  81. @done: jsr diag_finish ; A = errors reported
  82. sta errors
  83. sta MB_CODE
  84. cmp #$00
  85. bne @bad
  86. ldx #msg_ok - msgs
  87. jsr print
  88. lda #MB_ST_PASS
  89. sta MB_STATUS
  90. rts
  91. @bad: lda errors
  92. jsr print_dec
  93. ldx #msg_errors - msgs
  94. jsr print
  95. ldx #$00 ; base name, then .ERR
  96. @base: cpx base_len
  97. beq :+
  98. lda name_buf,x
  99. stx save_x
  100. jsr chrout
  101. ldx save_x
  102. inx
  103. bne @base
  104. : ldx #msg_errfile - msgs
  105. jsr print
  106. lda #MB_ST_FAIL
  107. sta MB_STATUS
  108. rts
  109. ; Map a source-reader failure (A = SRC_ERR_*) to its diagnostic.
  110. report_load:
  111. cmp #SRC_ERR_DISK
  112. bne @limit
  113. lda src_dos_code ; "DOS nn"
  114. ldx #$00
  115. @tens: cmp #10
  116. bcc :+
  117. sbc #10
  118. inx
  119. bne @tens
  120. : ora #'0'
  121. sta dos_text+1
  122. txa
  123. ora #'0'
  124. sta dos_text
  125. lda #<dos_text
  126. sta diag_arg1
  127. lda #>dos_text
  128. sta diag_arg1+1
  129. lda #2
  130. sta diag_arg1_len
  131. lda #$00
  132. sta diag_line
  133. sta diag_line+1
  134. sta diag_col
  135. lda #E_DSK_SOURCE_UNREADABLE
  136. jmp diag_report
  137. @limit: tax ; 2/3/4 -> E002/E001/E003
  138. lda load_codes-2,x
  139. pha
  140. lda src_err_line
  141. sta diag_line
  142. lda src_err_line+1
  143. sta diag_line+1
  144. lda src_err_col
  145. sta diag_col
  146. pla
  147. jmp diag_report
  148. ; Read a line from the keyboard into name_buf (screen editor input).
  149. read_name:
  150. lda #$00
  151. sta name_len
  152. @key: jsr kcall_inline
  153. .word CHRIN
  154. cmp #$0D
  155. beq @end
  156. ldx name_len
  157. cpx #NAME_MAX
  158. bcs @key
  159. sta name_buf,x
  160. inc name_len
  161. bne @key
  162. @end: lda #$0D
  163. jsr chrout
  164. lda name_len ; base_len = length without ".N8"
  165. sta base_len
  166. cmp #3
  167. bcc @out
  168. tax
  169. lda name_buf-3,x
  170. cmp #'.'
  171. bne @out
  172. lda name_buf-2,x
  173. and #$7F
  174. cmp #'N'
  175. bne @out
  176. lda name_buf-1,x
  177. cmp #'8'
  178. bne @out
  179. dex
  180. dex
  181. dex
  182. stx base_len
  183. @out: rts
  184. ; Print the $00-terminated message at msgs+X.
  185. print: lda msgs,x
  186. beq @done
  187. stx save_x
  188. jsr chrout
  189. ldx save_x
  190. inx
  191. bne print
  192. @done: rts
  193. ; Print A (0-99) in decimal; at most 21 errors are ever reported.
  194. print_dec:
  195. ldx #$00
  196. @t: cmp #10
  197. bcc @units
  198. sbc #10
  199. inx
  200. bne @t
  201. @units: pha
  202. txa
  203. beq :+
  204. ora #'0'
  205. jsr chrout
  206. : pla
  207. ora #'0'
  208. jmp chrout
  209. chrout: jsr kcall_inline
  210. .word CHROUT
  211. rts
  212. .segment "RODATA"
  213. load_codes:
  214. .byte E_SRC_FILE_TOO_LARGE, E_SRC_LINE_TOO_LONG, E_SRC_TOO_MANY_LINES
  215. msgs:
  216. msg_title: .byte $0D, "NOVA128 CHECK (DEMO: FRONT END ONLY)", $0D, $00
  217. msg_prompt: .byte "SOURCE FILE?", $0D, $00
  218. msg_checking: .byte "CHECKING...", $0D, $00
  219. msg_ok: .byte "NO ERRORS: DECLARATIONS, MEMBERS,", $0D
  220. .byte "SCOPES AND ACCESS ARE VALID.", $0D
  221. .byte "(NO CODE YET - CODE GENERATION IS E04)", $0D, $00
  222. msg_errors: .byte " ERROR(S); LIST IN ", $00
  223. msg_errfile: .byte ".ERR", $0D, $00
  224. .segment "BSS"
  225. name_buf: .res NAME_MAX
  226. name_len: .res 1
  227. base_len: .res 1
  228. errors: .res 1
  229. save_x: .res 1
  230. .segment "DATA"
  231. dos_text: .byte "00"

Powered by TurnKey Linux.