Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

369 wiersze
8.2KB

  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_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 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 #7 ; EMPTY: size 7, no destructor/interface
  192. sta out_class_size
  193. lda #$00
  194. sta out_class_size+1
  195. sta out_class_destroy
  196. sta out_class_destroy+1
  197. sta out_class_ifaces
  198. sta out_class_ifdir
  199. sta out_class_ifdir+1
  200. lda #<name_empty
  201. ldx #>name_empty
  202. ldy #name_empty_len
  203. jsr out_class
  204. bcs @p7_abort
  205. lda #35 ; BOX: destructor and one interface
  206. sta out_class_size
  207. lda #$00
  208. sta out_class_size+1
  209. lda #<destroy_b
  210. sta out_class_destroy
  211. lda #>destroy_b
  212. sta out_class_destroy+1
  213. lda #1
  214. sta out_class_ifaces
  215. lda #<iface_dir
  216. sta out_class_ifdir
  217. lda #>iface_dir
  218. sta out_class_ifdir+1
  219. lda #<name_box
  220. ldx #>name_box
  221. ldy #name_box_len
  222. jsr out_class
  223. bcs @p7_abort
  224. lda #<destroy_b
  225. sta out_method_addr
  226. lda #>destroy_b
  227. sta out_method_addr+1
  228. lda #<name_destroy
  229. ldx #>name_destroy
  230. ldy #name_destroy_len
  231. jsr out_method
  232. bcs @p7_abort
  233. lda #<method_stub
  234. sta out_method_addr
  235. lda #>method_stub
  236. sta out_method_addr+1
  237. lda #<name_stub
  238. ldx #>name_stub
  239. ldy #name_stub_len
  240. jsr out_method
  241. bcs @p7_abort
  242. jsr out_finish
  243. bcs @p7_fail
  244. lda #$01
  245. sta MB_DATA+7
  246. jmp @done
  247. @p7_abort:
  248. lda out_err
  249. sta MB_ADDR
  250. jsr out_abort
  251. @p7_fail:
  252. lda out_err
  253. sta MB_ADDR
  254. lda #$80
  255. jsr fail
  256. @done:
  257. jsr mmu_shutdown
  258. lda fail_mask
  259. sta MB_CODE
  260. lda #$00
  261. sta MB_CODE+1
  262. lda #MB_ST_FAIL
  263. ldx fail_mask
  264. bne @status
  265. lda #MB_ST_PASS
  266. @status:
  267. sta MB_STATUS
  268. lda fail_mask
  269. beq @ok_message
  270. ldy #fail_message - messages
  271. bne @print
  272. @ok_message:
  273. ldy #ok_message - messages
  274. @print: lda messages,y
  275. beq @end
  276. sty print_y
  277. jsr CHROUT
  278. ldy print_y
  279. iny
  280. bne @print
  281. @end: rts
  282. .segment "CODE"
  283. fail:
  284. ora fail_mask
  285. sta fail_mask
  286. rts
  287. destroy_b:
  288. rts
  289. method_stub:
  290. rts
  291. .segment "DATA"
  292. desc_empty:
  293. .word 7
  294. .word 0
  295. .byte 0
  296. .word 0
  297. .byte 0
  298. .assert * - desc_empty = CLASS_DESC_SIZE, error, "EMPTY descriptor size"
  299. desc_box:
  300. .word 35
  301. .word destroy_b
  302. .byte 1
  303. .word iface_dir
  304. .byte 0
  305. .assert * - desc_box = CLASS_DESC_SIZE, error, "BOX descriptor size"
  306. iface_dir:
  307. .word iface_stub
  308. .word iface_table
  309. iface_stub:
  310. .word 0
  311. iface_table:
  312. .word method_stub
  313. obj_empty:
  314. .word desc_empty
  315. .res 5
  316. obj_box:
  317. .word desc_box
  318. .res 33
  319. .assert obj_box - obj_empty = 7, error, "EMPTY object size"
  320. .assert * - obj_box = 35, error, "BOX object size"
  321. .segment "RODATA"
  322. name_source: .byte "CLASSTEST.N8"
  323. name_source_len = * - name_source
  324. name_empty: .byte "EMPTY"
  325. name_empty_len = * - name_empty
  326. name_box: .byte "BOX"
  327. name_box_len = * - name_box
  328. name_destroy: .byte "DESTROY"
  329. name_destroy_len = * - name_destroy
  330. name_stub: .byte "STUB"
  331. name_stub_len = * - name_stub
  332. messages:
  333. ok_message: .byte "NOVA128 CLASS TEST OK", $0D, $00
  334. fail_message: .byte "NOVA128 CLASS TEST FAIL", $0D, $00
  335. .segment "BSS"
  336. fail_mask: .res 1
  337. print_y: .res 1

Powered by TurnKey Linux.