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