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.

744 lignes
16KB

  1. ; E04-S03: scalar emitter and arithmetic fixture in x128.
  2. ;
  3. ; The fixture drives codegen.s directly (parser integration is E04-S04),
  4. ; executes the emitted shapes, copies the golden bytes to golden_copy, then
  5. ; tests the arithmetic helpers. It runs in the compiler/BASIC mapping; all
  6. ; variables and the code buffer are below $A000.
  7. ;
  8. ; Mailbox data:
  9. ; +0 byte assignment (5A)
  10. ; +1 comparison bit mask (EQ..GE, expected 0E with 5,7)
  11. ; +2/+3 word add ($2221)
  12. ; +4/+5 integer sub ($ECBB)
  13. ; +6 multiply result low ($2EE0 -> E0)
  14. ; +7 arithmetic fault (1 = divide by zero)
  15. ; Failure bits: 1 emitter/assignment, 2 add/sub, 4 comparisons,
  16. ; 8 short-circuit, 16 multiply, 32 unsigned divide, 64 signed divide,
  17. ; 128 divide-by-zero.
  18. .setcpu "6502"
  19. .include "../../src/common/c128.inc"
  20. .include "../../src/common/mailbox.inc"
  21. .include "../../src/common/codegen.inc"
  22. .include "../../src/common/arithmetic.inc"
  23. .import cg_init, cg_len, cg_err, cg_code, cg_here, cg_patch_here
  24. .import cg_lda_imm, cg_ldx_imm, cg_ora_imm
  25. .import cg_lda_abs, cg_ldx_abs, cg_sta_abs, cg_stx_abs
  26. .import cg_adc_abs, cg_sbc_abs, cg_cmp_abs, cg_jsr_abs
  27. .import cg_clc, cg_sec, cg_rts, cg_branch_fwd
  28. .import ar_mul_u16, ar_div_u16, ar_div_i16, ar_a, ar_b, ar_rem, ar_fault
  29. ; Fixed bank-0 scratch variables (SCRATCH is unused by this fixture).
  30. V_SRC = $1B00
  31. V_DST = $1B01
  32. V_WIDE = $1B02
  33. V_ADD_A = $1B04
  34. V_ADD_B = $1B06
  35. V_ADD_R = $1B08
  36. V_SUB_A = $1B0A
  37. V_SUB_B = $1B0C
  38. V_SUB_R = $1B0E
  39. V_BYTE_A = $1B10
  40. V_BYTE_B = $1B11
  41. V_CMP = $1B12
  42. V_FLAG = $1B13
  43. V_EVAL = $1B14
  44. V_MUL_A = $1B16
  45. V_MUL_B = $1B18
  46. V_MUL_R = $1B1A
  47. V_DIV_A = $1B1C
  48. V_DIV_B = $1B1E
  49. V_DIV_R = $1B20
  50. V_SDIV_A = $1B22
  51. V_SDIV_B = $1B24
  52. V_SDIV_R = $1B26
  53. .macro EMIT_LDA addr
  54. lda #<(addr)
  55. ldx #>(addr)
  56. jsr cg_lda_abs
  57. .endmacro
  58. .macro EMIT_LDX addr
  59. lda #<(addr)
  60. ldx #>(addr)
  61. jsr cg_ldx_abs
  62. .endmacro
  63. .macro EMIT_STA addr
  64. lda #<(addr)
  65. ldx #>(addr)
  66. jsr cg_sta_abs
  67. .endmacro
  68. .macro EMIT_STX addr
  69. lda #<(addr)
  70. ldx #>(addr)
  71. jsr cg_stx_abs
  72. .endmacro
  73. .macro EMIT_ADC addr
  74. lda #<(addr)
  75. ldx #>(addr)
  76. jsr cg_adc_abs
  77. .endmacro
  78. .macro EMIT_SBC addr
  79. lda #<(addr)
  80. ldx #>(addr)
  81. jsr cg_sbc_abs
  82. .endmacro
  83. .macro EMIT_CMP addr
  84. lda #<(addr)
  85. ldx #>(addr)
  86. jsr cg_cmp_abs
  87. .endmacro
  88. .macro EMIT_JSR addr
  89. lda #<(addr)
  90. ldx #>(addr)
  91. jsr cg_jsr_abs
  92. .endmacro
  93. .macro EMIT_LDA_IMM value
  94. lda #value
  95. jsr cg_lda_imm
  96. .endmacro
  97. .macro EMIT_ORA_IMM value
  98. lda #value
  99. jsr cg_ora_imm
  100. .endmacro
  101. .macro EMIT_BIT value
  102. EMIT_LDA V_CMP
  103. EMIT_ORA_IMM value
  104. EMIT_STA V_CMP
  105. .endmacro
  106. .segment "LOADADDR"
  107. .word $1C01
  108. .segment "EXEHDR"
  109. .word basic_end
  110. .word 10
  111. .byte $9E
  112. .byte "7181"
  113. .byte $00
  114. basic_end:
  115. .word $0000
  116. .segment "MAILBOX"
  117. .res MB_SIZE
  118. .segment "STARTUP"
  119. .export test_entry
  120. test_entry:
  121. php
  122. sei
  123. ldx #MB_SIZE - 1
  124. lda #$00
  125. @clr: sta MB_BASE,x
  126. dex
  127. bpl @clr
  128. lda #MB_MAGIC0_VALUE
  129. sta MB_MAGIC0
  130. lda #MB_MAGIC1_VALUE
  131. sta MB_MAGIC1
  132. lda #MB_PROD_PROGRAM
  133. sta MB_PRODUCER
  134. lda #MB_ST_RUNNING
  135. sta MB_STATUS
  136. lda #$00
  137. sta fail_mask
  138. sta MB_CODE
  139. sta MB_CODE+1
  140. jsr init_vars
  141. jsr cg_init
  142. ; ---------------------------------------------------- golden shape 1: byte assignment
  143. EMIT_LDA V_SRC
  144. EMIT_STA V_DST
  145. jsr cg_rts
  146. lda cg_len
  147. sta s2
  148. ; ---------------------------------------------------- shape 2: byte -> word widening
  149. EMIT_LDA V_SRC
  150. EMIT_STA V_WIDE
  151. EMIT_LDA_IMM $00
  152. EMIT_STA V_WIDE+1
  153. jsr cg_rts
  154. lda cg_len
  155. sta s3
  156. ; ---------------------------------------------------- shape 3: word addition
  157. EMIT_LDA V_ADD_A
  158. jsr cg_clc
  159. EMIT_ADC V_ADD_B
  160. EMIT_STA V_ADD_R
  161. EMIT_LDA V_ADD_A+1
  162. EMIT_ADC V_ADD_B+1
  163. EMIT_STA V_ADD_R+1
  164. jsr cg_rts
  165. lda cg_len
  166. sta s4
  167. ; ---------------------------------------------------- shape 4: integer subtraction
  168. EMIT_LDA V_SUB_A
  169. jsr cg_sec
  170. EMIT_SBC V_SUB_B
  171. EMIT_STA V_SUB_R
  172. EMIT_LDA V_SUB_A+1
  173. EMIT_SBC V_SUB_B+1
  174. EMIT_STA V_SUB_R+1
  175. jsr cg_rts
  176. lda cg_len
  177. sta s5
  178. ; ---------------------------------------------------- shape 5: six comparisons
  179. EMIT_LDA_IMM $00
  180. EMIT_STA V_CMP
  181. ; EQ bit 1
  182. EMIT_LDA V_BYTE_A
  183. EMIT_CMP V_BYTE_B
  184. lda #$D0 ; BNE skip
  185. jsr cg_branch_fwd
  186. sta fix_eq
  187. EMIT_BIT $01
  188. lda fix_eq
  189. jsr cg_patch_here
  190. ; NE bit 2
  191. EMIT_LDA V_BYTE_A
  192. EMIT_CMP V_BYTE_B
  193. lda #$F0 ; BEQ skip
  194. jsr cg_branch_fwd
  195. sta fix_ne
  196. EMIT_BIT $02
  197. lda fix_ne
  198. jsr cg_patch_here
  199. ; LT bit 4
  200. EMIT_LDA V_BYTE_A
  201. EMIT_CMP V_BYTE_B
  202. lda #$B0 ; BCS skip
  203. jsr cg_branch_fwd
  204. sta fix_lt
  205. EMIT_BIT $04
  206. lda fix_lt
  207. jsr cg_patch_here
  208. ; LE bit 8: equal or below goes to set, above skips
  209. EMIT_LDA V_BYTE_A
  210. EMIT_CMP V_BYTE_B
  211. lda #$F0 ; BEQ set
  212. jsr cg_branch_fwd
  213. sta fix_le1
  214. lda #$90 ; BCC set
  215. jsr cg_branch_fwd
  216. sta fix_le2
  217. lda #$B0 ; BCS skip
  218. jsr cg_branch_fwd
  219. sta fix_le3
  220. lda fix_le1
  221. jsr cg_patch_here
  222. lda fix_le2
  223. jsr cg_patch_here
  224. EMIT_BIT $08
  225. lda fix_le3
  226. jsr cg_patch_here
  227. ; GT bit 16: equal or below skips
  228. EMIT_LDA V_BYTE_A
  229. EMIT_CMP V_BYTE_B
  230. lda #$F0 ; BEQ skip
  231. jsr cg_branch_fwd
  232. sta fix_gt1
  233. lda #$90 ; BCC skip
  234. jsr cg_branch_fwd
  235. sta fix_gt2
  236. EMIT_BIT $10
  237. lda fix_gt1
  238. jsr cg_patch_here
  239. lda fix_gt2
  240. jsr cg_patch_here
  241. ; GE bit 32
  242. EMIT_LDA V_BYTE_A
  243. EMIT_CMP V_BYTE_B
  244. lda #$90 ; BCC skip
  245. jsr cg_branch_fwd
  246. sta fix_ge
  247. EMIT_BIT $20
  248. lda fix_ge
  249. jsr cg_patch_here
  250. jsr cg_rts
  251. lda cg_len
  252. sta s6
  253. ; ---------------------------------------------------- shape 6: short-circuit AND
  254. EMIT_LDA_IMM $00
  255. EMIT_STA V_EVAL
  256. EMIT_LDA V_BYTE_A
  257. lda #$F0 ; BEQ false
  258. jsr cg_branch_fwd
  259. sta fix_and1
  260. EMIT_LDA_IMM $01
  261. EMIT_STA V_EVAL
  262. EMIT_LDA V_BYTE_B
  263. lda #$F0 ; BEQ false
  264. jsr cg_branch_fwd
  265. sta fix_and2
  266. EMIT_LDA_IMM $01
  267. EMIT_STA V_FLAG
  268. jsr cg_rts
  269. lda fix_and1
  270. jsr cg_patch_here
  271. lda fix_and2
  272. jsr cg_patch_here
  273. EMIT_LDA_IMM $00
  274. EMIT_STA V_FLAG
  275. jsr cg_rts
  276. lda cg_len
  277. sta s7
  278. ; ---------------------------------------------------- shape 7: short-circuit OR
  279. EMIT_LDA_IMM $00
  280. EMIT_STA V_EVAL
  281. EMIT_LDA V_BYTE_A
  282. lda #$D0 ; BNE true
  283. jsr cg_branch_fwd
  284. sta fix_or1
  285. EMIT_LDA_IMM $01
  286. EMIT_STA V_EVAL
  287. EMIT_LDA V_BYTE_B
  288. lda #$D0 ; BNE true
  289. jsr cg_branch_fwd
  290. sta fix_or2
  291. EMIT_LDA_IMM $00
  292. EMIT_STA V_FLAG
  293. jsr cg_rts
  294. lda fix_or1
  295. jsr cg_patch_here
  296. lda fix_or2
  297. jsr cg_patch_here
  298. EMIT_LDA_IMM $01
  299. EMIT_STA V_FLAG
  300. jsr cg_rts
  301. lda cg_len
  302. sta golden_len
  303. jsr copy_golden
  304. lda cg_err
  305. beq @golden_ok
  306. lda #$01
  307. jsr fail
  308. jmp @finish
  309. @golden_ok:
  310. ; ---------------------------------------------------- run golden shapes
  311. lda #$00
  312. jsr run_code
  313. lda V_DST
  314. cmp #$5A
  315. beq @s2
  316. lda #$01
  317. jsr fail
  318. @s2: lda s2
  319. jsr run_code
  320. lda V_WIDE
  321. cmp #$5A
  322. bne @s2_bad
  323. lda V_WIDE+1
  324. bne @s2_bad
  325. jmp @s3
  326. @s2_bad:
  327. lda #$01
  328. jsr fail
  329. @s3: lda s3
  330. jsr run_code
  331. lda V_ADD_R
  332. cmp #$21
  333. bne @s3_bad
  334. lda V_ADD_R+1
  335. cmp #$22
  336. bne @s3_bad
  337. jmp @s4
  338. @s3_bad:
  339. lda #$02
  340. jsr fail
  341. @s4: lda s4
  342. jsr run_code
  343. lda V_SUB_R
  344. cmp #$BB
  345. bne @s4_bad
  346. lda V_SUB_R+1
  347. cmp #$EC
  348. bne @s4_bad
  349. jmp @s5
  350. @s4_bad:
  351. lda #$02
  352. jsr fail
  353. @s5: lda s5
  354. jsr run_code
  355. lda V_CMP
  356. cmp #$0E
  357. beq @s6
  358. lda #$04
  359. jsr fail
  360. @s6: lda #$00
  361. sta V_BYTE_A
  362. lda #$01
  363. sta V_BYTE_B
  364. lda s6
  365. jsr run_code
  366. lda V_FLAG
  367. bne @s6_bad
  368. lda V_EVAL
  369. bne @s6_bad
  370. jmp @s7
  371. @s6_bad:
  372. lda #$08
  373. jsr fail
  374. @s7: lda #$01
  375. sta V_BYTE_A
  376. lda #$00
  377. sta V_BYTE_B
  378. lda s7
  379. jsr run_code
  380. lda V_FLAG
  381. cmp #$01
  382. bne @s7_bad
  383. lda V_EVAL
  384. bne @s7_bad
  385. jmp @arith
  386. @s7_bad:
  387. lda #$08
  388. jsr fail
  389. ; ---------------------------------------------------- arithmetic helpers
  390. @arith:
  391. jsr cg_init
  392. EMIT_LDA V_MUL_A
  393. EMIT_STA ar_a
  394. EMIT_LDA V_MUL_A+1
  395. EMIT_STA ar_a+1
  396. EMIT_LDA V_MUL_B
  397. EMIT_STA ar_b
  398. EMIT_LDA V_MUL_B+1
  399. EMIT_STA ar_b+1
  400. EMIT_JSR ar_mul_u16
  401. EMIT_STA V_MUL_R
  402. EMIT_STX V_MUL_R+1
  403. jsr cg_rts
  404. lda cg_err
  405. beq @mul_run
  406. lda #$10
  407. jsr fail
  408. jmp @div
  409. @mul_run:
  410. lda #$00
  411. jsr run_code
  412. lda V_MUL_R
  413. cmp #$E0
  414. bne @mul_bad
  415. lda V_MUL_R+1
  416. cmp #$2E
  417. bne @mul_bad
  418. jmp @div
  419. @mul_bad:
  420. lda #$10
  421. jsr fail
  422. @div: jsr cg_init
  423. EMIT_LDA V_DIV_A
  424. EMIT_STA ar_a
  425. EMIT_LDA V_DIV_A+1
  426. EMIT_STA ar_a+1
  427. EMIT_LDA V_DIV_B
  428. EMIT_STA ar_b
  429. EMIT_LDA V_DIV_B+1
  430. EMIT_STA ar_b+1
  431. EMIT_JSR ar_div_u16
  432. EMIT_STA V_DIV_R
  433. EMIT_STX V_DIV_R+1
  434. jsr cg_rts
  435. lda cg_err
  436. beq @div_run
  437. lda #$20
  438. jsr fail
  439. jmp @sdiv
  440. @div_run:
  441. lda #$00
  442. jsr run_code
  443. bcs @div_bad
  444. lda V_DIV_R
  445. cmp #$8E
  446. bne @div_bad
  447. lda V_DIV_R+1
  448. bne @div_bad
  449. lda ar_rem
  450. cmp #$06
  451. bne @div_bad
  452. lda ar_rem+1
  453. bne @div_bad
  454. jmp @sdiv
  455. @div_bad:
  456. lda #$20
  457. jsr fail
  458. @sdiv: jsr cg_init
  459. EMIT_LDA V_SDIV_A
  460. EMIT_STA ar_a
  461. EMIT_LDA V_SDIV_A+1
  462. EMIT_STA ar_a+1
  463. EMIT_LDA V_SDIV_B
  464. EMIT_STA ar_b
  465. EMIT_LDA V_SDIV_B+1
  466. EMIT_STA ar_b+1
  467. EMIT_JSR ar_div_i16
  468. EMIT_STA V_SDIV_R
  469. EMIT_STX V_SDIV_R+1
  470. jsr cg_rts
  471. lda cg_err
  472. beq @sdiv_run
  473. lda #$40
  474. jsr fail
  475. jmp @divzero
  476. @sdiv_run:
  477. lda #$00
  478. jsr run_code
  479. bcs @sdiv_bad
  480. lda V_SDIV_R
  481. cmp #$F2
  482. bne @sdiv_bad
  483. lda V_SDIV_R+1
  484. cmp #$FF
  485. bne @sdiv_bad
  486. jmp @divzero
  487. @sdiv_bad:
  488. lda #$40
  489. jsr fail
  490. @divzero:
  491. lda #$00
  492. sta V_DIV_B
  493. sta V_DIV_B+1
  494. jsr cg_init
  495. EMIT_LDA V_DIV_A
  496. EMIT_STA ar_a
  497. EMIT_LDA V_DIV_A+1
  498. EMIT_STA ar_a+1
  499. EMIT_LDA V_DIV_B
  500. EMIT_STA ar_b
  501. EMIT_LDA V_DIV_B+1
  502. EMIT_STA ar_b+1
  503. EMIT_JSR ar_div_u16
  504. EMIT_STA V_DIV_R
  505. EMIT_STX V_DIV_R+1
  506. jsr cg_rts
  507. lda cg_err
  508. beq @dz_run
  509. lda #$80
  510. jsr fail
  511. jmp @finish
  512. @dz_run:
  513. lda #$00
  514. jsr run_code
  515. bcc @dz_bad
  516. lda ar_fault
  517. cmp #AR_FAULT_DIV0
  518. bne @dz_bad
  519. lda V_DIV_R
  520. ora V_DIV_R+1
  521. bne @dz_bad
  522. jmp @finish
  523. @dz_bad:
  524. lda #$80
  525. jsr fail
  526. ; ---------------------------------------------------- report
  527. @finish:
  528. lda V_DST
  529. sta MB_DATA+0
  530. lda V_CMP
  531. sta MB_DATA+1
  532. lda V_ADD_R
  533. sta MB_DATA+2
  534. lda V_ADD_R+1
  535. sta MB_DATA+3
  536. lda V_SUB_R
  537. sta MB_DATA+4
  538. lda V_SUB_R+1
  539. sta MB_DATA+5
  540. lda V_MUL_R
  541. sta MB_DATA+6
  542. lda ar_fault
  543. sta MB_DATA+7
  544. lda fail_mask
  545. sta MB_CODE
  546. lda #$00
  547. sta MB_CODE+1
  548. lda #MB_ST_FAIL
  549. ldx fail_mask
  550. bne @status
  551. lda #MB_ST_PASS
  552. @status:
  553. sta MB_STATUS
  554. ldy #$00
  555. @print: lda message,y
  556. beq @end
  557. sty print_y
  558. jsr CHROUT
  559. ldy print_y
  560. iny
  561. bne @print
  562. @end: plp
  563. rts
  564. ; A = code-buffer offset. Patch a JSR operand and run the snippet.
  565. run_code:
  566. clc
  567. adc #<cg_code
  568. sta @target+1
  569. lda #>cg_code
  570. adc #0
  571. sta @target+2
  572. @target:
  573. jsr $FFFF
  574. rts
  575. copy_golden:
  576. ldx #$00
  577. @copy: cpx golden_len
  578. beq @done
  579. lda cg_code,x
  580. sta golden_copy,x
  581. inx
  582. bne @copy
  583. @done: rts
  584. init_vars:
  585. lda #$5A
  586. sta V_SRC
  587. sta V_DST
  588. lda #$00
  589. sta V_WIDE
  590. sta V_WIDE+1
  591. sta V_CMP
  592. sta V_FLAG
  593. sta V_EVAL
  594. sta ar_fault
  595. lda #$34
  596. sta V_ADD_A
  597. lda #$12
  598. sta V_ADD_A+1
  599. lda #$ED
  600. sta V_ADD_B
  601. lda #$0F
  602. sta V_ADD_B+1
  603. lda #$00
  604. sta V_ADD_R
  605. sta V_ADD_R+1
  606. lda #$00
  607. sta V_SUB_A
  608. lda #$10
  609. sta V_SUB_A+1
  610. lda #$45
  611. sta V_SUB_B
  612. lda #$23
  613. sta V_SUB_B+1
  614. lda #$00
  615. sta V_SUB_R
  616. sta V_SUB_R+1
  617. lda #$05
  618. sta V_BYTE_A
  619. lda #$07
  620. sta V_BYTE_B
  621. lda #$2C
  622. sta V_MUL_A
  623. lda #$01
  624. sta V_MUL_A+1
  625. lda #$28
  626. sta V_MUL_B
  627. lda #$00
  628. sta V_MUL_B+1
  629. lda #$00
  630. sta V_MUL_R
  631. sta V_MUL_R+1
  632. lda #$E8
  633. sta V_DIV_A
  634. lda #$03
  635. sta V_DIV_A+1
  636. lda #$07
  637. sta V_DIV_B
  638. lda #$00
  639. sta V_DIV_B+1
  640. lda #$00
  641. sta V_DIV_R
  642. sta V_DIV_R+1
  643. lda #$9C
  644. sta V_SDIV_A
  645. lda #$FF
  646. sta V_SDIV_A+1
  647. lda #$07
  648. sta V_SDIV_B
  649. lda #$00
  650. sta V_SDIV_B+1
  651. lda #$00
  652. sta V_SDIV_R
  653. sta V_SDIV_R+1
  654. rts
  655. .segment "CODE"
  656. fail:
  657. ora fail_mask
  658. sta fail_mask
  659. rts
  660. .segment "RODATA"
  661. message: .byte "NOVA128 SCALAR TEST DONE", $0D, $00
  662. .segment "BSS"
  663. fail_mask: .res 1
  664. print_y: .res 1
  665. s2: .res 1
  666. s3: .res 1
  667. s4: .res 1
  668. s5: .res 1
  669. s6: .res 1
  670. s7: .res 1
  671. fix_eq: .res 1
  672. fix_ne: .res 1
  673. fix_lt: .res 1
  674. fix_le1: .res 1
  675. fix_le2: .res 1
  676. fix_le3: .res 1
  677. fix_gt1: .res 1
  678. fix_gt2: .res 1
  679. fix_ge: .res 1
  680. fix_and1: .res 1
  681. fix_and2: .res 1
  682. fix_or1: .res 1
  683. fix_or2: .res 1
  684. .export golden_len
  685. .export golden_copy
  686. golden_len: .res 1
  687. golden_copy: .res 256

Powered by TurnKey Linux.