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ů.

495 řádky
9.6KB

  1. ; E06-S01: interface value ABI fixture in x128.
  2. ;
  3. ; Runs under CR=$0E. It checks:
  4. ; - the four-byte value is little-endian: object low/high then table
  5. ; low/high;
  6. ; - null conversion writes four zero bytes and ignores the table pointer;
  7. ; - a non-null object with no table is IF_ERR_TABLE with a zero table half;
  8. ; - copying preserves all four bytes and never reads through a null pointer;
  9. ; - slot lookup reads table[slot*2] in declaration slot order;
  10. ; - the four-byte result area IF_RESULT carries all four bytes, and a failed
  11. ; store leaves the previous result intact;
  12. ; - four interface bytes pushed right-to-left arrive at FP+2..FP+5.
  13. ;
  14. ; MB_DATA flags 0..5 report the six phases.
  15. .setcpu "6502"
  16. .include "../../src/common/c128.inc"
  17. .include "../../src/common/mailbox.inc"
  18. .include "../../src/common/print.inc"
  19. .include "../../src/common/frames.inc"
  20. .include "../../src/common/interfaces.inc"
  21. .import pr_char, pr_cr, pr_text
  22. .import frame_init, frame_enter, frame_leave, frame_push_byte, frame_discard
  23. .import if_conv, if_copy, if_is_null, if_slot, if_ret_store, if_ret_load
  24. .import if_error
  25. .importzp if_obj, if_tab, if_dst, if_src
  26. .macro TEXT src, len
  27. lda #<src
  28. ldx #>src
  29. ldy #len
  30. jsr pr_text
  31. .endmacro
  32. .macro PHASE n
  33. lda #n
  34. sta MB_CODE
  35. lda #$00
  36. sta MB_CODE+1
  37. .endmacro
  38. .macro POINT var
  39. lda #<var
  40. sta tptr
  41. lda #>var
  42. sta tptr+1
  43. .endmacro
  44. .macro SETDST var
  45. lda #<var
  46. sta if_dst
  47. lda #>var
  48. sta if_dst+1
  49. .endmacro
  50. .macro SETSRC var
  51. lda #<var
  52. sta if_src
  53. lda #>var
  54. sta if_src+1
  55. .endmacro
  56. .macro EXPECT v0, v1, v2, v3
  57. lda #v0
  58. sta e0
  59. lda #v1
  60. sta e1
  61. lda #v2
  62. sta e2
  63. lda #v3
  64. sta e3
  65. .endmacro
  66. .macro FAIL_CS
  67. bcc :+
  68. jmp @fail
  69. :
  70. .endmacro
  71. .macro FAIL_CC
  72. bcs :+
  73. jmp @fail
  74. :
  75. .endmacro
  76. .macro FAIL_NE
  77. beq :+
  78. jmp @fail
  79. :
  80. .endmacro
  81. .segment "LOADADDR"
  82. .word $1C01
  83. .segment "EXEHDR"
  84. .word basic_end
  85. .word 10
  86. .byte $9E
  87. .byte "7181"
  88. .byte $00
  89. basic_end:
  90. .word $0000
  91. .segment "MAILBOX"
  92. .res MB_SIZE
  93. .segment "ZEROPAGE"
  94. tptr: .res 2
  95. .segment "STARTUP"
  96. .export test_entry, test_end
  97. test_entry:
  98. php
  99. sei
  100. ldx #MB_SIZE - 1
  101. lda #$00
  102. @clr: sta MB_BASE,x
  103. dex
  104. bpl @clr
  105. lda #MB_MAGIC0_VALUE
  106. sta MB_MAGIC0
  107. lda #MB_MAGIC1_VALUE
  108. sta MB_MAGIC1
  109. lda #MB_PROD_PROGRAM
  110. sta MB_PRODUCER
  111. lda #MB_ST_RUNNING
  112. sta MB_STATUS
  113. lda #$00
  114. sta MB_CODE
  115. sta MB_CODE+1
  116. lda MMU_CR
  117. sta saved_cr
  118. lda #CR_RAM0_KERNAL
  119. sta MMU_CR
  120. lda #PR_CLEAR
  121. jsr pr_char
  122. TEXT title, 22
  123. jsr pr_cr
  124. ; 1: little-endian layout of object and table pointers.
  125. PHASE 1
  126. lda #$34
  127. sta if_obj
  128. lda #$12
  129. sta if_obj+1
  130. lda #$78
  131. sta if_tab
  132. lda #$56
  133. sta if_tab+1
  134. SETDST val_a
  135. jsr if_conv
  136. FAIL_CS
  137. lda if_error
  138. FAIL_NE
  139. POINT val_a
  140. EXPECT $34, $12, $78, $56
  141. jsr cmp_val
  142. FAIL_CS
  143. lda #$01
  144. sta MB_DATA+0
  145. ; 2: canonical null and invalid conversion.
  146. PHASE 2
  147. lda #$00
  148. sta if_obj
  149. sta if_obj+1
  150. lda #$78
  151. sta if_tab
  152. lda #$56
  153. sta if_tab+1
  154. SETDST val_b
  155. jsr if_conv
  156. FAIL_CS
  157. lda if_error
  158. FAIL_NE
  159. POINT val_b
  160. EXPECT $00, $00, $00, $00
  161. jsr cmp_val
  162. FAIL_CS
  163. lda #<val_b
  164. ldx #>val_b
  165. jsr if_is_null
  166. FAIL_CC
  167. lda #<val_a
  168. ldx #>val_a
  169. jsr if_is_null
  170. FAIL_CS
  171. lda #$34
  172. sta if_obj
  173. lda #$12
  174. sta if_obj+1
  175. lda #$00
  176. sta if_tab
  177. sta if_tab+1
  178. SETDST val_c
  179. jsr if_conv
  180. FAIL_CC
  181. lda if_error
  182. cmp #IF_ERR_TABLE
  183. FAIL_NE
  184. POINT val_c
  185. EXPECT $34, $12, $00, $00
  186. jsr cmp_val
  187. FAIL_CS
  188. lda #$00
  189. ldx #$00
  190. jsr if_is_null
  191. FAIL_CC
  192. lda #$01
  193. sta MB_DATA+1
  194. ; 3: copying preserves every byte and rejects a null source pointer.
  195. PHASE 3
  196. SETSRC val_a
  197. SETDST val_d
  198. jsr if_copy
  199. FAIL_CS
  200. POINT val_d
  201. EXPECT $34, $12, $78, $56
  202. jsr cmp_val
  203. FAIL_CS
  204. POINT val_a
  205. EXPECT $34, $12, $78, $56
  206. jsr cmp_val
  207. FAIL_CS
  208. SETSRC val_b
  209. SETDST val_e
  210. jsr if_copy
  211. FAIL_CS
  212. POINT val_e
  213. EXPECT $00, $00, $00, $00
  214. jsr cmp_val
  215. FAIL_CS
  216. lda #$00
  217. sta if_src
  218. sta if_src+1
  219. SETDST val_e
  220. jsr if_copy
  221. FAIL_CC
  222. lda if_error
  223. cmp #IF_ERR_NULL
  224. FAIL_NE
  225. POINT val_e
  226. EXPECT $00, $00, $00, $00
  227. jsr cmp_val
  228. FAIL_CS
  229. lda #$01
  230. sta MB_DATA+2
  231. ; 4: slot order and the two refusal cases.
  232. PHASE 4
  233. lda #$34
  234. sta if_obj
  235. lda #$12
  236. sta if_obj+1
  237. lda #<slot_tab
  238. sta if_tab
  239. lda #>slot_tab
  240. sta if_tab+1
  241. SETDST val_f
  242. jsr if_conv
  243. FAIL_CS
  244. lda #<val_f
  245. ldx #>val_f
  246. ldy #0
  247. jsr if_slot
  248. FAIL_CS
  249. cmp #$EF
  250. FAIL_NE
  251. cpx #$BE
  252. FAIL_NE
  253. lda #<val_f
  254. ldx #>val_f
  255. ldy #1
  256. jsr if_slot
  257. FAIL_CS
  258. cmp #$FE
  259. FAIL_NE
  260. cpx #$CA
  261. FAIL_NE
  262. lda #<val_b
  263. ldx #>val_b
  264. ldy #0
  265. jsr if_slot
  266. FAIL_CC
  267. lda if_error
  268. cmp #IF_ERR_NULL
  269. FAIL_NE
  270. lda #<val_c
  271. ldx #>val_c
  272. ldy #0
  273. jsr if_slot
  274. FAIL_CC
  275. lda if_error
  276. cmp #IF_ERR_TABLE
  277. FAIL_NE
  278. lda #$01
  279. sta MB_DATA+3
  280. ; 5: four-byte result area.
  281. PHASE 5
  282. lda #<val_a
  283. ldx #>val_a
  284. jsr if_ret_store
  285. FAIL_CS
  286. POINT IF_RESULT
  287. EXPECT $34, $12, $78, $56
  288. jsr cmp_val
  289. FAIL_CS
  290. lda #<val_g
  291. ldx #>val_g
  292. jsr if_ret_load
  293. FAIL_CS
  294. POINT val_g
  295. EXPECT $34, $12, $78, $56
  296. jsr cmp_val
  297. FAIL_CS
  298. lda #<val_b
  299. ldx #>val_b
  300. jsr if_ret_store
  301. FAIL_CS
  302. lda #<val_h
  303. ldx #>val_h
  304. jsr if_ret_load
  305. FAIL_CS
  306. POINT val_h
  307. EXPECT $00, $00, $00, $00
  308. jsr cmp_val
  309. FAIL_CS
  310. lda #<val_a
  311. ldx #>val_a
  312. jsr if_ret_store
  313. FAIL_CS
  314. lda #$00
  315. ldx #$00
  316. jsr if_ret_store
  317. FAIL_CC
  318. lda if_error
  319. cmp #IF_ERR_NULL
  320. FAIL_NE
  321. POINT IF_RESULT
  322. EXPECT $34, $12, $78, $56
  323. jsr cmp_val
  324. FAIL_CS
  325. lda #$01
  326. sta MB_DATA+4
  327. ; 6: an interface argument pushed right-to-left lands object-first.
  328. PHASE 6
  329. jsr frame_init
  330. lda FRAME_SP
  331. sta saved_sp
  332. lda FRAME_SP+1
  333. sta saved_sp+1
  334. lda #$56
  335. jsr frame_push_byte
  336. FAIL_CS
  337. lda #$78
  338. jsr frame_push_byte
  339. FAIL_CS
  340. lda #$12
  341. jsr frame_push_byte
  342. FAIL_CS
  343. lda #$34
  344. jsr frame_push_byte
  345. FAIL_CS
  346. jsr take_iface
  347. FAIL_CS
  348. lda #IF_VALUE_SIZE
  349. ldx #$00
  350. jsr frame_discard
  351. lda FRAME_SP
  352. cmp saved_sp
  353. FAIL_NE
  354. lda FRAME_SP+1
  355. cmp saved_sp+1
  356. FAIL_NE
  357. lda #$01
  358. sta MB_DATA+5
  359. TEXT iface_ok, 12
  360. jsr pr_cr
  361. lda #MB_ST_PASS
  362. sta MB_STATUS
  363. lda #$00
  364. sta MB_CODE
  365. sta MB_CODE+1
  366. jmp @restore
  367. @fail:
  368. lda #MB_ST_FAIL
  369. sta MB_STATUS
  370. TEXT iface_fail, 14
  371. jsr pr_cr
  372. @restore:
  373. lda saved_cr
  374. sta MMU_CR
  375. plp
  376. rts
  377. ; Reads the four argument bytes at FP+2..FP+5: object $1234, table $5678.
  378. take_iface:
  379. lda #$00
  380. ldx #$00
  381. jsr frame_enter
  382. bcs @bad
  383. ldy #2
  384. lda (FRAME_FP),y
  385. cmp #$34
  386. bne @bad
  387. iny
  388. lda (FRAME_FP),y
  389. cmp #$12
  390. bne @bad
  391. iny
  392. lda (FRAME_FP),y
  393. cmp #$78
  394. bne @bad
  395. iny
  396. lda (FRAME_FP),y
  397. cmp #$56
  398. bne @bad
  399. jsr frame_leave
  400. clc
  401. rts
  402. @bad: sec
  403. rts
  404. ; C=1 when the four bytes at tptr differ from e0..e3.
  405. cmp_val:
  406. ldy #$00
  407. lda (tptr),y
  408. cmp e0
  409. bne @no
  410. iny
  411. lda (tptr),y
  412. cmp e1
  413. bne @no
  414. iny
  415. lda (tptr),y
  416. cmp e2
  417. bne @no
  418. iny
  419. lda (tptr),y
  420. cmp e3
  421. bne @no
  422. clc
  423. rts
  424. @no: sec
  425. rts
  426. .segment "DATA"
  427. slot_tab:
  428. .word $BEEF
  429. .word $CAFE
  430. .assert * - slot_tab = 2 * IF_SLOT_SIZE, error, "slot table size"
  431. .segment "RODATA"
  432. title: .byte "NOVA128 INTERFACE ABI"
  433. iface_ok: .byte "INTERFACE OK"
  434. iface_fail: .byte "INTERFACE FAIL"
  435. .segment "BSS"
  436. saved_cr: .res 1
  437. saved_sp: .res 2
  438. e0: .res 1
  439. e1: .res 1
  440. e2: .res 1
  441. e3: .res 1
  442. val_a: .res IF_VALUE_SIZE
  443. val_b: .res IF_VALUE_SIZE
  444. val_c: .res IF_VALUE_SIZE
  445. val_d: .res IF_VALUE_SIZE
  446. val_e: .res IF_VALUE_SIZE
  447. val_f: .res IF_VALUE_SIZE
  448. val_g: .res IF_VALUE_SIZE
  449. val_h: .res IF_VALUE_SIZE
  450. test_end:

Powered by TurnKey Linux.