Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

341 rinda
7.5KB

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

Powered by TurnKey Linux.