]> git.sur5r.net Git - cc65/blob - libsrc/em/em-kernel.s
Merge pull request #740 from laubzega/master
[cc65] / libsrc / em / em-kernel.s
1 ;
2 ; Ullrich von Bassewitz, 2002-11-29
3 ;
4 ; Common functions of the extended memory API.
5 ;
6
7         .import         return0, em_libref
8         .importzp       ptr1
9
10         .include        "em-kernel.inc"
11         .include        "em-error.inc"
12
13
14 ;----------------------------------------------------------------------------
15 ; Variables
16
17
18 .bss
19 _em_drv:        .res    2               ; Pointer to driver
20
21 ; Jump table for the driver functions.
22 .data
23 emd_vectors:
24 emd_install:    jmp     return0
25 emd_uninstall:  jmp     return0
26 emd_pagecount:  jmp     return0
27 emd_map:        jmp     return0
28 emd_use:        jmp     return0
29 emd_commit:     jmp     return0
30 emd_copyfrom:   jmp     return0
31 emd_copyto:     jmp     return0
32
33 ; Driver header signature
34 .rodata
35 emd_sig:        .byte   $65, $6d, $64, EMD_API_VERSION  ; "emd", version
36
37
38 ;----------------------------------------------------------------------------
39 ; unsigned char __fastcall__ em_install (void* driver);
40 ; /* Install the driver once it is loaded */
41
42
43 _em_install:
44         sta     _em_drv
45         sta     ptr1
46         stx     _em_drv+1
47         stx     ptr1+1
48
49 ; Check the driver signature
50
51         ldy     #.sizeof(emd_sig)-1
52 @L0:    lda     (ptr1),y
53         cmp     emd_sig,y
54         bne     inv_drv
55         dey
56         bpl     @L0
57
58 ; Set the library reference
59
60         ldy     #EMD_HDR::LIBREF
61         lda     #<em_libref
62         sta     (ptr1),y
63         iny
64         lda     #>em_libref
65         sta     (ptr1),y
66
67 ; Copy the jump vectors
68
69         ldy     #EMD_HDR::JUMPTAB
70         ldx     #0
71 @L1:    inx                             ; Skip the JMP opcode
72         jsr     copy                    ; Copy one byte
73         jsr     copy                    ; Copy one byte
74         cpy     #(EMD_HDR::JUMPTAB + .sizeof(EMD_HDR::JUMPTAB))
75         bne     @L1
76
77         jmp     emd_install             ; Call driver install routine
78
79 ; Driver signature invalid
80
81 inv_drv:
82         lda     #EM_ERR_INV_DRIVER
83         ldx     #0
84         rts
85
86 ; Copy one byte from the jump vectors
87
88 copy:   lda     (ptr1),y
89         sta     emd_vectors,x
90         iny
91         inx
92         rts
93
94 ;----------------------------------------------------------------------------
95 ; unsigned char em_uninstall (void);
96 ; /* Uninstall the currently loaded driver and return an error code.
97 ; ** Note: This call does not free allocated memory.
98 ; */
99
100 _em_uninstall:
101         jsr     emd_uninstall           ; Call driver routine
102
103 em_clear_ptr:                           ; External entry point
104         lda     #0
105         sta     _em_drv
106         sta     _em_drv+1               ; Clear the driver pointer
107
108         tax
109         rts                             ; Return zero