Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

302 строки
6.9KB

  1. ; E04-S07: compile COUNTER.N8, assign final code addresses, and write two
  2. ; deterministic PRGs. The generated code runs from the PRG in a second x128
  3. ; session; the fixture-owned wrapper places FRAME_FP and reports the program's
  4. ; `total` local through the mailbox.
  5. .setcpu "6502"
  6. .include "../../src/common/c128.inc"
  7. .include "../../src/common/mailbox.inc"
  8. .include "../../src/common/formats.inc"
  9. .include "../../src/common/frames.inc"
  10. .import mmu_init, mmu_bank0, mmu_shutdown
  11. .import src_load, src_dos_code, src_kernal_err
  12. .import names_init
  13. .import diag_init, diag_finish, diag_screen
  14. .import parse_file_sized
  15. .import em_on, em_bad
  16. .import cg_code, cg_len, cg_err
  17. .import fl_err
  18. .import sz_plan_code, sz_code_base
  19. .import sz_mismatch
  20. .import out_begin, out_section, out_end_section, out_byte, out_bytes
  21. .import out_finish, out_abort, out_load, out_entry, out_start, out_err
  22. .import gen_stub
  23. FRAME_BASE = $BF80 ; software frame area under CR=$0E
  24. WRAPPER_LEN = 66
  25. CODE_ADDR = PRG_ENTRY_ADDR + WRAPPER_LEN
  26. .macro ON_CARRY target
  27. bcc :+
  28. jmp target
  29. :
  30. .endmacro
  31. .macro ON_NONZERO target
  32. beq :+
  33. jmp target
  34. :
  35. .endmacro
  36. .segment "LOADADDR"
  37. .word $1C01
  38. .segment "EXEHDR"
  39. .word basic_end
  40. .word 10
  41. .byte $9E
  42. .byte "7181"
  43. .byte $00
  44. basic_end:
  45. .word $0000
  46. .segment "MAILBOX"
  47. .res MB_SIZE
  48. .segment "STARTUP"
  49. .export test_entry
  50. test_entry:
  51. php
  52. sei
  53. ldx #MB_SIZE - 1
  54. lda #$00
  55. @clr: sta MB_BASE,x
  56. dex
  57. bpl @clr
  58. lda #MB_MAGIC0_VALUE
  59. sta MB_MAGIC0
  60. lda #MB_MAGIC1_VALUE
  61. sta MB_MAGIC1
  62. lda #MB_PROD_COMPILER
  63. sta MB_PRODUCER
  64. lda #MB_ST_RUNNING
  65. sta MB_STATUS
  66. jsr mmu_init
  67. jsr mmu_bank0
  68. lda #<name_src
  69. ldx #>name_src
  70. ldy #name_src_len
  71. jsr src_load
  72. cmp #$00
  73. ON_NONZERO fail_load ; src_load returns A=0 on success
  74. jsr names_init
  75. lda #<name_src
  76. ldx #>name_src
  77. ldy #name_src_len
  78. jsr diag_init
  79. lda #$00
  80. sta diag_screen
  81. lda #$01
  82. sta em_on
  83. lda #<PRG_LOAD_ADDR
  84. sta out_load
  85. lda #>PRG_LOAD_ADDR
  86. sta out_load+1
  87. lda #<PRG_ENTRY_ADDR
  88. sta out_entry
  89. lda #>PRG_ENTRY_ADDR
  90. sta out_entry+1
  91. lda #WRAPPER_LEN
  92. jsr sz_plan_code ; final code base for absolute fixups
  93. jsr parse_file_sized
  94. jsr diag_finish
  95. sta diag_count
  96. lda diag_count
  97. sta MB_DATA+0
  98. lda em_bad
  99. sta MB_DATA+1
  100. lda cg_len
  101. sta MB_DATA+2
  102. lda cg_err
  103. sta MB_DATA+3
  104. lda fl_err
  105. sta MB_DATA+4
  106. lda sz_mismatch
  107. sta MB_DATA+6
  108. lda diag_count
  109. ON_NONZERO fail_diag
  110. lda em_bad
  111. ON_NONZERO fail_emit
  112. lda cg_err
  113. ON_NONZERO fail_emit
  114. lda fl_err
  115. ON_NONZERO fail_emit
  116. lda #<name_counter
  117. sta out_name_ptr
  118. lda #>name_counter
  119. sta out_name_ptr+1
  120. lda #name_counter_len
  121. sta out_name_len
  122. jsr emit_output
  123. bcs fail_out
  124. lda #<name_countb
  125. sta out_name_ptr
  126. lda #>name_countb
  127. sta out_name_ptr+1
  128. lda #name_countb_len
  129. sta out_name_len
  130. jsr emit_output
  131. bcs fail_out
  132. lda #MB_ST_PASS
  133. sta MB_STATUS
  134. jmp done
  135. fail_diag:
  136. lda #2
  137. jmp fail_common
  138. fail_emit:
  139. lda #3
  140. jmp fail_common
  141. fail_out:
  142. lda emit_err
  143. sta MB_DATA+5
  144. lda #4
  145. jmp fail_common
  146. fail_load:
  147. sta MB_DATA+5
  148. lda src_dos_code
  149. sta MB_DATA+6
  150. lda src_kernal_err
  151. sta MB_DATA+7
  152. lda #1
  153. fail_common:
  154. sta MB_CODE
  155. lda #$00
  156. sta MB_CODE+1
  157. lda #MB_ST_FAIL
  158. sta MB_STATUS
  159. done: jsr mmu_shutdown
  160. plp
  161. rts
  162. ; Write one output pair with the same generated bytes. A/X = base name,
  163. ; out_name_len = length. C=1 on any output failure.
  164. emit_output:
  165. lda out_name_ptr
  166. ldx out_name_ptr+1
  167. ldy out_name_len
  168. jsr out_begin
  169. ON_CARRY out_fail
  170. lda #<PRG_LOAD_ADDR
  171. sta out_start
  172. lda #>PRG_LOAD_ADDR
  173. sta out_start+1
  174. lda #<sec_stub
  175. ldx #>sec_stub
  176. ldy #4
  177. jsr out_section
  178. ON_CARRY out_fail
  179. lda #<gen_stub
  180. ldx #>gen_stub
  181. ldy #PRG_STUB_SIZE
  182. jsr out_bytes
  183. ON_CARRY out_fail
  184. jsr out_end_section
  185. ON_CARRY out_fail
  186. lda #<PRG_ENTRY_ADDR
  187. sta out_start
  188. lda #>PRG_ENTRY_ADDR
  189. sta out_start+1
  190. lda #<sec_start
  191. ldx #>sec_start
  192. ldy #5
  193. jsr out_section
  194. ON_CARRY out_fail
  195. lda #<wrapper
  196. ldx #>wrapper
  197. ldy #WRAPPER_LEN
  198. jsr out_bytes
  199. ON_CARRY out_fail
  200. jsr out_end_section
  201. ON_CARRY out_fail
  202. lda sz_code_base
  203. sta out_start
  204. lda sz_code_base+1
  205. sta out_start+1
  206. lda #<sec_code
  207. ldx #>sec_code
  208. ldy #4
  209. jsr out_section
  210. ON_CARRY out_fail
  211. lda #<cg_code
  212. ldx #>cg_code
  213. ldy cg_len
  214. jsr out_bytes
  215. ON_CARRY out_fail
  216. jsr out_end_section
  217. ON_CARRY out_fail
  218. jsr out_finish
  219. ON_CARRY out_fail
  220. clc
  221. rts
  222. out_fail: lda out_err
  223. sta emit_err
  224. jsr out_abort
  225. sec
  226. rts
  227. ; The PRG's fixed entry, at $1C0D. It clears the mailbox, installs a frame
  228. ; base, calls the generated program body at CODE_ADDR, and reports `total`
  229. ; (the second local, FP-2) as MB_DATA.
  230. wrapper:
  231. lda $FF00 ; save CR, select RAM through $BFFF
  232. pha
  233. lda #$0E
  234. sta $FF00
  235. ldx #MB_SIZE - 1
  236. lda #$00
  237. @clr: sta MB_BASE,x
  238. dex
  239. bpl @clr
  240. lda #MB_MAGIC0_VALUE
  241. sta MB_MAGIC0
  242. lda #MB_MAGIC1_VALUE
  243. sta MB_MAGIC1
  244. lda #MB_PROD_PROGRAM
  245. sta MB_PRODUCER
  246. lda #MB_ST_RUNNING
  247. sta MB_STATUS
  248. lda #<FRAME_BASE
  249. sta FRAME_FP
  250. lda #>FRAME_BASE
  251. sta FRAME_FP+1
  252. jsr CODE_ADDR
  253. lda FRAME_BASE - 3
  254. sta MB_DATA
  255. pla
  256. sta $FF00 ; restore the BASIC entry mapping
  257. lda #MB_ST_PASS
  258. sta MB_STATUS
  259. rts
  260. .assert * - wrapper = WRAPPER_LEN, error, "counter wrapper length changed"
  261. .assert CODE_ADDR < $4000, error, "generated code must stay below BASIC ROM"
  262. .segment "ZEROPAGE"
  263. out_name_ptr: .res 2
  264. .segment "RODATA"
  265. name_src: .byte "COUNTER.N8"
  266. name_src_len = * - name_src
  267. name_counter: .byte "COUNTER"
  268. name_counter_len = * - name_counter
  269. name_countb: .byte "COUNTB"
  270. name_countb_len = * - name_countb
  271. sec_stub: .byte "STUB"
  272. sec_start: .byte "START"
  273. sec_code: .byte "CODE"
  274. .segment "BSS"
  275. diag_count: .res 1
  276. out_name_len: .res 1
  277. emit_err: .res 1

Powered by TurnKey Linux.