153 lines
2.4 KiB
Z80 Assembly
153 lines
2.4 KiB
Z80 Assembly
.global _start
|
|
|
|
_start:
|
|
ld hl, syscall
|
|
ld a, 0xc3
|
|
ld (0xdffd), a
|
|
ld (0xdffe), hl
|
|
call scan_cards
|
|
call vmem_init
|
|
call pmem_init
|
|
call proc_map_init
|
|
ld c, 0
|
|
call get_frame
|
|
push bc
|
|
ld ix, empty_pagemap
|
|
call pmap_load
|
|
pop bc
|
|
ld c, b
|
|
ld b, 4
|
|
init_page_map_loop:
|
|
ld a, b
|
|
add a, 7
|
|
push bc
|
|
ld b, c
|
|
ld c, a
|
|
ld e, a
|
|
ld d, 0
|
|
call set_frame
|
|
pop bc
|
|
djnz init_page_map_loop
|
|
call tasking_init
|
|
call find_disk
|
|
ld hl, init_str
|
|
call read_init
|
|
ld hl, 0x8000
|
|
after_file_pos:
|
|
push hl
|
|
pop iy
|
|
ld l, (iy+0x1C) ; Load IX with the start of the program headers in memory
|
|
ld h, (iy+0x1D) ; Load IX with the start of the program headers in memory
|
|
push hl
|
|
pop ix
|
|
push iy
|
|
pop bc
|
|
add ix, bc
|
|
ld a, (iy+0x2C) ; load B with the number of program headers
|
|
ld b, a
|
|
phead_loop:
|
|
ld a, (ix+0)
|
|
cp 1
|
|
jp NZ, next_seg
|
|
push bc
|
|
ld c, (ix+20)
|
|
ld b, (ix+21)
|
|
; b = if c > 0 || b & 0xF > 0 {
|
|
; (b & 0xF0) + 0x10
|
|
; } else {
|
|
; b & 0xF0
|
|
; } >> 4
|
|
ld a, c
|
|
cp 0
|
|
jp z, cmp2
|
|
jp blk1
|
|
cmp2:
|
|
ld a, b
|
|
and 0xF
|
|
cp 0
|
|
jp z, blk2
|
|
blk1:
|
|
ld a, b
|
|
and 0xF0
|
|
add a, 0x10
|
|
ld b, a
|
|
jp end1
|
|
blk2:
|
|
ld a, b
|
|
and 0xF0
|
|
ld b, a
|
|
end1:
|
|
srl b
|
|
srl b
|
|
srl b
|
|
srl b
|
|
ld c, (ix+9)
|
|
srl c
|
|
srl c
|
|
srl c
|
|
srl c
|
|
push iy
|
|
push ix
|
|
push de
|
|
page_alloc_loop:
|
|
push bc
|
|
call get_free_frame
|
|
ld b, c
|
|
ld d, h
|
|
ld e, l
|
|
pop hl
|
|
ld c, l
|
|
push hl
|
|
call set_frame
|
|
pop bc
|
|
inc c
|
|
djnz page_alloc_loop
|
|
pop de
|
|
pop ix
|
|
pop iy
|
|
load_seg:
|
|
;Zero out the segments place in memory
|
|
ld c, (ix+20) ; Load the byte counter with the number of bytes to zero out
|
|
ld b, (ix+21)
|
|
ld e, (ix+8) ; Load the destination & source address register with the destination location of the segment in memory
|
|
ld d, (ix+9)
|
|
ld h, d
|
|
ld l, e
|
|
ld (hl), 0 ; Zero out the firts byte in the segment ( Acts as a 'seed' for the zeroing )
|
|
ldir
|
|
ld c, (ix+16) ; Load the byte counter with the number of bytes to transfer
|
|
ld b, (ix+17)
|
|
ld l, (ix+4) ; Load the source address register with the memory address if the segment data
|
|
ld h, (ix+5)
|
|
push iy
|
|
pop de
|
|
add hl, de
|
|
ld e, (ix+8) ; Load the destination address register with the destination location of the segment in memory
|
|
ld d, (ix+9)
|
|
ldir; Do the transfer
|
|
pop bc
|
|
next_seg:
|
|
ld de, 32
|
|
add ix, de
|
|
dec b
|
|
ld a, b
|
|
jp nz, phead_loop
|
|
ld l, (iy+0x18) ; Load HL with the program entry point
|
|
ld h, (iy+0x19) ; Load HL with the program entry point
|
|
ld ix, init_pagemap
|
|
call pmap_set
|
|
ld ix, empty_pagemap
|
|
call pmap_load
|
|
ld iy, init_pagemap
|
|
call new_process
|
|
call yield
|
|
halt
|
|
|
|
init_str: .asciz "init.elf"
|
|
|
|
empty_pagemap:
|
|
.ds.b 36
|
|
init_pagemap:
|
|
.ds.b 36
|
|
|