rubixcuber

NES Networking

Dec 14th, 2020 (edited)
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.79 KB | None | 0 0
  1. ;;;
  2. ;;; Register addresses
  3. ;;;
  4. #org $40f0
  5. #var FIFO_DATA, 1
  6. #var FIFO_STATUS, 1
  7.  
  8. ;;; SRAM Table for Freezes
  9.  
  10. ;;; Format - FF AA AA VV MM SS WW CA CA CV CS CT XX XX XX XX
  11. ; 0 FF - Used flag/fingerprint - AB indicates valid in-use slot
  12. ; 1-2 AA - Address
  13. ; 3 VV - Value
  14. ; 4 MM - Mask
  15. ; 5 SS - Size
  16. ; 6 WW - Write Type
  17. ; 7-8 CA - Compare Address
  18. ; 9 CV - Compare Value
  19. ; A CS - Compare Size
  20. ; B CT - Compare Type
  21. ; C-F XX - Unused/Expansion
  22.  
  23. #org $7F00
  24. FreezeTable:
  25. #org $7F80
  26. FreezeScratch:
  27.  
  28. ;Non SRAM value to detect freeze table needing to be initialized
  29. #org $07FF
  30. FreezeInit:
  31.  
  32. #org $07FE
  33. CommReady:
  34.  
  35.  
  36. ;;;
  37. ;;; Variables in zero page to make code size small
  38. ;;;
  39. #org $cc ; cc-d2 appears to be unused? Should probably verify somehow.
  40. #var payloadOffset, 1
  41. #var payloadNewValue, 1
  42. #var payloadOldValue, 1
  43. #var payloadSize, 1
  44.  
  45. ;;;
  46. ;;; Well known and useful locations of game state
  47. ;;;
  48. #org $0657
  49. itemStateTable:
  50.  
  51. ;;;
  52. ;;; Bottom of stack area, used as scratch area to put code into from usb communications.
  53. ;;;
  54. #org $7FA0 ; $0100-010f is technically part of stack but appears to be used by game code a bunch
  55. codeScratchArea:
  56.  
  57. #org $0700
  58. messageReturn:
  59.  
  60.  
  61. ;;;
  62. ;;; The usb write message header. This never changes, so it can just sit in rom and be copied.
  63. ;;;
  64. #org $ed94, $1eda4, $C
  65. sendItemStateChangeMsgHeader:
  66. ; n8pro protocol header, '+', '+'^0xff, CMD_USB_WR, CMD_USB_WR^0xff, len in LE BO
  67. #byte '+', $2b ^ $ff, $22, $22 ^ $ff
  68. #byte 4, 0
  69. ; our header, 'i' for 'item'.
  70. #byte 'i'
  71. sendItemStateChangeMsgHeaderEnd:
  72.  
  73. ;;; address of the original nmi hook function
  74. #org $E484
  75. originalNMI:
  76.  
  77. ;;;
  78. ;;; nmi hook function to check for code dump from usb interface, loads code into ram and jumps to it
  79. ;;; it's up to the host to include code to signal that it has successfully handled the data
  80. ;;; by writing a completion message to the fifo.
  81. ;;;
  82. #org $ffc0, $1ffd0
  83. usbDataHook:
  84.  
  85. LDA #$0E ; NMI bank
  86. ;LDA #$05 ; main bank
  87. JSR $FFAC
  88. JMP usbMain
  89.  
  90. #org $B290, $1B2A0
  91. usbMain:
  92.  
  93.  
  94. lda FIFO_STATUS
  95. bmi .done
  96. cmp #$40 ; extra check for special value mesen returns for unknown registers so we don't break everything
  97. beq .done
  98. lda FIFO_DATA
  99. sta payloadSize
  100.  
  101. LDA #$AB
  102. STA CommReady
  103.  
  104. ldx #$0
  105. .loop:
  106. cpx payloadSize
  107. beq .done
  108.  
  109. .waitByteLoop:
  110. ;lda FIFO_STATUS
  111. ;bmi .waitByteLoop
  112. lda FIFO_DATA
  113. sta codeScratchArea,X
  114.  
  115. inx
  116. jmp .loop
  117.  
  118. .done:
  119.  
  120.  
  121. ;LDA #$1E
  122. ;STA $2001
  123.  
  124. jmp originalNMI
  125. ;JMP $6CC0
  126.  
  127.  
  128.  
  129.  
  130. ;;;
  131. ;;; rewrite nmi pointer to be the above function.
  132. ;;;
  133. #org $fffa, $2000a, 2
  134. nmiPointer:
  135. #word usbDataHook
  136.  
  137. ;Main routine hijack instead of NMI
  138. #org $ed89, $1ed99
  139. LDA #$0E
  140. JSR $FFAC
  141.  
  142. JSR MainFunc
  143. JMP MainEnd
  144.  
  145. #org $fae4, $1faf4
  146. MainEnd:
  147. LDA #$05 ; main bank
  148. JSR $FFAC
  149. JSR $B1E6
  150. JMP $6CC0
  151.  
  152. #org $B390, $1B3A0
  153. MainFunc:
  154.  
  155. LDA CommReady
  156. CMP #$AB
  157. BNE :+
  158.  
  159. JSR CommFunc
  160.  
  161. LDA #$00
  162. STA CommReady
  163. :
  164.  
  165. JSR ExecuteFreezes
  166.  
  167. JMP MainEnd
  168.  
  169. #org $BE90, $1BEA0, $31
  170. CommFunc:
  171. LDX #$00
  172. ;Read message ID
  173. LDA codeScratchArea,x
  174. STA $03
  175. INX
  176. ;Read action
  177. LDA codeScratchArea,x
  178. STA $04
  179. INX
  180.  
  181. ;system messages
  182. CMP #$FF
  183. BNE :+
  184. JMP NullMsg
  185. :
  186. CMP #$FE
  187. BNE :+
  188. JMP Version
  189. :
  190. ;All actions over 4 get sent to return
  191. CMP #$06
  192. BCC :+
  193. LDA #$05
  194. :
  195.  
  196. ;jump table for actions
  197. ASL
  198. TAY
  199. LDA Actions,y
  200. STA $00
  201. LDA Actions+1,y
  202. STA $01
  203. JMP ($0000)
  204.  
  205. #org $BD90, $1BDA0,$C
  206. Actions:
  207. #byte <Reads, >Reads, <ArrayReads, >ArrayReads
  208. #byte <Writes, >Writes, <ArrayWrites, >ArrayWrites
  209. #byte <Freeze, >Freeze, <CommReturn, >CommReturn
  210.  
  211. #org $BC90, $1BCA0
  212. Reads:
  213.  
  214. ;Read number of addresses
  215. LDA codeScratchArea,x
  216. STA $02
  217.  
  218. ;send N8/USB header stuff
  219. ldy #$00
  220. .headerLoop:
  221. lda sendItemStateChangeMsgHeader, y
  222. STA FIFO_DATA
  223. iny
  224. cpy #4
  225. bne .headerLoop
  226.  
  227. ;send message length
  228. LDA $02
  229. CLC
  230. ADC #$03
  231. STA FIFO_DATA
  232. LDA #$00
  233. STA FIFO_DATA
  234.  
  235. ;Our return header
  236. LDA #$20 ;static part
  237. STA FIFO_DATA
  238. LDA $03 ;message ID
  239. STA FIFO_DATA
  240. LDA $04 ;action (0)
  241. STA FIFO_DATA
  242.  
  243.  
  244.  
  245. LDY #$00
  246.  
  247. INX
  248.  
  249. ;loop through addresses sent
  250. :
  251. LDA codeScratchArea,x
  252. STA $00
  253. INX
  254. LDA codeScratchArea,x
  255. STA $01
  256. INX
  257.  
  258. ;use indirect addressing to read value with 00 as a pointer
  259. TYA
  260. PHA
  261. LDY #$00
  262. LDA ($00),Y
  263. STA FIFO_DATA
  264. PLA
  265. TAY
  266.  
  267. ;loop until reaching saved number of addresses
  268. INY
  269. CPY $02
  270. BNE :-
  271.  
  272.  
  273. CommReturn:
  274. RTS
  275.  
  276.  
  277. #org $BB90, $1BBA0
  278. ArrayReads:
  279.  
  280. ;Read array length
  281. LDA codeScratchArea,x
  282. STA $02
  283.  
  284. ;send N8/USB header stuff
  285. ldy #$00
  286. .headerLoop:
  287. lda sendItemStateChangeMsgHeader, y
  288. STA FIFO_DATA
  289. iny
  290. cpy #4
  291. bne .headerLoop
  292.  
  293. ;send message length
  294. LDA $02
  295. CLC
  296. ADC #$03
  297. STA FIFO_DATA
  298. LDA #$00
  299. STA FIFO_DATA
  300.  
  301. ;Our return header
  302. LDA #$20 ;static part
  303. STA FIFO_DATA
  304. LDA $03 ;message ID
  305. STA FIFO_DATA
  306. LDA $04 ;action (1)
  307. STA FIFO_DATA
  308.  
  309.  
  310.  
  311.  
  312. INX
  313.  
  314. ;store base address to pointer
  315.  
  316. LDA codeScratchArea,x
  317. STA $00
  318. INX
  319. LDA codeScratchArea,x
  320. STA $01
  321. INX
  322.  
  323. ;use indirect addressing to read value with 00 as a pointer
  324. LDY #$00
  325. :
  326. LDA ($00),Y
  327. STA FIFO_DATA
  328.  
  329.  
  330. ;loop until reaching array length
  331. INY
  332. CPY $02
  333. BNE :-
  334.  
  335. RTS
  336.  
  337.  
  338.  
  339. #org $BA90, $1BAA0
  340. Writes:
  341.  
  342. ;Read number of addresses
  343. LDA codeScratchArea,x
  344. STA $02
  345.  
  346. ;send N8/USB header stuff
  347. ldy #$00
  348. .headerLoop:
  349. lda sendItemStateChangeMsgHeader, y
  350. STA FIFO_DATA
  351. iny
  352. cpy #4
  353. bne .headerLoop
  354.  
  355. ;send message length
  356. LDA #$03
  357. STA FIFO_DATA
  358. LDA #$00
  359. STA FIFO_DATA
  360.  
  361. ;Our return header
  362. LDA #$20 ;static part
  363. STA FIFO_DATA
  364. LDA $03 ;message ID
  365. STA FIFO_DATA
  366. LDA $04 ;action (2)
  367. STA FIFO_DATA
  368.  
  369.  
  370. LDY #$00
  371.  
  372. INX
  373.  
  374. ;loop through addresses sent
  375. :
  376.  
  377. ;address
  378. LDA codeScratchArea,x
  379. STA $00
  380. INX
  381. LDA codeScratchArea,x
  382. STA $01
  383. INX
  384.  
  385. ;value
  386. LDA codeScratchArea,x
  387. STA $05
  388. INX
  389.  
  390.  
  391.  
  392. ;use indirect addressing to read value with 00 as a pointer
  393. TYA
  394. PHA
  395. LDY #$00
  396. LDA $05
  397. STA ($00),Y
  398. PLA
  399. TAY
  400.  
  401. ;loop until reaching saved number of addresses
  402. INY
  403. CPY $02
  404. BNE :-
  405.  
  406. RTS
  407.  
  408.  
  409. #org $B990, $1B9A0
  410. ArrayWrites:
  411.  
  412. ;Read array length
  413. LDA codeScratchArea,x
  414. STA $02
  415.  
  416. ;send N8/USB header stuff
  417. ldy #$00
  418. .headerLoop:
  419. lda sendItemStateChangeMsgHeader, y
  420. STA FIFO_DATA
  421. iny
  422. cpy #4
  423. bne .headerLoop
  424.  
  425. ;send message length
  426. LDA #$03
  427. STA FIFO_DATA
  428. LDA #$00
  429. STA FIFO_DATA
  430.  
  431. ;Our return header
  432. LDA #$20 ;static part
  433. STA FIFO_DATA
  434. LDA $03 ;message ID
  435. STA FIFO_DATA
  436. LDA $04 ;action (3)
  437. STA FIFO_DATA
  438.  
  439.  
  440. INX
  441.  
  442. ;store base address to pointer
  443. LDA codeScratchArea,x
  444. STA $00
  445. INX
  446. LDA codeScratchArea,x
  447. STA $01
  448. INX
  449.  
  450. ;use indirect addressing to read value with 00 as a pointer
  451. LDY #$00
  452. :
  453.  
  454. ;values
  455. LDA codeScratchArea,x
  456. INX
  457. STA ($00),Y
  458.  
  459. ;loop until reaching array length
  460. INY
  461. CPY $02
  462. BNE :-
  463.  
  464. RTS
  465.  
  466.  
  467.  
  468. #org $B490, $1B4A0
  469. Freeze:
  470.  
  471. ;size
  472. LDA codeScratchArea,x
  473. STA FreezeScratch+4
  474. INX
  475.  
  476. ;compare size
  477. LDA codeScratchArea,x
  478. STA FreezeScratch+9
  479. INX
  480.  
  481. ;address
  482. LDA codeScratchArea,x
  483. STA $00
  484. STA FreezeScratch
  485. INX
  486. LDA codeScratchArea,x
  487. STA $01
  488. STA FreezeScratch+1
  489. INX
  490.  
  491.  
  492.  
  493. ;value
  494. LDA codeScratchArea,x
  495. STA FreezeScratch+2
  496. INX
  497.  
  498. ;mask
  499. LDA codeScratchArea,x
  500. STA FreezeScratch+3
  501. INX
  502.  
  503.  
  504. ;write mode
  505. LDA codeScratchArea,x
  506. STA FreezeScratch+5
  507. INX
  508.  
  509. ;compare address
  510. LDA codeScratchArea,x
  511. STA FreezeScratch+6
  512. INX
  513. LDA codeScratchArea,x
  514. STA FreezeScratch+7
  515. INX
  516.  
  517. ;compare value
  518. LDA codeScratchArea,x
  519. STA FreezeScratch+8
  520. INX
  521.  
  522. ;compare type
  523. LDA codeScratchArea,x
  524. STA FreezeScratch+10
  525. INX
  526.  
  527. JSR FindFreezeAddr
  528. BCC .notfound
  529.  
  530. ;address exists in table
  531. LDA FreezeScratch+10
  532. BNE :+
  533.  
  534. ;Compare is never, erase freeze entry
  535. LDA #$01
  536. STA $05
  537. LDA #$00
  538. STA FreezeTable,x
  539. BEQ .finish
  540.  
  541. :
  542. ;overwrite existing entry
  543. JSR SaveFreeze
  544. LDA #$01
  545. STA $05
  546. SEC
  547. BCS .finish
  548.  
  549. .notfound:
  550.  
  551. JSR FindFreezeEmpty
  552. BCS :+
  553.  
  554. ;No empty slot
  555. LDA #$00
  556. STA $05
  557. BEQ .finish
  558.  
  559. :
  560. JSR SaveFreeze
  561. LDA #$01
  562. STA $05
  563.  
  564. .finish:
  565.  
  566. ;send N8/USB header stuff
  567. ldy #$00
  568. .headerLoop:
  569. lda sendItemStateChangeMsgHeader, y
  570. STA FIFO_DATA
  571. iny
  572. cpy #4
  573. bne .headerLoop
  574.  
  575. ;send message length
  576. LDA #$04
  577. STA FIFO_DATA
  578. LDA #$00
  579. STA FIFO_DATA
  580.  
  581. ;Our return header
  582. LDA #$20 ;static part
  583. STA FIFO_DATA
  584. LDA $03 ;message ID
  585. STA FIFO_DATA
  586. LDA $04 ;action (04)
  587. STA FIFO_DATA
  588. LDA $05 ;success
  589. STA FIFO_DATA
  590.  
  591. RTS
  592.  
  593. ;Looks for Address matching $00,$01 - sets X to that slot and sets carry if found, otherwise clear carry
  594. FindFreezeAddr:
  595. LDX #$00
  596. :
  597. LDA FreezeTable,x
  598. CMP #$AB
  599. BNE :+
  600. LDA FreezeTable+1,x
  601. CMP $00
  602. BNE :+
  603. LDA FreezeTable+2,x
  604. CMP $01
  605. BNE :+
  606. SEC
  607. RTS
  608. :
  609. TXA
  610. CLC
  611. ADC #$10
  612. TAX
  613. CMP #$80
  614. BNE :--
  615. CLC
  616. RTS
  617.  
  618. ;Looks for unused slot - sets X to that slot and sets carry if found, otherwise clear carry
  619. FindFreezeEmpty:
  620. LDX #$00
  621. :
  622. LDA FreezeTable,x
  623. CMP #$AB
  624. BEQ :+
  625. SEC
  626. RTS
  627. :
  628. TXA
  629. CLC
  630. ADC #$10
  631. TAX
  632. CMP #$80
  633. BNE :--
  634. CLC
  635. RTS
  636.  
  637. ;Copies the incoming values into the current freeze slot pointed to in X
  638. SaveFreeze:
  639.  
  640. LDA #$AB
  641. STA FreezeTable,x
  642. INX
  643.  
  644. LDY #$00
  645. :
  646. LDA FreezeScratch,y
  647. STA FreezeTable,x
  648. INX
  649. INY
  650. CPY #$0B
  651. BNE :-
  652. RTS
  653.  
  654. ;loops over freeze table, tests compares and then calls writes
  655. ExecuteFreezes:
  656.  
  657. LDA FreezeInit
  658. CMP #$AB
  659. BEQ :+
  660.  
  661. LDA #$AB
  662. STA FreezeInit
  663.  
  664. LDA #$00
  665. STA FreezeTable
  666. STA FreezeTable+$10
  667. STA FreezeTable+$20
  668. STA FreezeTable+$30
  669. STA FreezeTable+$40
  670. STA FreezeTable+$50
  671. STA FreezeTable+$60
  672. STA FreezeTable+$70
  673. :
  674.  
  675. LDX #$00
  676. :
  677. LDA FreezeTable,x
  678. CMP #$AB
  679. BNE :+
  680.  
  681. JSR TestCompare
  682. BCC :+
  683.  
  684. JSR FreezeWrite
  685.  
  686. :
  687. TXA
  688. CLC
  689. ADC #$10
  690. TAX
  691. CMP #$80
  692. BNE :--
  693. CLC
  694.  
  695.  
  696. RTS
  697.  
  698.  
  699. ;public enum CompareType : byte
  700. ;{
  701. ; Never = 0x00,
  702. ; Equal = 0x01,
  703. ; NotEqual = 0x02,//6,A,C,E
  704. ; Always = 0x03,//7,B,D,F
  705. ; GreaterThan = 0x04,
  706. ; GreaterThanOrEqual = 0x05,
  707. ; LessThan = 0x08,
  708. ; LessThanOrEqual = 0x09,
  709. ; NotLessThan = 0x05,
  710. ; NotGreaterThan = 0x09,
  711. ;
  712. ; MaskSet = 0x11,
  713. ; MaskUnset = 0x12,
  714. ;
  715. ;}
  716.  
  717. ;performs the comparison check for the current freeze and sets carry if valid
  718. TestCompare:
  719. ;Get current value
  720. LDA FreezeTable+7,x
  721. STA $00
  722. LDA FreezeTable+8,x
  723. STA $01
  724.  
  725. LDY #$00
  726. LDA ($00),y
  727. STA $02
  728.  
  729. LDA FreezeTable+$B,x
  730. CMP #$01
  731. BNE :+
  732.  
  733. ;Equal
  734. LDA $02
  735. CMP FreezeTable+9,x
  736. BEQ Success
  737. BNE .fail
  738.  
  739. :
  740. CMP #$02
  741. BNE :+
  742.  
  743. ;NotEqual
  744. LDA $02
  745. CMP FreezeTable+9,x
  746. BNE Success
  747. BEQ .fail
  748.  
  749. :
  750. CMP #$03
  751. ;Always
  752. BEQ Success
  753. CMP #$04
  754. BNE :+
  755.  
  756. ;GreaterThan
  757. LDA $02
  758. CMP FreezeTable+9,x
  759. BEQ .fail
  760. BCS Success
  761. BCC .fail
  762.  
  763. :
  764. CMP #$05
  765. BNE :+
  766. ;GreaterThanOrEqual
  767. LDA $02
  768. CMP FreezeTable+9,x
  769. BCC .fail
  770. BCS Success
  771.  
  772. :
  773. CMP #$08
  774. BNE :+
  775.  
  776. ;LessThan
  777. LDA $02
  778. CMP FreezeTable+9,x
  779. BCS .fail
  780. BCC Success
  781. :
  782. CMP #$09
  783. BNE :+
  784.  
  785. ;LessThanOrEqual
  786. LDA $02
  787. CMP FreezeTable+9,x
  788. BEQ Success
  789. BCS .fail
  790. BCC Success
  791. :
  792.  
  793. .fail:
  794. CLC
  795. RTS
  796.  
  797. Success:
  798. SEC
  799. RTS
  800.  
  801. ;public enum WriteType : byte
  802. ;{
  803. ; None = 0,
  804. ; WriteValue = 1,
  805. ; IncrementBy = 2,
  806. ; DecrementBy = 3,
  807. ; WriteMasked = 4,
  808. ;}
  809.  
  810. FreezeWrite:
  811.  
  812. LDA FreezeTable+1,x
  813. STA $00
  814. LDA FreezeTable+2,x
  815. STA $01
  816.  
  817. LDA FreezeTable+6,x
  818. BNE :+
  819.  
  820. ;None
  821. RTS
  822.  
  823. :
  824. CMP #$01
  825. BNE :+
  826.  
  827. ;WriteValue
  828. LDY #$00
  829. LDA FreezeTable+3,x
  830. STA ($00),y
  831. RTS
  832.  
  833. :
  834. CMP #$02
  835. BNE :+
  836.  
  837. ;IncrementBy
  838. LDY #$00
  839. LDA ($00),y
  840. CLC
  841. ADC FreezeTable+3,x
  842. STA ($00),y
  843. RTS
  844.  
  845. :
  846. CMP #$03
  847. BNE :+
  848.  
  849. ;DecrementBy
  850. LDY #$00
  851. LDA ($00),y
  852. SEC
  853. SBC FreezeTable+3,x
  854. STA ($00),y
  855. RTS
  856.  
  857. :
  858. CMP #$04
  859. BNE :+
  860.  
  861. ;WriteMasked
  862. LDA FreezeTable+4,x
  863. STA $03
  864. AND FreezeTable+3,x
  865. STA $02
  866.  
  867. LDA $03
  868. EOR #$FF
  869. STA $03
  870.  
  871. LDY #$00
  872. LDA ($00),y
  873. AND $03
  874. ORA $02
  875. STA ($00),y
  876.  
  877.  
  878. :
  879.  
  880. RTS
  881.  
  882. #org $B910, $1B920
  883. Version:
  884. ;send N8/USB header stuff
  885. ldy #$00
  886. .headerLoop:
  887. lda sendItemStateChangeMsgHeader, y
  888. STA FIFO_DATA
  889. iny
  890. cpy #4
  891. bne .headerLoop
  892.  
  893. ;send message length
  894. LDA #$08
  895. STA FIFO_DATA
  896. LDA #$00
  897. STA FIFO_DATA
  898.  
  899. ;Our return header
  900. LDA #$20 ;static part
  901. STA FIFO_DATA
  902. LDA $03 ;message ID
  903. STA FIFO_DATA
  904. LDA $04 ;action (FE)
  905. STA FIFO_DATA
  906.  
  907. ;version number
  908. LDA #$00
  909. STA FIFO_DATA
  910. LDA #$00
  911. STA FIFO_DATA
  912.  
  913. ;max read size
  914. LDA #$10
  915. STA FIFO_DATA
  916. ;max write size
  917. LDA #$10
  918. STA FIFO_DATA
  919. ;max freezes
  920. LDA #$08
  921. STA FIFO_DATA
  922. RTS
  923.  
  924.  
  925. #org $B890, $1B8A0
  926. NullMsg:
  927. ;send N8/USB header stuff
  928. ldy #$00
  929. .headerLoop:
  930. lda sendItemStateChangeMsgHeader, y
  931. STA FIFO_DATA
  932. iny
  933. cpy #4
  934. bne .headerLoop
  935.  
  936. ;send message length
  937. LDA #$03
  938. STA FIFO_DATA
  939. LDA #$00
  940. STA FIFO_DATA
  941.  
  942. ;Our return header
  943. LDA #$20 ;static part
  944. STA FIFO_DATA
  945. LDA $03 ;message ID
  946. STA FIFO_DATA
  947. LDA $04 ;action (FF)
  948. STA FIFO_DATA
  949.  
  950. RTS
  951.  
Add Comment
Please, Sign In to add comment