Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

400 lignes
8.0KB

  1. ; E04-S02: software-frame ABI test in x128.
  2. ;
  3. ; The fixture runs with CR=$0E and IRQs masked so the frame stack at
  4. ; $B800-$BFFF is RAM. It restores the entry CR before returning to BASIC.
  5. ; Checks:
  6. ; +0/+1 recursive two-byte result (sum 1..50 = 1275 = $04FB)
  7. ; +2 one-byte return (5+7 = 12)
  8. ; +3 overflow error (FRAME_ERR_STACK)
  9. ; +4/+5 SP after the overflow unwinds ($C000)
  10. ; +6 frame_error after overflow (FRAME_ERR_STACK)
  11. ; +7 FP low after unwinding (0)
  12. ; Failure bits: 1 recursion, 2 one-byte return, 4 overflow, 8 stack state.
  13. .setcpu "6502"
  14. .include "../../src/common/c128.inc"
  15. .include "../../src/common/mailbox.inc"
  16. .include "../../src/common/frames.inc"
  17. .import frame_init, frame_enter, frame_leave, frame_discard
  18. .import frame_push_byte, frame_push_word, frame_error
  19. .segment "LOADADDR"
  20. .word $1C01
  21. .segment "EXEHDR"
  22. .word basic_end
  23. .word 10
  24. .byte $9E
  25. .byte "7181"
  26. .byte $00
  27. basic_end:
  28. .word $0000
  29. .segment "MAILBOX"
  30. .res MB_SIZE
  31. .segment "STARTUP"
  32. .export test_entry
  33. test_entry:
  34. php
  35. sei
  36. ldx #MB_SIZE - 1
  37. lda #$00
  38. @clr: sta MB_BASE,x
  39. dex
  40. bpl @clr
  41. lda #MB_MAGIC0_VALUE
  42. sta MB_MAGIC0
  43. lda #MB_MAGIC1_VALUE
  44. sta MB_MAGIC1
  45. lda #MB_PROD_PROGRAM
  46. sta MB_PRODUCER
  47. lda #MB_ST_RUNNING
  48. sta MB_STATUS
  49. lda #$00
  50. sta fail_mask
  51. sta sum_lo
  52. sta sum_hi
  53. sta byte_sum
  54. sta ov_error
  55. sta MB_CODE
  56. sta MB_CODE+1
  57. jsr frame_init
  58. lda MMU_CR
  59. sta saved_cr
  60. lda #CR_RAM0_KERNAL
  61. sta MMU_CR
  62. ; ------------------------------------------------ successful recursion
  63. jsr frame_init
  64. lda #<50
  65. ldx #>50
  66. jsr frame_push_word
  67. bcs @rec_push_fail
  68. jsr recurse
  69. bcs @rec_call_fail
  70. sta sum_lo
  71. stx sum_hi
  72. lda #2
  73. ldx #0
  74. jsr frame_discard
  75. lda sum_lo
  76. cmp #$FB
  77. bne @rec_bad
  78. lda sum_hi
  79. cmp #$04
  80. bne @rec_bad
  81. lda FRAME_SP
  82. cmp #<FRAME_STACK_TOP
  83. bne @rec_bad
  84. lda FRAME_SP+1
  85. cmp #>FRAME_STACK_TOP
  86. bne @rec_bad
  87. jmp @byte_return
  88. @rec_push_fail:
  89. lda #$01
  90. jsr fail
  91. jmp @byte_return
  92. @rec_call_fail:
  93. lda #2
  94. ldx #0
  95. jsr frame_discard
  96. lda #$01
  97. jsr fail
  98. jmp @byte_return
  99. @rec_bad:
  100. lda #$01
  101. jsr fail
  102. ; --------------------------------------------------- one-byte return
  103. @byte_return:
  104. jsr frame_init
  105. lda #7
  106. jsr frame_push_byte
  107. bcs @byte_fail
  108. lda #5
  109. jsr frame_push_byte
  110. bcs @byte_fail
  111. jsr sum_bytes
  112. bcs @byte_fail
  113. sta byte_sum
  114. lda #2
  115. ldx #0
  116. jsr frame_discard
  117. lda byte_sum
  118. cmp #12
  119. beq @overflow
  120. @byte_fail:
  121. lda #$02
  122. jsr fail
  123. ; ------------------------------------------------------ stack overflow
  124. @overflow:
  125. jsr frame_init
  126. lda #<1000
  127. ldx #>1000
  128. jsr frame_push_word
  129. bcs @ov_push_fail
  130. jsr recurse
  131. bcc @ov_no_fault
  132. lda #2
  133. ldx #0
  134. jsr frame_discard
  135. lda frame_error
  136. sta ov_error
  137. cmp #FRAME_ERR_STACK
  138. beq @ov_check_sp
  139. lda #$04
  140. jsr fail
  141. jmp @ov_check_sp
  142. @ov_push_fail:
  143. lda #$04
  144. jsr fail
  145. jmp @finish
  146. @ov_no_fault:
  147. lda #2
  148. ldx #0
  149. jsr frame_discard
  150. lda #$04
  151. jsr fail
  152. @ov_check_sp:
  153. lda FRAME_SP
  154. cmp #<FRAME_STACK_TOP
  155. bne @ov_bad
  156. lda FRAME_SP+1
  157. cmp #>FRAME_STACK_TOP
  158. bne @ov_bad
  159. lda FRAME_FP
  160. ora FRAME_FP+1
  161. beq @finish
  162. @ov_bad:
  163. lda #$08
  164. jsr fail
  165. ; ---------------------------------------------- hardware-stack guard
  166. tsx
  167. stx saved_hw_sp
  168. ldx #$20
  169. txs
  170. lda #0
  171. ldx #0
  172. jsr frame_enter
  173. ldx saved_hw_sp
  174. txs
  175. bcc @hw_bad
  176. lda frame_error
  177. cmp #FRAME_ERR_STACK
  178. beq @finish
  179. @hw_bad:
  180. lda #$10
  181. jsr fail
  182. ; ---------------------------------------------------------- report
  183. @finish:
  184. lda sum_lo
  185. sta MB_DATA+0
  186. lda sum_hi
  187. sta MB_DATA+1
  188. lda byte_sum
  189. sta MB_DATA+2
  190. lda ov_error
  191. sta MB_DATA+3
  192. lda FRAME_SP
  193. sta MB_DATA+4
  194. lda FRAME_SP+1
  195. sta MB_DATA+5
  196. lda frame_error
  197. sta MB_DATA+6
  198. lda FRAME_FP
  199. sta MB_DATA+7
  200. lda saved_cr
  201. sta MMU_CR
  202. lda fail_mask
  203. sta MB_CODE
  204. lda #$00
  205. sta MB_CODE+1
  206. lda #MB_ST_FAIL
  207. ldx fail_mask
  208. bne @status
  209. lda #MB_ST_PASS
  210. @status:
  211. sta MB_STATUS
  212. ldy #$00
  213. @print: lda message,y
  214. beq @end
  215. sty print_y
  216. jsr CHROUT
  217. ldy print_y
  218. iny
  219. bne @print
  220. @end: plp
  221. rts
  222. .segment "CODE"
  223. fail:
  224. ora fail_mask
  225. sta fail_mask
  226. rts
  227. ; recurse(depth) -> depth + recurse(depth-1), zero at depth 0.
  228. ; Arguments: depth word at FP+2. Locals: depth word, result word.
  229. recurse:
  230. lda #24
  231. ldx #0
  232. jsr frame_enter
  233. bcc @entered
  234. jmp @entry_err
  235. @entered:
  236. ; local +0/+1 = depth, local +2/+3 = sentinel/result
  237. ldy #2
  238. lda (FRAME_FP),y
  239. ldy #0
  240. sta (FRAME_SP),y
  241. ldy #3
  242. lda (FRAME_FP),y
  243. ldy #1
  244. sta (FRAME_SP),y
  245. ldy #2
  246. lda #$A5
  247. sta (FRAME_SP),y
  248. iny
  249. lda #$5A
  250. sta (FRAME_SP),y
  251. ldy #0
  252. lda (FRAME_SP),y
  253. sta depth
  254. iny
  255. lda (FRAME_SP),y
  256. sta depth+1
  257. lda depth
  258. ora depth+1
  259. beq @zero
  260. lda depth
  261. sec
  262. sbc #1
  263. sta calc
  264. lda depth+1
  265. sbc #0
  266. sta calc+1
  267. lda calc
  268. ldx calc+1
  269. jsr frame_push_word
  270. bcs @push_err
  271. jsr recurse
  272. bcs @nested_err
  273. sta result
  274. stx result+1
  275. lda #2
  276. ldx #0
  277. jsr frame_discard
  278. ldy #2
  279. lda (FRAME_SP),y
  280. cmp #$A5
  281. bne @corrupt
  282. iny
  283. lda (FRAME_SP),y
  284. cmp #$5A
  285. bne @corrupt
  286. ldy #0
  287. lda (FRAME_SP),y
  288. clc
  289. adc result
  290. sta result
  291. ldy #1
  292. lda (FRAME_SP),y
  293. adc result+1
  294. sta result+1
  295. ldy #2
  296. lda result
  297. sta (FRAME_SP),y
  298. ldy #3
  299. lda result+1
  300. sta (FRAME_SP),y
  301. lda result
  302. ldx result+1
  303. jmp @leave
  304. @zero: lda #0
  305. ldx #0
  306. @leave:
  307. sta ret_lo
  308. stx ret_hi
  309. jsr frame_leave
  310. lda ret_lo
  311. ldx ret_hi
  312. clc
  313. rts
  314. @entry_err:
  315. lda #FRAME_ERR_STACK
  316. sec
  317. rts
  318. @push_err:
  319. jsr frame_leave
  320. lda #FRAME_ERR_STACK
  321. sec
  322. rts
  323. @nested_err:
  324. lda #2
  325. ldx #0
  326. jsr frame_discard
  327. jsr frame_leave
  328. lda #FRAME_ERR_STACK
  329. sec
  330. rts
  331. @corrupt:
  332. lda #2
  333. ldx #0
  334. jsr frame_discard
  335. jsr frame_leave
  336. lda #FRAME_ERR_STATE
  337. sec
  338. rts
  339. ; sum_bytes(a,b) -> A = a+b. Two byte arguments at FP+2 and FP+3.
  340. sum_bytes:
  341. lda #0
  342. ldx #0
  343. jsr frame_enter
  344. bcs @out
  345. ldy #2
  346. lda (FRAME_FP),y
  347. iny
  348. clc
  349. adc (FRAME_FP),y
  350. sta sum_result
  351. jsr frame_leave
  352. lda sum_result
  353. clc
  354. rts
  355. @out: sec
  356. rts
  357. .segment "RODATA"
  358. message: .byte "NOVA128 FRAME TEST DONE", $0D, $00
  359. .segment "BSS"
  360. fail_mask: .res 1
  361. print_y: .res 1
  362. saved_cr: .res 1
  363. saved_hw_sp: .res 1
  364. sum_lo: .res 1
  365. sum_hi: .res 1
  366. byte_sum: .res 1
  367. ov_error: .res 1
  368. depth: .res 2
  369. calc: .res 2
  370. result: .res 2
  371. ret_lo: .res 1
  372. ret_hi: .res 1
  373. sum_result: .res 1

Powered by TurnKey Linux.