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

305 строки
7.0KB

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

Powered by TurnKey Linux.