1
0
mirror of https://github.com/cc65/cc65.git synced 2024-12-23 19:29:37 +00:00
cc65/libsrc/em/em-kernel.s

109 lines
2.4 KiB
ArmAsm
Raw Normal View History

;
; Ullrich von Bassewitz, 2002-11-29
;
; Common functions of the extended memory API.
;
.export _em_install, _em_deinstall
.import return0
.importzp ptr1
.include "em-kernel.inc"
.include "em-error.inc"
;----------------------------------------------------------------------------
; Variables
.bss
_em_drv: .res 2 ; Pointer to driver
; Jump table for the driver functions.
.data
emd_vectors:
emd_install: jmp return0
emd_deinstall: jmp return0
emd_pagecount: jmp return0
emd_map: jmp return0
emd_use: jmp return0
emd_commit: jmp return0
emd_copyfrom: jmp return0
emd_copyto: jmp return0
; Driver header signature
.rodata
emd_sig: .byte $65, $6d, $64, $00 ; "emd", version
emd_sig_len = * - emd_sig
;----------------------------------------------------------------------------
; unsigned char __fastcall__ em_install (void* driver);
; /* Install the driver once it is loaded */
_em_install:
sta _em_drv
sta ptr1
stx _em_drv+1
stx ptr1+1
; Check the driver signature
ldy #emd_sig_len-1
@L0: lda (ptr1),y
cmp emd_sig,y
bne inv_drv
dey
bpl @L0
; Copy the jump vectors
ldy #EMD_HDR_JUMPTAB
ldx #0
@L1: inx ; Skip the JMP opcode
jsr copy ; Copy one byte
jsr copy ; Copy one byte
cpx #(EMD_HDR_JUMPCOUNT*3)
bne @L1
jmp emd_install ; Call driver install routine
; Driver signature invalid
inv_drv:
lda #EM_ERR_INV_DRIVER
ldx #0
rts
; Copy one byte from the jump vectors
copy: lda (ptr1),y
iny
set: sta emd_vectors,x
inx
rts
;----------------------------------------------------------------------------
; void __fastcall__ em_deinstall (void);
; /* Deinstall the driver before unloading it */
_em_deinstall:
jsr emd_deinstall ; Call driver routine
; Point all jump vectors to return0
ldx #0
@L1: inx ; Skip JMP opcode
lda #<return0
jsr set
lda #>return0
jsr set
cpx #(EMD_HDR_JUMPCOUNT*3)
bne @L1
rts