Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #program asmstpwtch
- 10 RUN AT 3
- 20 SAVE "asmstpwtch.bas"
- 30 CLEAR $beff
- 40 .asm
- 50 ; org $bf00
- 60 ;ctc2 equ $1a3b
- 70 ;regsel equ $243b
- 80 ; jp init
- 90 ; jp start
- 100 ; jp read
- 110 ; jp stop
- 120 ;init ; initialize timer
- 130 ; di
- 140 ; nreg $c0,ivt & %11100000 | 1
- 150 ; nreg $c4,%00000001 ;ULA interrupt enabled
- 160 ; nreg $c5,%00000000 ;Timers disabled
- 170 ; nreg $c6,%00000000
- 180 ; ld bc,regsel ;Register select port
- 190 ; ld a,$11 ;Video timing register
- 200 ; out (c),a ; select the register
- 210 ; inc b ;Register read port
- 220 ; in a,(c) ;Read register
- 230 ; and %00000111 ;Mask video mode
- 240 ; ld hl,ms1 ;1ms Prescalar table
- 250 ; add hl,a ;Table offset for video mode
- 260 ; ld a,(hl) ;Read prescalar
- 270 ; ld (prescl),a ;Save prescalar
- 280 ; ld a,$bf ;Load IVT high byte
- 290 ; ld i,a ; into I
- 300 ; ld a, 1 ;Flag value
- 310 ; ld (initialized),a
- 320 ; ld (stopped),a
- 330 ; im 2 ;Set interrupt mode 2
- 340 ; ei ;Enable interrupts
- 350 ; ret
- 360 ;initialized db 0
- 370 ;stopped db 0
- 380 ;;
- 390 ;; Timer prescalars
- 400 ;;
- 410 ;ms1 db 109,112,115,117,121,125,129,105
- 420 ;prescl db 0
- 430 ;;
- 440 ;; Start timer at 0
- 450 ;;
- 460 ;start
- 470 ; ld a,(initialized)
- 480 ; or a
- 490 ; call z,init ;Initialize IM 2
- 500 ; di
- 510 ; ld a,(stopped)
- 520 ; or a
- 530 ; jr z, reset ;Not stopped, just reset counter
- 540 ; xor a
- 550 ; ld (stopped),a;Flag not stopped
- 560 ; ld bc,regsel
- 570 ; ld a,$c5
- 580 ; out (c),a ;Select timer interrupt register
- 590 ; inc b
- 600 ; in a,(c) ;Read CTC0..7 interrupt state
- 610 ; or %00000100 ; enable CTC2 interrupts
- 620 ; out (c),a ;Write new interrupt state
- 630 ; ld bc,ctc2
- 640 ; ld a,1
- 650 ; out (c),a ;Disable CTC2
- 660 ; ld a,%10100101;Timer config flags
- 670 ; out (c),a ;Send config flags to CTC2
- 680 ; ld a,(prescl) ;Load prescalar
- 690 ; out (c),a ; into CTC2
- 700 ;reset
- 710 ; ld hl,0
- 720 ; ld (ctr),hl ;Zero counter
- 730 ; ei ;Enable interrupts, start counter
- 740 ; ret
- 750 ;;
- 760 ;; Read current timer value
- 770 ;;
- 780 ;read
- 790 ; di
- 800 ; ld bc,(ctr) ;Load counter into BC for BASIC
- 810 ; ei
- 820 ; ret
- 830 ;;
- 840 ;; Stop timer
- 850 ;;
- 860 ;stop
- 870 ; di
- 880 ; ld bc,ctc2
- 890 ; ld a,%00000011 ;Reset and stop timer flags
- 900 ; out (c),a ;Stop CTC2
- 910 ; ld bc,regsel
- 920 ; ld a,$c5
- 930 ; out (c),a ;Select timer interrupt register
- 940 ; inc b
- 950 ; in a,(c) ;Read timer interrupt register
- 960 ; and %11111011 ;Disable CTC2 interrupts
- 970 ; out (c),a ;Update timer interrupt register
- 980 ; ld a,1
- 990 ; ld (stopped),a ;Set stopped flag
- 1000 ; ei
- 1010 ; ret
- 1020 ;;
- 1030 ;; Timer interrupt handler
- 1040 ;;
- 1050 ;ctchandler
- 1060 ; push hl
- 1070 ; ld hl,(ctr) ;Get current counter value
- 1080 ; inc hl ;Increment value
- 1090 ; ld (ctr),hl ;Store new counter value
- 1100 ; pop hl
- 1110 ; ei
- 1120 ; reti
- 1130 ;ctr dw 0
- 1140 ;;
- 1150 ;; ULA interrupt handler
- 1160 ;;
- 1170 ;ulahandler
- 1180 ; call $38 ;Call ROM ULA Interrupt
- 1190 ; reti ;ROM does RET so we do RETI
- 1200 ;;
- 1210 ;; Default interrupt handler
- 1220 ;;
- 1230 ;inthandler
- 1240 ; ei
- 1250 ; reti
- 1260 ;;
- 1270 ;;Interrupt Vector Table
- 1280 ;;
- 1290 ; align 32
- 1300 ;ivt
- 1310 ; dw inthandler ; 0-line interrupt
- 1320 ; dw inthandler ; 1-uart0 rx
- 1330 ; dw inthandler ; 2-uart1 rx
- 1340 ; dw inthandler ; 3-ctc0
- 1350 ; dw inthandler ; 4-ctc1
- 1360 ; dw ctchandler ; 5-ctc2
- 1370 ; dw inthandler ; 6-ctc3
- 1380 ; dw inthandler ; 7-ctc4
- 1390 ; dw inthandler ; 8-ctc5
- 1400 ; dw inthandler ; 9-ctc6
- 1410 ; dw inthandler ;10-ctc7
- 1420 ; dw ulahandler ;11-ula
- 1430 ; dw inthandler ;12-uart0 tx
- 1440 ; dw inthandler ;13-uart1 tx
- 1450 ; dw inthandler ;14-unused
- 1460 ; dw inthandler ;15-unused
- 1470 REM -------------------------------
- 1480 REM BASIC TEST PROGRAM
- 1490 REM -------------------------------
- 1500 PROC StartTimer()
- 1510 FOR %r=0 TO 3
- 1520 RUN AT %r
- 1530 PRINT "RUN AT ";%r
- 1540 %s = FN ReadTimer()
- 1550 f= TIME
- 1560 FOR i=1 TO 10
- 1570 PRINT i;", "; % INT { FN ReadTimer()}-s;"ms, "; TIME -f;" frames"
- 1580 f= TIME
- 1590 %s= FN ReadTimer()
- 1600 NEXT i
- 1610 PRINT "Press ANY Key": PAUSE 0: CLS
- 1620 NEXT %r
- 1630 PROC StopTimer()
- 1640 STOP
- 1650 REM -------------------------------
- 1660 REM BASIC 2 Machine Code Interface
- 1670 REM -------------------------------
- 1680 DEFPROC InitTimer()
- 1690 RANDOMIZE % USR $bf00
- 1700 ENDPROC
- 1710 DEFPROC StartTimer()
- 1720 RANDOMIZE % USR $bf03
- 1730 ENDPROC
- 1740 DEF FN ReadTimer() = % USR $bf06
- 1750 DEFPROC StopTimer()
- 1760 RANDOMIZE % USR $bf09
- 1770 ENDPROC
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement