]> git.sur5r.net Git - cc65/blob - libsrc/atari/break.s
info about c1541 in docs, lowered highest available address to $6000 due to
[cc65] / libsrc / atari / break.s
1 ;
2 ; Christian Groessler, 27-Feb-2000
3 ;
4 ; void set_brk (unsigned Addr);
5 ; void reset_brk (void);
6 ;
7
8         .export         _set_brk, _reset_brk
9         .destructor     _reset_brk
10         .export         _brk_a, _brk_x, _brk_y, _brk_sr, _brk_pc
11
12         .include        "atari.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
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     VBREAK
42         sta     oldvec
43         lda     VBREAK+1
44         sta     oldvec+1        ; Save the old vector
45
46 L1:     lda     #<brk_handler   ; Set the break vector to our routine
47         sta     VBREAK
48         lda     #>brk_handler
49         sta     VBREAK+1
50         rts
51
52 .endproc
53
54
55 ; Reset the break vector
56 .proc   _reset_brk
57
58         lda     oldvec
59         bne     @L1
60         ldx     oldvec
61         beq     @L9             ; Jump if vector not installed
62 @L1:    sta     VBREAK
63         stx     VBREAK+1
64 @L9:    rts
65
66 .endproc
67
68
69
70 ; Break handler, called if a break occurs
71
72 .proc   brk_handler
73
74         sty     _brk_y
75         stx     _brk_x
76         pla
77         sta     _brk_a
78         pla
79         and     #$EF            ; Clear break bit
80         sta     _brk_sr
81         pla                     ; PC low
82         sec
83         sbc     #2              ; Point to start of brk
84         sta     _brk_pc
85         pla                     ; PC high
86         sbc     #0
87         sta     _brk_pc+1
88
89         jsr     uservec         ; Call the user's routine
90
91         lda     _brk_pc+1
92         pha
93         lda     _brk_pc
94         pha
95         lda     _brk_sr
96         pha
97         ldx     _brk_x
98         ldy     _brk_y
99         lda     _brk_a
100         rti                     ; Jump back...
101
102 .endproc
103
104