;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; KERNEL (system side) ;;;;;;;;;;;;;;;;;;;;;;;
;яЁш т√чютх #0005 т ёшёЄхьх тъы■ўхэ√ ёЄЁрэшЎ√: pgsystem, pgkillable, pgkillable, pgkillable (эр ёыєўрщ яюЁўш ёЄхъюь)
MAXAPPS=16
bdosstack_sz=0;150 ;80 ьрыю фы чруЁєчъш Їрщыр, 110 ьрыю фы fopen (фрцх ё INTSTACK2), 140 ьрыю фы ўЄхэш ърЄрыюур (фрцх ё INTSTACK2) ;0=юЄъы■ўшЄ№ ь№■Єхъё BDOS
QUITSTACK=0x4000 ;<=0x4000
macro BDOSSETPGSSCR
ld a,pgscr0_0
ld bc,memport8000
out (c),a
ld a,pgscr0_1
ld b,memportc000_hi;#ff
out (c),a
endm
macro BDOSSETPGFATFS
call BDOS_setpgfatfs
endm
macro BDOSSETPGTRDOSFS
call BDOS_setpgtrdosfs
endm
fatfs.tabl=0x4000
include "fatfs_h.asm"
wassyscode
disp 0x0000
syscode
sys_time_date
ds 4
ds 0x0000+4-$
jp sys_quit
sys_reter
ret
callbdos_mutex
db 0xc0
ds 0x0005+4-$
jp callbdos
ds 0x0009+4-$
jp sys_getchar
sys_farcall
jp endsys_result_a
ds 0x0015-2-$
endsys_result_aq
out (0xfd),a
display "kernel_result_a=",$
ds 0x0010+5-$
;e=char
if bdosstack_sz==0
ld (sys_prchar_sp),sp
ld sp,BDOSSTACK ;фю ¤Єюую ьюьхэЄр яЁхЁ√трэшх ьюцхЄ чряюЁюЄ№ ы■сюх ьхёЄю ярь Єш (user sp >=#3b00)
else
exx
ld hl,0
add hl,sp
ld iy,(appaddr)
;ld (iy+app.callbdos_sp),l
;ld (iy+app.callbdos_sp+1),h
ld bc,app.bdosstack+bdosstack_sz
add iy,bc
ld sp,iy ;фю ¤Єюую ьюьхэЄр яЁхЁ√трэшх ьюцхЄ чряюЁюЄ№ ы■сюх ьхёЄю ярь Єш (user sp >=#3b00)
exx
endif
ld iy,(appaddr)
call BDOS_prchar ;яюЁЄшЄ Єюы№ъю #c000+, эю ёрьр тюёёЄрэртыштрхЄ pgkillable
if bdosstack_sz==0
sys_prchar_sp=$+1
ld sp,0
else
exx
;ld iy,(appaddr)
;ld l,(iy+app.callbdos_sp)
;ld h,(iy+app.callbdos_sp+1)
ld sp,hl
exx
endif
jp endsys_result_a
sys_timer
ds 4
ds 0x0030+4-$
jp sys_farcall
ds 0x0038-$
jp sys_sysint
ds 0x0038+9-$ -4
sys_intq
;bc=memport0000
;d=pgmain
;e=чэрўхэшх фы ръъєьєы ЄюЁр
;a=screenpg
;iy="iy"
ld sp,INTMICROSTACK
out (0xfd),a ;фры№°х яюярфрхь т init_resident
;sp=INTMICROSTACK
;bc=memport0000
;d=pgmain
;e=чэрўхэшх фы ръъєьєы ЄюЁр
;di
ds 0x0038+14-$ -4
;TODO чрїтрЄшЄ№ ь№■Єхъё (яЁхЁ√трэшх тэєЄЁш яЁхЁ√трэш фюыцэю яюярёЄ№ т яЁюёЄющ юсЁрсюЄўшъ схч °хфєыхЁр)
jp sys_intgo ;эєцэю, ўЄюс√ ьюцэю с√ыю ёЄртшЄ№ Єюўъє юёЄрэютр эр #0100
;ds 0x0101-$ ;эєцэю, ўЄюс√ ьюцэю с√ыю ёЄртшЄ№ Єюўъє юёЄрэютр эр #0100
safestack_sz=18
STRUCT app
flags BYTE ;Їыруш (тёхуфр т эрўрых ёЄЁєъЄєЁ√)
;priority BYTE ;TODO яЁшюЁшЄхЄ (0=ъюэхЎ ёяшёър)
id BYTE ;эюьхЁ чрфрўш (0=ётюсюфэю)
parentid BYTE ;эюьхЁ ЁюфшЄхы№ёъющ чрфрўш
mainpg BYTE ;уыртэр ёЄЁрэшЎр чрфрўш (Єрь userkernel)
;callbdos_sp WORD ;ё■фр ёюїЁрэ хЄё ёЄхъ яЁш т√чютх BDOS
;curmsg WORD ;TODO рфЁхё Єхъє∙хую ёююс∙хэш ¤Єющ чрфрўх
;endmsg WORD ;TODO рфЁхё ъюэЎр юўхЁхфш ёююс∙хэшщ ¤Єющ чрфрўх
;sp WORD ;Єхъє∙шщ рфЁхё ёЄхър (ыхцшЄ т mainpg:intsp)
;next WORD ;TODO єърчрЄхы№ эр ёыхфє∙є■ чрфрўє (ёыхфє■∙р чр т√яюыэ хьющ тэєЄЁш Єюую цх яЁшюЁшЄхЄр)
screen BYTE ;Єхъє∙шщ эюьхЁ ¤ъЁрэр ;fd_user + 8*screen
gfxmode BYTE ;Єхъє∙шщ тшфхюЁхцшь ;чэрўхэшх фы #bd77
textcuraddr WORD ;рфЁхё ъєЁёюЁр эр ¤ъЁрэх
curcolor BYTE ;Єхъє∙шщ рЄЁшсєЄ яЁш яхўрЄш
dta WORD ;data transfer address
vol BYTE ;Єхъє∙шщ фЁрщт (volume)
dircluster DWORD ;Єхъє∙р фшЁхъЄюЁш
dir BLOCK DIR_sz ;тЁхьхээ√щ сєЇхЁ фы ўЄхэш ърЄрыюур
bdosstack BLOCK bdosstack_sz ;ёЄхъ яЁш т√чютх BDOS
pal BLOCK 32
;safestack BLOCK safestack_sz ;de,hl,af',af,ix,hl',de',bc',iy
ENDS
display "apps start=",/h,$
safestack
ds safestack_sz
app1 app
app_sz=$-safestack
ds (MAXAPPS-1)*app_sz
display "MAXAPPS=",/h,MAXAPPS
app_afterlast=$+safestack_sz
app_last=app_afterlast-app_sz
display "app1=",/h,app1
display "app_last=",/h,app_last
sys_intgo
ld (sys_int_iy),iy
appaddr=$+2
ld iy,app1
ld (sys_intsp),sp
ld sp,iy ;safestack_end
push af ;skipped
exx
push bc
push de
push hl
push ix
;ld a,(iy+app.screen)
push af ;f, a=screenpg
ex af,af'
push af
exx
ld h,(iy+app.mainpg)
push de ;"hl"
push hl ;h=mainpg,l="a"
ld sp,iy
sys_int_iy=$+1
ld de,0
push de
ld d,b
ld e,c
ld bc,memport4000
out (c),h
ld (INTMICROSTACK+#4000),de ;"bc"
sys_intsp=$+1
ld hl,0
ld (intsp+#4000),hl ;"sp"
ld a,pgtrdosfs;pagexor-5
out (c),a ;Єрь INTSTACK
;sys_int_schedule_and_go
ld sp,INTSTACK2
call setgfxpal_focus
call schedule ;out: hl=iy=app
;ld hl,(appaddr)
;ld iy,(appaddr)
;call iffocus_setgfx
call on_int
sys_int_popregs
ld a,pgkillable
ld bc,memport4000
ld (sys_curpg4000),a
out (c),a
;sys_int_popregs
ld de,-safestack_sz
add iy,de
ld sp,iy
pop de ;d=mainpg,e="a"
pop hl ;"hl"
ld bc,memport0000
exx
pop af
ex af,af'
pop af ;f, a=screenpg
;ld a,(curscreen) ;(focusappaddr)+app.screen
ld iy,(focusappaddr)
ld a,(iy+app.screen)
pop ix
pop hl
pop de
pop bc
exx
pop iy
;TODO юётюсюфшЄ№ ь№■Єхъё, ьюцэю тъы■ўшЄ№ яЁхЁ√трэш
jp sys_intq
schedule
;find next app, set iy
;out: hl=iy=app
ld hl,(appaddr)
ld bc,-app_last;app_afterlast
ld de,app_last+app_sz;app_sz
ld a,MAXAPPS
findnextapp0
;add hl,de
;sbc hl,bc
;add hl,bc
;jr nz,$+5
;ld hl,app1
add hl,bc
jr nc,$+5
ld hl,app1 -(app_last+app_sz)
add hl,de
bit factive,(hl)
jr nz,findnextappq
dec a
jr nz,findnextapp0
;no active apps
;findnextapp_idle (TODO х∙╕ хёыш т Єхъє∙хь ЇЁхщьх єцх яЁющфхэ√ тёх ръЄштэ√х чрфрўш?)
ld hl,app1
findnextappq
ld (appaddr),hl
if 1==1
ld iy,(appaddr)
ld a,(iy+app.mainpg)
ld bc,memport4000
;ld (sys_curpg4000),a ;TODO шыш эх эєцэю?
out (c),a
ld iy,(focusappaddr)
ld a,(iy+app.screen)
or fd_system
ld (user_fdvalue1+#4000),a
ld (user_fdvalue2+#4000),a
ld (user_fdvalue3+#4000),a
ld (user_fdvalue4+#4000),a
;ld (user_fdvalue5+#4000),a ;not supported yet
ld (user_fdvalue6+#4000),a
ld a,pgtrdosfs
out (c),a ;Єрь INTSTACK
endif
ld iy,(appaddr)
ret
setgfxpal_focus
;хёыш т yield эх яюёЄртшЄ№ ярышЄЁє тЄюЁющ чрфрўх, Єю юэр эшъюуфр эх яюёЄртшЄё , хёыш яхЁтр чрфрўр т Ўшъых фхырхЄ yield
;яюЄюьє ўЄю тёх яЁхЁ√трэш сєфєЄ ёЄртшЄ№ яхЁтє■ чрфрўє
;хёыш цх ярышЄЁє ёЄртшЄ№ т ёрьюь yield, Єю ьюуєЄ с√Є№ яЁюсыхь√ ё т√ёЄртыхэшхь ярышЄЁ√, хёыш yield т√ч√трЄ№ т ёыєўрщэ√ї ьхёЄрї шыш хёыш тёх чрфрўш эхръЄштэ√
;яю¤Єюьє юсЁрсюЄўшъ яЁхЁ√трэшщ фюыцхэ т√ёЄрты Є№ ярышЄЁє ш тшфхюЁхцшь чрфрўш, ъюЄюЁр т Їюъєёх, эхчртшёшью юЄ х╕ ръЄштэюёЄш
;ld de,(focusappaddr)
;or a
;sbc hl,de
;jp nz,sys_int_nofocus
;add hl,de ;appaddr
;ld a,(iy+app.gfxmode)
;ld (sys_curgfxmode),a
;sys_int_nofocus
;TODO т ьюьхэЄ яхЁхъы■ўхэш эр focusapp (Є.х. эр яЁхф√фє∙хь ЇЁхщьх эх с√ыю Їюъєёр)
;;push iy
;;ld iy,(focusappaddr)
;call restoretextmode
;;pop iy
ld hl,(focusappaddr)
ld bc,app.gfxmode
add hl,bc
ld a,(hl)
ld bc,#bd77
out (c),a ;set gfx mode
;ld hl,(focusappaddr)
ld bc,app.pal+31 -app.gfxmode
add hl,bc
ld c,#ff
ld a,7
dup 8
OUT (#F6),A
ld d,(hl)
dec hl
ld b,(hl) ;DDp palette low bits
OUT (c),d;(#FF),A
dec hl
dec a
edup
ld a,7
dup 7
OUT (#FE),A
ld d,(hl)
dec hl
ld b,(hl) ;DDp palette low bits
OUT (c),d;(#FF),A
dec hl
dec a
edup
OUT (#FE),A ;0
ld d,(hl)
dec hl
ld b,(hl) ;DDp palette low bits
OUT (c),d;(#FF),A
ret
sys_sysint
;TODO schedule (фы RTOS), эю Єюуфр эрфю ЁххэЄхЁрсхы№эюёЄ№ тёхї яЁюЎхфєЁ BDOS (фрцх схч ¤Єюую °хфєышэур юэш тё╕ Ёртэю эх фюыцэ√ шьхЄ№ ёюёЄю эш !)
;ъръ °хфєышЄ№, ъюуфр ь√ т kernelspace???
;TODO яЁютхЁър ъЁшЄшўхёъющ ёхъЎшш (т юс√ўэюь яЁхЁ√трэшш эх эєцэю)
ex de,hl
ex (sp),hl ;тюёёЄрэютшыш ёЄхъ шч de
ld (sys_sysint_jp),hl
ld (sys_sysint_sp),sp
ld sp,INTSTACK1
push af
push bc
push de ;"hl"
;push hl
exx
ex af,af'
push af
push bc
push de
push hl
push ix
push iy
ld sp,INTSTACK2
ld bc,memport4000
ld a,pgtrdosfs;pagexor-5 ;Єрь INTSTACK
out (c),a
call setgfxpal_focus
call on_int
sys_curpg4000=$+1
ld a,pgkillable
ld bc,memport4000
out (c),a
ld sp,INTSTACK1-18
pop iy
pop ix
pop hl
pop de
pop bc
pop af
ex af,af'
exx
pop hl ;"hl"
;pop de
pop bc
pop af
sys_sysint_sp=$+1
ld sp,0
pop de
ei
;ret
sys_sysint_jp=$+1
jp 0
on_int
;т #4000 ёхщўрё pg5, Єрь ёЄхъ
focusappaddr=$+1
ld hl,app1
ld bc,app.gfxmode
add hl,bc
ld e,(hl)
;sys_curgfxmode=$+1
;ld e,%10101000 ;320x200 mode
call readmouse ;resident >=#4000
ld (sys_mousecoords),hl
ld a,d
ld (sys_mousebuttons),a
call readtime ;hl=date, de=time
ld (sys_time_date),de
ld (sys_time_date+2),hl
ld hl,sys_timer
inc (hl)
inc hl
jr nz,on_int_timerq
inc (hl)
inc hl
jr nz,on_int_timerq
inc (hl)
inc hl
jr nz,on_int_timerq
inc (hl)
on_int_timerq
call KEYSCAN
;call PEEKKEY ;ld a,(curkey)
;cp ssEnter
ld a,#7f
in a,(#fe)
rra
ld c,a ;c0=ss
ld a,#bf
in a,(#fe)
or c
cpl
ld c,a
cpl
;a0=c0=0: ssEnter pressed
on_int_oldssEnter=$+1
or 0 ;=0: ssEnter was released
rra
ld a,c
ld (on_int_oldssEnter),a
jr c,sys_int_noselectapp
call KEY_PUTREDRAW
ld hl,(focusappaddr)
ld bc,-app_last;app_afterlast
ld de,app_last+app_sz;app_sz
ld a,MAXAPPS
findnextgfxapp0
;add hl,de
;sbc hl,bc
;add hl,bc
;jr nz,$+5
;ld hl,app1
add hl,bc
jr nc,$+5 ;hl < app_last
ld hl,app1 -(app_last+app_sz)
add hl,de
bit fgfx,(hl)
jr z,findnextgfxappskip
bit fwaiting,(hl)
jr z,findnextgfxappq
findnextgfxappskip
dec a
jr nz,findnextgfxapp0
ld hl,app1
findnextgfxappq
ld (focusappaddr),hl
sys_int_noselectapp
muzcall=$+1
jp sys_reter;pt3player.PLAY ;TODO call drivers
sys_getchar
;out: de=mouse dydx, l=buttons, A=key, H=high bits of key
call checkfocus_getmouse
call z,GETKEY ;A=key, H=high bits of key, BC=keynolang
;jp endsys_result_a
;ds #0050-$
endsys_result_a
ld iy,(focusappaddr)
ex af,af'
ld a,(iy+app.screen)
ld iy,(appaddr)
jp endsys_result_aq
;TODO сЁрЄ№ эюьхЁ ¤ъЁрэр є чрфрўш ё Їюъєёюь ш яЁш °хфєышэух ёЄртшЄ№ ¤ЄюЄ эюьхЁ т userkernel эютющ чрфрўш
sys_getchar_fail
;a=0, nz
;ld a,NOKEY ;no key
;ld h,a
;ld b,a
ld c,a ;no keynolang
ld d,a;0
ld e,a;0 ;no mouse movement
ld l,0xff ;no buttons
ret ;nz ;jp endsys_result_a
checkfocus_getmouse
;out: nz=fail
ld de,(focusappaddr)
ld hl,(appaddr)
xor a
sbc hl,de
jr nz,sys_getchar_fail ;nz
sys_mousecoords=$+1
ld hl,0
sys_oldmousecoords=$+1
ld de,0
ld (sys_oldmousecoords),hl
ld a,l
sub e ;a=dx
ld e,a ;e=dx
ld a,d
sub h ;a=dy
ld d,a ;d=dy
sys_mousebuttons=$+1
ld l,0xff
xor a
ret ;z
callbdos
;яЁш т√чютх bdos эрфю тъы■ўшЄ№:
;#0000 - syscode (єцх тъы■ўхэю)
;#4000 - fatfs
;[#8000 - curpg32klow]
;#c000 - curpg32khigh
;чр∙шЄр юЄ юфэютЁхьхээюую фюёЄєяр фтєь чрфрўрь
;чрэ Єю a,bc,de,hl
;ётюсюфэю iy
if bdosstack_sz==0
ld (callbdos_sp),sp
ld sp,BDOSSTACK ;фю ¤Єюую ьюьхэЄр яЁхЁ√трэшх ьюцхЄ чряюЁюЄ№ ы■сюх ьхёЄю ярь Єш (user sp >=#3b00)
else
exx
callbdos_lock
ld hl,callbdos_mutex ;шчэрўры№эю #c0
sla (hl)
jr z,callbdos_lock ;с√ы чрэ Є
ld hl,0
add hl,sp
ld iy,(appaddr)
;ld (iy+app.callbdos_sp),l
;ld (iy+app.callbdos_sp+1),h
ld bc,app.bdosstack+bdosstack_sz
add iy,bc
ld sp,iy ;фю ¤Єюую ьюьхэЄр яЁхЁ√трэшх ьюцхЄ чряюЁюЄ№ ы■сюх ьхёЄю ярь Єш (user sp >=#3b00)
push hl
exx
endif
;ld iy,(focusappaddr)
;ld a,(iy+app.screen)
;xor 0x10 ;fd_user^fd_system
;out (0xfd),a
ld iy,(appaddr)
call BDOShandler
push af
push bc
call setpgs_killable
if bdosstack_sz !=0
ld a,#c0
ld (callbdos_mutex),a ;Єю цх ёрьюх фхыр■Є Єх ЇєэъЎшш BDOS, ъюЄюЁ√х эх ёюсшЁр■Єё тючтЁр∙рЄ№ё
endif
pop bc
pop af
if bdosstack_sz==0
callbdos_sp=$+1
ld sp,0
else
exx
pop hl
ld iy,(appaddr)
;ld l,(iy+app.callbdos_sp)
;ld h,(iy+app.callbdos_sp+1)
ld sp,hl
exx
endif
jp endsys_result_a
setpgs_killable
ld a,pgkillable
ld bc,memport4000
ld (sys_curpg4000),a
out (c),a
ld b,memport8000_hi;#bf
out (c),a
ld b,memportc000_hi;#ff
out (c),a
ret
sys_quit
;ёэ Є№ Єхъє∙є■ чрфрўє
ld sp,QUITSTACK ;хёыш эх ёфхырЄ№, Єю тё╕ х∙╕ ёЄхъ чрфрўш, ш ь√ эх тхЁэ╕ьё шч schedule
ld iy,(appaddr)
ld e,(iy+app.id)
call BDOS_freezeapp
call BDOS_delapppages
jp BDOS_yield_q ;яхЁхїюфшь эр ъръє■-эшсєф№ чрфрўє
setkernelpages_go
;sp=#3ffx
;ёхщўрё тъы■ўхэр 5- ёЄЁрэшЎр
BDOSSETPGTRDOSFS
call makeidle
setkernelpages_go_iy
;ld sp,BDOSSTACK
call setpgs_killable
;ld iy,(appaddr)
ld d,(iy+app.mainpg)
;d=pgmain
;e=чэрўхэшх фы ръъєьєы ЄюЁр
ld bc,memport0000
ld a,(iy+app.screen)
jp sys_intq ;Єрь ei
sys_findfreeappstruct
;out: nz=error, iy=free struct
ld iy,app1
ld de,app_sz
ld b,MAXAPPS
xor a
sys_findfreeappstruct0
cp (iy+app.id)
ret z ;iy = free app struct
add iy,de
djnz sys_findfreeappstruct0
;too many apps!!!
ret ;nz
sys_findfreeid
xor a
sys_findfreeid_next
inc a ;a!=0 (0 ш #ff эхы№ч - ёь. BDOS_newpage)
ld iy,app1
ld de,app_sz
ld b,MAXAPPS
sys_findfreeid0
cp (iy+app.id)
jr z,sys_findfreeid_next
add iy,de
djnz sys_findfreeid0
;a=free id
ret
include "syskey2.asm"
include "fatfsdrv.asm"
include "sysbdos.asm" ;т ъюэЎх хёЄ№ align 256
ent
syscodesz=$-wassyscode
display "syscodesz=",/h,syscodesz," < minstack=",/h,SYSMINSTACK