]> git.sur5r.net Git - cc65/blob - libsrc/cbm610/break.s
This commit was generated by cvs2svn to compensate for changes in r2,
[cc65] / libsrc / cbm610 / 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
11                       
12         .include        "zeropage.inc"
13         .include        "page3.inc"
14
15
16 .bss
17 _brk_a:         .res    1
18 _brk_x:         .res    1
19 _brk_y:         .res    1
20 _brk_sr:        .res    1
21 _brk_pc:        .res    2
22 _brk_01:        .res    1
23
24 oldvec:         .res    2               ; Old vector
25
26
27 .data
28 uservec:        jmp     $FFFF           ; Patched at runtime
29
30
31 .code
32
33 ; Set the break vector
34 .proc   _set_brk
35
36         sta     uservec+1
37         stx     uservec+2       ; Set the user vector
38
39         lda     oldvec
40         ora     oldvec+1        ; Did we save the vector already?
41         bne     L1              ; Jump if we installed the handler already
42
43         lda     BRKVec
44         sta     oldvec
45         lda     BRKVec+1
46         sta     oldvec+1        ; Save the old vector
47
48         lda     #<_reset_brk
49         ldx     #>_reset_brk
50         jsr     _atexit         ; Install an exit handler
51
52 L1:     lda     #<brk_handler   ; Set the break vector to our routine
53         sta     BRKVec
54         lda     #>brk_handler
55         sta     BRKVec+1
56         rts
57
58 .endproc
59
60
61 ; Reset the break vector
62 .proc   _reset_brk
63
64         lda     oldvec
65         sta     BRKVec
66         lda     oldvec+1
67         sta     BRKVec+1
68         rts
69
70 .endproc
71
72
73
74 ; Break handler, called if a break occurs
75
76 .proc   brk_handler
77
78         pla
79         sta     _brk_y
80         pla
81         sta     _brk_x
82         pla
83         sta     _brk_a
84         pla
85         and     #$EF            ; Clear break bit
86         sta     _brk_sr
87         pla                     ; PC low
88         sec
89         sbc     #2              ; Point to start of brk
90         sta     _brk_pc
91         pla                     ; PC high
92         sbc     #0
93         sta     _brk_pc+1
94         lda     IndReg
95         sta     _brk_01
96         lda     ExecReg
97         sta     IndReg
98
99         jsr     uservec         ; Call the user's routine
100
101         lda     _brk_01
102         sta     IndReg
103
104         lda     _brk_pc+1
105         pha
106         lda     _brk_pc
107         pha
108         lda     _brk_sr
109         pha
110         ldx     _brk_x
111         ldy     _brk_y
112         lda     _brk_a
113         rti                     ; Jump back...
114
115 .endproc
116
117