]> git.sur5r.net Git - cc65/blob - libsrc/serial/ser-kernel.s
Working on the new serial code
[cc65] / libsrc / serial / ser-kernel.s
1 ;
2 ; Ullrich von Bassewitz, 2003-04-15
3 ;
4 ; Common functions of the serial drivers
5 ;
6
7         .export         ser_clear_ptr
8         .import         return0
9         .importzp       ptr1
10
11         .include        "ser-kernel.inc"
12         .include        "ser-error.inc"
13
14
15 ;----------------------------------------------------------------------------
16 ; Variables
17
18
19 .bss
20 _ser_drv:       .res    2               ; Pointer to driver
21
22 ; Jump table for the driver functions.
23 .data
24 ser_vectors:
25 ser_install:    jmp     return0
26 ser_uninstall:  jmp     return0
27 ser_params:     jmp     return0
28 ser_get:        jmp     return0
29 ser_put:        jmp     return0
30 ser_pause:      jmp     return0
31 ser_unpause:    jmp     return0
32 ser_status:     jmp     return0
33 ser_ioctl:      jmp     return0
34
35 ; Driver header signature
36 .rodata
37 ser_sig:        .byte   $73, $65, $72, $00      ; "ser", version
38 ser_sig_len     = * - ser_sig
39
40
41 ;----------------------------------------------------------------------------
42 ; unsigned char __fastcall__ ser_install (void* driver);
43 ; /* Install the driver once it is loaded */
44
45
46 _ser_install:
47         sta     _ser_drv
48         sta     ptr1
49         stx     _ser_drv+1
50         stx     ptr1+1
51
52 ; Check the driver signature
53
54         ldy     #ser_sig_len-1
55 @L0:    lda     (ptr1),y
56         cmp     ser_sig,y
57         bne     inv_drv
58         dey
59         bpl     @L0
60
61 ; Copy the jump vectors
62
63         ldy     #SER_HDR_JUMPTAB
64         ldx     #0
65 @L1:    inx                             ; Skip the JMP opcode
66         jsr     copy                    ; Copy one byte
67         jsr     copy                    ; Copy one byte
68         cpx     #(SER_HDR_JUMPCOUNT*3)
69         bne     @L1
70
71         jmp     ser_install             ; Call driver install routine
72
73 ; Driver signature invalid
74
75 inv_drv:
76         lda     #SER_ERR_INV_DRIVER
77         ldx     #0
78         rts
79
80 ; Copy one byte from the jump vectors
81
82 copy:   lda     (ptr1),y
83         sta     ser_vectors,x
84         iny
85         inx
86         rts
87
88 ;----------------------------------------------------------------------------
89 ; unsigned char __fastcall__ ser_uninstall (void);
90 ; /* Uninstall the currently loaded driver and return an error code.
91 ;  * Note: This call does not free allocated memory.
92 ;  */
93
94 _ser_uninstall:
95         jsr     ser_uninstall           ; Call driver routine
96
97 ser_clear_ptr:                          ; External entry point
98         lda     #0
99         sta     _ser_drv
100         sta     _ser_drv+1              ; Clear the driver pointer
101
102         tax
103         rts                             ; Return zero
104