You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

377 line
8.4KB

  1. ; E05-S02: class descriptor and object-header test in x128.
  2. ;
  3. ; The fixture checks the packed descriptor ABI and its runtime accessors:
  4. ; EMPTY: size 7, no destructor, no interfaces
  5. ; BOX: size 35, destructor, one interface-directory entry
  6. ; It then writes CLASSTEST.PRG/MAP through the real output writer. MB_DATA
  7. ; flags 0..7 report descriptor, size, destructor, interface, and MAP success.
  8. .setcpu "6502"
  9. .include "../../src/common/c128.inc"
  10. .include "../../src/common/mailbox.inc"
  11. .include "../../src/common/formats.inc"
  12. .include "../../src/common/class.inc"
  13. .import mmu_init, mmu_bank0, mmu_shutdown
  14. .import out_begin, out_startup, out_finish, out_abort
  15. .import out_load, out_entry, out_err
  16. .import out_class, out_class_addr, out_class_size, out_class_destroy
  17. .import out_method, out_method_addr
  18. .import out_class_ifaces, out_class_ifdir
  19. .import obj_class, obj_size, obj_destroy, obj_iface_dir
  20. .export desc_empty, desc_box, destroy_b, iface_dir, method_stub
  21. .segment "LOADADDR"
  22. .word $1C01
  23. .segment "EXEHDR"
  24. .word basic_end
  25. .word 10
  26. .byte $9E
  27. .byte "7181"
  28. .byte $00
  29. basic_end:
  30. .word $0000
  31. .segment "MAILBOX"
  32. .res MB_SIZE
  33. .segment "STARTUP"
  34. .export test_entry
  35. test_entry:
  36. php
  37. sei
  38. ldx #MB_SIZE - 1
  39. lda #$00
  40. @clr: sta MB_BASE,x
  41. dex
  42. bpl @clr
  43. lda #MB_MAGIC0_VALUE
  44. sta MB_MAGIC0
  45. lda #MB_MAGIC1_VALUE
  46. sta MB_MAGIC1
  47. lda #MB_PROD_PROGRAM
  48. sta MB_PRODUCER
  49. lda #MB_ST_RUNNING
  50. sta MB_STATUS
  51. lda #$00
  52. sta fail_mask
  53. sta MB_CODE
  54. sta MB_CODE+1
  55. ldx #$07
  56. @flags: sta MB_DATA,x
  57. dex
  58. bpl @flags
  59. jsr mmu_init
  60. jsr mmu_bank0
  61. ; ------------------------------------------------ descriptor: EMPTY
  62. lda #<obj_empty
  63. ldx #>obj_empty
  64. jsr obj_class
  65. bcs @p0_fail
  66. cmp #<desc_empty
  67. bne @p0_fail
  68. cpx #>desc_empty
  69. bne @p0_fail
  70. lda #$00 ; null object and null descriptor pointer
  71. ldx #$00
  72. jsr obj_class
  73. bcc @p0_fail
  74. lda #$01
  75. sta MB_DATA+0
  76. jmp @p1
  77. @p0_fail:
  78. lda #$01
  79. jsr fail
  80. @p1: ; ------------------------------------------------------ size: EMPTY
  81. lda #<obj_empty
  82. ldx #>obj_empty
  83. jsr obj_size
  84. bcs @p1_fail
  85. cmp #7
  86. bne @p1_fail
  87. cpx #$00
  88. bne @p1_fail
  89. lda #$01
  90. sta MB_DATA+1
  91. jmp @p2
  92. @p1_fail:
  93. lda #$02
  94. jsr fail
  95. @p2: ; -------------------------------------------------- destructor: EMPTY
  96. lda #<obj_empty
  97. ldx #>obj_empty
  98. jsr obj_destroy
  99. bcs @p2_fail
  100. cmp #$00
  101. bne @p2_fail
  102. cpx #$00
  103. bne @p2_fail
  104. lda #$01
  105. sta MB_DATA+2
  106. jmp @p3
  107. @p2_fail:
  108. lda #$04
  109. jsr fail
  110. @p3: ; ------------------------------------------------- descriptor: BOX
  111. lda #<obj_box
  112. ldx #>obj_box
  113. jsr obj_class
  114. bcs @p3_fail
  115. cmp #<desc_box
  116. bne @p3_fail
  117. cpx #>desc_box
  118. bne @p3_fail
  119. lda #$01
  120. sta MB_DATA+3
  121. jmp @p4
  122. @p3_fail:
  123. lda #$08
  124. jsr fail
  125. @p4: ; ------------------------------------------------------ size: BOX
  126. lda #<obj_box
  127. ldx #>obj_box
  128. jsr obj_size
  129. bcs @p4_fail
  130. cmp #35
  131. bne @p4_fail
  132. cpx #$00
  133. bne @p4_fail
  134. lda #$01
  135. sta MB_DATA+4
  136. jmp @p5
  137. @p4_fail:
  138. lda #$10
  139. jsr fail
  140. @p5: ; ------------------------------------------------- destructor: BOX
  141. lda #<obj_box
  142. ldx #>obj_box
  143. jsr obj_destroy
  144. bcs @p5_fail
  145. cmp #<destroy_b
  146. bne @p5_fail
  147. cpx #>destroy_b
  148. bne @p5_fail
  149. lda #$01
  150. sta MB_DATA+5
  151. jmp @p6
  152. @p5_fail:
  153. lda #$20
  154. jsr fail
  155. @p6: ; ------------------------------------------------ interface directory
  156. lda #<obj_box
  157. ldx #>obj_box
  158. jsr obj_iface_dir
  159. bcs @p6_fail
  160. cmp #<iface_dir
  161. bne @p6_fail
  162. cpx #>iface_dir
  163. bne @p6_fail
  164. cpy #1
  165. bne @p6_fail
  166. lda #$01
  167. sta MB_DATA+6
  168. jmp @p7
  169. @p6_fail:
  170. lda #$40
  171. jsr fail
  172. @p7: ; -------------------------------------------------------- MAP output
  173. lda #<PRG_LOAD_ADDR
  174. sta out_load
  175. lda #>PRG_LOAD_ADDR
  176. sta out_load+1
  177. lda #<PRG_ENTRY_ADDR
  178. sta out_entry
  179. lda #>PRG_ENTRY_ADDR
  180. sta out_entry+1
  181. lda #<name_source
  182. ldx #>name_source
  183. ldy #name_source_len
  184. jsr out_begin
  185. bcc :+
  186. jmp @p7_abort
  187. : jsr out_startup
  188. bcc :+
  189. jmp @p7_abort
  190. :
  191. lda #<desc_empty
  192. sta out_class_addr
  193. lda #>desc_empty
  194. sta out_class_addr+1
  195. lda #7 ; EMPTY: size 7, no destructor/interface
  196. sta out_class_size
  197. lda #$00
  198. sta out_class_size+1
  199. sta out_class_destroy
  200. sta out_class_destroy+1
  201. sta out_class_ifaces
  202. sta out_class_ifdir
  203. sta out_class_ifdir+1
  204. lda #<name_empty
  205. ldx #>name_empty
  206. ldy #name_empty_len
  207. jsr out_class
  208. bcs @p7_abort
  209. lda #<desc_box
  210. sta out_class_addr
  211. lda #>desc_box
  212. sta out_class_addr+1
  213. lda #35 ; BOX: destructor and one interface
  214. sta out_class_size
  215. lda #$00
  216. sta out_class_size+1
  217. lda #<destroy_b
  218. sta out_class_destroy
  219. lda #>destroy_b
  220. sta out_class_destroy+1
  221. lda #1
  222. sta out_class_ifaces
  223. lda #<iface_dir
  224. sta out_class_ifdir
  225. lda #>iface_dir
  226. sta out_class_ifdir+1
  227. lda #<name_box
  228. ldx #>name_box
  229. ldy #name_box_len
  230. jsr out_class
  231. bcs @p7_abort
  232. lda #<destroy_b
  233. sta out_method_addr
  234. lda #>destroy_b
  235. sta out_method_addr+1
  236. lda #<name_destroy
  237. ldx #>name_destroy
  238. ldy #name_destroy_len
  239. jsr out_method
  240. bcs @p7_abort
  241. lda #<method_stub
  242. sta out_method_addr
  243. lda #>method_stub
  244. sta out_method_addr+1
  245. lda #<name_stub
  246. ldx #>name_stub
  247. ldy #name_stub_len
  248. jsr out_method
  249. bcs @p7_abort
  250. jsr out_finish
  251. bcs @p7_fail
  252. lda #$01
  253. sta MB_DATA+7
  254. jmp @done
  255. @p7_abort:
  256. lda out_err
  257. sta MB_ADDR
  258. jsr out_abort
  259. @p7_fail:
  260. lda out_err
  261. sta MB_ADDR
  262. lda #$80
  263. jsr fail
  264. @done:
  265. jsr mmu_shutdown
  266. lda fail_mask
  267. sta MB_CODE
  268. lda #$00
  269. sta MB_CODE+1
  270. lda #MB_ST_FAIL
  271. ldx fail_mask
  272. bne @status
  273. lda #MB_ST_PASS
  274. @status:
  275. sta MB_STATUS
  276. lda fail_mask
  277. beq @ok_message
  278. ldy #fail_message - messages
  279. bne @print
  280. @ok_message:
  281. ldy #ok_message - messages
  282. @print: lda messages,y
  283. beq @end
  284. sty print_y
  285. jsr CHROUT
  286. ldy print_y
  287. iny
  288. bne @print
  289. @end: rts
  290. .segment "CODE"
  291. fail:
  292. ora fail_mask
  293. sta fail_mask
  294. rts
  295. destroy_b:
  296. rts
  297. method_stub:
  298. rts
  299. .segment "DATA"
  300. desc_empty:
  301. .word 7
  302. .word 0
  303. .byte 0
  304. .word 0
  305. .byte 0
  306. .assert * - desc_empty = CLASS_DESC_SIZE, error, "EMPTY descriptor size"
  307. desc_box:
  308. .word 35
  309. .word destroy_b
  310. .byte 1
  311. .word iface_dir
  312. .byte 0
  313. .assert * - desc_box = CLASS_DESC_SIZE, error, "BOX descriptor size"
  314. iface_dir:
  315. .word iface_stub
  316. .word iface_table
  317. iface_stub:
  318. .word 0
  319. iface_table:
  320. .word method_stub
  321. obj_empty:
  322. .word desc_empty
  323. .res 5
  324. obj_box:
  325. .word desc_box
  326. .res 33
  327. .assert obj_box - obj_empty = 7, error, "EMPTY object size"
  328. .assert * - obj_box = 35, error, "BOX object size"
  329. .segment "RODATA"
  330. name_source: .byte "CLASSTEST.N8"
  331. name_source_len = * - name_source
  332. name_empty: .byte "EMPTY"
  333. name_empty_len = * - name_empty
  334. name_box: .byte "BOX"
  335. name_box_len = * - name_box
  336. name_destroy: .byte "DESTROY"
  337. name_destroy_len = * - name_destroy
  338. name_stub: .byte "STUB"
  339. name_stub_len = * - name_stub
  340. messages:
  341. ok_message: .byte "NOVA128 CLASS TEST OK", $0D, $00
  342. fail_message: .byte "NOVA128 CLASS TEST FAIL", $0D, $00
  343. .segment "BSS"
  344. fail_mask: .res 1
  345. print_y: .res 1

Powered by TurnKey Linux.