Subversion Repositories NedoOS

Rev

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

  1.         DEVICE ZXSPECTRUM128
  2.         ;device pentagon1024
  3.  
  4.         include "../_sdk/syssets.asm"
  5. TOPDOWNMEM=0;1
  6.  
  7.                 if atm != 2
  8. memport0000=0x37f7
  9. memport4000=0x77f7
  10. memport8000=0xb7f7
  11. memportc000=0xf7f7
  12. memportrom0000=0x3ff7
  13. memportrom4000=0x7ff7
  14. memportrom8000=0xbff7
  15. memportromc000=0xfff7
  16. pagexor=0xff
  17.         else
  18. memport0000=0x3ff7
  19. memport4000=0x7ff7
  20. memport8000=0xbff7
  21. memportc000=0xfff7
  22. memportrom0000=0x3ff7
  23. memportrom4000=0x7ff7
  24. memportrom8000=0xbff7
  25. memportromc000=0xfff7
  26. pagexor=0x7f
  27.         endif
  28.        
  29.         if NEMOIDE==1
  30. ;схема Nemo:
  31. hddstat=0xF0
  32. hddcmd=0xF0
  33. hddhead=0xD0
  34. hddcylhi=0xB0
  35. hddcyllo=0x90
  36. hddsec=0x70
  37. hddcount=0x50
  38. hdderr=0x30
  39. hdddatlo=0x10
  40. hdddathi=0x11
  41. hddupr=0xC8
  42. hdduprON=0
  43.         else
  44. ;схема ATM:
  45. hddstat=0xFEEF
  46. hddcmd=0xFEEF
  47. hddhead=0xFECF
  48. hddcylhi=0xFEAF
  49. hddcyllo=0xFE8F
  50. hddsec=0xFE6F
  51. hddcount=0xFE4F
  52. hdderr=0xFE2F
  53. hdddatlo=0xFE0F
  54. hdddathi=0xFF0F
  55. hddupr=0xFEBE ;при установленном b7 FFBA
  56. hdduprON=0xFFBA
  57. hddupr1=0xF7
  58. hddupr0=0x77
  59.         endif
  60. memport8000_hi=memport8000/256
  61. memportc000_hi=memportc000/256
  62.  
  63. SYSMINSTACK=0x3b00
  64.  
  65. resident=0x6000;0x6000+8000 (где не затрут при очистке экрана) ;pgtrdosfs
  66. trdos_catbuf=0x6300;0x3200 ;,0x900 ;pgtrdosfs (0x4000)
  67. trdos_sectorbuf=0x6c00
  68. trdos_fcbbuf=0x6d00 ;size=0x200*trdos_MAXFILES
  69. trdos_MAXFILES=8
  70. INTMUZSTACK=0x3e00 ;kernelspace
  71. ;INTSTACK1=0x3f00 ;kernelspace (для входа в обработчик без порчи стека) (не пересекается с возможным стеком задачи!!!)
  72. INTSTACK2=0x5f00;0x6000 ;pgkillable и pgtrdosfs (рабочий стек обработчика прерываний) (>=0x4000, иначе нельзя выключить теневые порты)
  73. TRDOSSTACK=0x5f00-96;0x6000-96 ;чтобы не пересекалось с INTSTACK (в промежутке между преключениями страниц может произойти системное прерывание), но и на экран не попало
  74. BDOSSTACK=0x4000 ;kernelspace
  75. STACK=0x4000 ;userspace
  76. ;при вызове BDOS стек некоторое время такой же, как в юзерспейсе
  77. ;поэтому на входе в BDOS надо иметь в 0x4000...0xffff страницы, которые не жалко
  78. ;предполагается, что юзер не имеет стек ниже 0x3b00, иначе он затрёт систему
  79.  
  80.         include "../_sdk/sys_h.asm"
  81.  
  82.         if TOPDOWNMEM
  83. pgtrdosfs=pagexor-(sys_npages-1)
  84. pgfatfs=pagexor-(sys_npages-2)
  85. pgsys=pagexor-(sys_npages-3)
  86. pgfatfs2=pagexor-(sys_npages-4) ;structs
  87.         else
  88. pgtrdosfs=pagexor-8
  89. pgfatfs=pagexor-9
  90. pgsys=pagexor-10
  91. pgfatfs2=pagexor-11 ;structs
  92.         endif
  93.  
  94. pgkillable=pagexor-4 ;в 128K памяти, т.к. можно портить
  95. ;pgfirstfree=pagexor-11
  96.  
  97. pgscr0_0=pagexor-1
  98. pgscr0_1=pagexor-5
  99. pgscr1_0=pagexor-3
  100. pgscr1_1=pagexor-7
  101.  
  102. fd_system=0x57;%01010111 ;%0x01sx1x ;для неисправленного АТМ2 надо A9=1, а номер страницы в 0x7ffd не будет влиять, если адресация по memportc000
  103. fd_system_getchar=0x56;%01010110 ;%0x01sx1x ;для неисправленного АТМ2 надо A9=1, а номер страницы в 0x7ffd не будет влиять, если адресация по memportc000
  104. fd_user=0x47;%01000111 ;%0x00sx1x ;для неисправленного АТМ2 надо A9=1, а номер страницы в 0x7ffd не будет влиять, если адресация по memportc000
  105.  
  106. ;условные страницы для sjasm
  107. COMPILEPG_INIT=0
  108. COMPILEPG_SYS0=4
  109. COMPILEPG_SYS1=6
  110.  
  111.         SLOT 1
  112.         page COMPILEPG_INIT
  113.         org 0x6000
  114. begin
  115.         xor a
  116.         out (0xfe),a
  117.        
  118.          ifdef KOE
  119.                 display "KOE!!!"
  120.                 ld a,0 ;turbo ;0x10 ;noturbo
  121.                 ld bc,0xeff7
  122.                 out (c),a ;for KOE
  123.                 ld a,0x10
  124.                 ld bc,0x7ffd
  125.                 out (c),a
  126.          endif
  127.                
  128.         LD (IY+1),0xCC
  129.  
  130.         if 1==0
  131.        ;IFN em3d13
  132.        ; LD HL,ONERR
  133.        ; LD (23747),HL
  134.        ;ENDIF
  135.        LD A,(23833)
  136.        ADD A,'A'
  137.        LD (src),A
  138.        LD (dst),A
  139.        XOR A
  140.        LD (23658),A ;0x5c6a
  141.       ;LD L,A,H,L
  142.       ;LD (23802),HL
  143.         endif
  144.        XOR A
  145.         ld (0x5d10),a
  146.        
  147.         ;ld hl,0xc9f1 ;pop af:ret
  148.         ;ld (0x5cc2),hl
  149.        
  150.         ;ld bc,0xfbdf ;x
  151.         ;in l,(c)
  152.         ;ld b,0xff
  153.         ;in h,(c)
  154.         ;ld (init_oldmousecoords),hl
  155.  
  156. ;;;;;;;;;;;;;;;;;;; set gfx mode ;;;;;;;;;;;;;;;;;
  157.                 ei
  158.         halt
  159.         ;LD A,0xaa;%10101010 ;640x200 mode
  160.         ;LD A,0xae;%10101110 ;textmode
  161.                 if atm==1
  162.                         ;выясним откуда запустились
  163. init_rst_buf=0x4000
  164.                         ld hl,init_rst_buf
  165.                         rst 0x08
  166.                         defb 0x50,0x03
  167.                         rst 0x08        ; в D вернется текущий драйв
  168.                         defb 0x50,0x02
  169.                         ld a,d
  170.                         add a,a
  171.                         add a,a
  172.                         add a,a
  173.                         ld hl,init_rst_buf
  174.                         ld b,0
  175.                         ld c,a
  176.                         add hl,bc
  177.                         ld de,init_rst_buf+512
  178.                         ld bc,8
  179.                         ldir
  180.                         ld a,(init_rst_buf+512)
  181.                         rst 0x08
  182.                         defb 0x50,0x05
  183.                         ld a,(init_rst_buf+512)
  184.                         and 1 ;m/s
  185.                         ld hl,init_rst_buf
  186.                         ld bc,0x0000
  187.                         ld d,b
  188.                         ld e,c
  189.                         ld a,2
  190.                         ex af,af' ;'
  191.                         ld a,1
  192.                         rst 0x08
  193.                         defb 0x50,0x04,0x02
  194.                         ld a,(init_rst_buf+512)
  195.                         ld d,12
  196.                         cp 0x0f
  197.                         jr z,.l3
  198.                         ld d,3
  199.                         cp 4
  200.                         jr z,.init_sysdev_part
  201.                         ld d,7
  202.                         cp 5
  203.                         jp nz,init_sysdev_end
  204. .init_sysdev_part
  205.                         ld hl,init_rst_buf+0x01BE+0x0008-12
  206. .l2
  207.                         inc d
  208.                         push de
  209.                         ld bc,12
  210.                         add hl,bc
  211.                         ld bc,0x0400
  212.                         ld de,init_rst_buf+512+3
  213. .l1                     ld a,(de)
  214.                         xor (hl)
  215.                         or c
  216.                         ld c,a
  217.                         inc de
  218.                         inc hl
  219.                         djnz .l1
  220.                         pop de
  221.                         or a
  222.                         jr nz,.l2
  223. .l3
  224.                         ld a,d
  225.                         ld (init_sysdrv_val),a
  226. init_sysdev_end
  227.                         halt
  228.                         ld bc,0xeff7
  229.                         ld a,0x80
  230.                         out (c),a
  231.                         ld a,0x10
  232.                         ld bc,0x7ffd
  233.                         out (c),a
  234.                         ld bc,0x01bf
  235.                         out (c),b
  236.                         LD A,0xa8;%10101000 ;320x200 mode
  237.                         ld bc,0xbd77    ;shadow ports and palette remain on
  238.                         out (c),a
  239.                         xor a
  240.                         out (0xbf),a
  241.                 else
  242.                         LD A,0xa8;%10101000 ;320x200 mode
  243.                         CALL INIT_OUTSHADON
  244.         endif
  245.         call INIT_blackpal
  246.  
  247.         di
  248.                 if atm==1 and PS2KBD
  249.                         ld bc,0xdef7   
  250.                         out (c),c              
  251.                         ld b,0xbe              
  252.                         ld a,2                 
  253.                         out (c),a
  254.                 endif
  255.                
  256.                 if atm==3 or atm==1
  257.                         ld a,0x7f-5
  258.                         ld bc,memportrom4000
  259.                         out (c),a ;отключаем 7ffd
  260.                         ld a,0x7f-2
  261.                         ld bc,memportrom8000
  262.                         out (c),a ;отключаем 7ffd
  263.                         ;ld a,0x7f-2
  264.                         ld bc,memportromc000
  265.                         out (c),a ;отключаем 7ffd
  266.                 endif
  267.                
  268.                 ifn atm==1
  269.                         call findpgdos
  270.                 else
  271.                         ld a,0x04
  272.                         in a,(0xbe)
  273.                         and 0xbf;%10111111
  274.                         ;ld a,0x8b
  275.                 endif
  276.          ld lx,a
  277.         ld (sys_pgdos),a ;до установки резидента
  278.  
  279.         ld a,pgsys
  280.         call INIT_setpg_c000
  281.         ld hl,0x8000
  282.         ld de,0xc000
  283.         ld bc,0x4000
  284.         ldir
  285.        
  286.         ld a,pgtrdosfs
  287.         call INIT_setpg_c000
  288.         ld hl,wastrdosfs
  289.         ld de,0xc000+idle;COMMANDLINE;PROGSTART ;idle code
  290.         ld bc,trdosfs_sz
  291.         ldir
  292.                         ld a,0xc3
  293.                         ld (0x5cc2),a
  294.                         ld hl,ONERR;ddrv
  295.                         ld (0x5cc3),hl
  296.                         ld hl,0x5c00
  297.                         ld de,0xc000+0x1c00
  298.                         ld bc,0x0400;for run hobeta;0x0200;0x5d3b-0x5c00
  299.                         ldir
  300.         ld hl,wasresident
  301.         ld de,resident+0xc000-0x4000
  302.         ld bc,resident_sz
  303.         ldir
  304.                         ld hl,0x5c4b
  305.                         ld de,varbas_stor+0x8000
  306.                         ld bc,32
  307.                         ldir
  308.        
  309.         ld hl,0xc000+trdos_fcbbuf-0x4000
  310.         ld d,h
  311.         ld e,l
  312.         inc de
  313.         ld bc,0x200*trdos_MAXFILES-1
  314.         ld (hl),l;0
  315.         ldir
  316.  
  317.         ;ld a,pgidle
  318.         ;call INIT_setpg_c000
  319.         ;ld hl,wasidle
  320.         ;ld de,0x0100+0xc000
  321.         ;ld bc,idle_sz
  322.         ;ldir
  323.        
  324.         ld a,pgsys
  325.         call INIT_setpg_8000
  326.         ld a,pgfatfs
  327.         call INIT_setpg_c000
  328.        
  329. ;перебрасываем 16K упакованный блок в 0xc000
  330.         ld hl,wassys+0x3fff
  331.         ld de,0xffff
  332.         ld bc,0x4000
  333.         lddr
  334. ;распаковываем в 0x6400
  335.         ld hl,0xc000;wassys
  336.         ld de,0x6400;0x8000
  337.         call DEC40 ;распаковываем в 0x8000 (там уже включены системные странички)
  338. ;перебрасываем 32K из 0x6400 в 0x8000
  339.         ld hl,0x6400+0x7fff
  340.         ld de,0x8000+0x7fff
  341.         ld bc,0x8000
  342.         lddr
  343.  
  344. fatfspatchaddr=0xc000
  345.        
  346.         ld hl,devices_init
  347.         ld (0xc000+FFS_DRV.init),hl
  348.         ld hl,disk_status
  349.         ld (0xc000+FFS_DRV.status),hl
  350.         ld hl,devices_read      ;read to userspace
  351.         ld (0xc000+FFS_DRV.rd_to_usp),hl
  352.         ld hl,devices_readnopg  ;read to buffer
  353.         ld (0xc000+FFS_DRV.rd_to_buf),hl
  354.         ld hl,devices_write     ;write from userspace
  355.         ld (0xc000+FFS_DRV.wr_fr_usp),hl
  356.         ld hl,devices_writenopg ;write from buffer
  357.         ld (0xc000+FFS_DRV.wr_fr_buf),hl
  358.         ld hl,get_fattime
  359.         ld (0xc000+FFS_DRV.RTC),hl
  360.         ld hl,strcpy_lib2usp   
  361.         ld (0xc000+FFS_DRV.strcpy_lib2usp),hl
  362.         ld hl,strcpy_usp2lib
  363.         ld (0xc000+FFS_DRV.strcpy_usp2lib),hl
  364.         ld hl,memcpy_lib2usp
  365.         ld (0xc000+FFS_DRV.memcpy_lib2usp),hl
  366.         ld hl,memcpy_usp2lib
  367.         ld (0xc000+FFS_DRV.memcpy_usp2lib),hl
  368.         ld hl,memcpy_buf2usp
  369.         ld (0xc000+FFS_DRV.memcpy_buf2usp),hl
  370.         ld hl,memcpy_usp2buf
  371.         ld (0xc000+FFS_DRV.memcpy_usp2buf),hl
  372.  
  373. ;инициализация менеджера памяти и вход в юзерспейс:
  374. ;HALT (чтобы прерывание не произошло когда не надо)
  375. ;[назначаем страницы системспейса (одна из них должна быть такая же, как в юзерспейсе) - уже есть общая страница 5]
  376. ;в юзерспейсе назначаем нижнюю страницу с керналем (вместо ПЗУ)
  377.         ld a,fd_user
  378.         out (0xfd),a
  379.                 if atm==3 or atm==1
  380.          ld a,0x7f
  381.          ld bc,memportrom0000
  382.          out (c),a ;отключаем ПЗУ
  383.          ld a,0x7f-5
  384.          ld bc,memportrom4000
  385.          out (c),a ;отключаем 7ffd
  386.          ld a,0x7f-2
  387.          ld bc,memportrom8000
  388.          out (c),a ;отключаем 7ffd
  389.          ;ld a,0x7f-2
  390.          ld bc,memportromc000
  391.          out (c),a ;отключаем 7ffd
  392.         endif
  393.         ld a,pgtrdosfs ;idle
  394.         ld bc,memport0000
  395.         out (c),a
  396.        
  397.         ;ld hl,wasuserkernel+0x8000
  398.         ;ld de,0
  399.         ;ld bc,userkernel_sz
  400.         ;ldir
  401.        
  402.         ld a,fd_system
  403.         out (0xfd),a
  404.                 if atm==3 or atm==1
  405.          ld a,0x7f
  406.          ld bc,memportrom0000
  407.          out (c),a ;отключаем ПЗУ
  408.          ;4000,8000,c000 уже отключили 7ffd выше
  409.         endif
  410.         ld a,pgsys
  411.         ld bc,memport0000
  412.         out (c),a
  413. ;в системспейсе:
  414. ;включить fatfs
  415. ;поставить резидент в 7fxx
  416. ;переходим в sys_intq, а оттуда в init_resident
  417.  
  418.         if 1==0
  419.         ld a,lx;(sys_pgdos)
  420.         ld bc,memportrom0000
  421.         out (c),a
  422.         LD A,0xa8;%10101000 ;320x200 mode
  423.         ld bc,0xff77 ;shadow ports off, palette off
  424.         out (c),a
  425.         ld a,1
  426.         ld c,1
  427.         call 0x3d13
  428.         ld c,0x18
  429.         call 0x3d13
  430.         ld hl,0xc000
  431.         ld de,0x0000
  432.         ld bc,0x0805
  433.         call 0x3d13
  434.         jr $
  435.         endif
  436.  
  437.         ld sp,BDOSSTACK
  438.         ;ei
  439.         ;halt ;чтобы прерывание не произошло когда не надо
  440.         ;di
  441.         ;jr $
  442. ;init_oldmousecoords=$+1
  443. ;        ld hl,0
  444. ;        ld (sys_oldmousecoords),hl
  445.          call BDOS_setpgstructs
  446.          ld hl,0xc000
  447.          ld de,0xc001
  448.          ld bc,0x3fff
  449.          ld (hl),l;0
  450.          ldir ;не помогло
  451. init_sysdrv_val=$+1
  452.          ld a,SYSDRV
  453.          ld (SYSDRV_VAL),a
  454.         jp setkernelpages_go ;di!!!
  455.        
  456.                 ifn atm==1
  457. INIT_OUTSHADON
  458.         ;LD BC,0xFF77 ;shadow ports remain off
  459.                         LD BC,0xBD77 ;shadow ports and palette remain on
  460.                         LD IX,10835
  461.                         PUSH IX
  462.                         JP 0x3D2F
  463.                 endif
  464.  
  465. INIT_setpg_low
  466.         LD BC,memportrom0000 ;page for 0x0000..0x3fff
  467.         OUT (C),A
  468.         ret
  469.  
  470. INIT_setpg_8000
  471.         LD BC,memport8000 ;page for 0x8000..0xbfff
  472.         OUT (C),A
  473.         ret
  474.  
  475. INIT_setpg_c000
  476.         LD BC,memportc000 ;page for 0xc000..0xffff
  477.         OUT (C),A
  478.         ret
  479.  
  480.                 ifn atm==1
  481. findpgdos
  482. ;если не найти страницу текущего доса, то на старых версиях ПЗУ ZX Evo не будет работать (в странице 0x83 почему-то не дос по умолчанию)
  483.         call crcdos
  484.         ld (doscrchi),de
  485.         ld (doscrclo),bc
  486.         ld lx,0x83
  487. findpgdos0
  488.         ld a,lx
  489.         call INIT_setpg_low
  490.         call crcdos
  491. doscrchi=$+1
  492.         ld hl,0
  493.         or a
  494.         sbc hl,de
  495.         jr nz,doscrcbad
  496. doscrclo=$+1
  497.         ld hl,0
  498.         or a
  499.         sbc hl,bc
  500.         jr nz,doscrcbad
  501.         ld a,lx
  502.         ret
  503. doscrcbad
  504.         ld a,lx
  505.         add a,4
  506.         ld lx,a
  507.         cp 0xc0
  508.         jr c,findpgdos0
  509.         ld a,0x83 ;not found
  510.         ret
  511. crcdos
  512.         ld hl,0x0000
  513.         ld bc,0
  514.         ld de,0
  515. crcdos0
  516.         ld a,d
  517.         add a,a
  518.         rl c
  519.         rl b
  520.         rl e
  521.         rl d
  522.         xor b
  523.         ld b,a
  524.         ld a,(hl)
  525.         xor c
  526.         ld c,a
  527.         inc hl
  528.         bit 6,h
  529.         jr z,crcdos0
  530.         ret
  531.                 endif
  532.  
  533. INIT_blackpal
  534.         LD HL,blackpalend
  535.         ;halt ;halt есть выше - убрано, чтобы не светилось ничего
  536.         LD DE,0xa80f ;0xab=6912 ;palette on, EGA, turbo
  537.         LD BC,0xBD77
  538.         OUT (C),D
  539. INIT_setpal0 LD A,E
  540.         and 7
  541.         BIT 3,E
  542.         OUT (0xFE),A
  543.         JR Z,$+4
  544.         OUT (0xF6),A
  545.         LD A,(HL)
  546.         DEC HL
  547.         ld b,(hl) ;DDp palette low bits
  548.         dec hl
  549.         ld c,0xff
  550.         OUT (c),a;(0xFF),A
  551.         DEC E
  552.         JP P,INIT_setpal0
  553.         ret
  554.  
  555.         ifdef NOPAL
  556.         dw 0xffff,0xfefe,0xfdfd,0xfcfc,0xefef,0xeeee,0xeded,0xecec
  557.         dw 0xffff,0xdede,0xbdbd,0x9c9c,0x6f6f,0x4e4e,0x2d2d,0x0c0c
  558.         else
  559.         ds 32,0xf3
  560.         endif
  561. blackpalend=$-1
  562.  
  563.         include "unmegalz.asm" ;DEC40
  564.  
  565. wasresident
  566.         disp resident
  567.                 ifn atm==1
  568. readmouse  ;=$-wasresident+resident
  569. ;sp=0x7fxx
  570. ;e=gfxmode
  571. ;out: hl=mousecoords, d=mousebuttons
  572.                         call sys_SHADOFF
  573.                        ;ifdef NOMOUSE
  574.                        ; ld hl,0
  575.                        ; ld d,0x0f ;buttons
  576.                        ;else
  577.                         ld bc,0xfadf ;buttons
  578.                         in d,(c)
  579.                         inc b ;ld bc,0xfbdf ;x
  580.                         in l,(c)
  581.                         ld b,0xff ;y
  582.                         in h,(c)
  583.                        ;endif
  584.                 endif
  585. shadon_pgsys  ;=$-wasresident+resident
  586.         LD A,e;0xa8;%10101000 ;320x200 mode
  587. shadon_pgsys_a  ;=$-wasresident+resident
  588.                 ifn atm==1
  589.                         CALL sys_SHADON
  590.                 else
  591.                         ld bc,0x01bf
  592.                         out (c),b
  593.                         ld bc,0xbd77    ;shadow ports and palette remain on
  594.                         out (c),a
  595.                         xor a
  596.                         out (0xbf),a
  597.                 endif
  598.                
  599.                 if atm==3 or atm==1
  600.                         ld a,0x7f
  601.                         call sys_setpg_low
  602.                         ld a,pgsys
  603.                         ld bc,memport0000
  604.                         jr sys_outca_jr
  605.          else
  606.                         ld a,0x7f-(pagexor-pgsys)
  607.          endif
  608. sys_setpg_low  ;=$-wasresident+resident
  609.                 ld bc,memportrom0000
  610.                 jr sys_outca_jr
  611. sys_SHADOFF  ;=$-wasresident+resident
  612. sys_pgdos=wasresident+(($+1)-resident) ;для патча
  613.                 ld a,0x83 ;48 basic switchable to DOS
  614.                 call sys_setpg_low
  615.         LD A,e;0xa8;%10101000 ;320x200 mode
  616.                 ld bc,0xff77 ;shadow ports off, palette off
  617. sys_outca_jr
  618.         out (c),a
  619.                 ret
  620.                 ifn atm==1
  621. sys_SHADON  ;=$-wasresident+resident
  622.                         LD bc,10835
  623.                         PUSH bc
  624.                         LD BC,0xBD77 ;shadow ports and palette remain on
  625.                         JP 0x3D2F
  626.                 endif
  627.  
  628. ;TODO убрать в pgtrdos
  629. dos3d13_resident  ;=$-wasresident+resident
  630.  
  631. ;сейчас включена pg5
  632. ;iy=23610
  633.         ld (dos3d13_sp_st),sp
  634.         ld sp,trdos_sp ;надо стек в 0x4000+ (не пересекающийся с INTSTACK, т.к. сейчас может произойти системное прерывание), по умолчанию стек был в 0x3fxx
  635.         ;call swap_sysvars
  636.         ex af,af'
  637.        call sys_SHADOFF ;включили ПЗУ
  638.                 ld (em3d13_de_st),de    ;push de ;e=gfxmode
  639.                  
  640.                 ;***************************** 
  641.                 ;call EM3D13PP;0x3d13
  642.                 ;собственно дpайвеp, аналогичный 0x3д13 (и с его использованием)
  643.                 ;на выходе - A pавно 0 - все окей, не 0 - ошибка
  644.                 ;вместо  пpоцедyp DRAW_WINDOWS, PRINT_WINDOWS и REST_WINDOW
  645.                 ;использyй свои.
  646.                 ;Kurleson
  647. ;EM3D13PP
  648.         ld      hl,em3d13pp_ret
  649.         push    hl
  650.         ld      (23613),sp
  651.         xor     a
  652.         ld (23801),a
  653.         ld      (23823),a
  654.         ld      (23824),a
  655.         ld hl,varbas_stor
  656.         ld de,0x5c4b
  657.         ld bc,32
  658.         ldir
  659.         if atm == 1
  660.                 xor a
  661.                 out (0xbf),a
  662.         endif
  663.         exx     ;pop hl,de,bc
  664.         ex af,af'
  665.         jp      0x3D13
  666.  
  667. ONERR
  668.         ex      (sp),hl
  669.         push    af
  670.         ld a,(0x5d0f)
  671.         or a
  672.         jr nz,em3d13pp_ret
  673.         ld      a,h
  674.         cp      0x0d
  675.         jr      z,em3d13_error
  676. ONERR_NO
  677.         pop     af
  678.         ex      (sp),hl
  679.         ret
  680. em3d13_error  
  681.         ld      a,0xff
  682.         ld (0x5d0f),a
  683. em3d13pp_ret
  684.  
  685. em3d13_de_st=$+1
  686.     ld de,0     ;e=gfxmode
  687.         di
  688.     call shadon_pgsys ;выключили ПЗУ (неатомарно - две записи в порт!!!)
  689.         ei
  690.         ;call swap_sysvars
  691. dos3d13_sp_st=$+1       ;-wasresident+resident
  692.         ld sp,0
  693.         ld a,(0x5d0f)   ;возврат ошибки
  694.         ret
  695.  
  696.         ifn atm==1
  697. NVRAM_REG=0xdf
  698. NVRAM_VAL=0xbf
  699. minmes  ;=$-wasresident+resident
  700.     ld h,a
  701.     xor a
  702.     srl h
  703.     rra
  704.     srl h
  705.     rra
  706.     srl h
  707.     rra
  708.     ret
  709.  
  710. bcd2bin  ;=$-wasresident+resident
  711.     ld b,NVRAM_REG
  712.     out (c),a
  713.     ld b,NVRAM_VAL
  714.     in a,(c)
  715.     ret
  716.    
  717. readtime  ;=$-wasresident+resident
  718. ;sp=0x7fxx
  719. ;e=gfxmode
  720. ;out: hl=date, de=time
  721. ;TODO атомарно
  722.         call sys_SHADOFF
  723.         LD A,e;0xa8;%10101000 ;320x200 mode
  724.         push af
  725.         ld bc,0xeff7
  726.         ld a,0x80
  727.         out (c),a
  728.         ld bc,0xf7 + (NVRAM_REG<<8)
  729.     ld a,0x0b
  730.     out (c),a
  731.     ld b,NVRAM_VAL
  732.     in a,(c)
  733.     or 0x04
  734.     out (c),a
  735.     xor a               ;sec
  736.     call bcd2bin
  737.     srl a
  738.     ld e,a
  739.    
  740.     ld a,2              ;min
  741.     call bcd2bin
  742.     call minmes
  743.     add a,e
  744.     ld e,a
  745.     ld d,h
  746.    
  747.     ld a,4              ;h
  748.     call bcd2bin
  749.     add a,a
  750.     add a,a
  751.     add a,a
  752.     add a,d
  753.     ld d,a
  754.    
  755.     ld a,7              ;day
  756.     call bcd2bin
  757.     ld l,a
  758.    
  759.     ld a,8              ;month
  760.     call bcd2bin
  761.     call minmes
  762.     add a,l
  763.     ld l,a
  764.    
  765.     ld a,9              ;year
  766.     call bcd2bin
  767.     add a,20
  768.     add a,a
  769.     add a,h
  770.     ld h,a
  771.         ld bc,0xeff7
  772.         xor a
  773.         out (c),a
  774.         pop af
  775.         jp shadon_pgsys_a
  776.                 endif
  777.  
  778.         ;disp $-wasresident+resident
  779.  
  780.                
  781.                 ds 100
  782. trdos_sp
  783. varbas_stor
  784.                 ds 32
  785.         ent
  786. resident_sz=$-wasresident
  787.         display "residentend=",resident+resident_sz,"<=",trdos_catbuf
  788.  
  789. wastrdosfs
  790.         disp COMMANDLINE;PROGSTART
  791. idle
  792.         db "idle",0
  793.         ds PROGSTART-$
  794.         include "idle.asm"
  795. idle_sz=$-idle
  796.         ent
  797.         disp 0x4000+idle+idle_sz
  798.         include "trdosfs.asm"
  799.         include "trdosio.asm"
  800.         include "bdospg2.asm"
  801.         ent
  802. trdosfs_sz=$-wastrdosfs
  803.         display "trdosfs_sz=",/h,trdosfs_sz,"<=0x1c00"
  804.        
  805. end
  806. wassys
  807.  
  808.         SLOT 0
  809.         page COMPILEPG_SYS0
  810.         SLOT 1
  811.         page COMPILEPG_SYS1
  812.         org 0x0000
  813. sysbegin
  814.         include "syskrnl.asm"
  815. wasuserkernel
  816.         disp 0x0000
  817.         include "userkrnl.asm"
  818.         ent
  819. userkernel_sz=$-wasuserkernel
  820.         ;display "wasuserkernel=",/d,wasuserkernel
  821.         ;display "wasuserkernel_end=",/d,$
  822.         ;display "userkernel_sz=",/d,userkernel_sz
  823.         ds 0x4000-$
  824.         incbin "../fatfs4os/fatfs.raw"
  825. sysend
  826.  
  827.         ;display "begin=",/d,begin
  828.         ;display "end=",/d,end
  829.        
  830.         ;display "sysbegin=",/d,sysbegin
  831.         ;display "sysend=",/d,sysend
  832.  
  833.         SLOT 1
  834.         page COMPILEPG_INIT
  835.         savebin "initcode.c",begin,end-begin
  836.        
  837.         SLOT 0
  838.         page COMPILEPG_SYS0
  839.         SLOT 1
  840.         page COMPILEPG_SYS1
  841.         savebin "syscode.c",sysbegin,sysend-sysbegin
  842.        
  843.         LABELSLIST "..\..\us\user.l"
  844.