Subversion Repositories NedoOS

Rev

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

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