Subversion Repositories NedoOS

Rev

Rev 92 | Rev 144 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; KERNEL (system side) ;;;;;;;;;;;;;;;;;;;;;;;        
  2. ;яЁш т√чютх #0005 т ёшёЄхьх тъы■ўхэ√ ёЄЁрэшЎ√: pgsystem, pgkillable, pgkillable, pgkillable (эр ёыєўрщ яюЁўш ёЄхъюь)
  3.  
  4. MAXAPPS=16
  5. bdosstack_sz=0;150 ;80 ьрыю фы  чруЁєчъш Їрщыр, 110 ьрыю фы  fopen (фрцх ё INTSTACK2), 140 ьрыю фы  ўЄхэш  ърЄрыюур (фрцх ё INTSTACK2) ;0=юЄъы■ўшЄ№ ь№■Єхъё BDOS
  6.  
  7. QUITSTACK=0x4000 ;<=0x4000
  8.  
  9.         macro BDOSSETPGSSCR
  10.         ld a,pgscr0_0
  11.         ld bc,memport8000
  12.         out (c),a
  13.         ld a,pgscr0_1
  14.         ld b,memportc000_hi;#ff
  15.         out (c),a
  16.         endm
  17.  
  18.         macro BDOSSETPGFATFS
  19.         call BDOS_setpgfatfs
  20.         endm
  21.  
  22.         macro BDOSSETPGTRDOSFS
  23.         call BDOS_setpgtrdosfs
  24.         endm
  25.  
  26.  
  27. fatfs.tabl=0x4000
  28.         include "fatfs_h.asm"
  29.        
  30. wassyscode
  31.         disp 0x0000
  32. syscode
  33. sys_time_date
  34.         ds 4
  35.  
  36.         ds 0x0000+4-$
  37.         jp sys_quit
  38.  
  39. sys_reter
  40.         ret
  41.  
  42. callbdos_mutex
  43.         db 0xc0
  44.         ds 0x0005+4-$
  45.         jp callbdos
  46.  
  47.         ds 0x0009+4-$
  48.         jp sys_getchar
  49.  
  50. sys_farcall
  51.         jp endsys_result_a
  52.  
  53.         ds 0x0015-2-$
  54. endsys_result_aq
  55.         out (0xfd),a
  56.         display "kernel_result_a=",$
  57.         ds 0x0010+5-$
  58. ;e=char
  59.         if bdosstack_sz==0
  60.         ld (sys_prchar_sp),sp
  61.         ld sp,BDOSSTACK ;фю ¤Єюую ьюьхэЄр яЁхЁ√трэшх ьюцхЄ чряюЁюЄ№ ы■сюх ьхёЄю ярь Єш (user sp >=#3b00)
  62.         else
  63.         exx
  64.         ld hl,0
  65.         add hl,sp
  66.         ld iy,(appaddr)
  67.         ;ld (iy+app.callbdos_sp),l
  68.         ;ld (iy+app.callbdos_sp+1),h
  69.         ld bc,app.bdosstack+bdosstack_sz
  70.         add iy,bc
  71.         ld sp,iy ;фю ¤Єюую ьюьхэЄр яЁхЁ√трэшх ьюцхЄ чряюЁюЄ№ ы■сюх ьхёЄю ярь Єш (user sp >=#3b00)
  72.         exx
  73.         endif
  74.        
  75.         ld iy,(appaddr)
  76.         call BDOS_prchar ;яюЁЄшЄ Єюы№ъю #c000+, эю ёрьр тюёёЄрэртыштрхЄ pgkillable
  77.         if bdosstack_sz==0
  78. sys_prchar_sp=$+1
  79.         ld sp,0
  80.         else
  81.         exx
  82.         ;ld iy,(appaddr)
  83.         ;ld l,(iy+app.callbdos_sp)
  84.         ;ld h,(iy+app.callbdos_sp+1)
  85.         ld sp,hl
  86.         exx
  87.         endif
  88.         jp endsys_result_a
  89.  
  90. sys_timer
  91.         ds 4
  92.  
  93.         ds 0x0030+4-$
  94.         jp sys_farcall
  95.  
  96.         ds 0x0038-$
  97.         jp sys_sysint
  98.  
  99.         ds 0x0038+9-$ -4
  100. sys_intq
  101. ;bc=memport0000
  102. ;d=pgmain
  103. ;e=чэрўхэшх фы  ръъєьєы ЄюЁр
  104. ;a=screenpg
  105. ;iy="iy"
  106.         ld sp,INTMICROSTACK
  107.         out (0xfd),a ;фры№°х яюярфрхь т init_resident
  108. ;sp=INTMICROSTACK
  109. ;bc=memport0000
  110. ;d=pgmain
  111. ;e=чэрўхэшх фы  ръъєьєы ЄюЁр
  112. ;di
  113.  
  114.         ds 0x0038+14-$ -4
  115.         ;TODO чрїтрЄшЄ№ ь№■Єхъё (яЁхЁ√трэшх тэєЄЁш яЁхЁ√трэш  фюыцэю яюярёЄ№ т яЁюёЄющ юсЁрсюЄўшъ схч °хфєыхЁр)
  116.         jp sys_intgo ;эєцэю, ўЄюс√ ьюцэю с√ыю ёЄртшЄ№ Єюўъє юёЄрэютр эр #0100
  117.         ;ds 0x0101-$ ;эєцэю, ўЄюс√ ьюцэю с√ыю ёЄртшЄ№ Єюўъє юёЄрэютр эр #0100
  118.  
  119. safestack_sz=18
  120.         STRUCT app
  121. flags           BYTE ;Їыруш (тёхуфр т эрўрых ёЄЁєъЄєЁ√)
  122. ;priority        BYTE ;TODO яЁшюЁшЄхЄ (0=ъюэхЎ ёяшёър)
  123. id              BYTE ;эюьхЁ чрфрўш (0=ётюсюфэю)
  124. parentid        BYTE ;эюьхЁ ЁюфшЄхы№ёъющ чрфрўш
  125. mainpg          BYTE ;уыртэр  ёЄЁрэшЎр чрфрўш (Єрь userkernel)
  126. ;callbdos_sp     WORD ;ё■фр ёюїЁрэ хЄё  ёЄхъ яЁш т√чютх BDOS
  127. ;curmsg          WORD ;TODO рфЁхё Єхъє∙хую ёююс∙хэш  ¤Єющ чрфрўх
  128. ;endmsg          WORD ;TODO рфЁхё ъюэЎр юўхЁхфш ёююс∙хэшщ ¤Єющ чрфрўх
  129. ;sp              WORD ;Єхъє∙шщ рфЁхё ёЄхър (ыхцшЄ т mainpg:intsp)
  130. ;next            WORD ;TODO єърчрЄхы№ эр ёыхфє∙є■ чрфрўє (ёыхфє■∙р  чр т√яюыэ хьющ тэєЄЁш Єюую цх яЁшюЁшЄхЄр)
  131. screen          BYTE ;Єхъє∙шщ эюьхЁ ¤ъЁрэр ;fd_user + 8*screen
  132. gfxmode         BYTE ;Єхъє∙шщ тшфхюЁхцшь ;чэрўхэшх фы  #bd77
  133. textcuraddr     WORD ;рфЁхё ъєЁёюЁр эр ¤ъЁрэх
  134. curcolor        BYTE ;Єхъє∙шщ рЄЁшсєЄ яЁш яхўрЄш
  135. dta             WORD ;data transfer address
  136. vol             BYTE ;Єхъє∙шщ фЁрщт (volume)
  137. dircluster      DWORD ;Єхъє∙р  фшЁхъЄюЁш 
  138. dir             BLOCK DIR_sz ;тЁхьхээ√щ сєЇхЁ фы  ўЄхэш  ърЄрыюур
  139. bdosstack       BLOCK bdosstack_sz ;ёЄхъ яЁш т√чютх BDOS
  140. pal             BLOCK 32
  141. ;safestack       BLOCK safestack_sz ;de,hl,af',af,ix,hl',de',bc',iy
  142.         ENDS
  143.  
  144.         display "apps start=",/h,$
  145. safestack
  146.         ds safestack_sz
  147. app1    app
  148. app_sz=$-safestack
  149.  
  150.         ds (MAXAPPS-1)*app_sz
  151.         display "MAXAPPS=",/h,MAXAPPS
  152.  
  153. app_afterlast=$+safestack_sz
  154. app_last=app_afterlast-app_sz
  155.         display "app1=",/h,app1
  156.         display "app_last=",/h,app_last
  157.  
  158. sys_intgo
  159.         ld (sys_int_iy),iy
  160. appaddr=$+2
  161.         ld iy,app1
  162.          ld (sys_intsp),sp
  163.         ld sp,iy ;safestack_end
  164.          push af ;skipped
  165.         exx
  166.         push bc
  167.         push de
  168.         push hl
  169.         push ix
  170.         ;ld a,(iy+app.screen)
  171.         push af ;f, a=screenpg
  172.         ex af,af'
  173.         push af
  174.         exx
  175.        ld h,(iy+app.mainpg)
  176.         push de ;"hl"
  177.        push hl ;h=mainpg,l="a"
  178.  
  179.        ld sp,iy
  180. sys_int_iy=$+1
  181.        ld de,0
  182.        push de
  183.  
  184.        ld d,b
  185.         ld e,c
  186.        ld bc,memport4000
  187.         out (c),h
  188.         ld (INTMICROSTACK+#4000),de ;"bc"
  189. sys_intsp=$+1
  190.         ld hl,0
  191.         ld (intsp+#4000),hl ;"sp"
  192.        ld a,pgtrdosfs;pagexor-5
  193.        out (c),a ;Єрь INTSTACK
  194.  
  195. ;sys_int_schedule_and_go
  196.        ld sp,INTSTACK2
  197.  
  198.        call setgfxpal_focus
  199.  
  200.        call schedule ;out: hl=iy=app
  201.  
  202.        ;ld hl,(appaddr)
  203.        ;ld iy,(appaddr)
  204.        ;call iffocus_setgfx
  205.  
  206.        call on_int
  207.  
  208. sys_int_popregs
  209.        ld a,pgkillable
  210.        ld bc,memport4000
  211.        ld (sys_curpg4000),a
  212.        out (c),a
  213.  
  214. ;sys_int_popregs
  215.        ld de,-safestack_sz
  216.        add iy,de
  217.        ld sp,iy
  218.        
  219.         pop de ;d=mainpg,e="a"
  220.         pop hl ;"hl"
  221.        ld bc,memport0000
  222.         exx
  223.         pop af
  224.         ex af,af'
  225.         pop af ;f, a=screenpg
  226.          ;ld a,(curscreen) ;(focusappaddr)+app.screen
  227.          ld iy,(focusappaddr)
  228.          ld a,(iy+app.screen)
  229.         pop ix
  230.         pop hl
  231.         pop de
  232.         pop bc
  233.         exx
  234.         pop iy
  235.         ;TODO юётюсюфшЄ№ ь№■Єхъё, ьюцэю тъы■ўшЄ№ яЁхЁ√трэш 
  236.         jp sys_intq
  237.  
  238. schedule
  239. ;find next app, set iy
  240. ;out: hl=iy=app
  241.         ld hl,(appaddr)
  242.         ld bc,-app_last;app_afterlast
  243.         ld de,app_last+app_sz;app_sz
  244.         ld a,MAXAPPS
  245. findnextapp0
  246.         ;add hl,de
  247.         ;sbc hl,bc
  248.         ;add hl,bc
  249.         ;jr nz,$+5
  250.         ;ld hl,app1
  251.         add hl,bc
  252.         jr nc,$+5
  253.         ld hl,app1 -(app_last+app_sz)
  254.         add hl,de
  255.         bit factive,(hl)
  256.         jr nz,findnextappq
  257.         dec a
  258.         jr nz,findnextapp0
  259. ;no active apps
  260. ;findnextapp_idle (TODO х∙╕ хёыш т Єхъє∙хь ЇЁхщьх єцх яЁющфхэ√ тёх ръЄштэ√х чрфрўш?)
  261.         ld hl,app1
  262. findnextappq
  263.         ld (appaddr),hl
  264.           if 1==1
  265.           ld iy,(appaddr)
  266.           ld a,(iy+app.mainpg)
  267.           ld bc,memport4000
  268.           ;ld (sys_curpg4000),a ;TODO шыш эх эєцэю?
  269.           out (c),a
  270.           ld iy,(focusappaddr)
  271.           ld a,(iy+app.screen)
  272.           or fd_system
  273.           ld (user_fdvalue1+#4000),a
  274.           ld (user_fdvalue2+#4000),a
  275.           ld (user_fdvalue3+#4000),a
  276.           ld (user_fdvalue4+#4000),a
  277.           ;ld (user_fdvalue5+#4000),a ;not supported yet
  278.           ld (user_fdvalue6+#4000),a
  279.           ld a,pgtrdosfs
  280.           out (c),a ;Єрь INTSTACK
  281.           endif
  282.         ld iy,(appaddr)
  283.         ret
  284.  
  285. setgfxpal_focus
  286. ;хёыш т yield эх яюёЄртшЄ№ ярышЄЁє тЄюЁющ чрфрўх, Єю юэр эшъюуфр эх яюёЄртшЄё , хёыш яхЁтр  чрфрўр т Ўшъых фхырхЄ yield
  287. ;яюЄюьє ўЄю тёх яЁхЁ√трэш  сєфєЄ ёЄртшЄ№ яхЁтє■ чрфрўє
  288. ;хёыш цх ярышЄЁє ёЄртшЄ№ т ёрьюь yield, Єю ьюуєЄ с√Є№ яЁюсыхь√ ё т√ёЄртыхэшхь ярышЄЁ√, хёыш yield т√ч√трЄ№ т ёыєўрщэ√ї ьхёЄрї шыш хёыш тёх чрфрўш эхръЄштэ√
  289. ;яю¤Єюьє юсЁрсюЄўшъ яЁхЁ√трэшщ фюыцхэ т√ёЄрты Є№ ярышЄЁє ш тшфхюЁхцшь чрфрўш, ъюЄюЁр  т Їюъєёх, эхчртшёшью юЄ х╕ ръЄштэюёЄш
  290.  
  291.         ;ld de,(focusappaddr)
  292.         ;or a
  293.         ;sbc hl,de
  294.         ;jp nz,sys_int_nofocus
  295.         ;add hl,de ;appaddr
  296.         ;ld a,(iy+app.gfxmode)
  297.         ;ld (sys_curgfxmode),a
  298. ;sys_int_nofocus
  299.        
  300.         ;TODO т ьюьхэЄ яхЁхъы■ўхэш  эр focusapp (Є.х. эр яЁхф√фє∙хь ЇЁхщьх эх с√ыю Їюъєёр)
  301.         ;;push iy
  302.         ;;ld iy,(focusappaddr)
  303.         ;call restoretextmode
  304.         ;;pop iy
  305.  
  306.         ld hl,(focusappaddr)
  307.         ld bc,app.gfxmode
  308.         add hl,bc
  309.         ld a,(hl)
  310.         ld bc,#bd77
  311.         out (c),a ;set gfx mode
  312.        
  313.         ;ld hl,(focusappaddr)
  314.         ld bc,app.pal+31 -app.gfxmode
  315.         add hl,bc
  316.        
  317.         ld c,#ff
  318.         ld a,7
  319.         dup 8
  320.         OUT (#F6),A
  321.         ld d,(hl)
  322.         dec hl
  323.         ld b,(hl) ;DDp palette low bits
  324.         OUT (c),d;(#FF),A
  325.         dec hl
  326.         dec a
  327.         edup
  328.         ld a,7
  329.         dup 7
  330.         OUT (#FE),A
  331.         ld d,(hl)
  332.         dec hl
  333.         ld b,(hl) ;DDp palette low bits
  334.         OUT (c),d;(#FF),A
  335.         dec hl
  336.         dec a
  337.         edup
  338.         OUT (#FE),A ;0
  339.         ld d,(hl)
  340.         dec hl
  341.         ld b,(hl) ;DDp palette low bits
  342.         OUT (c),d;(#FF),A
  343.         ret
  344.  
  345. sys_sysint
  346. ;TODO schedule (фы  RTOS), эю Єюуфр эрфю ЁххэЄхЁрсхы№эюёЄ№ тёхї яЁюЎхфєЁ BDOS (фрцх схч ¤Єюую °хфєышэур юэш тё╕ Ёртэю эх фюыцэ√ шьхЄ№ ёюёЄю эш !)
  347. ;ъръ °хфєышЄ№, ъюуфр ь√ т kernelspace???
  348. ;TODO яЁютхЁър ъЁшЄшўхёъющ ёхъЎшш (т юс√ўэюь яЁхЁ√трэшш эх эєцэю)
  349.         ex de,hl
  350.         ex (sp),hl ;тюёёЄрэютшыш ёЄхъ шч de
  351.         ld (sys_sysint_jp),hl
  352.         ld (sys_sysint_sp),sp
  353.         ld sp,INTSTACK1
  354.         push af
  355.         push bc
  356.         push de ;"hl"
  357.         ;push hl
  358.         exx
  359.         ex af,af'
  360.        push af
  361.        push bc
  362.        push de
  363.        push hl
  364.        push ix
  365.        push iy
  366.        ld sp,INTSTACK2
  367.  
  368.        ld bc,memport4000
  369.        ld a,pgtrdosfs;pagexor-5 ;Єрь INTSTACK
  370.        out (c),a
  371.  
  372.        call setgfxpal_focus
  373.  
  374.        call on_int
  375. sys_curpg4000=$+1
  376.        ld a,pgkillable
  377.        ld bc,memport4000
  378.        out (c),a
  379.  
  380.        ld sp,INTSTACK1-18
  381.        pop iy
  382.        pop ix
  383.        pop hl
  384.        pop de
  385.        pop bc
  386.        pop af
  387.        ex af,af'
  388.         exx
  389.         pop hl ;"hl"
  390.         ;pop de
  391.         pop bc
  392.         pop af
  393. sys_sysint_sp=$+1
  394.         ld sp,0
  395.         pop de
  396.         ei
  397.         ;ret
  398. sys_sysint_jp=$+1
  399.         jp 0
  400.        
  401. on_int
  402. ;т #4000 ёхщўрё pg5, Єрь ёЄхъ
  403. focusappaddr=$+1
  404.         ld hl,app1
  405.         ld bc,app.gfxmode
  406.         add hl,bc
  407.         ld e,(hl)
  408. ;sys_curgfxmode=$+1
  409.         ;ld e,%10101000 ;320x200 mode
  410.         call readmouse ;resident >=#4000
  411.         ld (sys_mousecoords),hl
  412.         ld a,d
  413.         ld (sys_mousebuttons),a
  414.         call readtime ;hl=date, de=time
  415.         ld (sys_time_date),de
  416.         ld (sys_time_date+2),hl
  417.  
  418.         ld hl,sys_timer
  419.         inc (hl)
  420.         inc hl
  421.         jr nz,on_int_timerq
  422.         inc (hl)
  423.         inc hl
  424.         jr nz,on_int_timerq
  425.         inc (hl)
  426.         inc hl
  427.         jr nz,on_int_timerq
  428.         inc (hl)
  429. on_int_timerq
  430.        
  431.         call KEYSCAN
  432.  
  433.         ;call PEEKKEY ;ld a,(curkey)
  434.         ;cp ssEnter
  435.        
  436.         ld a,#7f
  437.         in a,(#fe)
  438.         rra
  439.         ld c,a ;c0=ss
  440.         ld a,#bf
  441.         in a,(#fe)
  442.         or c
  443.         cpl
  444.         ld c,a
  445.         cpl
  446.         ;a0=c0=0: ssEnter pressed
  447. on_int_oldssEnter=$+1
  448.         or 0 ;=0: ssEnter was released
  449.         rra
  450.         ld a,c
  451.         ld (on_int_oldssEnter),a
  452.         jr c,sys_int_noselectapp
  453.          call KEY_PUTREDRAW
  454.  
  455.         ld hl,(focusappaddr)
  456.         ld bc,-app_last;app_afterlast
  457.         ld de,app_last+app_sz;app_sz
  458.         ld a,MAXAPPS
  459. findnextgfxapp0
  460.         ;add hl,de
  461.         ;sbc hl,bc
  462.         ;add hl,bc
  463.         ;jr nz,$+5
  464.         ;ld hl,app1
  465.         add hl,bc
  466.         jr nc,$+5 ;hl < app_last
  467.         ld hl,app1 -(app_last+app_sz)
  468.         add hl,de
  469.         bit fgfx,(hl)
  470.         jr z,findnextgfxappskip
  471.          bit fwaiting,(hl)
  472.          jr z,findnextgfxappq
  473. findnextgfxappskip
  474.         dec a
  475.         jr nz,findnextgfxapp0
  476.         ld hl,app1
  477. findnextgfxappq
  478.         ld (focusappaddr),hl
  479. sys_int_noselectapp
  480.  
  481. muzcall=$+1
  482.         jp sys_reter;pt3player.PLAY ;TODO call drivers
  483.  
  484.        
  485. sys_getchar
  486. ;out: de=mouse dydx, l=buttons, A=key, H=high bits of key
  487.         call checkfocus_getmouse
  488.         call z,GETKEY ;A=key, H=high bits of key, BC=keynolang
  489.         ;jp endsys_result_a
  490.         ;ds #0050-$
  491. endsys_result_a
  492.          ld iy,(focusappaddr)
  493.         ex af,af'
  494.        ld a,(iy+app.screen)
  495.        ld iy,(appaddr)
  496.        jp endsys_result_aq
  497.  
  498. ;TODO сЁрЄ№ эюьхЁ ¤ъЁрэр є чрфрўш ё Їюъєёюь ш яЁш °хфєышэух ёЄртшЄ№ ¤ЄюЄ эюьхЁ т userkernel эютющ чрфрўш
  499.        
  500. sys_getchar_fail
  501. ;a=0, nz
  502.        ;ld a,NOKEY ;no key
  503.         ;ld h,a
  504.         ;ld b,a
  505.         ld c,a ;no keynolang
  506.        ld d,a;0
  507.        ld e,a;0 ;no mouse movement
  508.        ld l,0xff ;no buttons
  509.        ret ;nz ;jp endsys_result_a
  510.  
  511. checkfocus_getmouse
  512. ;out: nz=fail
  513.        ld de,(focusappaddr)
  514.        ld hl,(appaddr)
  515.        xor a
  516.        sbc hl,de
  517.        jr nz,sys_getchar_fail ;nz
  518. sys_mousecoords=$+1
  519.        ld hl,0
  520. sys_oldmousecoords=$+1
  521.        ld de,0
  522.        ld (sys_oldmousecoords),hl
  523.        ld a,l
  524.        sub e ;a=dx
  525.        ld e,a ;e=dx
  526.        ld a,d
  527.        sub h ;a=dy
  528.        ld d,a ;d=dy
  529. sys_mousebuttons=$+1
  530.        ld l,0xff
  531.        xor a
  532.        ret ;z
  533.  
  534. callbdos
  535. ;яЁш т√чютх bdos эрфю тъы■ўшЄ№:
  536. ;#0000 - syscode (єцх тъы■ўхэю)
  537. ;#4000 - fatfs
  538. ;[#8000 - curpg32klow]
  539. ;#c000 - curpg32khigh
  540. ;чр∙шЄр юЄ юфэютЁхьхээюую фюёЄєяр фтєь чрфрўрь
  541. ;чрэ Єю a,bc,de,hl
  542. ;ётюсюфэю iy
  543.        if bdosstack_sz==0
  544.  
  545.        ld (callbdos_sp),sp
  546.        ld sp,BDOSSTACK ;фю ¤Єюую ьюьхэЄр яЁхЁ√трэшх ьюцхЄ чряюЁюЄ№ ы■сюх ьхёЄю ярь Єш (user sp >=#3b00)
  547.  
  548.        else
  549.        
  550.        exx
  551. callbdos_lock        
  552.        ld hl,callbdos_mutex ;шчэрўры№эю #c0
  553.        sla (hl)
  554.        jr z,callbdos_lock ;с√ы чрэ Є
  555.        
  556.        ld hl,0
  557.        add hl,sp
  558.        ld iy,(appaddr)
  559.        ;ld (iy+app.callbdos_sp),l
  560.        ;ld (iy+app.callbdos_sp+1),h
  561.        ld bc,app.bdosstack+bdosstack_sz
  562.        add iy,bc
  563.        ld sp,iy ;фю ¤Єюую ьюьхэЄр яЁхЁ√трэшх ьюцхЄ чряюЁюЄ№ ы■сюх ьхёЄю ярь Єш (user sp >=#3b00)
  564.        push hl
  565.        exx
  566.        
  567.        endif
  568.        
  569.            ;ld iy,(focusappaddr)
  570.            ;ld a,(iy+app.screen)
  571.            ;xor 0x10 ;fd_user^fd_system
  572.            ;out (0xfd),a
  573.        ld iy,(appaddr)
  574.        call BDOShandler
  575.         push af
  576.         push bc
  577.         call setpgs_killable
  578.        if bdosstack_sz !=0
  579.        ld a,#c0
  580.        ld (callbdos_mutex),a ;Єю цх ёрьюх фхыр■Є Єх ЇєэъЎшш BDOS, ъюЄюЁ√х эх ёюсшЁр■Єё  тючтЁр∙рЄ№ё 
  581.        endif
  582.         pop bc
  583.         pop af
  584.        
  585.        if bdosstack_sz==0
  586. callbdos_sp=$+1
  587.        ld sp,0
  588.        else
  589.        exx
  590.        pop hl
  591.        ld iy,(appaddr)
  592.        ;ld l,(iy+app.callbdos_sp)
  593.        ;ld h,(iy+app.callbdos_sp+1)
  594.        ld sp,hl
  595.        exx
  596.        endif
  597.        jp endsys_result_a
  598.  
  599. setpgs_killable
  600.        ld a,pgkillable
  601.        ld bc,memport4000
  602.        ld (sys_curpg4000),a
  603.        out (c),a
  604.        ld b,memport8000_hi;#bf
  605.        out (c),a
  606.        ld b,memportc000_hi;#ff
  607.        out (c),a
  608.        ret
  609.  
  610. sys_quit
  611. ;ёэ Є№ Єхъє∙є■ чрфрўє
  612.        ld sp,QUITSTACK ;хёыш эх ёфхырЄ№, Єю тё╕ х∙╕ ёЄхъ чрфрўш, ш ь√ эх тхЁэ╕ьё  шч schedule
  613.        ld iy,(appaddr)
  614.        ld e,(iy+app.id)
  615.        call BDOS_freezeapp
  616.        call BDOS_delapppages
  617.        jp BDOS_yield_q ;яхЁхїюфшь эр ъръє■-эшсєф№ чрфрўє
  618.        
  619. setkernelpages_go
  620. ;sp=#3ffx
  621. ;ёхщўрё тъы■ўхэр 5-  ёЄЁрэшЎр
  622.        BDOSSETPGTRDOSFS
  623.        call makeidle
  624. setkernelpages_go_iy
  625.        ;ld sp,BDOSSTACK
  626.        call setpgs_killable
  627.  
  628.        ;ld iy,(appaddr)
  629.        ld d,(iy+app.mainpg)
  630. ;d=pgmain
  631. ;e=чэрўхэшх фы  ръъєьєы ЄюЁр
  632.        ld bc,memport0000
  633.        ld a,(iy+app.screen)
  634.        jp sys_intq ;Єрь ei
  635.  
  636.  
  637. sys_findfreeappstruct
  638. ;out: nz=error, iy=free struct
  639.        ld iy,app1
  640.        ld de,app_sz
  641.        ld b,MAXAPPS
  642.        xor a
  643. sys_findfreeappstruct0
  644.        cp (iy+app.id)
  645.        ret z ;iy = free app struct
  646.        add iy,de
  647.        djnz sys_findfreeappstruct0
  648. ;too many apps!!!
  649.        ret ;nz
  650.        
  651. sys_findfreeid
  652.        xor a
  653. sys_findfreeid_next
  654.        inc a ;a!=0 (0 ш #ff эхы№ч  - ёь. BDOS_newpage)
  655.        ld iy,app1
  656.        ld de,app_sz
  657.        ld b,MAXAPPS
  658. sys_findfreeid0
  659.        cp (iy+app.id)
  660.        jr z,sys_findfreeid_next
  661.        add iy,de
  662.        djnz sys_findfreeid0
  663. ;a=free id
  664.        ret
  665.  
  666.        include "syskey2.asm"
  667.        
  668.        include "fatfsdrv.asm"
  669.        include "sysbdos.asm" ;т ъюэЎх хёЄ№ align 256
  670.        ent
  671. syscodesz=$-wassyscode
  672.        display "syscodesz=",/h,syscodesz," < minstack=",/h,SYSMINSTACK
  673.