234 lines
3.0 KiB
Z80 Assembly
234 lines
3.0 KiB
Z80 Assembly
|
.global set_frame
|
||
|
.global get_free_frame
|
||
|
.global pmem_init
|
||
|
|
||
|
RAM_TYPE equ 2
|
||
|
SHARED_DATA_PAGE equ 2
|
||
|
BMAP_PAGE_512K equ 3
|
||
|
RAM_SIZE_LOW_PORT equ 0xFD
|
||
|
RAM_SIZE_HIGH_PORT equ 0xFE
|
||
|
BANKING_PAGE equ 0xE
|
||
|
|
||
|
ram_nums equ BANKING_PAGE << 12
|
||
|
first_ram_card: .db 0
|
||
|
|
||
|
; Get the pointer to the specified RAM card's bitmap.
|
||
|
; Also maps the right frame in
|
||
|
; A contains the RAM card to use
|
||
|
; HL returns the pointer to the bitmap
|
||
|
; The values in A, BC, DE, and IX are destroyed.
|
||
|
get_ram_bmap:
|
||
|
ex af, af'
|
||
|
ld a, (first_ram_card)
|
||
|
ld b, a
|
||
|
ld c, BANKING_PAGE
|
||
|
ld d, 0
|
||
|
ld e, SHARED_DATA_PAGE
|
||
|
call set_frame
|
||
|
ex af, af'
|
||
|
ld b, a
|
||
|
ld c, 0xFD
|
||
|
in l, (c)
|
||
|
inc c
|
||
|
in h, (c)
|
||
|
ex af, af'
|
||
|
ld a, h
|
||
|
cp 0
|
||
|
jp nz, grb_large_card
|
||
|
ld a, l
|
||
|
cp 128
|
||
|
jp nz, grb_large_card
|
||
|
; grb_512k_card
|
||
|
ld l, a
|
||
|
ld a, (first_ram_card)
|
||
|
ld b, a
|
||
|
ld c, BANKING_PAGE
|
||
|
ld d, 0
|
||
|
ld e, BMAP_PAGE_512K
|
||
|
call set_frame
|
||
|
ex af, af'
|
||
|
ld h, 0
|
||
|
ld l, a
|
||
|
add hl, hl
|
||
|
add hl, hl
|
||
|
add hl, hl
|
||
|
add hl, hl
|
||
|
ld a, h
|
||
|
or 0xE0
|
||
|
ld h, a
|
||
|
ret
|
||
|
grb_large_card:
|
||
|
ex af, af'
|
||
|
ld b, a
|
||
|
ld c, 0xF
|
||
|
ld d, 0
|
||
|
ld e, d
|
||
|
call set_frame
|
||
|
ld hl, 0xE000
|
||
|
ret
|
||
|
|
||
|
; Get a free frame of RAM
|
||
|
; On return, C contains the card that the frame is in, and
|
||
|
; HL contains the frame number
|
||
|
; The values in A, B, D, E, IX, and IY are destroyed.
|
||
|
get_free_frame:
|
||
|
push bc
|
||
|
ld a, (first_ram_card)
|
||
|
ld b, a
|
||
|
ld c, BANKING_PAGE
|
||
|
ld d, 0
|
||
|
ld e, SHARED_DATA_PAGE
|
||
|
call set_frame
|
||
|
pop bc
|
||
|
gff_loop:
|
||
|
ld ix, ram_nums
|
||
|
ld a, (ix+0)
|
||
|
cp 0
|
||
|
jp z, gff_done
|
||
|
push af
|
||
|
push ix
|
||
|
call get_ram_bmap
|
||
|
pop ix
|
||
|
push hl
|
||
|
pop iy
|
||
|
pop af
|
||
|
push iy
|
||
|
ld b, a
|
||
|
ld c, 0xFD
|
||
|
in l, (c)
|
||
|
inc c
|
||
|
in h, (c)
|
||
|
srl h
|
||
|
rr l
|
||
|
srl h
|
||
|
rr l
|
||
|
srl h
|
||
|
rr l
|
||
|
ld b, h
|
||
|
ld c, l
|
||
|
byte_loop:
|
||
|
push bc
|
||
|
ld b, 8
|
||
|
ld c, a
|
||
|
bit_loop:
|
||
|
ld a, b
|
||
|
sub 1
|
||
|
sla a
|
||
|
sla a
|
||
|
sla a
|
||
|
or 0x47
|
||
|
ld (bit_ins+1), a
|
||
|
or 0x80
|
||
|
ld (gff_set_ins+1), a
|
||
|
ld a, (iy+0)
|
||
|
bit_ins: bit 0, a
|
||
|
jp nz, used_frame
|
||
|
pop de
|
||
|
pop de
|
||
|
push iy
|
||
|
pop hl
|
||
|
ld a, (hl)
|
||
|
gff_set_ins: set 0, a
|
||
|
ld (hl), a
|
||
|
scf
|
||
|
ccf
|
||
|
sbc hl, de
|
||
|
add hl, hl
|
||
|
add hl, hl
|
||
|
add hl, hl
|
||
|
ld a, b
|
||
|
sub 1
|
||
|
add a, l
|
||
|
ld l, a
|
||
|
ret
|
||
|
used_frame:
|
||
|
djnz bit_loop
|
||
|
ld d, c
|
||
|
pop bc
|
||
|
dec bc
|
||
|
inc iy
|
||
|
ld a,b
|
||
|
or c
|
||
|
ld a, d
|
||
|
jp nz,byte_loop
|
||
|
inc ix
|
||
|
pop iy
|
||
|
jp gff_loop
|
||
|
gff_done:
|
||
|
exx
|
||
|
ld c, 0
|
||
|
ld hl, 0
|
||
|
ret
|
||
|
|
||
|
pmem_init:
|
||
|
ld b, RAM_TYPE
|
||
|
call find_first_card
|
||
|
ld a, l
|
||
|
ld (first_ram_card), a
|
||
|
ex af, af'
|
||
|
ld c, BANKING_PAGE
|
||
|
ld b, l
|
||
|
ld d, 0
|
||
|
ld e, SHARED_DATA_PAGE
|
||
|
call set_frame
|
||
|
ld ix, ram_nums
|
||
|
ld b, 16
|
||
|
ld c, RAM_TYPE
|
||
|
call get_all_cards
|
||
|
ld ix, ram_nums
|
||
|
init_loop:
|
||
|
ld a, (ix+0)
|
||
|
inc ix
|
||
|
cp 0
|
||
|
jp z, init_done
|
||
|
ld b, a
|
||
|
ld c, RAM_SIZE_LOW_PORT
|
||
|
in l, (c)
|
||
|
ld c, RAM_SIZE_HIGH_PORT
|
||
|
in h, (c)
|
||
|
push hl
|
||
|
pop iy
|
||
|
ld d, a
|
||
|
push af
|
||
|
ld a, d
|
||
|
call get_ram_bmap
|
||
|
pmem_init_grb_done:
|
||
|
pop af
|
||
|
push hl
|
||
|
push iy
|
||
|
pop bc
|
||
|
ld d, h
|
||
|
ld e, l
|
||
|
ld (hl), 0 ; Zero out the first byte ( Acts as a 'seed' for the zeroing )
|
||
|
ldir
|
||
|
pop hl
|
||
|
ld b, a
|
||
|
push iy
|
||
|
pop de
|
||
|
ld a, d
|
||
|
cp 0
|
||
|
jp nz, init_if1
|
||
|
ld a, e
|
||
|
cp 128
|
||
|
jp nz, init_if1
|
||
|
jp init_if1_end
|
||
|
init_if1:
|
||
|
ld (hl), 0x1
|
||
|
init_if1_end:
|
||
|
/* ld a, (first_ram_card) */
|
||
|
/* ld c, a */
|
||
|
/* ld a, b */
|
||
|
/* cp c */
|
||
|
jp nz, init_if2_end
|
||
|
ld (hl), 0xFF
|
||
|
init_if2_end:
|
||
|
ld a, (first_ram_card)
|
||
|
ld b, a
|
||
|
ld c, BANKING_PAGE
|
||
|
ld d, 0
|
||
|
ld e, SHARED_DATA_PAGE
|
||
|
call set_frame
|
||
|
jp init_loop
|
||
|
init_done:
|
||
|
ret
|