]> git.sur5r.net Git - cc65/blob - libsrc/cbm610/break.s
added sleep() implementation
[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        "cbm610.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_y
79         pla
80         sta     _brk_x
81         pla
82         sta     _brk_a
83         pla
84         and     #$EF            ; Clear break bit
85         sta     _brk_sr
86         pla                     ; PC low
87         sec
88         sbc     #2              ; Point to start of brk
89         sta     _brk_pc
90         pla                     ; PC high
91         sbc     #0
92         sta     _brk_pc+1
93         lda     IndReg
94         sta     _brk_01
95         lda     ExecReg
96         sta     IndReg
97
98         jsr     uservec         ; Call the user's routine
99
100         lda     _brk_01
101         sta     IndReg
102
103         lda     _brk_pc+1
104         pha
105         lda     _brk_pc
106         pha
107         lda     _brk_sr
108         pha
109         ldx     _brk_x
110         ldy     _brk_y
111         lda     _brk_a
112         rti                     ; Jump back...
113
114 .endproc
115
116