Advertisement
taylorza

NextBASIC High Resolution Timer

Feb 4th, 2024 (edited)
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.83 KB | None | 0 0
  1. #program asmstpwtch
  2. 10 RUN AT 3
  3. 20 SAVE "asmstpwtch.bas"
  4. 30 CLEAR $beff
  5. 40 .asm
  6. 50 ; org $bf00
  7. 60 ;ctc2 equ $1a3b
  8. 70 ;regsel equ $243b
  9. 80 ; jp init
  10. 90 ; jp start
  11. 100 ; jp read
  12. 110 ; jp stop
  13. 120 ;init ; initialize timer
  14. 130 ; di
  15. 140 ; nreg $c0,ivt & %11100000 | 1
  16. 150 ; nreg $c4,%00000001 ;ULA interrupt enabled
  17. 160 ; nreg $c5,%00000000 ;Timers disabled
  18. 170 ; nreg $c6,%00000000
  19. 180 ; ld bc,regsel ;Register select port
  20. 190 ; ld a,$11 ;Video timing register
  21. 200 ; out (c),a ; select the register
  22. 210 ; inc b ;Register read port
  23. 220 ; in a,(c) ;Read register
  24. 230 ; and %00000111 ;Mask video mode
  25. 240 ; ld hl,ms1 ;1ms Prescalar table
  26. 250 ; add hl,a ;Table offset for video mode
  27. 260 ; ld a,(hl) ;Read prescalar
  28. 270 ; ld (prescl),a ;Save prescalar
  29. 280 ; ld a,$bf ;Load IVT high byte
  30. 290 ; ld i,a ; into I
  31. 300 ; ld a, 1 ;Flag value
  32. 310 ; ld (initialized),a
  33. 320 ; ld (stopped),a
  34. 330 ; im 2 ;Set interrupt mode 2
  35. 340 ; ei ;Enable interrupts
  36. 350 ; ret
  37. 360 ;initialized db 0
  38. 370 ;stopped db 0
  39. 380 ;;
  40. 390 ;; Timer prescalars
  41. 400 ;;
  42. 410 ;ms1 db 109,112,115,117,121,125,129,105
  43. 420 ;prescl db 0
  44. 430 ;;
  45. 440 ;; Start timer at 0
  46. 450 ;;
  47. 460 ;start
  48. 470 ; ld a,(initialized)
  49. 480 ; or a
  50. 490 ; call z,init ;Initialize IM 2
  51. 500 ; di
  52. 510 ; ld a,(stopped)
  53. 520 ; or a
  54. 530 ; jr z, reset ;Not stopped, just reset counter
  55. 540 ; xor a
  56. 550 ; ld (stopped),a;Flag not stopped
  57. 560 ; ld bc,regsel
  58. 570 ; ld a,$c5
  59. 580 ; out (c),a ;Select timer interrupt register
  60. 590 ; inc b
  61. 600 ; in a,(c) ;Read CTC0..7 interrupt state
  62. 610 ; or %00000100 ; enable CTC2 interrupts
  63. 620 ; out (c),a ;Write new interrupt state
  64. 630 ; ld bc,ctc2
  65. 640 ; ld a,1
  66. 650 ; out (c),a ;Disable CTC2
  67. 660 ; ld a,%10100101;Timer config flags
  68. 670 ; out (c),a ;Send config flags to CTC2
  69. 680 ; ld a,(prescl) ;Load prescalar
  70. 690 ; out (c),a ; into CTC2
  71. 700 ;reset
  72. 710 ; ld hl,0
  73. 720 ; ld (ctr),hl ;Zero counter
  74. 730 ; ei ;Enable interrupts, start counter
  75. 740 ; ret
  76. 750 ;;
  77. 760 ;; Read current timer value
  78. 770 ;;
  79. 780 ;read
  80. 790 ; di
  81. 800 ; ld bc,(ctr) ;Load counter into BC for BASIC
  82. 810 ; ei
  83. 820 ; ret
  84. 830 ;;
  85. 840 ;; Stop timer
  86. 850 ;;
  87. 860 ;stop
  88. 870 ; di
  89. 880 ; ld bc,ctc2
  90. 890 ; ld a,%00000011 ;Reset and stop timer flags
  91. 900 ; out (c),a ;Stop CTC2
  92. 910 ; ld bc,regsel
  93. 920 ; ld a,$c5
  94. 930 ; out (c),a ;Select timer interrupt register
  95. 940 ; inc b
  96. 950 ; in a,(c) ;Read timer interrupt register
  97. 960 ; and %11111011 ;Disable CTC2 interrupts
  98. 970 ; out (c),a ;Update timer interrupt register
  99. 980 ; ld a,1
  100. 990 ; ld (stopped),a ;Set stopped flag
  101. 1000 ; ei
  102. 1010 ; ret
  103. 1020 ;;
  104. 1030 ;; Timer interrupt handler
  105. 1040 ;;
  106. 1050 ;ctchandler
  107. 1060 ; push hl
  108. 1070 ; ld hl,(ctr) ;Get current counter value
  109. 1080 ; inc hl ;Increment value
  110. 1090 ; ld (ctr),hl ;Store new counter value
  111. 1100 ; pop hl
  112. 1110 ; ei
  113. 1120 ; reti
  114. 1130 ;ctr dw 0
  115. 1140 ;;
  116. 1150 ;; ULA interrupt handler
  117. 1160 ;;
  118. 1170 ;ulahandler
  119. 1180 ; call $38 ;Call ROM ULA Interrupt
  120. 1190 ; reti ;ROM does RET so we do RETI
  121. 1200 ;;
  122. 1210 ;; Default interrupt handler
  123. 1220 ;;
  124. 1230 ;inthandler
  125. 1240 ; ei
  126. 1250 ; reti
  127. 1260 ;;
  128. 1270 ;;Interrupt Vector Table
  129. 1280 ;;
  130. 1290 ; align 32
  131. 1300 ;ivt
  132. 1310 ; dw inthandler ; 0-line interrupt
  133. 1320 ; dw inthandler ; 1-uart0 rx
  134. 1330 ; dw inthandler ; 2-uart1 rx
  135. 1340 ; dw inthandler ; 3-ctc0
  136. 1350 ; dw inthandler ; 4-ctc1
  137. 1360 ; dw ctchandler ; 5-ctc2
  138. 1370 ; dw inthandler ; 6-ctc3
  139. 1380 ; dw inthandler ; 7-ctc4
  140. 1390 ; dw inthandler ; 8-ctc5
  141. 1400 ; dw inthandler ; 9-ctc6
  142. 1410 ; dw inthandler ;10-ctc7
  143. 1420 ; dw ulahandler ;11-ula
  144. 1430 ; dw inthandler ;12-uart0 tx
  145. 1440 ; dw inthandler ;13-uart1 tx
  146. 1450 ; dw inthandler ;14-unused
  147. 1460 ; dw inthandler ;15-unused
  148. 1470 REM -------------------------------
  149. 1480 REM BASIC TEST PROGRAM
  150. 1490 REM -------------------------------
  151. 1500 PROC StartTimer()
  152. 1510 FOR %r=0 TO 3
  153. 1520 RUN AT %r
  154. 1530 PRINT "RUN AT ";%r
  155. 1540 %s = FN ReadTimer()
  156. 1550 f= TIME
  157. 1560 FOR i=1 TO 10
  158. 1570 PRINT i;", "; % INT { FN ReadTimer()}-s;"ms, "; TIME -f;" frames"
  159. 1580 f= TIME
  160. 1590 %s= FN ReadTimer()
  161. 1600 NEXT i
  162. 1610 PRINT "Press ANY Key": PAUSE 0: CLS
  163. 1620 NEXT %r
  164. 1630 PROC StopTimer()
  165. 1640 STOP
  166. 1650 REM -------------------------------
  167. 1660 REM BASIC 2 Machine Code Interface
  168. 1670 REM -------------------------------
  169. 1680 DEFPROC InitTimer()
  170. 1690 RANDOMIZE % USR $bf00
  171. 1700 ENDPROC
  172. 1710 DEFPROC StartTimer()
  173. 1720 RANDOMIZE % USR $bf03
  174. 1730 ENDPROC
  175. 1740 DEF FN ReadTimer() = % USR $bf06
  176. 1750 DEFPROC StopTimer()
  177. 1760 RANDOMIZE % USR $bf09
  178. 1770 ENDPROC
  179.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement