?login_element?

Subversion Repositories NedoOS

Rev

Rev 497 | Rev 661 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;maincode
  2. ;возврат в систему
  3. ;TODO через функцию системы (чтобы 0x0000 можно было использовать для своих целей, напр. структура NIL или указатель в 0xffff)
  4. user_fdvalue1=$+1
  5.         ld a,fd_system
  6.         out (0xfd),a
  7. ;(в CP/M текущий дисковод!)
  8. user_scr0_low=0x0004
  9.         nop
  10.  
  11.         ds 0x0005-$ ;0 b
  12. ;вызов функции системы
  13. ;TODO сделать рестарт, с сохранением аккумулятора
  14. user_fdvalue2=$+1
  15.         ld a,fd_system
  16.         out (0xfd),a
  17. ;getchar=0x0009 (можно rst 0x08)
  18. user_fdvalue3=$+1
  19.         ld a,fd_system
  20.         out (0xfd),a
  21. kernel_setpg
  22.         out (c),a
  23.         ret
  24.  
  25.         ds 0x0010-$ ;0 b
  26. ;putchar=0x0010
  27.         ld e,a
  28. user_fdvalue4=$+1
  29.         ld a,fd_system
  30.         out (0xfd),a
  31.         display "kernel_result_a=",$
  32. kernel_result_a
  33.         ex af,af'
  34.        ret ;можно перенести вместо kernel_setpg
  35. user_scr0_high=0x0017
  36.        nop
  37.  
  38. ;TODO убрать рестарты включения страниц, вместо них сделать вызовы (будет быстрее из-за отсутствия jr)
  39.        ds 0x0018-$ ;1 b
  40. ;setpg4000=0x0018
  41.        ld bc,memport4000
  42.        ld (curpg16k),a
  43.        jr kernel_setpg
  44.  
  45.        ds 0x0020-$ ;0 b
  46. ;setpg8000=0x0020
  47.        ld bc,memport8000
  48.        ld (curpg32klow),a
  49.        jr kernel_setpg
  50.  
  51.        ds 0x0028-$ ;0 b
  52. ;setpgc000=0x0028
  53.        ld bc,memportc000
  54.        ld (curpg32khigh),a
  55.        jr kernel_setpg
  56.  
  57.        ds 0x0030-$ ;0 b
  58.        jr $
  59. user_scr1_low=0x0032
  60.        nop
  61. user_scr1_high=0x0033
  62.        nop
  63.        ds 2
  64. INTMICROSTACK ;2 байта до (стек) и 2 байта после (bc) ;di!!!
  65.        ds 2
  66.  
  67. ;int=4246t (из них 905t установка палитры, 874t чтение клавиатуры)
  68.        ds 0x0038-$ ;0 b
  69.        ex de,hl ;de="hl", hl="de"
  70.        ex (sp),hl ;hl=адрес выхода, de="hl", в стеке "de"
  71.         ;ld (intsp),sp ;можно убрать эту операцию в kernelspace
  72.        ld (intjp),hl ;TODO писать не прямо в intjp, а в промежуточную локацию (иначе хвост обработчика нельзя с ei - он сам не может сменить режим обработки прерывания после jp)
  73.        ld l,a
  74. user_fdvalue6=$+1
  75.        ld a,fd_system
  76.        out (0xfd),a ;10 b
  77. ;---------
  78.        ;ld sp,INTSTACK
  79.        ;(keep bc in MICROSTACK)
  80.        ;...
  81.        ;ld sp,INTMICROSTACK
  82.        ;ld a,%0101s111;%0x01sx1x ;для неисправленного АТМ2 надо A9=1, а номер страницы в 0x7ffd не будет влиять, если адресация по memportc000
  83.        ;out (0xfd),a
  84. ;---------
  85. ;сейчас стек INTSTACK (иначе нельзя вызвать rst)
  86. init_resident
  87. ;sp=INTMICROSTACK
  88. ;bc=memport0000
  89. ;d=pgmain
  90. ;e=значение для аккумулятора
  91. ;di
  92.        out (c),d
  93. curpg16k=$+1
  94.        ld a,0;pgmain4000
  95.        SETPG16K ;rst ;чтобы инлайнить, надо 9 байт лишних, а у нас только 5 (6?)
  96. curpg32klow=$+1
  97.        ld a,0;pgmain8000
  98.        SETPG32KLOW ;rst
  99. curpg32khigh=$+1
  100.        ld a,0;pgmainc000
  101.        SETPG32KHIGH ;rst
  102.         pop bc
  103. ;        ld a,e
  104. ;intde=$+1
  105. ;        ld de,0
  106. intsp=$+1
  107.        ld sp,0xfffe;STACK-2 ;там de ;нельзя в kernelspace, т.к. вложенное прерывание запортит стек! и de уже должно быть присвоено
  108.        ld a,e
  109.        pop de ;TODO ld de, причём перед ld sp, иначе вложенное прерывание запортит стек!
  110.         ei ;TODO в kernelspace (чтобы делать yield с включенными прерываниями), когда тут будет сохранение intsp, intjp через промежуточную локацию, а в kernelspace будет мьютекс
  111. intjp=$+1
  112.        jp 0x0100 ;main_go ;18+2 b
  113.  
  114.        display "end of user kernel=",$
  115.        display "curpg16k=",curpg16k
  116.        display "curpg32klow=",curpg32klow
  117.        display "curpg32khigh=",curpg32khigh
  118.