Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

268 řádky
6.2KB

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

Powered by TurnKey Linux.