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

430 строки
10KB

  1. ; E01-S05: capacity-checking skeleton for cfg/compiler.cfg.
  2. ;
  3. ; Links the production src/compiler/mmu.s with the frozen memory map and
  4. ; proves, in x128, every region and rule the compiler will depend on. Results
  5. ; go to the fixed test mailbox (src/common/mailbox.inc):
  6. ; MB_STATUS $A5 pass / $FA fail
  7. ; MB_CODE 16-bit mask of FAILED checks (CHECK_*), 0 on pass
  8. ; MB_DATA+0 NMIs counted by mmu_nmi_guard
  9. ; MB_DATA+1 CR seen right after the NMI (expect $4E)
  10. ; MB_DATA+2 P0L seen right after the NMI (expect the private page)
  11. ; MB_DATA+3 private zero-page sentinel after the NMI (expect $C5)
  12. ;
  13. ; Assemble with -D OVERFLOW_<REGION>=1 to prove ld65 rejects an overflow of
  14. ; ZP, COMMON, MAIN, SWSTACK, or TABLES.
  15. .setcpu "6502"
  16. .include "../../src/common/c128.inc"
  17. .include "../../src/common/mailbox.inc"
  18. .import mmu_init, mmu_bank0, mmu_bank1, mmu_system, mmu_shutdown
  19. .import mmu_peek1, mmu_poke1, kcall_inline, mmu_nmi_count
  20. .importzp mmu_ptr
  21. .import __COMPILER_ZP_PAGE__
  22. CHECK_ZP = $0001 ; private zero page isolated from system ZP
  23. CHECK_KCALL = $0002 ; KERNAL calls from both states keep ZP/MMU
  24. CHECK_BANK1 = $0004 ; first/last table bytes are bank-1 only
  25. CHECK_NMI = $0008 ; NMI under bank 1 + private ZP is harmless
  26. CHECK_COMMON = $0010 ; COMMON/DISKBUF/SCRATCH/MAILBOX shared
  27. CHECK_RESTORE = $0020 ; exact system state after mmu_shutdown
  28. CHECK_ALL = $003F
  29. ZP_SENTINEL = $C5
  30. .segment "LOADADDR"
  31. .word $1C01
  32. .segment "EXEHDR"
  33. .word basic_end
  34. .word 10
  35. .byte $9E
  36. .byte "7181" ; SYS $1C0D
  37. .byte $00
  38. basic_end:
  39. .word $0000
  40. .segment "ZEROPAGE"
  41. zp_probe: .res 1
  42. .ifdef OVERFLOW_ZP
  43. .res $FE
  44. .endif
  45. .segment "MAILBOX"
  46. mailbox: .res MB_SIZE
  47. .assert mailbox = MB_BASE, error, "MAILBOX segment must sit at MB_BASE"
  48. .segment "DISKBUF"
  49. diskbuf: .res $100
  50. .segment "SCRATCH"
  51. scratch: .res 1
  52. .segment "SWSTACK"
  53. swstack_first: .res 1
  54. .res $0800 - 2
  55. swstack_last: .res 1
  56. .ifdef OVERFLOW_SWSTACK
  57. .res 1
  58. .endif
  59. .segment "TABLES"
  60. tables_first: .res 1
  61. .res $5500 - 2
  62. tables_last: .res 1
  63. .ifdef OVERFLOW_TABLES
  64. .res 1
  65. .endif
  66. ; --------------------------------------------------------------- STARTUP
  67. .segment "STARTUP"
  68. .export skel_entry
  69. skel_entry:
  70. php
  71. sei
  72. tsx
  73. stx entry_sp
  74. ldx #MB_SIZE - 1 ; mailbox: initialized and running
  75. lda #$00
  76. @clr: sta MB_BASE,x
  77. dex
  78. bpl @clr
  79. lda #MB_MAGIC0_VALUE
  80. sta MB_MAGIC0
  81. lda #MB_MAGIC1_VALUE
  82. sta MB_MAGIC1
  83. lda #MB_PROD_PLATFORM
  84. sta MB_PRODUCER
  85. lda #MB_ST_RUNNING
  86. sta MB_STATUS
  87. lda #<CHECK_ALL ; every check starts failed
  88. sta fail_mask
  89. lda #>CHECK_ALL
  90. sta fail_mask+1
  91. lda MMU_CR ; system state for CHECK_RESTORE
  92. sta entry_state+0
  93. ldx #4
  94. @save: lda MMU_RCR,x
  95. sta entry_state+1,x
  96. dex
  97. bpl @save
  98. lda NMINV
  99. sta entry_state+6
  100. lda NMINV+1
  101. sta entry_state+7
  102. lda zp_probe ; system ZP byte at the probe's offset
  103. sta sys_zp_before
  104. jsr mmu_init
  105. jsr mmu_bank0
  106. ; ------------------------------------------- private zero page
  107. lda #ZP_SENTINEL
  108. sta zp_probe ; logical ZP -> physical $1Axx
  109. jsr mmu_system
  110. lda zp_probe ; system ZP again
  111. cmp sys_zp_before
  112. bne @zp_done
  113. lda __COMPILER_ZP_PAGE__ * 256 + zp_probe
  114. cmp #ZP_SENTINEL
  115. bne @zp_done
  116. lda #<CHECK_ZP
  117. jsr pass
  118. @zp_done:
  119. jsr mmu_bank0
  120. ; ---------------------------------- KERNAL calls from both states
  121. ldy #$00
  122. @say0: lda bank0_msg,y
  123. beq @said0
  124. sty print_y
  125. jsr kcall_inline
  126. .word CHROUT
  127. ldy print_y
  128. iny
  129. bne @say0
  130. @said0: jsr common_say_bank1 ; same from the bank-1 state
  131. lda zp_probe
  132. cmp #ZP_SENTINEL
  133. bne @kc_done
  134. jsr state_is_bank0
  135. bne @kc_done
  136. lda kc1_ok
  137. cmp #$01
  138. bne @kc_done
  139. lda #<CHECK_KCALL
  140. jsr pass
  141. @kc_done:
  142. ; ------------------------------------------- bank-1 table window
  143. lda tables_first ; bank-0 bytes at the same addresses
  144. sta b0_first
  145. lda tables_last
  146. sta b0_last
  147. lda #<tables_first
  148. sta mmu_ptr
  149. lda #>tables_first
  150. sta mmu_ptr+1
  151. ldy #$00
  152. lda #$5A
  153. jsr mmu_poke1
  154. lda #<tables_last
  155. sta mmu_ptr
  156. lda #>tables_last
  157. sta mmu_ptr+1
  158. lda #$A5
  159. jsr mmu_poke1
  160. jsr mmu_peek1
  161. cmp #$A5
  162. bne @b1_done
  163. lda #<tables_first
  164. sta mmu_ptr
  165. lda #>tables_first
  166. sta mmu_ptr+1
  167. jsr mmu_peek1
  168. cmp #$5A
  169. bne @b1_done
  170. lda tables_first
  171. cmp b0_first
  172. bne @b1_done
  173. lda tables_last
  174. cmp b0_last
  175. bne @b1_done
  176. jsr state_is_bank0
  177. bne @b1_done
  178. lda #<CHECK_BANK1
  179. jsr pass
  180. @b1_done:
  181. ; ----------------------------------------- shared common regions
  182. lda #$3C
  183. sta diskbuf
  184. lda #$C3
  185. sta scratch
  186. jsr common_shared_test
  187. lda shared_ok
  188. cmp #$01
  189. bne @sh_done
  190. lda MB_DATA+7 ; written from the bank-1 state
  191. cmp #$7E
  192. bne @sh_done
  193. lda #<CHECK_COMMON
  194. jsr pass
  195. @sh_done:
  196. lda #$00
  197. sta MB_DATA+7
  198. ; -------------------------------------- NMI under bank 1 + ZP
  199. jsr common_nmi_test
  200. lda MB_DATA+0
  201. beq @nmi_done ; the NMI never arrived
  202. lda MB_DATA+1
  203. cmp #CR_RAM1_KERNAL
  204. bne @nmi_done
  205. lda MB_DATA+2
  206. cmp #<__COMPILER_ZP_PAGE__
  207. bne @nmi_done
  208. lda MB_DATA+3
  209. cmp #ZP_SENTINEL
  210. bne @nmi_done
  211. lda nmi_sp
  212. cmp entry_sp_inner
  213. bne @nmi_done
  214. lda #<CHECK_NMI
  215. jsr pass
  216. @nmi_done:
  217. ; ------------------------------------------------- full restore
  218. jsr mmu_shutdown
  219. tsx
  220. cpx entry_sp
  221. bne @rs_done
  222. lda MMU_CR
  223. cmp entry_state+0
  224. bne @rs_done
  225. ldx #4
  226. @rs: lda MMU_RCR,x
  227. cmp entry_state+1,x
  228. bne @rs_done
  229. dex
  230. bpl @rs
  231. lda NMINV
  232. cmp entry_state+6
  233. bne @rs_done
  234. lda NMINV+1
  235. cmp entry_state+7
  236. bne @rs_done
  237. lda #<CHECK_RESTORE
  238. jsr pass
  239. @rs_done:
  240. ; ------------------------------------------------ report
  241. lda fail_mask
  242. sta MB_CODE
  243. lda fail_mask+1
  244. sta MB_CODE+1
  245. lda #<skel_done
  246. sta MB_ADDR
  247. lda #>skel_done
  248. sta MB_ADDR+1
  249. ldy #ok_msg - messages
  250. lda fail_mask
  251. ora fail_mask+1
  252. bne @fail
  253. lda #MB_ST_PASS
  254. bne @report
  255. @fail: ldy #fail_msg - messages
  256. lda #MB_ST_FAIL
  257. @report:
  258. sta MB_STATUS
  259. skel_done:
  260. plp
  261. @print: lda messages,y
  262. beq @end
  263. sty print_y
  264. jsr CHROUT
  265. ldy print_y
  266. iny
  267. bne @print
  268. @end: rts
  269. .segment "CODE"
  270. ; Clear a passed check (A = low-byte mask; all checks fit in the low byte).
  271. pass:
  272. eor #$FF
  273. and fail_mask
  274. sta fail_mask
  275. rts
  276. ; Z=1 when the MMU shows the exact bank-0 compiler state.
  277. state_is_bank0:
  278. lda MMU_CR
  279. cmp #CR_RAM0_KERNAL
  280. bne @no
  281. lda MMU_P0L
  282. cmp #<__COMPILER_ZP_PAGE__
  283. @no: rts
  284. .ifdef OVERFLOW_MAIN
  285. .res $9BF3
  286. .endif
  287. .segment "RODATA"
  288. bank0_msg:
  289. .byte "KCALL FROM BANK 0", $0D, $00
  290. messages:
  291. ok_msg:
  292. .byte "NOVA128 MAP SKELETON OK", $0D, $00
  293. fail_msg:
  294. .byte "NOVA128 MAP SKELETON FAIL", $0D, $00
  295. .segment "BSS"
  296. entry_sp: .res 1
  297. entry_state: .res 8 ; CR, RCR, P0L, P0H, P1L, P1H, NMINV
  298. sys_zp_before: .res 1
  299. fail_mask: .res 2
  300. b0_first: .res 1
  301. b0_last: .res 1
  302. print_y: .res 1
  303. ; ---------------------------------------------------------------- COMMON
  304. ; These routines run with bank 1 mapped, so they must be in common RAM.
  305. .segment "COMMON"
  306. common_say_bank1:
  307. lda #$00
  308. sta kc1_ok
  309. jsr mmu_bank1
  310. ldy #$00
  311. @say: lda bank1_msg,y
  312. beq @said
  313. sty say_y
  314. jsr kcall_inline
  315. .word CHROUT
  316. ldy say_y
  317. iny
  318. bne @say
  319. @said: lda MMU_CR ; still bank 1 after the KERNAL calls?
  320. cmp #CR_RAM1_KERNAL
  321. bne @out
  322. lda MMU_P0L
  323. cmp #<__COMPILER_ZP_PAGE__
  324. bne @out
  325. inc kc1_ok
  326. @out: jmp mmu_bank0
  327. common_shared_test:
  328. lda #$00
  329. sta shared_ok
  330. jsr mmu_bank1
  331. lda diskbuf
  332. cmp #$3C
  333. bne @out
  334. lda scratch
  335. cmp #$C3
  336. bne @out
  337. lda #$7E
  338. sta MB_DATA+7
  339. inc shared_ok
  340. @out: jmp mmu_bank0
  341. common_nmi_test:
  342. tsx
  343. stx entry_sp_inner
  344. jsr mmu_bank1
  345. lda #$7F ; disable all CIA #2 sources, clear flags
  346. sta CIA2_ICR
  347. bit CIA2_ICR
  348. lda #$40
  349. sta CIA2_TALO
  350. lda #$00
  351. sta CIA2_TAHI
  352. lda mmu_nmi_count
  353. sta nmi_before
  354. lda #CIA_ICR_SET | CIA_ICR_TA
  355. sta CIA2_ICR
  356. lda #CIA_CRA_START | CIA_CRA_ONESHOT | CIA_CRA_LOAD
  357. sta CIA2_CRA
  358. ldx #$00 ; wait up to ~65K iterations
  359. ldy #$00
  360. @wait: lda mmu_nmi_count
  361. cmp nmi_before
  362. bne @hit
  363. dex
  364. bne @wait
  365. dey
  366. bne @wait
  367. @hit: lda MMU_CR ; state right after the NMI returned
  368. sta MB_DATA+1
  369. lda MMU_P0L
  370. sta MB_DATA+2
  371. lda zp_probe
  372. sta MB_DATA+3
  373. tsx ; same depth as at routine entry?
  374. stx nmi_sp
  375. lda #$7F
  376. sta CIA2_ICR
  377. lda #$00
  378. sta CIA2_CRA
  379. bit CIA2_ICR
  380. lda mmu_nmi_count
  381. sec
  382. sbc nmi_before
  383. sta MB_DATA+0
  384. jmp mmu_bank0
  385. bank1_msg: .byte "KCALL FROM BANK 1", $0D, $00
  386. kc1_ok: .byte $00
  387. say_y: .byte $00
  388. shared_ok: .byte $00
  389. nmi_before: .byte $00
  390. nmi_sp: .byte $00
  391. entry_sp_inner: .byte $00
  392. .ifdef OVERFLOW_COMMON
  393. .res $0600
  394. .endif

Powered by TurnKey Linux.