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