您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

266 行
6.1KB

  1. ; E04-S05: compile hello.n8 and emit a runnable PRG (x128).
  2. ;
  3. ; The fixture runs in the compiler mapping, loads HELLO.N8, parses and
  4. ; type-checks it normally, and reads the single string print captured during
  5. ; pass 2. It then writes HELLO.PRG with output.s: the standard BASIC stub at
  6. ; $1C01 and a body at $1C0D that saves CR, selects the D129 mapping ($0E),
  7. ; prints the captured bytes through CHROUT, restores CR, and returns to BASIC.
  8. ;
  9. ; This is a bounded source-to-code proof, not the general statement emitter:
  10. ; one string print is required and gen_bad rejects anything else.
  11. ;
  12. ; Mailbox data: +0 diagnostics, +1 print count, +2 gen_bad, +3 text length,
  13. ; +4 out_err. FAIL code is the stage: 1 load, 2 diagnostics, 3 unsupported
  14. ; print, 4 output.
  15. .setcpu "6502"
  16. .include "../../src/common/c128.inc"
  17. .include "../../src/common/mailbox.inc"
  18. .include "../../src/common/formats.inc"
  19. .import mmu_init, mmu_bank0, mmu_shutdown
  20. .import src_load, src_dos_code, src_kernal_err
  21. .import names_init
  22. .import diag_init, diag_finish, diag_screen
  23. .import parse_file, gen_text, gen_text_len, gen_print_count, gen_bad
  24. .import out_begin, out_section, out_end_section
  25. .import out_byte, out_bytes, out_finish, out_abort
  26. .import out_load, out_entry, out_start, out_err
  27. .import gen_stub
  28. ; A conditional branch to a far error path: near branch over an absolute JMP.
  29. .macro ON_CARRY target
  30. bcc :+
  31. jmp target
  32. :
  33. .endmacro
  34. .segment "LOADADDR"
  35. .word $1C01
  36. .segment "EXEHDR"
  37. .word basic_end
  38. .word 10
  39. .byte $9E
  40. .byte "7181"
  41. .byte $00
  42. basic_end:
  43. .word $0000
  44. .segment "MAILBOX"
  45. .res MB_SIZE
  46. .segment "STARTUP"
  47. .export test_entry
  48. test_entry:
  49. php
  50. sei
  51. ldx #MB_SIZE - 1
  52. lda #$00
  53. @clr: sta MB_BASE,x
  54. dex
  55. bpl @clr
  56. lda #MB_MAGIC0_VALUE
  57. sta MB_MAGIC0
  58. lda #MB_MAGIC1_VALUE
  59. sta MB_MAGIC1
  60. lda #MB_PROD_COMPILER
  61. sta MB_PRODUCER
  62. lda #MB_ST_RUNNING
  63. sta MB_STATUS
  64. lda #$00
  65. sta MB_DATA
  66. sta MB_DATA+1
  67. sta MB_DATA+2
  68. sta MB_DATA+3
  69. sta MB_DATA+4
  70. sta MB_DATA+5
  71. sta MB_DATA+6
  72. sta MB_DATA+7
  73. jsr mmu_init
  74. jsr mmu_bank0
  75. lda #<PRG_LOAD_ADDR
  76. sta out_load
  77. lda #>PRG_LOAD_ADDR
  78. sta out_load+1
  79. lda #<PRG_ENTRY_ADDR
  80. sta out_entry
  81. lda #>PRG_ENTRY_ADDR
  82. sta out_entry+1
  83. lda #<name_src
  84. ldx #>name_src
  85. ldy #name_src_len
  86. jsr src_load
  87. cmp #$00
  88. bne @fail_load
  89. jsr names_init
  90. lda #<name_src
  91. ldx #>name_src
  92. ldy #name_src_len
  93. jsr diag_init
  94. lda #$00 ; ERR files only; keep the screen quiet
  95. sta diag_screen
  96. jsr parse_file
  97. jsr diag_finish
  98. sta diag_count
  99. lda diag_count
  100. sta MB_DATA+0
  101. lda gen_print_count
  102. sta MB_DATA+1
  103. lda gen_bad
  104. sta MB_DATA+2
  105. lda gen_text_len
  106. sta MB_DATA+3
  107. lda diag_count
  108. bne @fail_diag
  109. lda gen_bad
  110. bne @fail_gen
  111. lda gen_print_count
  112. cmp #1
  113. bne @fail_gen
  114. lda gen_text_len
  115. beq @fail_gen
  116. jsr emit_hello
  117. bcc @ok
  118. lda emit_err
  119. sta MB_DATA+4
  120. lda #4
  121. jmp @fail
  122. @ok: lda out_err
  123. sta MB_DATA+4
  124. lda #MB_ST_PASS
  125. sta MB_STATUS
  126. jmp @done
  127. @fail_load:
  128. sta MB_DATA+5 ; src_load result
  129. lda src_dos_code
  130. sta MB_DATA+6
  131. lda src_kernal_err
  132. sta MB_DATA+7
  133. lda #1
  134. jmp @fail
  135. @fail_diag:
  136. lda #2
  137. jmp @fail
  138. @fail_gen:
  139. lda #3
  140. @fail: sta MB_CODE
  141. lda #$00
  142. sta MB_CODE+1
  143. lda #MB_ST_FAIL
  144. sta MB_STATUS
  145. @done: jsr mmu_shutdown
  146. plp
  147. rts
  148. ; Write HELLO.PRG through output.s. C=1 on any output error.
  149. emit_hello:
  150. lda #<name_hello
  151. ldx #>name_hello
  152. ldy #name_hello_len
  153. jsr out_begin
  154. ON_CARRY @abort
  155. lda #<PRG_LOAD_ADDR ; BASIC stub section
  156. sta out_start
  157. lda #>PRG_LOAD_ADDR
  158. sta out_start+1
  159. lda #<sec_stub
  160. ldx #>sec_stub
  161. ldy #4
  162. jsr out_section
  163. ON_CARRY @abort
  164. lda #<gen_stub
  165. ldx #>gen_stub
  166. ldy #PRG_STUB_SIZE
  167. jsr out_bytes
  168. ON_CARRY @abort
  169. jsr out_end_section
  170. ON_CARRY @abort
  171. lda #<PRG_ENTRY_ADDR ; generated body
  172. sta out_start
  173. lda #>PRG_ENTRY_ADDR
  174. sta out_start+1
  175. lda #<sec_code
  176. ldx #>sec_code
  177. ldy #4
  178. jsr out_section
  179. ON_CARRY @abort
  180. lda #<prologue
  181. ldx #>prologue
  182. ldy #prologue_len
  183. jsr out_bytes
  184. ON_CARRY @abort
  185. ldy #$00
  186. @chars: cpy gen_text_len
  187. beq @epilogue
  188. sty temp_y
  189. lda #$A9 ; LDA #char
  190. jsr out_byte
  191. ON_CARRY @abort
  192. ldy temp_y
  193. lda gen_text,y
  194. jsr out_byte
  195. ON_CARRY @abort
  196. lda #$20 ; JSR $FFD2 (CHROUT)
  197. jsr out_byte
  198. ON_CARRY @abort
  199. lda #$D2
  200. jsr out_byte
  201. ON_CARRY @abort
  202. lda #$FF
  203. jsr out_byte
  204. ON_CARRY @abort
  205. ldy temp_y
  206. iny
  207. bne @chars
  208. @epilogue:
  209. lda #<epilogue
  210. ldx #>epilogue
  211. ldy #epilogue_len
  212. jsr out_bytes
  213. ON_CARRY @abort
  214. jsr out_end_section
  215. ON_CARRY @abort
  216. jsr out_finish
  217. ON_CARRY @abort
  218. clc
  219. rts
  220. @abort: lda out_err
  221. sta emit_err
  222. jsr out_abort
  223. sec
  224. rts
  225. .segment "RODATA"
  226. name_src: .byte "HELLO.N8"
  227. name_src_len = * - name_src
  228. name_hello: .byte "HELLO"
  229. name_hello_len = * - name_hello
  230. sec_stub: .byte "STUB"
  231. sec_code: .byte "CODE"
  232. ; LDA MMU_CR / PHA / LDA #$0E / STA MMU_CR
  233. prologue:
  234. .byte $AD, $00, $FF, $48, $A9, $0E, $8D, $00, $FF
  235. prologue_len = * - prologue
  236. ; PLA / STA MMU_CR / RTS
  237. epilogue:
  238. .byte $68, $8D, $00, $FF, $60
  239. epilogue_len = * - epilogue
  240. .segment "BSS"
  241. diag_count: .res 1
  242. temp_y: .res 1
  243. emit_err: .res 1

Powered by TurnKey Linux.