Subversion Repositories NedoOS

Rev

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