Advertisement
Guest User

PIC-PONG.ASM V3.01

a guest
Dec 19th, 2012
265
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 58.14 KB | None | 0 0
  1. ;---------------------------------------------------;
  2. ;---------------------------------------------------;
  3. ; Name: PIC-PONG.ASM ;
  4. ; Use: DTI's version of the PONG game ;
  5. ;---------------------------------------------------;
  6. ; Copyright: (C)2012 DTI ;
  7. ; Dysfunctional Technologies, Inc. ;
  8. ; All Rights Reserved ;
  9. ;---------------------------------------------------;
  10. ; Author: Timothy S. Carlson ;
  11. ; Dysfunctional Technologies, Inc. ;
  12. ; Date: December 18, 2012 ;
  13. ; Version: V3.01 ;
  14. ;---------------------------------------------------;
  15. ; VERSION LOG: ;
  16. ; V3.00: Modified characters, character placement, ;
  17. ; and field to look more like the real PONG ;
  18. ; V3.01: Renamed to PIC-PONG ;
  19. ; Added 64x224 mode for copyright message ;
  20. ; Added piezo speaker for sounds ;
  21. ; Added ball 'slow-down' method ;
  22. ; Added special dot to field as court divider;
  23. ;---------------------------------------------------;
  24. ;---------------------------------------------------;
  25. #DEFINE _PONG.ASM_ ;
  26. #DEFINE _MAIN_MODULE_ ;
  27. ;---------------------------------------------------;
  28. #DEFINE _USE_THUMBSTICKS_ ;
  29. ;---------------------------------------------------;
  30.  
  31. ;---------------------------------------------------;
  32. ; Includes ;
  33. ;---------------------------------------------------;
  34. #INCLUDE Common.INC ;
  35. ;---------------------------------------------------;
  36.  
  37. ;---------------------------------------------------;
  38. ; Macros ;
  39. ;---------------------------------------------------;
  40. DELAY MACRO DTIME ;
  41. MOVLW DTIME ;
  42. MOVWF DTemp ;
  43. DECFSZ DTemp, F ;
  44. GOTO $-1 ;
  45. ENDM ;
  46. ;
  47. DO_BIT MACRO THISBIT, NOPS ;
  48. BTFSC INDF1, THISBIT ;
  49. BSF PORTA, VIDEO_0_BIT ;
  50. BTFSS INDF1, THISBIT ;
  51. BCF PORTA, VIDEO_0_BIT ;
  52. #IF NOPS > 0 ;
  53. NOP ;
  54. #ENDIF ;
  55. #IF NOPS > 1 ;
  56. NOP ;
  57. #ENDIF ;
  58. #IF NOPS > 2 ;
  59. NOP ;
  60. #ENDIF ;
  61. #IF NOPS > 3 ;
  62. NOP ;
  63. #ENDIF ;
  64. #IF NOPS > 4 ;
  65. NOP ;
  66. #ENDIF ;
  67. #IF NOPS > 5 ;
  68. NOP ;
  69. #ENDIF ;
  70. #IF NOPS > 6 ;
  71. NOP ;
  72. #ENDIF ;
  73. #IF NOPS > 7 ;
  74. NOP ;
  75. #ENDIF ;
  76. #IF NOPS > 8 ;
  77. NOP ;
  78. #ENDIF ;
  79. #IF NOPS > 9 ;
  80. NOP ;
  81. #ENDIF ;
  82. ENDM ;
  83. ;
  84. SET_SIGNAL MACRO COLOR ;
  85. MOVFW PORTA ;
  86. ANDLW VIDEO_MASK ;
  87. IORLW COLOR ;
  88. MOVWF PORTA ;
  89. ENDM ;
  90. ;
  91. NEG_SYNC_4US MACRO ;
  92. ;-----------------------------------------------;
  93. ; 4us Negative Sync Generation ;
  94. ;-----------------------------------------------;
  95. SET_SIGNAL COLOR_SYNC ;
  96. BTFSS System_Status, BUZZ_BIT ;
  97. GOTO $+16 ;
  98. DECFSZ Buzz_Count, F ;
  99. GOTO $+16 ;
  100. MOVFW Buzz_Reload ;
  101. MOVWF Buzz_Count ;
  102. BANKSEL TRISA ;
  103. BCF TRISA, RBUTT_BIT ; Set as OUTPUT
  104. BANKSEL MEMORY ;
  105. MOVLW RBUTT ;
  106. XORWF PORTA, F ;
  107. DECFSZ Buzz_Dur_LO, F ;
  108. GOTO $+16 ;
  109. DECFSZ Buzz_Dur_HI, F ;
  110. GOTO $+16 ;
  111. BCF System_Status, BUZZ_BIT ;
  112. GOTO $+15 ;
  113. NOP ;
  114. NOP ;
  115. NOP ;
  116. NOP ;
  117. NOP ;
  118. NOP ;
  119. NOP ;
  120. NOP ;
  121. NOP ;
  122. NOP ;
  123. NOP ;
  124. NOP ;
  125. NOP ;
  126. NOP ;
  127. MOVLW 3 ;
  128. MOVWF DTemp ;
  129. DECFSZ DTemp, F ;
  130. GOTO $-1 ;
  131. NOP ;
  132. ;-----------------------------------------------;
  133. ENDM ;
  134. ;
  135. NEG_SYNC_2US MACRO ;
  136. ;-----------------------------------------------;
  137. ; 2us Negative Sync Generation ;
  138. ;-----------------------------------------------;
  139. SET_SIGNAL COLOR_SYNC ;
  140. MOVLW 3 ;
  141. MOVWF DTemp ;
  142. DECFSZ DTemp, F ;
  143. GOTO $-1 ;
  144. NOP ;
  145. NOP ;
  146. ;-----------------------------------------------;
  147. ENDM ;
  148. ;
  149. POS_SYNC_2US MACRO ;
  150. ;-----------------------------------------------;
  151. ; 2us Positive Sync Generation ;
  152. ;-----------------------------------------------;
  153. SET_SIGNAL COLOR_BLACK ;
  154. MOVLW 3 ;
  155. MOVWF DTemp ;
  156. DECFSZ DTemp, F ;
  157. GOTO $-1 ;
  158. NOP ;
  159. NOP ;
  160. ;-----------------------------------------------;
  161. ENDM ;
  162. ;
  163. ;---------------------------------------------------;
  164.  
  165. ;---------------------------------------------------;
  166. ; Defines ;
  167. ;---------------------------------------------------;
  168. #IFDEF _USE_THUMBSTICKS_ ;
  169. #DEFINE RJOY H'01' ;
  170. #DEFINE RJOY_BIT 0 ; GPIO 0 - PIN 7
  171. #DEFINE RBUTT H'02' ;
  172. #DEFINE RBUTT_BIT 1 ; GPIO 1 - PIN 6
  173. #DEFINE LJOY H'04' ;
  174. #DEFINE LJOY_BIT 2 ; GPIO 2 - PIN 5
  175. #DEFINE LBUTT H'08' ;
  176. #DEFINE LBUTT_BIT 3 ; GPIO 3 - PIN 4
  177. #ELSE ;!_USE_THUMBSTICKS_ ;
  178. #DEFINE RBUTT_1 H'01' ;
  179. #DEFINE RBUTT_1_BIT 0 ; GPIO 0 - PIN 7
  180. #DEFINE RBUTT_2 H'02' ;
  181. #DEFINE RBUTT_2_BIT 1 ; GPIO 1 - PIN 6
  182. #DEFINE LBUTT_2 H'04' ;
  183. #DEFINE LBUTT_2_BIT 2 ; GPIO 2 - PIN 5
  184. #DEFINE LBUTT_1 H'08' ;
  185. #DEFINE LBUTT_1_BIT 3 ; GPIO 3 - PIN 4
  186. #ENDIF ;_USE_THUMBSTICKS_ ;
  187. ;
  188. #DEFINE VIDEO_1 H'10' ; 1K ohm
  189. #DEFINE VIDEO_1_BIT 4 ; GPIO 5 - PIN 2
  190. #DEFINE VIDEO_0 H'20' ; 470 ohm
  191. #DEFINE VIDEO_0_BIT 5 ; GPIO 4 - PIN 3
  192. ;
  193. #DEFINE VIDEO_MASK H'CF' ;
  194. #DEFINE COLOR_WHITE (VIDEO_0 + VIDEO_1) ;
  195. #DEFINE COLOR_BLACK VIDEO_1 ;
  196. #DEFINE COLOR_SYNC 0 ;
  197. #DEFINE MAX_LINES 56 ;
  198. #DEFINE DRAW_BALL_BIT 0 ;
  199. #DEFINE MAX_BALL_WAIT 3 ;
  200. #DEFINE VIDEO_BUFFER_START H'2010' ;
  201. #DEFINE LEFT_SCORE_START H'01' ;
  202. #DEFINE RIGHT_SCORE_START H'02' ;
  203. #DEFINE LEFT_PADDLE_START H'00' ;
  204. #DEFINE LEFT_PADDLE_BIT H'40' ;
  205. #DEFINE LEFT_PADDLE_MASK H'BF' ;
  206. #DEFINE RIGHT_PADDLE_START H'03' ;
  207. #DEFINE RIGHT_PADDLE_BIT H'02' ;
  208. #DEFINE RIGHT_PADDLE_MASK H'FD' ;
  209. #DEFINE PADDLE_SIZE 8 ;
  210. ;---------------------------------------------------;
  211.  
  212. ;---------------------------------------------------;
  213. USER_DATA_1 UDATA H'020' ;
  214. ;---------------------------------------------------;
  215. Ball_X res 1 ; 20
  216. Ball_Y res 1 ; 21
  217. Ball_Dir_X res 1 ; 22
  218. Ball_Dir_Y res 1 ; 23
  219. Paddle_1_Y res 1 ; 24
  220. Paddle_2_Y res 1 ; 25
  221. Score_1 res 1 ; 26
  222. Score_2 res 1 ; 27
  223. Ball_Wait res 1 ; 29
  224. #DEFINE BUZZ H'01' ;
  225. #DEFINE BUZZ_BIT 0 ;
  226. System_Status res 1 ; 28
  227. ;---------------------------------------------------;
  228. USER_DATA_2 UDATA_SHR H'070' ;
  229. ;---------------------------------------------------;
  230. Temp1 res 1 ; 70
  231. Temp2 res 1 ; 71
  232. DTemp res 1 ; 72
  233. DL_Count res 1 ; 73
  234. Line_Data res 4 ; 74-77
  235. Byte_Count res 1 ; 78
  236. Repeat_Count res 1 ; 79
  237. Buzz_Count res 1 ; 7A
  238. Buzz_Reload res 1 ; 7B
  239. Buzz_Dur_HI res 1 ; 7C
  240. Buzz_Dur_LO res 1 ; 7D
  241. ;---------------------------------------------------;
  242.  
  243. ;---------------------------------------------------;
  244. RESET_VECT CODE H'000' ;
  245. ;---------------------------------------------------;
  246. CALL _Initialize_System ;
  247. NOP ;
  248. NOP ;
  249. GOTO _MAIN ;
  250. ;---------------------------------------------------;
  251.  
  252. ;---------------------------------------------------;
  253. USER_CODE_1 CODE H'004' ;
  254. ;---------------------------------------------------;
  255. _MAIN: ;
  256. ;---------------------------------------------------;
  257. GOTO _Next_Frame ;
  258. ;---------------------------------------------------;
  259.  
  260. ;---------------------------------------------------;
  261. _Next_Frame: ;
  262. ;---------------------------------------------------;
  263. ;-----------------------------------------------;
  264. ; VERTICAL SYNC PULSE Time ;
  265. ; This consists of 5 blank half lines, ;
  266. ; 4 inverted half lines, and 5 more blank half ;
  267. ; lines. This totals 12 full lines of 64us each.;
  268. ; --------------------------------------------- ;
  269. ; NOTE: Timing is CRITICAL for a nice, clean ;
  270. ; display. If you notice the top part of the ;
  271. ; display is skewed or "tearing", your timings ;
  272. ; are wrong and need to be adjusted. Make sure ;
  273. ; you haven't inadvertently dropped a half frame;
  274. ;-----------------------------------------------;
  275. CALL _Blank_Half_Line ;
  276. CALL _Blank_Half_Line ;
  277. CALL _Blank_Half_Line ;
  278. CALL _Blank_Half_Line ;
  279. ;
  280. CALL _Transition_Half_Line ;
  281. ;
  282. CALL _Inverted_Half_Line ;
  283. CALL _Inverted_Half_Line ;
  284. CALL _Special_Half_Line ;
  285. ;
  286. CALL _Blank_Half_Line ;
  287. CALL _Blank_Half_Line ;
  288. CALL _Blank_Half_Line ;
  289. CALL _Blank_Half_Line ;
  290. CALL _Blank_Half_Line ;
  291. NOP ;
  292. ;-----------------------------------------------;
  293. ;
  294. ;-----------------------------------------------;
  295. ; Just a bunch of BLANK LINES, so that the video;
  296. ; data doesn't start in the non-display area. ;
  297. ; Add or remove lines to adjust the verticle ;
  298. ; position of your video. If you add or remove, ;
  299. ; make sure to adjust the number of BLANK LINES ;
  300. ; which follow the data lines, so that the video;
  301. ; stays at 60hz ;
  302. ;-----------------------------------------------;
  303. MOVLW 15 ;
  304. MOVWF Temp1 ;
  305. CALL _Blank_Line ;
  306. DECFSZ Temp1, F ;
  307. GOTO $-2 ;
  308. ;
  309. ;-----------------------------------------------;
  310. ; 224 Data lines ;
  311. ;-----------------------------------------------;
  312. CALL _Data_Lines ;
  313. ;
  314. ;-----------------------------------------------;
  315. ; Another 8 blank lines. So, to summarize: ;
  316. ; (note - I needed four full 60us frames for ;
  317. ; the game processing (paddles, ball, scores, ;
  318. ; etc.), so I moved four blank line there for ;
  319. ; use for those routines) ;
  320. ; ;
  321. ; - 12 VERTICAL SYNC lines ;
  322. ; - 21 BLANK LINES ;
  323. ; - 224 DATA LINES ;
  324. ; - 8 BLANK LINES ;
  325. ; ;
  326. ; For a total of 265 lines at 64us each, or ;
  327. ; 16.96ms, or approximately 60hz. 16.6666ms ;
  328. ; would be _perfect_. ;
  329. ;-----------------------------------------------;
  330. ; MOVLW 2 ;
  331. ; MOVWF Temp1 ;
  332. ; CALL _Blank_Line ;
  333. ; DECFSZ Temp1, F ;
  334. ; GOTO $-2 ;
  335. ;-----------------------------------------------;
  336. ;
  337. CALL _Copyright ; 8 blank FULL line (60us)
  338. NOP ;
  339. NOP ;
  340. ;-----------------------------------------------;
  341. ; All of the game processing is done here, the ;
  342. ; last 4 full 60us blank lines ;
  343. ;-----------------------------------------------;
  344. CALL _Update_Ball ; 1 blank FULL line (60us)
  345. CALL _Update_Scores ; 1 blank FULL line (60us)
  346. CALL _Update_Paddle_1 ; 1 blank FULL line (60us)
  347. CALL _Update_Paddle_2 ; 1 blank FULL line (60us)
  348. ;-----------------------------------------------;
  349. ;
  350. GOTO _Next_Frame ;
  351. ;---------------------------------------------------;
  352. ;
  353. ;---------------------------------------------------;
  354. _Data_Lines: ;
  355. ;---------------------------------------------------;
  356. ; NOP ;
  357. ;-----------------------------------------------;
  358. ; 4us Negative Sync Generation ;
  359. ;-----------------------------------------------;
  360. NEG_SYNC_4US ;
  361. ;-----------------------------------------------;
  362. SET_SIGNAL COLOR_BLACK ;
  363. ;
  364. MOVLW MAX_LINES ;
  365. MOVWF DL_Count ;
  366. ;
  367. MOVLW LOW VIDEO_BUFFER_START ;
  368. MOVWF FSR1L ;
  369. MOVLW HIGH VIDEO_BUFFER_START ;
  370. MOVWF FSR1H ;
  371. ;
  372. ;-----------------------------------------------;
  373. ; 60us Black Signal Generation ;
  374. ;-----------------------------------------------;
  375. DELAY 155 ;
  376. NOP ;
  377. NOP ;
  378. ;-----------------------------------------------;
  379. ;
  380. _DL_Next_Line: ;
  381. MOVLW 4 ;
  382. MOVWF Repeat_Count ;
  383. _DL_Repeat_Line: ;
  384. ;-----------------------------------------------;
  385. ; 4us Negative Sync Generation ;
  386. ;-----------------------------------------------;
  387. NEG_SYNC_4US ;
  388. ;-----------------------------------------------;
  389. ;
  390. ;-----------------------------------------------;
  391. ; Front porch - shifts the data to the right ;
  392. ; and hopefully centers it on the screen ;
  393. ; --------------------------------------------- ;
  394. ; NOTE: a DELAY 12 produces a nice 7.5us porch ;
  395. ;-----------------------------------------------;
  396. SET_SIGNAL COLOR_BLACK ;
  397. DELAY 15 ;
  398. ;-----------------------------------------------;
  399. ;
  400. MOVLW H'FC' ;
  401. ANDWF FSR1L, F ;
  402. MOVLW 4 ;
  403. MOVWF Byte_Count ;
  404. _DL_Next_Byte: ;
  405. ;-----------------------------------------------;
  406. ; This is where the 32 bits of data are actually;
  407. ; send out over the video signal ;
  408. ;-----------------------------------------------;
  409. DO_BIT 7, 8 ;
  410. DO_BIT 6, 8 ;
  411. DO_BIT 5, 8 ;
  412. DO_BIT 4, 8 ;
  413. DO_BIT 3, 8 ;
  414. DO_BIT 2, 8 ;
  415. DO_BIT 1, 8 ;
  416. DO_BIT 0, 1 ;
  417. ;
  418. ADDFSR FSR1, 1 ;
  419. ;
  420. _DL_Center_Line: ;
  421. MOVLW 3 ;
  422. XORWF Byte_Count, W ;
  423. BTFSS STATUS, Z ;
  424. GOTO _DL_Center_Line_Done ;
  425. NOP ;
  426. NOP ;
  427. NOP ;
  428. BCF PORTA, VIDEO_0_BIT ;
  429. NOP ;
  430. NOP ;
  431. NOP ;
  432. NOP ;
  433. BSF PORTA, VIDEO_0_BIT ;
  434. NOP ;
  435. BCF PORTA, VIDEO_0_BIT ;
  436. _DL_Center_Line_Done: ;
  437. ;
  438. DECFSZ Byte_Count, F ;
  439. GOTO _DL_Next_Byte ;
  440. DECF FSR1L, F ;
  441. ;-----------------------------------------------;
  442. ;
  443. ;-----------------------------------------------;
  444. ; Back porch - between this and the front porch,;
  445. ; this 'frames' the video on your TV (hopefully);
  446. ; --------------------------------------------- ;
  447. ; NOTE: a DELAY 8 (plus a NOP) produces a ;
  448. ; nice 4.5us back porch, which fleshes out the ;
  449. ; data line to 60us ;
  450. ;-----------------------------------------------;
  451. SET_SIGNAL COLOR_BLACK ;
  452. DELAY 2 ;
  453. NOP ;
  454. NOP ;
  455. ; NOP ;
  456. ; NOP ;
  457. ; NOP ;
  458. ; NOP ;
  459. ; NOP ;
  460. ;-----------------------------------------------;
  461. ;
  462. DECFSZ Repeat_Count, F ;
  463. GOTO $+2 ;
  464. GOTO _DL_Next_Data ;
  465. ; NOP ;
  466. ; NOP ;
  467. ; NOP ;
  468. NOP ;
  469. NOP ;
  470. NOP ;
  471. NOP ;
  472. NOP ;
  473. NOP ;
  474. GOTO _DL_Repeat_Line ;
  475. ;
  476. ;-----------------------------------------------;
  477. ; 224 lines of information to transmit ;
  478. ; so the screen size is 32x224. But we transmit ;
  479. ; each line 4 times, so it's actually 32x56 ;
  480. ;-----------------------------------------------;
  481. _DL_Next_Data: ;
  482. NOP ;
  483. ADDFSR FSR1, 1 ;
  484. DECFSZ DL_Count, F ;
  485. GOTO _DL_Next_Line ;
  486. ;
  487. NOP ;
  488. NOP ;
  489. NOP ;
  490. NOP ;
  491. ;-----------------------------------------------;
  492. ; 4us Negative Sync Generation ;
  493. ;-----------------------------------------------;
  494. NEG_SYNC_4US ;
  495. ;-----------------------------------------------;
  496. ;
  497. ;-----------------------------------------------;
  498. ; 60us Black Signal Generation ;
  499. ;-----------------------------------------------;
  500. SET_SIGNAL COLOR_BLACK ;
  501. DELAY 154 ;
  502. NOP ;
  503. ;
  504. ;-----------------------------------------------;
  505. ;
  506. RETURN ;
  507. ;---------------------------------------------------;
  508.  
  509. ;---------------------------------------------------;
  510. _Blank_Line: ;
  511. ;---------------------------------------------------;
  512. ;-----------------------------------------------;
  513. ; 4us Negative Sync Generation ;
  514. ;-----------------------------------------------;
  515. NEG_SYNC_4US ;
  516. ;-----------------------------------------------;
  517. ;
  518. ;-----------------------------------------------;
  519. ; 60us Black Signal Generation ;
  520. ;-----------------------------------------------;
  521. SET_SIGNAL COLOR_BLACK ;
  522. DELAY 156 ;
  523. ;-----------------------------------------------;
  524. ;
  525. RETURN ;
  526. ;---------------------------------------------------;
  527.  
  528. ;---------------------------------------------------;
  529. _Transition_Half_Line: ;
  530. ;---------------------------------------------------;
  531. NOP ;
  532. NOP ;
  533. NOP ;
  534. ;-----------------------------------------------;
  535. ; 2us Negative Sync Generation ;
  536. ;-----------------------------------------------;
  537. NEG_SYNC_2US ;
  538. ;-----------------------------------------------;
  539. ;
  540. ;-----------------------------------------------;
  541. ; 30us Blank Signal Generation ;
  542. ;-----------------------------------------------;
  543. SET_SIGNAL COLOR_BLACK ;
  544. DELAY 73 ;
  545. ;-----------------------------------------------;
  546. ;
  547. ;-----------------------------------------------;
  548. ; 2s Positive Sync Generation ;
  549. ;-----------------------------------------------;
  550. POS_SYNC_2US ;
  551. ;-----------------------------------------------;
  552. ;
  553. ;-----------------------------------------------;
  554. ; 30us Inverted Signal Generation ;
  555. ;-----------------------------------------------;
  556. SET_SIGNAL COLOR_SYNC ;
  557. DELAY 77 ;
  558. ;-----------------------------------------------;
  559. ;
  560. RETURN ;
  561. ;---------------------------------------------------;
  562.  
  563. ;---------------------------------------------------;
  564. _Inverted_Half_Line: ;
  565. ;---------------------------------------------------;
  566. ;-----------------------------------------------;
  567. ; 2s Positive Sync Generation ;
  568. ;-----------------------------------------------;
  569. POS_SYNC_2US ;
  570. ;-----------------------------------------------;
  571. ;
  572. ;-----------------------------------------------;
  573. ; 30us Inverted Signal Generation ;
  574. ;-----------------------------------------------;
  575. SET_SIGNAL COLOR_SYNC ;
  576. DELAY 77 ;
  577. ;-----------------------------------------------;
  578. ;
  579. RETURN ;
  580. ;---------------------------------------------------;
  581.  
  582. ;---------------------------------------------------;
  583. _Special_Half_Line: ;
  584. ;---------------------------------------------------;
  585. ;-----------------------------------------------;
  586. ; 2us Positive Sync Generation ;
  587. ;-----------------------------------------------;
  588. POS_SYNC_2US ;
  589. ;-----------------------------------------------;
  590. ;
  591. ;-----------------------------------------------;
  592. ; 30us Sync Signal Generation (SPECIAL) ;
  593. ;-----------------------------------------------;
  594. SET_SIGNAL COLOR_SYNC ;
  595. ;
  596. BANKSEL OPTION_REG ;
  597. BSF OPTION_REG, PSA ;
  598. BANKSEL TMR0 ;
  599. CLRF TMR0 ;
  600. ;
  601. BANKSEL TRISA ;
  602. BCF TRISA, 2 ;
  603. BANKSEL PORTA ;
  604. BCF PORTA, 2 ;
  605. NOP ;
  606. BSF PORTA, 2 ;
  607. BANKSEL TRISA ;
  608. BSF TRISA, 2 ;
  609. BANKSEL MEMORY ;
  610. ;
  611. DELAY 74 ;
  612. ;-----------------------------------------------;
  613. ;
  614. ;-----------------------------------------------;
  615. ; 2us Positive Sync Generation (SPECIAL) ;
  616. ;-----------------------------------------------;
  617. SET_SIGNAL COLOR_BLACK ;
  618. DELAY 2 ;
  619. NOP ;
  620. ;-----------------------------------------------;
  621. ;
  622. RETURN ;
  623. ;---------------------------------------------------;
  624.  
  625. ;---------------------------------------------------;
  626. _Blank_Half_Line: ;
  627. ;---------------------------------------------------;
  628. NOP ;
  629. NOP ;
  630. NOP ;
  631. ;-----------------------------------------------;
  632. ; 2us Negative Sync Generation ;
  633. ;-----------------------------------------------;
  634. NEG_SYNC_2US ;
  635. ;-----------------------------------------------;
  636. ;
  637. ;-----------------------------------------------;
  638. ; 30us Blank Signal Generation ;
  639. ;-----------------------------------------------;
  640. SET_SIGNAL COLOR_BLACK ;
  641. DELAY 76 ;
  642. ;-----------------------------------------------;
  643. ;
  644. RETURN ;
  645. ;---------------------------------------------------;
  646.  
  647. ;---------------------------------------------------;
  648. _Update_Scores: ;
  649. ;---------------------------------------------------;
  650. ; This will retrieve the character font information ;
  651. ; from program memory and display the two scores ;
  652. ; at the top left and top right of the screen. ;
  653. ; NOTE: This is a FULL BLANK LINE routine ;
  654. ; (around 19us to display each score). ;
  655. ;---------------------------------------------------;
  656. ;-----------------------------------------------;
  657. ; 4us Negative Sync Generation ;
  658. ;-----------------------------------------------;
  659. NEG_SYNC_4US ;
  660. ;-----------------------------------------------;
  661. ;
  662. ;-----------------------------------------------;
  663. ; 60us Blank Signal Generation ;
  664. ; But with lots of calculations going on ;
  665. ;-----------------------------------------------;
  666. SET_SIGNAL COLOR_BLACK ;
  667. ;
  668. BANKSEL OPTION_REG ;
  669. BCF OPTION_REG, PSA ;
  670. BANKSEL TMR0 ;
  671. CLRF TMR0 ;
  672. ;
  673. _US_Draw_Score1: ;
  674. MOVLW LOW VIDEO_BUFFER_START + LEFT_SCORE_START;
  675. MOVWF FSR1L ;
  676. MOVLW HIGH VIDEO_BUFFER_START ;
  677. MOVWF FSR1H ;
  678. ;
  679. CLRW ;
  680. MOVWI 0[INDF1] ;
  681. MOVWI 4[INDF1] ;
  682. MOVWI 8[INDF1] ;
  683. MOVWI 12[INDF1] ;
  684. MOVWI 16[INDF1] ;
  685. ;
  686. SWAPF Score_1, W ;
  687. ANDLW H'0F' ;
  688. MOVWF Temp1 ;
  689. ADDWF Temp1, F ;
  690. ADDWF Temp1, F ;
  691. ADDWF Temp1, F ;
  692. ADDWF Temp1, F ;
  693. ;
  694. MOVLW LOW VIDEO_BUFFER_START + LEFT_SCORE_START;
  695. MOVWF FSR1L ;
  696. MOVLW HIGH VIDEO_BUFFER_START ;
  697. MOVWF FSR1H ;
  698. ;
  699. MOVLW 5 ;
  700. MOVWF Temp2 ;
  701. _US1_Draw_Left_Char: ;
  702. MOVLP HIGH CHARACTER_TABLE ;
  703. MOVFW Temp1 ;
  704. ADDLW LOW CHARACTER_TABLE ;
  705. BTFSC STATUS, C ;
  706. INCF PCLATH, F ;
  707. CALLW ;
  708. MOVWF DTemp ;
  709. RRF DTemp, W ;
  710. ANDLW H'70' ;
  711. MOVWF INDF1 ;
  712. ADDFSR FSR1, 4 ;
  713. INCF Temp1, F ;
  714. DECFSZ Temp2, F ;
  715. GOTO _US1_Draw_Left_Char ;
  716. ;
  717. MOVFW Score_1 ;
  718. ANDLW H'0F' ;
  719. MOVWF Temp1 ;
  720. ADDWF Temp1, F ;
  721. ADDWF Temp1, F ;
  722. ADDWF Temp1, F ;
  723. ADDWF Temp1, F ;
  724. ;
  725. MOVLW LOW VIDEO_BUFFER_START + LEFT_SCORE_START;
  726. MOVWF FSR1L ;
  727. MOVLW HIGH VIDEO_BUFFER_START ;
  728. MOVWF FSR1H ;
  729. ;
  730. MOVLW 5 ;
  731. MOVWF Temp2 ;
  732. _US1_Draw_Right_Char: ;
  733. MOVLP HIGH CHARACTER_TABLE ;
  734. MOVFW Temp1 ;
  735. ADDLW LOW CHARACTER_TABLE ;
  736. BTFSC STATUS, C ;
  737. INCF PCLATH, F ;
  738. CALLW ;
  739. MOVWF DTemp ;
  740. RRF DTemp, W ;
  741. ANDLW H'07' ;
  742. MOVWF DTemp ;
  743. MOVFW INDF1 ;
  744. IORWF DTemp, W ;
  745. MOVWF INDF1 ;
  746. ADDFSR FSR1, 4 ;
  747. INCF Temp1, F ;
  748. DECFSZ Temp2, F ;
  749. GOTO _US1_Draw_Right_Char ;
  750. ;
  751. _US_Draw_Score2: ;
  752. MOVLW LOW VIDEO_BUFFER_START + RIGHT_SCORE_START;
  753. MOVWF FSR1L ;
  754. MOVLW HIGH VIDEO_BUFFER_START ;
  755. MOVWF FSR1H ;
  756. ;
  757. CLRW ;
  758. MOVWI 0[INDF1] ;
  759. MOVWI 4[INDF1] ;
  760. MOVWI 8[INDF1] ;
  761. MOVWI 12[INDF1] ;
  762. MOVWI 16[INDF1] ;
  763. ;
  764. SWAPF Score_2, W ;
  765. ANDLW H'0F' ;
  766. MOVWF Temp1 ;
  767. ADDWF Temp1, F ;
  768. ADDWF Temp1, F ;
  769. ADDWF Temp1, F ;
  770. ADDWF Temp1, F ;
  771. ;
  772. MOVLW LOW VIDEO_BUFFER_START + RIGHT_SCORE_START;
  773. MOVWF FSR1L ;
  774. MOVLW HIGH VIDEO_BUFFER_START ;
  775. MOVWF FSR1H ;
  776. ;
  777. MOVLW 5 ;
  778. MOVWF Temp2 ;
  779. _US2_Draw_Left_Char: ;
  780. MOVLP HIGH CHARACTER_TABLE ;
  781. MOVFW Temp1 ;
  782. ADDLW LOW CHARACTER_TABLE ;
  783. BTFSC STATUS, C ;
  784. INCF PCLATH, F ;
  785. CALLW ;
  786. ANDLW H'E0' ;
  787. MOVWF DTemp ;
  788. MOVWF INDF1 ;
  789. ADDFSR FSR1, 4 ;
  790. INCF Temp1, F ;
  791. DECFSZ Temp2, F ;
  792. GOTO _US2_Draw_Left_Char ;
  793. ;
  794. MOVFW Score_2 ;
  795. ANDLW H'0F' ;
  796. MOVWF Temp1 ;
  797. ADDWF Temp1, F ;
  798. ADDWF Temp1, F ;
  799. ADDWF Temp1, F ;
  800. ADDWF Temp1, F ;
  801. ;
  802. MOVLW LOW VIDEO_BUFFER_START + RIGHT_SCORE_START;
  803. MOVWF FSR1L ;
  804. MOVLW HIGH VIDEO_BUFFER_START ;
  805. MOVWF FSR1H ;
  806. ;
  807. MOVLW 5 ;
  808. MOVWF Temp2 ;
  809. _US2_Draw_Right_Char: ;
  810. MOVLP HIGH CHARACTER_TABLE ;
  811. MOVFW Temp1 ;
  812. ADDLW LOW CHARACTER_TABLE ;
  813. BTFSC STATUS, C ;
  814. INCF PCLATH, F ;
  815. CALLW ;
  816. ANDLW H'0E' ;
  817. MOVWF DTemp ;
  818. MOVFW INDF1 ;
  819. IORWF DTemp, W ;
  820. MOVWF INDF1 ;
  821. ADDFSR FSR1, 4 ;
  822. INCF Temp1, F ;
  823. DECFSZ Temp2, F ;
  824. GOTO _US2_Draw_Right_Char ;
  825. ;
  826. NOP ;
  827. MOVFW TMR0 ;
  828. SUBLW 227 ;
  829. BTFSC STATUS, C ;
  830. GOTO $-3 ;
  831. NOP ;
  832. NOP ;
  833. NOP ;
  834. NOP ;
  835. ;
  836. RETURN ;
  837. ;---------------------------------------------------;
  838.  
  839. ;---------------------------------------------------;
  840. _Update_Paddle_1: ;
  841. ;---------------------------------------------------;
  842. ; NOTE: This is a SINGLE FULL blank line routine - ;
  843. ; about 28us. It fits comfortably in a 60us window. ;
  844. ;---------------------------------------------------;
  845. NOP ;
  846. ;-----------------------------------------------;
  847. ; 4us Negative Sync Generation ;
  848. ;-----------------------------------------------;
  849. NEG_SYNC_4US ;
  850. ;-----------------------------------------------;
  851. ;
  852. ;-----------------------------------------------;
  853. ; 60us Blank Signal Generation ;
  854. ; But with lots of calculations going on ;
  855. ;-----------------------------------------------;
  856. SET_SIGNAL COLOR_BLACK ;
  857. ;
  858. BANKSEL OPTION_REG ;
  859. BCF OPTION_REG, PSA ;
  860. BANKSEL TMR0 ;
  861. CLRF TMR0 ;
  862. ;
  863. _UP1_Clear_Paddle: ;
  864. MOVFW Paddle_1_Y ;
  865. ADDWF Paddle_1_Y, W ;
  866. ADDWF Paddle_1_Y, W ;
  867. ADDWF Paddle_1_Y, W ;
  868. ADDLW LOW VIDEO_BUFFER_START + LEFT_PADDLE_START;
  869. MOVWF FSR1L ;
  870. MOVLW HIGH VIDEO_BUFFER_START ;
  871. MOVWF FSR1H ;
  872. MOVIW 0[INDF1] ;
  873. ANDLW LEFT_PADDLE_MASK ;
  874. MOVWI 0[INDF1] ;
  875. MOVIW 4[INDF1] ;
  876. ANDLW LEFT_PADDLE_MASK ;
  877. MOVWI 4[INDF1] ;
  878. MOVIW 8[INDF1] ;
  879. ANDLW LEFT_PADDLE_MASK ;
  880. MOVWI 8[INDF1] ;
  881. MOVIW 12[INDF1] ;
  882. ANDLW LEFT_PADDLE_MASK ;
  883. MOVWI 12[INDF1] ;
  884. MOVIW 16[INDF1] ;
  885. ANDLW LEFT_PADDLE_MASK ;
  886. MOVWI 16[INDF1] ;
  887. MOVIW 20[INDF1] ;
  888. ANDLW LEFT_PADDLE_MASK ;
  889. MOVWI 20[INDF1] ;
  890. MOVIW 24[INDF1] ;
  891. ANDLW LEFT_PADDLE_MASK ;
  892. MOVWI 24[INDF1] ;
  893. MOVIW 28[INDF1] ;
  894. ANDLW LEFT_PADDLE_MASK ;
  895. MOVWI 28[INDF1] ;
  896. ;
  897. #IFDEF _USE_THUMBSTICKS_ ;
  898. _UP1_Update: ;
  899. ;-----------------------------------------------;
  900. ; ADC Magic (Channel 0) ;
  901. ;-----------------------------------------------;
  902. BANKSEL ADCON1 ;
  903. MOVLW H'60' ; Left Justified
  904. MOVWF ADCON1 ; FOSC/64, VREF
  905. MOVLW B'00001011' ; AN2, ADC GO, ADC On
  906. MOVWF ADCON0 ;
  907. BTFSC ADCON0, GO ; Wait for conversion
  908. GOTO $-1 ;
  909. MOVFW ADRESH ; Get result
  910. BANKSEL MEMORY ;
  911. ;-----------------------------------------------;
  912. ;
  913. MOVWF Temp1 ;
  914. MOVLW H'60' ;
  915. SUBWF Temp1, W ;
  916. BTFSS STATUS, C ;
  917. DECF Paddle_1_Y, F ;
  918. MOVLW H'9F' ;
  919. SUBWF Temp1, W ;
  920. BTFSC STATUS, C ;
  921. INCF Paddle_1_Y, F ;
  922. BTFSC Paddle_1_Y, MSB ;
  923. CLRF Paddle_1_Y ;
  924. MOVLW 48 ;
  925. SUBWF Paddle_1_Y, W ;
  926. BTFSS STATUS, C ;
  927. GOTO _UP1_Update_Done ;
  928. MOVLW 48 ;
  929. MOVWF Paddle_1_Y ;
  930. _UP1_Update_Done: ;
  931. #ELSE ;!_USE_THUMBSTICKS_ ;
  932. _UP1_Check_Up: ;
  933. CLRW ;
  934. XORWF Paddle_1_Y, W ;
  935. BTFSC STATUS, Z ;
  936. GOTO _UP1_Check_Down ;
  937. BTFSS PORTA, LBUTT_1_BIT ;
  938. DECF Paddle_1_Y, F ;
  939. _UP1_Check_Down: ;
  940. MOVLW 48 ;
  941. XORWF Paddle_1_Y, W ;
  942. BTFSC STATUS, Z ;
  943. GOTO _UP1_Draw_Paddle ;
  944. BTFSS PORTA, LBUTT_2_BIT ;
  945. INCF Paddle_1_Y, F ;
  946. #ENDIF ;_USE_THUMBSTICKS_ ;
  947. ;
  948. _UP1_Draw_Paddle: ;
  949. MOVFW Paddle_1_Y ;
  950. ADDWF Paddle_1_Y, W ;
  951. ADDWF Paddle_1_Y, W ;
  952. ADDWF Paddle_1_Y, W ;
  953. ADDLW LOW VIDEO_BUFFER_START + LEFT_PADDLE_START;
  954. MOVWF FSR1L ;
  955. MOVLW HIGH VIDEO_BUFFER_START ;
  956. MOVWF FSR1H ;
  957. MOVIW 0[INDF1] ;
  958. IORLW LEFT_PADDLE_BIT ;
  959. MOVWI 0[INDF1] ;
  960. MOVIW 4[INDF1] ;
  961. IORLW LEFT_PADDLE_BIT ;
  962. MOVWI 4[INDF1] ;
  963. MOVIW 8[INDF1] ;
  964. IORLW LEFT_PADDLE_BIT ;
  965. MOVWI 8[INDF1] ;
  966. MOVIW 12[INDF1] ;
  967. IORLW LEFT_PADDLE_BIT ;
  968. MOVWI 12[INDF1] ;
  969. MOVIW 16[INDF1] ;
  970. IORLW LEFT_PADDLE_BIT ;
  971. MOVWI 16[INDF1] ;
  972. MOVIW 20[INDF1] ;
  973. IORLW LEFT_PADDLE_BIT ;
  974. MOVWI 20[INDF1] ;
  975. MOVIW 24[INDF1] ;
  976. IORLW LEFT_PADDLE_BIT ;
  977. MOVWI 24[INDF1] ;
  978. MOVIW 28[INDF1] ;
  979. IORLW LEFT_PADDLE_BIT ;
  980. MOVWI 28[INDF1] ;
  981. ;
  982. MOVFW TMR0 ;
  983. SUBLW 228 ;
  984. BTFSC STATUS, C ;
  985. GOTO $-3 ;
  986. NOP ;
  987. NOP ;
  988. NOP ;
  989. ;
  990. RETURN ;
  991. ;---------------------------------------------------;
  992.  
  993. ;---------------------------------------------------;
  994. _Update_Paddle_2: ;
  995. ;---------------------------------------------------;
  996. ; NOTE: This is a SINGLE FULL blank line routine - ;
  997. ; about 28us. It fits comfortably in a 60us window. ;
  998. ;---------------------------------------------------;
  999. ;-----------------------------------------------;
  1000. ; 4us Negative Sync Generation ;
  1001. ;-----------------------------------------------;
  1002. NEG_SYNC_4US ;
  1003. ;-----------------------------------------------;
  1004. ;
  1005. ;-----------------------------------------------;
  1006. ; 60us Blank Signal Generation ;
  1007. ; But with lots of calculations going on ;
  1008. ;-----------------------------------------------;
  1009. SET_SIGNAL COLOR_BLACK ;
  1010. ;
  1011. BANKSEL OPTION_REG ;
  1012. BCF OPTION_REG, PSA ;
  1013. BANKSEL TMR0 ;
  1014. CLRF TMR0 ;
  1015. ;
  1016. _UP2_Clear_Paddle: ;
  1017. MOVFW Paddle_2_Y ;
  1018. ADDWF Paddle_2_Y, W ;
  1019. ADDWF Paddle_2_Y, W ;
  1020. ADDWF Paddle_2_Y, W ;
  1021. ADDLW LOW VIDEO_BUFFER_START + RIGHT_PADDLE_START;
  1022. MOVWF FSR1L ;
  1023. MOVLW HIGH VIDEO_BUFFER_START ;
  1024. MOVWF FSR1H ;
  1025. MOVIW 0[INDF1] ;
  1026. ANDLW RIGHT_PADDLE_MASK ;
  1027. MOVWI 0[INDF1] ;
  1028. MOVIW 4[INDF1] ;
  1029. ANDLW RIGHT_PADDLE_MASK ;
  1030. MOVWI 4[INDF1] ;
  1031. MOVIW 8[INDF1] ;
  1032. ANDLW RIGHT_PADDLE_MASK ;
  1033. MOVWI 8[INDF1] ;
  1034. MOVIW 12[INDF1] ;
  1035. ANDLW RIGHT_PADDLE_MASK ;
  1036. MOVWI 12[INDF1] ;
  1037. MOVIW 16[INDF1] ;
  1038. ANDLW RIGHT_PADDLE_MASK ;
  1039. MOVWI 16[INDF1] ;
  1040. MOVIW 20[INDF1] ;
  1041. ANDLW RIGHT_PADDLE_MASK ;
  1042. MOVWI 20[INDF1] ;
  1043. MOVIW 24[INDF1] ;
  1044. ANDLW RIGHT_PADDLE_MASK ;
  1045. MOVWI 24[INDF1] ;
  1046. MOVIW 28[INDF1] ;
  1047. ANDLW RIGHT_PADDLE_MASK ;
  1048. MOVWI 28[INDF1] ;
  1049. ;
  1050. #IFDEF _USE_THUMBSTICKS_ ;
  1051. _UP2_Update: ;
  1052. ;-----------------------------------------------;
  1053. ; ADC Magic (Channel 0) ;
  1054. ;-----------------------------------------------;
  1055. BANKSEL ADCON1 ;
  1056. MOVLW H'60' ; Left Justified
  1057. MOVWF ADCON1 ; FOSC/64, VREF
  1058. MOVLW B'00000011' ; AN0, ADC GO, ADC On
  1059. MOVWF ADCON0 ;
  1060. BTFSC ADCON0, GO ; Wait for conversion
  1061. GOTO $-1 ;
  1062. MOVFW ADRESH ; Get result
  1063. BANKSEL MEMORY ;
  1064. ;-----------------------------------------------;
  1065. ;
  1066. MOVWF Temp1 ;
  1067. MOVLW H'60' ;
  1068. SUBWF Temp1, W ;
  1069. BTFSS STATUS, C ;
  1070. DECF Paddle_2_Y, F ;
  1071. MOVLW H'9F' ;
  1072. SUBWF Temp1, W ;
  1073. BTFSC STATUS, C ;
  1074. INCF Paddle_2_Y, F ;
  1075. BTFSC Paddle_2_Y, MSB ;
  1076. CLRF Paddle_2_Y ;
  1077. MOVLW 48 ;
  1078. SUBWF Paddle_2_Y, W ;
  1079. BTFSS STATUS, C ;
  1080. GOTO _UP2_Update_Done ;
  1081. MOVLW 48 ;
  1082. MOVWF Paddle_2_Y ;
  1083. _UP2_Update_Done: ;
  1084. #ELSE ;!_USE_THUMBSTICKS_ ;
  1085. _UP2_Check_Up: ;
  1086. CLRW ;
  1087. XORWF Paddle_2_Y, W ;
  1088. BTFSC STATUS, Z ;
  1089. GOTO _UP2_Check_Down ;
  1090. BTFSS PORTA, RBUTT_1_BIT ;
  1091. DECF Paddle_2_Y, F ;
  1092. _UP2_Check_Down: ;
  1093. MOVLW 40 ;
  1094. XORWF Paddle_2_Y, W ;
  1095. BTFSC STATUS, Z ;
  1096. GOTO _UP2_Draw_Paddle ;
  1097. BTFSS PORTA, RBUTT_2_BIT ;
  1098. INCF Paddle_2_Y, F ;
  1099. #ENDIF ;_USE_THUMBSTICKS_ ;
  1100. ;
  1101. _UP2_Draw_Paddle: ;
  1102. MOVFW Paddle_2_Y ;
  1103. ADDWF Paddle_2_Y, W ;
  1104. ADDWF Paddle_2_Y, W ;
  1105. ADDWF Paddle_2_Y, W ;
  1106. ADDLW LOW VIDEO_BUFFER_START + RIGHT_PADDLE_START;
  1107. MOVWF FSR1L ;
  1108. MOVLW HIGH VIDEO_BUFFER_START ;
  1109. MOVWF FSR1H ;
  1110. MOVIW 0[INDF1] ;
  1111. IORLW RIGHT_PADDLE_BIT ;
  1112. MOVWI 0[INDF1] ;
  1113. MOVIW 4[INDF1] ;
  1114. IORLW RIGHT_PADDLE_BIT ;
  1115. MOVWI 4[INDF1] ;
  1116. MOVIW 8[INDF1] ;
  1117. IORLW RIGHT_PADDLE_BIT ;
  1118. MOVWI 8[INDF1] ;
  1119. MOVIW 12[INDF1] ;
  1120. IORLW RIGHT_PADDLE_BIT ;
  1121. MOVWI 12[INDF1] ;
  1122. MOVIW 16[INDF1] ;
  1123. IORLW RIGHT_PADDLE_BIT ;
  1124. MOVWI 16[INDF1] ;
  1125. MOVIW 20[INDF1] ;
  1126. IORLW RIGHT_PADDLE_BIT ;
  1127. MOVWI 20[INDF1] ;
  1128. MOVIW 24[INDF1] ;
  1129. IORLW RIGHT_PADDLE_BIT ;
  1130. MOVWI 24[INDF1] ;
  1131. MOVIW 28[INDF1] ;
  1132. IORLW RIGHT_PADDLE_BIT ;
  1133. MOVWI 28[INDF1] ;
  1134. ;
  1135. NOP ;
  1136. MOVFW TMR0 ;
  1137. SUBLW 228 ;
  1138. BTFSC STATUS, C ;
  1139. GOTO $-3 ;
  1140. NOP ;
  1141. NOP ;
  1142. ;
  1143. RETURN ;
  1144. ;---------------------------------------------------;
  1145.  
  1146. ;---------------------------------------------------;
  1147. _Update_Ball: ;
  1148. ;---------------------------------------------------;
  1149. ; NOTE: This is a FULL blank line routine - ;
  1150. ; about 17-18us. It fits comfortably in a 60us ;
  1151. ; window. ;
  1152. ;---------------------------------------------------;
  1153. ;-----------------------------------------------;
  1154. ; 4us Negative Sync Generation ;
  1155. ;-----------------------------------------------;
  1156. NEG_SYNC_4US ;
  1157. ;
  1158. ;-----------------------------------------------;
  1159. ; 60us Blank Signal Generation ;
  1160. ; But with lots of calculations going on ;
  1161. ;-----------------------------------------------;
  1162. SET_SIGNAL COLOR_BLACK ;
  1163. ;
  1164. BANKSEL OPTION_REG ;
  1165. BCF OPTION_REG, PSA ;
  1166. BANKSEL TMR0 ;
  1167. CLRF TMR0 ;
  1168. ;
  1169. _UB_Check_Wait: ;
  1170. DECFSZ Ball_Wait, F ;
  1171. GOTO _UB_Exit ;
  1172. ;
  1173. MOVLW MAX_BALL_WAIT ;
  1174. MOVWF Ball_Wait ;
  1175. ;
  1176. CLRW ;
  1177. XORWF Ball_Dir_X, W ;
  1178. BTFSS STATUS, Z ;
  1179. GOTO _UB_Clear_Ball ;
  1180. CLRW ;
  1181. XORWF Ball_Dir_Y, W ;
  1182. BTFSS STATUS, Z ;
  1183. GOTO _UB_Clear_Ball ;
  1184. ;
  1185. _UB_Check_L_Serve: ;
  1186. BTFSC PORTA, LBUTT_BIT ;
  1187. GOTO _UB_Check_R_Serve ;
  1188. MOVLW 1 ;
  1189. MOVWF Ball_Dir_X ;
  1190. MOVLW 1 ;
  1191. MOVWF Ball_Dir_Y ;
  1192. MOVLW 16 ;
  1193. MOVWF Ball_X ;
  1194. MOVLW 27 ;
  1195. MOVWF Ball_Y ;
  1196. GOTO _UB_Service ;
  1197. _UB_Check_R_Serve: ;
  1198. BANKSEL TRISA ;
  1199. BSF TRISA, RBUTT_BIT ;
  1200. BANKSEL PORTA ;
  1201. BTFSC PORTA, RBUTT_BIT ;
  1202. GOTO _UB_Exit ;
  1203. BANKSEL TRISA ;
  1204. BCF TRISA, RBUTT_BIT ;
  1205. BANKSEL PORTA ;
  1206. MOVLW -1 ;
  1207. MOVWF Ball_Dir_X ;
  1208. MOVLW -1 ;
  1209. MOVWF Ball_Dir_Y ;
  1210. MOVLW 15 ;
  1211. MOVWF Ball_X ;
  1212. MOVLW 27 ;
  1213. MOVWF Ball_Y ;
  1214. _UB_Service: ;
  1215. CALL _Clear_Court ;
  1216. MOVLW H'11' ;
  1217. XORWF Score_1, W ;
  1218. BTFSC STATUS, Z ;
  1219. GOTO $+5 ;
  1220. MOVLW H'11' ;
  1221. XORWF Score_2, W ;
  1222. BTFSS STATUS, Z ;
  1223. GOTO _UB_Draw_Ball ;
  1224. CLRF Score_1 ;
  1225. CLRF Score_2 ;
  1226. GOTO _UB_Draw_Ball ;
  1227. ;
  1228. _UB_Clear_Ball: ;
  1229. MOVFW Ball_Y ;
  1230. ADDWF Ball_Y, W ;
  1231. ADDWF Ball_Y, W ;
  1232. ADDWF Ball_Y, W ;
  1233. ADDLW LOW VIDEO_BUFFER_START ;
  1234. MOVWF FSR1L ;
  1235. RRF Ball_X, W ;
  1236. MOVWF Temp1 ;
  1237. RRF Temp1, F ;
  1238. RRF Temp1, W ;
  1239. ANDLW H'1F' ;
  1240. ADDWF FSR1L, F ;
  1241. MOVLW HIGH VIDEO_BUFFER_START ;
  1242. MOVWF FSR1H ;
  1243. ;
  1244. MOVFW Ball_X ;
  1245. ANDLW H'07' ;
  1246. MOVWF Temp1 ;
  1247. MOVLW H'7F' ;
  1248. MOVWF DTemp ;
  1249. MOVLW 0 ; ;
  1250. XORWF Temp1, W ;
  1251. BTFSC STATUS, Z ;
  1252. GOTO $+5 ;
  1253. DECF Temp1, F ;
  1254. RRF DTemp, F ;
  1255. BSF DTemp, MSB ;
  1256. GOTO $-7 ;
  1257. ;
  1258. MOVFW DTemp ;
  1259. ANDWF INDF1, F ;
  1260. ;
  1261. MOVLW H'04' ;
  1262. ADDWF FSR1L, F ;
  1263. MOVFW DTemp ;
  1264. ANDWF INDF1, F ;
  1265. ;
  1266. _UB_Update_Ball_X: ;
  1267. MOVFW Ball_Dir_X ; Update Ball X Position
  1268. ADDWF Ball_X, F ;
  1269. ;
  1270. _UB_Update_Ball_X_Min: ;
  1271. MOVLW 0 ;
  1272. XORWF Ball_X, W ;
  1273. BTFSS STATUS, Z ;
  1274. GOTO _UB_Update_Ball_X_Max ;
  1275. MOVLW 1 ;
  1276. MOVWF Ball_Dir_X ;
  1277. ;
  1278. INCF Score_2, F ;
  1279. MOVLW 20 ;
  1280. MOVWF Buzz_Count ;
  1281. MOVWF Buzz_Reload ;
  1282. MOVLW H'7F' ;
  1283. MOVWF Buzz_Dur_LO ;
  1284. MOVLW H'01' ;
  1285. MOVWF Buzz_Dur_HI ;
  1286. BSF System_Status, BUZZ_BIT ;
  1287. MOVLW 0 ;
  1288. MOVWF Ball_Dir_X ;
  1289. MOVWF Ball_Dir_Y ;
  1290. MOVLW 15 ;
  1291. MOVWF Ball_X ;
  1292. MOVLW 27 ;
  1293. MOVWF Ball_Y ;
  1294. MOVFW Score_2 ;
  1295. ANDLW H'0F' ;
  1296. XORLW H'0A' ;
  1297. BTFSS STATUS, Z ;
  1298. GOTO _UB_BXMin_Exit ;
  1299. MOVFW Score_2 ;
  1300. ANDLW H'F0' ;
  1301. ADDLW H'10' ;
  1302. MOVWF Score_2 ;
  1303. MOVLW H'A0' ;
  1304. XORWF Score_2, W ;
  1305. BTFSC STATUS, Z ;
  1306. CLRF Score_2 ;
  1307. _UB_BXMin_Exit: ;
  1308. MOVLW H'11' ;
  1309. XORWF Score_2, W ;
  1310. BTFSS STATUS, Z ;
  1311. GOTO _UB_Exit ;
  1312. CALL _Clear_Court ;
  1313. CALL _Draw_Title ;
  1314. GOTO _UB_Exit ;
  1315. ;
  1316. _UB_Update_Ball_X_Max: ;
  1317. MOVLW 31 ;
  1318. XORWF Ball_X, W ;
  1319. BTFSS STATUS, Z ;
  1320. GOTO _UB_Update_Ball_Y ;
  1321. MOVLW -1 ;
  1322. MOVWF Ball_Dir_X ;
  1323. ;
  1324. INCF Score_1, F ;
  1325. MOVLW 20 ;
  1326. MOVWF Buzz_Count ;
  1327. MOVWF Buzz_Reload ;
  1328. MOVLW H'7F' ;
  1329. MOVWF Buzz_Dur_LO ;
  1330. MOVLW H'01' ;
  1331. MOVWF Buzz_Dur_HI ;
  1332. BSF System_Status, BUZZ_BIT ;
  1333. MOVLW 0 ;
  1334. MOVWF Ball_Dir_X ;
  1335. MOVWF Ball_Dir_Y ;
  1336. MOVLW 15 ;
  1337. MOVWF Ball_X ;
  1338. MOVLW 27 ;
  1339. MOVWF Ball_Y ;
  1340. MOVFW Score_1 ;
  1341. ANDLW H'0F' ;
  1342. XORLW H'0A' ;
  1343. BTFSS STATUS, Z ;
  1344. GOTO _UB_BXMax_Exit ;
  1345. MOVFW Score_1 ;
  1346. ANDLW H'F0' ;
  1347. ADDLW H'10' ;
  1348. MOVWF Score_1 ;
  1349. MOVLW H'A0' ;
  1350. XORWF Score_1, W ;
  1351. BTFSC STATUS, Z ;
  1352. CLRF Score_1 ;
  1353. _UB_BXMax_Exit: ;
  1354. MOVLW H'11' ;
  1355. XORWF Score_1, W ;
  1356. BTFSS STATUS, Z ;
  1357. GOTO _UB_Exit ;
  1358. CALL _Clear_Court ;
  1359. CALL _Draw_Title ;
  1360. GOTO _UB_Exit ;
  1361. ;
  1362. _UB_Update_Ball_Y: ;
  1363. MOVFW Ball_Dir_Y ; Update Ball Y Position
  1364. ADDWF Ball_Y, F ;
  1365. ;
  1366. _UB_Update_Ball_Y_Min: ;
  1367. MOVLW 0 ;
  1368. XORWF Ball_Y, W ;
  1369. BTFSS STATUS, Z ;
  1370. GOTO _UB_Update_Ball_Y_Max ;
  1371. MOVLW 1 ;
  1372. MOVWF Ball_Dir_Y ;
  1373. MOVLW 13 ;
  1374. MOVWF Buzz_Count ;
  1375. MOVWF Buzz_Reload ;
  1376. MOVLW H'3F' ;
  1377. MOVWF Buzz_Dur_LO ;
  1378. MOVLW H'01' ;
  1379. MOVWF Buzz_Dur_HI ;
  1380. BSF System_Status, BUZZ_BIT ;
  1381. GOTO _UB_Paddle_Detect ;
  1382. ;
  1383. _UB_Update_Ball_Y_Max: ;
  1384. MOVLW 55 ;
  1385. XORWF Ball_Y, W ;
  1386. BTFSS STATUS, Z ;
  1387. GOTO _UB_Paddle_Detect ;
  1388. MOVLW -1 ;
  1389. MOVWF Ball_Dir_Y ;
  1390. MOVLW 13 ;
  1391. MOVWF Buzz_Count ;
  1392. MOVWF Buzz_Reload ;
  1393. MOVLW H'3F' ;
  1394. MOVWF Buzz_Dur_LO ;
  1395. MOVLW H'01' ;
  1396. MOVWF Buzz_Dur_HI ;
  1397. BSF System_Status, BUZZ_BIT ;
  1398. ;
  1399. _UB_Paddle_Detect: ;
  1400. _UB_Paddle_Detect_Left: ;
  1401. MOVLW -1 ;
  1402. XORWF Ball_Dir_X, W ;
  1403. BTFSS STATUS, Z ;
  1404. GOTO _UB_Paddle_Detect_Right ;
  1405. ;
  1406. MOVLW 2 ;
  1407. XORWF Ball_X, W ;
  1408. BTFSS STATUS, Z ;
  1409. GOTO _UB_Draw_Ball ;
  1410. ;
  1411. MOVFW Paddle_1_Y ;
  1412. SUBWF Ball_Y, W ;
  1413. BTFSS STATUS, C ;
  1414. GOTO _UB_Draw_Ball ;
  1415. MOVFW Paddle_1_Y ;
  1416. ADDLW 8 ;
  1417. SUBWF Ball_Y, W ;
  1418. BTFSC STATUS, C ;
  1419. GOTO _UB_Draw_Ball ;
  1420. MOVLW 1 ;
  1421. MOVWF Ball_Dir_X ;
  1422. MOVLW 15 ;
  1423. MOVWF Buzz_Count ;
  1424. MOVWF Buzz_Reload ;
  1425. MOVLW H'3F' ;
  1426. MOVWF Buzz_Dur_LO ;
  1427. MOVLW H'01' ;
  1428. MOVWF Buzz_Dur_HI ;
  1429. BSF System_Status, BUZZ_BIT ;
  1430. GOTO _UB_Draw_Ball ;
  1431. ;
  1432. _UB_Paddle_Detect_Right: ;
  1433. MOVLW 1 ;
  1434. XORWF Ball_Dir_X, W ;
  1435. BTFSS STATUS, Z ;
  1436. GOTO _UB_Draw_Ball ;
  1437. ;
  1438. MOVLW 29 ;
  1439. XORWF Ball_X, W ;
  1440. BTFSS STATUS, Z ;
  1441. GOTO _UB_Draw_Ball ;
  1442. ;
  1443. MOVFW Paddle_2_Y ;
  1444. SUBWF Ball_Y, W ;
  1445. BTFSS STATUS, C ;
  1446. GOTO _UB_Draw_Ball ;
  1447. MOVFW Paddle_2_Y ;
  1448. ADDLW 8 ;
  1449. SUBWF Ball_Y, W ;
  1450. BTFSC STATUS, C ;
  1451. GOTO _UB_Draw_Ball ;
  1452. MOVLW -1 ;
  1453. MOVWF Ball_Dir_X ;
  1454. MOVLW 15 ;
  1455. MOVWF Buzz_Count ;
  1456. MOVWF Buzz_Reload ;
  1457. MOVLW H'3F' ;
  1458. MOVWF Buzz_Dur_LO ;
  1459. MOVLW H'01' ;
  1460. MOVWF Buzz_Dur_HI ;
  1461. BSF System_Status, BUZZ_BIT ;
  1462. ;
  1463. _UB_Draw_Ball: ;
  1464. MOVFW Ball_Y ;
  1465. ADDWF Ball_Y, W ;
  1466. ADDWF Ball_Y, W ;
  1467. ADDWF Ball_Y, W ;
  1468. ADDLW LOW VIDEO_BUFFER_START ;
  1469. MOVWF FSR1L ;
  1470. RRF Ball_X, W ;
  1471. MOVWF Temp1 ;
  1472. RRF Temp1, F ;
  1473. RRF Temp1, W ;
  1474. ANDLW H'1F' ;
  1475. ADDWF FSR1L, F ;
  1476. MOVLW HIGH VIDEO_BUFFER_START ;
  1477. MOVWF FSR1H ;
  1478. ;
  1479. MOVFW Ball_X ;
  1480. ANDLW H'07' ;
  1481. MOVWF Temp1 ;
  1482. MOVLW H'80' ;
  1483. MOVWF DTemp ;
  1484. MOVLW 0 ; ;
  1485. XORWF Temp1, W ;
  1486. BTFSC STATUS, Z ;
  1487. GOTO $+5 ;
  1488. DECF Temp1, F ;
  1489. RRF DTemp, F ;
  1490. BCF DTemp, MSB ;
  1491. GOTO $-7 ;
  1492. ;
  1493. MOVFW DTemp ;
  1494. IORWF INDF1, F ;
  1495. ;
  1496. MOVLW H'04' ;
  1497. ADDWF FSR1L, F ;
  1498. MOVFW DTemp ;
  1499. IORWF INDF1, F ;
  1500. ;
  1501. _UB_Exit: ;
  1502. BANKSEL TRISA ;
  1503. BSF TRISA, RBUTT_BIT ;
  1504. BANKSEL PORTA ;
  1505. ;
  1506. NOP ;
  1507. MOVFW TMR0 ;
  1508. SUBLW 227 ;
  1509. BTFSC STATUS, C ;
  1510. GOTO $-3 ;
  1511. NOP ;
  1512. ;
  1513. RETURN ;
  1514. ;---------------------------------------------------;
  1515.  
  1516. ;---------------------------------------------------;
  1517. _Initialize_System: ;
  1518. ;---;-----------------------------------------------;
  1519. ; Initialize Hardware ;
  1520. ;-----------------------------------------------;
  1521. BANKSEL OSCCON ;
  1522. MOVLW B'11110000' ; 32Mhz
  1523. MOVWF OSCCON ;
  1524. ;
  1525. BANKSEL OSCSTAT ; Wait for
  1526. IS1:MOVFW OSCSTAT ; high speed
  1527. ANDLW H'79' ; oscillator
  1528. XORLW H'59' ; to be
  1529. BTFSS STATUS, Z ; stable and
  1530. GOTO IS1 ; locked
  1531. ;
  1532. BANKSEL ANSELA ;
  1533. CLRF ANSELA ; ALL I/O as digital
  1534. #IFDEF _USE_THUMBSTICKS_ ;
  1535. BSF ANSELA, LJOY_BIT ;
  1536. BSF ANSELA, RJOY_BIT ;
  1537. #ENDIF ;_USE_THUMBSTICKS_ ;
  1538. ;
  1539. BANKSEL LATA ;
  1540. CLRF LATA ;
  1541. ;
  1542. BANKSEL TRISA ;
  1543. CLRF TRISA ;
  1544. BCF TRISA, VIDEO_0_BIT ; Set as OUTPUT
  1545. BCF TRISA, VIDEO_1_BIT ; Set As OUTPUT
  1546. #IFDEF _USE_THUMBSTICKS_ ;
  1547. BSF TRISA, LJOY_BIT ; Set as INPUT
  1548. BSF TRISA, LBUTT_BIT ; Set as INPUT
  1549. BSF TRISA, RJOY_BIT ; Set as INPUT
  1550. BCF TRISA, RBUTT_BIT ; Set as OUTPUT (PIEZO)
  1551. #ELSE ;!_USE_THUMBSTICKS_ ;
  1552. BSF TRISA, LBUTT_1_BIT ; Set as INPUT
  1553. BSF TRISA, LBUTT_2_BIT ; Set as INPUT
  1554. BSF TRISA, RBUTT_1_BIT ; Set as INPUT
  1555. BSF TRISA, RBUTT_2_BIT ; Set as INPUT
  1556. #ENDIF ;_USE_THUMBSTICKS_ ;
  1557. ;
  1558. BANKSEL PORTA ;
  1559. CLRF PORTA ;
  1560. BCF PORTA, VIDEO_0_BIT ; Set LOW
  1561. BCF PORTA, VIDEO_1_BIT ; Set LOW
  1562. #IFDEF _USE_THUMBSTICKS_ ;
  1563. BSF PORTA, LJOY_BIT ; Set HIGH
  1564. BSF PORTA, LBUTT_BIT ; Set HIGH
  1565. BSF PORTA, RJOY_BIT ; Set HIGH
  1566. BSF PORTA, RBUTT_BIT ; Set HIGH
  1567. #ELSE ;!_USE_THUMBSTICKS_ ;
  1568. BSF PORTA, LBUTT_1_BIT ; Set HIGH
  1569. BSF PORTA, LBUTT_2_BIT ; Set HIGH
  1570. BSF PORTA, RBUTT_1_BIT ; Set HIGH
  1571. BSF PORTA, RBUTT_2_BIT ; Set HIGH
  1572. #ENDIF ;_USE_THUMBSTICKS_ ;
  1573. ;
  1574. BANKSEL INTCON ;
  1575. CLRF INTCON ;
  1576. ;
  1577. BANKSEL OPTION_REG ;
  1578. CLRF OPTION_REG ;
  1579. ;
  1580. ;-----------------------------------------------;
  1581. ; Initialize Timer0 (for counting cycles) ;
  1582. ;-----------------------------------------------;
  1583. BANKSEL OPTION_REG ;
  1584. BCF OPTION_REG, NOT_WPUEN ;
  1585. BCF OPTION_REG, TMR0CS ;
  1586. BCF OPTION_REG, PSA ; prescaler to timer0
  1587. BCF OPTION_REG, PS2 ;
  1588. BCF OPTION_REG, PS1 ; 000 - 250ns
  1589. BCF OPTION_REG, PS0 ;
  1590. BANKSEL TMR0 ;
  1591. CLRF TMR0 ;
  1592. ;
  1593. ;-----------------------------------------------;
  1594. ; Initialize Video Buffer ;
  1595. ; Copy image from EEPROM into buffer memory ;
  1596. ;-----------------------------------------------;
  1597. BANKSEL MEMORY ;
  1598. ; PAGESEL _Clear_Court ;
  1599. CALL _Clear_Court ;
  1600. ; PAGESEL HIGH _Draw_Title ;
  1601. CALL _Draw_Title ;
  1602. ;
  1603. ;-----------------------------------------------;
  1604. ; Initialize Memory ;
  1605. ;-----------------------------------------------;
  1606. BANKSEL MEMORY ;
  1607. CLRF System_Status ;
  1608. ; BSF System_Status, BUZZ_BIT ;
  1609. MOVLW 1 ;
  1610. MOVWF Buzz_Count ;
  1611. MOVWF Buzz_Reload ;
  1612. MOVLW H'FF' ;
  1613. MOVWF Buzz_Dur_LO ;
  1614. MOVLW H'FF' ;
  1615. MOVWF Buzz_Dur_HI ;
  1616. MOVLW MAX_BALL_WAIT ;
  1617. MOVWF Ball_Wait ;
  1618. MOVLW 0 ;
  1619. MOVWF Score_1 ;
  1620. MOVLW 0 ;
  1621. MOVWF Score_2 ;
  1622. MOVLW 20 ;
  1623. MOVWF Paddle_1_Y ;
  1624. MOVLW 20 ;
  1625. MOVWF Paddle_2_Y ;
  1626. MOVLW 15 ;
  1627. MOVWF Ball_X ;
  1628. MOVLW 27 ;
  1629. MOVWF Ball_Y ;
  1630. MOVLW 0 ;
  1631. MOVWF Ball_Dir_X ;
  1632. MOVLW 0 ;
  1633. MOVWF Ball_Dir_Y ;
  1634. ;
  1635. ;-----------------------------------------------;
  1636. ; Initialize Other Subsystems ;
  1637. ;-----------------------------------------------;
  1638. ;
  1639. RETURN ;
  1640. ;---------------------------------------------------;
  1641.  
  1642. ;---------------------------------------------------;
  1643. _Copyright: ;
  1644. ;---------------------------------------------------;
  1645. ;-----------------------------------------------;
  1646. ; Setup ;
  1647. ;-----------------------------------------------;
  1648. MOVLW LOW COPYRIGHT_TABLE ;
  1649. MOVWF FSR1L ;
  1650. MOVLW HIGH COPYRIGHT_TABLE ;
  1651. MOVWF FSR1H ;
  1652. MOVLW 8 ;
  1653. MOVWF Temp1 ;
  1654. ;-----------------------------------------------;
  1655. ;
  1656. ;-----------------------------------------------;
  1657. ; 8 64us Data Line Generation ;
  1658. ;-----------------------------------------------;
  1659. _CR_Next_Line: ;
  1660. NOP ;
  1661. NOP ;
  1662. ;-----------------------------------------------;
  1663. ; 4us Negative Sync Generation ;
  1664. ;-----------------------------------------------;
  1665. NEG_SYNC_4US ;
  1666. ;-----------------------------------------------;
  1667. ;
  1668. ;-----------------------------------------------;
  1669. ; Xus Back Porch (Black Signal) Generation ;
  1670. ;-----------------------------------------------;
  1671. SET_SIGNAL COLOR_BLACK ;
  1672. DELAY 4 ;13 ;17 ;
  1673. NOP ;
  1674. NOP ;
  1675. NOP ;
  1676. ;-----------------------------------------------;
  1677. ;
  1678. ;-----------------------------------------------;
  1679. ; Data Generation ;
  1680. ;-----------------------------------------------;
  1681. DO_BIT 7, 1 ;
  1682. DO_BIT 6, 1 ;
  1683. DO_BIT 5, 1 ;
  1684. DO_BIT 4, 1 ;
  1685. DO_BIT 3, 1 ;
  1686. DO_BIT 2, 1 ;
  1687. DO_BIT 1, 1 ;
  1688. DO_BIT 0, 0 ;
  1689. ADDFSR FSR1, 1 ;
  1690. DO_BIT 7, 1 ;
  1691. DO_BIT 6, 1 ;
  1692. DO_BIT 5, 1 ;
  1693. DO_BIT 4, 1 ;
  1694. DO_BIT 3, 1 ;
  1695. DO_BIT 2, 1 ;
  1696. DO_BIT 1, 1 ;
  1697. DO_BIT 0, 0 ;
  1698. ADDFSR FSR1, 1 ;
  1699. DO_BIT 7, 1 ;
  1700. DO_BIT 6, 1 ;
  1701. DO_BIT 5, 1 ;
  1702. DO_BIT 4, 1 ;
  1703. DO_BIT 3, 1 ;
  1704. DO_BIT 2, 1 ;
  1705. DO_BIT 1, 1 ;
  1706. DO_BIT 0, 0 ;
  1707. ADDFSR FSR1, 1 ;
  1708. DO_BIT 7, 1 ;
  1709. DO_BIT 6, 1 ;
  1710. DO_BIT 5, 1 ;
  1711. DO_BIT 4, 1 ;
  1712. DO_BIT 3, 1 ;
  1713. DO_BIT 2, 1 ;
  1714. DO_BIT 1, 1 ;
  1715. DO_BIT 0, 0 ;
  1716. ADDFSR FSR1, 1 ;
  1717. DO_BIT 7, 1 ;
  1718. DO_BIT 6, 1 ;
  1719. DO_BIT 5, 1 ;
  1720. DO_BIT 4, 1 ;
  1721. DO_BIT 3, 1 ;
  1722. DO_BIT 2, 1 ;
  1723. DO_BIT 1, 1 ;
  1724. DO_BIT 0, 0 ;
  1725. ADDFSR FSR1, 1 ;
  1726. DO_BIT 7, 1 ;
  1727. DO_BIT 6, 1 ;
  1728. DO_BIT 5, 1 ;
  1729. DO_BIT 4, 1 ;
  1730. DO_BIT 3, 1 ;
  1731. DO_BIT 2, 1 ;
  1732. DO_BIT 1, 1 ;
  1733. DO_BIT 0, 0 ;
  1734. ADDFSR FSR1, 1 ;
  1735. DO_BIT 7, 1 ;
  1736. DO_BIT 6, 1 ;
  1737. DO_BIT 5, 1 ;
  1738. DO_BIT 4, 1 ;
  1739. DO_BIT 3, 1 ;
  1740. DO_BIT 2, 1 ;
  1741. DO_BIT 1, 1 ;
  1742. DO_BIT 0, 0 ;
  1743. ADDFSR FSR1, 1 ;
  1744. DO_BIT 7, 1 ;
  1745. DO_BIT 6, 1 ;
  1746. DO_BIT 5, 1 ;
  1747. DO_BIT 4, 1 ;
  1748. DO_BIT 3, 1 ;
  1749. DO_BIT 2, 1 ;
  1750. DO_BIT 1, 1 ;
  1751. DO_BIT 0, 0 ;
  1752. ADDFSR FSR1, 1 ;
  1753. ;-----------------------------------------------;
  1754. ;
  1755. ;-----------------------------------------------;
  1756. ; Xus Front Porch (Black Signal) Generation ;
  1757. ;-----------------------------------------------;
  1758. SET_SIGNAL COLOR_BLACK ;
  1759. ; DELAY 1 ;2 ;6 ;
  1760. ; NOP ;
  1761. ; NOP ;
  1762. ; NOP ;
  1763. ; NOP ;
  1764. ; NOP ;
  1765. ;-----------------------------------------------;
  1766. ;
  1767. DECFSZ Temp1, F ;
  1768. GOTO $+2 ;
  1769. RETURN ;
  1770. NOP ;
  1771. GOTO _CR_Next_Line ;
  1772. ;---------------------------------------------------;
  1773.  
  1774. ;---------------------------------------------------;
  1775. _Clear_Court: ;
  1776. ;---------------------------------------------------;
  1777. MOVLW LOW VIDEO_BUFFER_START ;
  1778. MOVWF FSR1L ;
  1779. MOVLW HIGH VIDEO_BUFFER_START ;
  1780. MOVWF FSR1H ;
  1781. MOVLW MAX_LINES * 4 ;
  1782. MOVWF Temp1 ; 224 bytes
  1783. _CC_IVB: ;
  1784. MOVLW H'00' ;
  1785. MOVWF INDF1 ;
  1786. INCF FSR1L, F ;
  1787. DECFSZ Temp1, F ;
  1788. GOTO _CC_IVB ;
  1789. RETURN ;
  1790. ;---------------------------------------------------;
  1791.  
  1792. ;---------------------------------------------------;
  1793. _Draw_Title: ;
  1794. ;---------------------------------------------------;
  1795. MOVLW LOW VIDEO_BUFFER_START + (15 * 4) ;
  1796. MOVWF FSR1L ;
  1797. MOVLW HIGH VIDEO_BUFFER_START ;
  1798. MOVWF FSR1H ;
  1799. MOVLW LOW PICPONG_TABLE ;
  1800. MOVWF FSR0L ;
  1801. MOVLW HIGH PICPONG_TABLE ;
  1802. MOVWF FSR0H ;
  1803. MOVLW PICPONG_TABLE_END - PICPONG_TABLE_START ;
  1804. MOVWF Temp1 ;
  1805. _DT_TITLE: ;
  1806. MOVFW INDF0 ;
  1807. MOVWF INDF1 ;
  1808. ADDFSR FSR1, 1 ;
  1809. ADDFSR FSR0, 1 ;
  1810. DECFSZ Temp1, F ;
  1811. GOTO _DT_TITLE ;
  1812. RETURN ;
  1813. ;---------------------------------------------------;
  1814.  
  1815. ;---------------------------------------------------;
  1816. ; COPYRIGHT Scan Line Data ;
  1817. ;---------------------------------------------------;
  1818. COPYRIGHT_TABLE: ;
  1819. ;---------------------------------------------------;
  1820. DT B'00000000', B'00000011', B'00111011', B'10001001', B'00100111', B'00100010', B'11100000', B'00000000'
  1821. DT B'00000000', B'00000011', B'10111011', B'10010011', B'10010111', B'01110110', B'11100000', B'00000000'
  1822. DT B'00000000', B'00000010', B'10010001', B'00010010', B'10010001', B'01010010', B'00100000', B'00000000'
  1823. DT B'10101010', B'10101010', B'10010001', B'00010010', B'00010111', B'01010010', B'11100101', B'01010101'
  1824. DT B'10101010', B'10101010', B'10010001', B'00010010', B'00010111', B'01010010', B'11100101', B'01010101'
  1825. DT B'00000000', B'00000010', B'10010001', B'00010010', B'10010100', B'01010010', B'10000000', B'00000000'
  1826. DT B'00000000', B'00000011', B'10010011', B'10010011', B'10010111', B'01110010', B'11100000', B'00000000'
  1827. DT B'00000000', B'00000011', B'00010011', B'10001001', B'00100111', B'00100010', B'11100000', B'00000000'
  1828. ;---------------------------------------------------;
  1829.  
  1830. ;---------------------------------------------------;
  1831. ;USER_CODE_2 CODE H'800' ;
  1832. ;---------------------------------------------------;
  1833. ; Numeric Characters (0-9) Scan Line Data ;
  1834. ;---------------------------------------------------;
  1835. CHARACTER_TABLE: ;
  1836. ;---------------------------------------------------;
  1837. DT B'11101110', B'10101010', B'10101010', B'10101010', B'11101110'
  1838. DT B'01000100', B'11001100', B'01000100', B'01000100', B'01000100'
  1839. DT B'11101110', B'00100010', B'11101110', B'10001000', B'11101110'
  1840. DT B'11101110', B'00100010', B'11101110', B'00100010', B'11101110'
  1841. DT B'10101010', B'10101010', B'11101110', B'00100010', B'00100010'
  1842. DT B'11101110', B'10001000', B'11101110', B'00100010', B'11101110'
  1843. DT B'11101110', B'10001000', B'11101110', B'10101010', B'11101110'
  1844. DT B'11101110', B'00100010', B'00100010', B'00100010', B'00100010'
  1845. DT B'11101110', B'10101010', B'11101110', B'10101010', B'11101110'
  1846. DT B'11101110', B'10101010', B'11101110', B'00100010', B'00100010'
  1847. ;---------------------------------------------------;
  1848.  
  1849. ;---------------------------------------------------;
  1850. ; PICPONG Title Scan Line Data ;
  1851. ;---------------------------------------------------;
  1852. PICPONG_TABLE: ;
  1853. ;---------------------------------------------------;
  1854. PICPONG_TABLE_START: ;
  1855. DT B'00000000', B'00000000', B'00000000', B'00000000'
  1856. DT B'00000000', B'00011001', B'01000000', B'00000000'
  1857. DT B'00000000', B'00011101', B'11100000', B'00000000'
  1858. DT B'00000000', B'00010100', B'10100000', B'00000000'
  1859. DT B'00000000', B'00010100', B'10100000', B'00000000'
  1860. DT B'00000000', B'00010101', B'10000000', B'00000000'
  1861. DT B'00000000', B'00010101', B'10001000', B'00000000'
  1862. DT B'00000000', B'00011101', B'10001000', B'00000000'
  1863. DT B'00000000', B'00011001', B'10000000', B'00000000'
  1864. DT B'00000000', B'00010001', B'10100000', B'00000000'
  1865. DT B'00000000', B'00010001', B'10100000', B'00000000'
  1866. DT B'00000000', B'00010001', B'11100000', B'00000000'
  1867. DT B'00000000', B'00010001', B'01000000', B'00000000'
  1868. DT B'00000000', B'00000000', B'00000000', B'00000000'
  1869. DT B'00000000', B'00000000', B'00000000', B'00000000'
  1870. DT B'00000000', B'01100010', B'01000100', B'00000000'
  1871. DT B'00000000', B'01110111', B'11101110', B'00000000'
  1872. DT B'00000000', B'01010101', B'10101010', B'00000000'
  1873. DT B'00000000', B'01010101', B'10101010', B'00000000'
  1874. DT B'00000000', B'01010101', B'10101010', B'00000000'
  1875. DT B'00000000', B'01010101', B'10101010', B'00000000'
  1876. DT B'00000000', B'01110101', B'10101110', B'00000000'
  1877. DT B'00000000', B'01100101', B'10100110', B'00000000'
  1878. DT B'00000000', B'01000101', B'10100010', B'00000000'
  1879. DT B'00000000', B'01000101', B'10101010', B'00000000'
  1880. DT B'00000000', B'01000111', B'10101110', B'00000000'
  1881. DT B'00000000', B'01000010', B'10100100', B'00000000'
  1882. DT B'00000000', B'00000000', B'00000000', B'00000000'
  1883. PICPONG_TABLE_END: ;
  1884. ;---------------------------------------------------;
  1885.  
  1886. ;---------------------------------------------------;
  1887. END ;
  1888. ;---------------------------------------------------;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement