]> git.sur5r.net Git - cc65/blob - libsrc/cbm510/break.s
Atari: clock_gettime() and clock_settime() implementations
[cc65] / libsrc / cbm510 / break.s
1 ;
2 ; Ullrich von Bassewitz, 27.09.1998
3 ;
4 ; void set_brk (unsigned Addr);
5 ; void reset_brk (void);
6 ;
7
8         .export         _set_brk, _reset_brk
9         .export         _brk_a, _brk_x, _brk_y, _brk_sr, _brk_pc
10         .import         _atexit, BRKVec
11
12         .include        "cbm510.inc"
13
14
15 .bss
16 _brk_a:         .res    1
17 _brk_x:         .res    1
18 _brk_y:         .res    1
19 _brk_sr:        .res    1
20 _brk_pc:        .res    2
21 _brk_01:        .res    1
22
23 oldvec:         .res    2               ; Old vector
24
25
26 .data
27 uservec:        jmp     $FFFF           ; Patched at runtime
28
29
30 .code
31
32 ; Set the break vector
33 .proc   _set_brk
34
35         sta     uservec+1
36         stx     uservec+2       ; Set the user vector
37
38         lda     oldvec
39         ora     oldvec+1        ; Did we save the vector already?
40         bne     L1              ; Jump if we installed the handler already
41
42         lda     BRKVec
43         sta     oldvec
44         lda     BRKVec+1
45         sta     oldvec+1        ; Save the old vector
46
47 L1:     lda     #<brk_handler   ; Set the break vector to our routine
48         ldx     #>brk_handler
49         sta     BRKVec
50         stx     BRKVec+1
51         rts
52
53 .endproc
54
55
56 ; Reset the break vector
57 .proc   _reset_brk
58
59         lda     oldvec
60         ldx     oldvec+1
61         beq     @L9             ; Jump if vector not installed
62         sta     BRKVec
63         stx     BRKVec+1
64         lda     #$00
65         sta     oldvec          ; Clear the old vector
66         stx     oldvec+1
67 @L9:    rts
68
69 .endproc
70
71
72
73 ; Break handler, called if a break occurs
74
75 .proc   brk_handler
76
77         pla
78         sta     _brk_01
79         pla
80         sta     _brk_y
81         pla
82         sta     _brk_x
83         pla
84         sta     _brk_a
85         pla
86         and     #$EF            ; Clear break bit
87         sta     _brk_sr
88         pla                     ; PC low
89         sec
90         sbc     #2              ; Point to start of brk
91         sta     _brk_pc
92         pla                     ; PC high
93         sbc     #0
94         sta     _brk_pc+1
95
96         jsr     uservec         ; Call the user's routine
97
98         lda     _brk_01
99         sta     IndReg
100
101         lda     _brk_pc+1
102         pha
103         lda     _brk_pc
104         pha
105         lda     _brk_sr
106         pha
107         ldx     _brk_x
108         ldy     _brk_y
109         lda     _brk_a
110         rti                     ; Jump back...
111
112 .endproc
113
114