?login_element?

Subversion Repositories NedoOS

Rev

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

  1.         DEVICE ZXSPECTRUM1024
  2.         include "../_sdk/sys_h.asm"
  3.  
  4. PROFI=512;1024
  5.         if PROFI=512
  6. PGATTR0=0x18
  7. PGATTR1=0x1a
  8.         else
  9. PGATTR0=0x38
  10. PGATTR1=0x3a
  11.         endif
  12.  
  13. ;emul=в 0000
  14. ;основной набор регистров=в альтернативном наборе
  15. ;PC=в DE
  16. ;текущий индексный=в IX
  17. ;не текущий индексный=в _IZ
  18. ;SP=в _SP (todo в (SP)? но там сейчас jpiyer для выхода из DOSER. сделать в DOSER 2-байтный патч?)
  19.  
  20. STACK=0x4000
  21.  
  22. stats=0 ;статистика по опкодам
  23.  
  24. margins=1 ;1=хранить в de уже пересчитанный PC ;8000,c000 - всегда замапленные страницы ;4000 - страница ПЗУ или текущая PC
  25. ;MEM48C0=1 ;8000,c000 - всегда замапленные страницы ;4000 - страница ПЗУ или текущая 4000 (каждый раз включать)
  26.  
  27. extpg5=1 ;1=перехват экрана
  28.  
  29. skipIM1=1 ;1=вместо трассировки #38 вызываем ее (если IY=23610)
  30.  
  31.         MACRO OUTPG
  32.         SETPGC000
  33.         ENDM
  34.  
  35.        if margins
  36.         MACRO OUTPGCOM
  37.         SETPG4000
  38.         ENDM
  39.        endif
  40.  
  41.         MACRO OUTPG4000
  42.         SETPG4000
  43.         ENDM
  44.  
  45.         MACRO _Loop_
  46.        ;OUTcom
  47.         JP (IY) ;EMULOOP
  48.         ENDM
  49.  
  50. ;если вместо стр.команд включили др.стр.
  51.         MACRO _LoopC
  52.         OUTcom
  53.         JP (IY)
  54.         ENDM
  55.  
  56. ;если вместо стр.команд включили др.стр. и до этого момента не трогали флаги
  57.         MACRO _LoopCimmediately
  58.         OUTcomCY15
  59.         JP (IY)
  60.         ENDM
  61.  
  62. ;если резко сменился PC (полный DE)
  63.         MACRO _LoopJP
  64.         CALCiypgcom
  65.         jp DOSER
  66.         ENDM
  67.         MACRO _LoopJP_NODOS
  68.         CALCiypgcom
  69.         JP (IY)
  70.         ENDM
  71.  
  72. ;если эмулятор щёлкал страницу и резко сменился PC (полный DE)
  73.         MACRO _LoopC_JP
  74.         CALCiypgcom
  75.         jp DOSER
  76.         ENDM
  77.         MACRO _LoopC_JP_NODOS
  78.         CALCiypgcom
  79.         JP (IY)
  80.         ENDM
  81.  
  82. ;если IN/OUT (могла измениться конфигурация памяти - но внутри out7ffd уже есть CALCpgcom)
  83.         MACRO _LoopSWI
  84.         JP (IY)
  85.         ENDM
  86.  
  87. ;берем смещение d
  88. ;результат HL=IX+d
  89.         MACRO getdIXtoHL
  90.         get
  91.         next
  92.         LD L,A
  93.         RLA
  94.         SBC A,A
  95.         LD H,A
  96.         PUSH IX
  97.         POP BC
  98.         ADD HL,BC
  99.         ENDM
  100.  
  101.        if margins
  102.         include "mem_marg.asm"
  103.        else
  104.        ;if MEM48C0
  105.        ; include "mem_48c0.asm"
  106.        ;else
  107.         include "mem_c000.asm"
  108.        ;endif
  109.        endif
  110.  
  111.         org PROGSTART
  112. begin
  113.         ld sp,STACK
  114.         OS_HIDEFROMPARENT
  115.         ld e,3+0x80 ;keep
  116.         OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
  117.         ;ld e,0 ;color byte
  118.         ;OS_CLS
  119.  
  120.         OS_GETMAINPAGES ;out: d,e,h,l=pages in 0000,4000,8000,c000, c=flags, b=id
  121.        push hl
  122.         ld hl,temulpgs
  123.         ld a,d
  124.         ld (deadpg),a
  125.         ld (hl),d
  126.         ld d,h
  127.         ld e,l
  128.         inc de
  129.         ld bc,64-1
  130.         ldir
  131.         ;OS_GETMAINPAGES ;out: d,e,h,l=pages in 0000,4000,8000,c000, c=flags, b=id
  132.        pop hl
  133.         ld a,h
  134.         ld (temulpgs+2),a
  135.         ld a,l
  136.         ld (temulpgs+0),a
  137.  
  138.         ld a,(user_scr0_low) ;ok
  139.         call clearpg
  140.         ld a,(user_scr1_low) ;ok
  141.         call clearpg
  142.  
  143.        if extpg5
  144.         OS_NEWPAGE
  145.         ld a,e
  146.        else
  147.         ld a,(user_scr0_high) ;ok
  148.        endif
  149.         ld (temulpgs+5),a
  150.        if extpg5
  151.         OS_NEWPAGE
  152.         ld a,e
  153.        else
  154.         ld a,(user_scr1_high) ;ok
  155.        endif
  156.         ld (temulpgs+7),a
  157.  
  158.         OS_NEWPAGE
  159.         ld a,e
  160.         ld (temulpgs+1),a
  161.         OS_NEWPAGE
  162.         ld a,e
  163.         ld (temulpgs+4),a
  164.         OS_NEWPAGE
  165.         ld a,e
  166.         ld (temulpgs+6),a
  167.         OS_NEWPAGE
  168.         ld a,e
  169.         ld (temulpgs+PGATTR0),a;0x38
  170.         OS_NEWPAGE
  171.         ld a,e
  172.         ld (temulpgs+PGATTR1),a;0x3a
  173.  
  174.         OS_NEWPAGE
  175.         ld a,e
  176.         ld (temulpgs+3),a
  177.         OS_NEWPAGE
  178.         ld a,e
  179.         ld (temulpgs+8),a
  180.         OS_NEWPAGE
  181.         ld a,e
  182.         ld (temulpgs+9),a
  183.         OS_NEWPAGE
  184.         ld a,e
  185.         ld (temulpgs+10),a
  186.  
  187.         ld de,path
  188.         OS_CHDIR      
  189.         ld de,diskname
  190.         OS_OPENHANDLE
  191.         ld a,b
  192.         ld (diskhandle),a
  193.        
  194.         OS_NEWPAGE
  195.         ld a,e
  196.         LD (pgrom48),a
  197.         LD (pgrom48_im1check),a
  198.         ld de,trom48
  199. ;de=имя файла
  200. ;a=в какой странице
  201.         call loadfile_in_ahl
  202.  
  203.         OS_NEWPAGE
  204.         ld a,e
  205.         LD (pgrom128),a
  206.         ld de,trom128
  207. ;de=имя файла
  208. ;a=в какой странице
  209.         call loadfile_in_ahl
  210.  
  211.         OS_NEWPAGE
  212.         ld a,e
  213.         LD (pgromDOS),a
  214.         ld de,tromDOS
  215. ;de=имя файла
  216. ;a=в какой странице
  217.         call loadfile_in_ahl
  218.  
  219.         OS_NEWPAGE
  220.         ld a,e
  221.         LD (pgromSYS),a
  222.         ld de,tromSYS
  223. ;de=имя файла
  224. ;a=в какой странице
  225.         call loadfile_in_ahl
  226.  
  227.         call swapimer
  228.  
  229. Reset
  230.         ld sp,STACK
  231.  
  232. ;хотя бы одно прерывание, чтобы захватить матрицу клавиатуры
  233.         ld b,25
  234. waitstart0
  235.         halt ;не YIELD, иначе наш обработчик не вызовется!
  236.         djnz waitstart0
  237.  
  238.        if 0;extpg5
  239.         xor a
  240.         ld (screenin4000_flag),a
  241.         ld a,0xc9
  242.         ld (screenin0000_flag),a
  243.         ld (screenin8000_flag),a
  244.         ld (screeninc000_flag),a
  245.        endif
  246.  
  247.         ;ld a,5
  248.         ;ld (_logicpg4000),a
  249.         ;ld a,(temulpgs+5)
  250.         ;ld (emulcurpg4000),a
  251.         ;SETPG4000 ;TODO убрать
  252.         ;ld a,2
  253.         ;ld (_logicpg8000),a
  254.         ;ld a,(temulpgs+2)
  255.         ;ld (emulcurpg8000),a
  256.         ;SETPG8000
  257.  
  258.         ld a,-1 ;impossible value
  259.         ld (oldcurvideomode),a
  260.         ld (oldcurscr7ffd),a
  261.  
  262.        ;ld a,-1
  263.        ;ld (doson0),a ;for basic48
  264.         xor a
  265.         ld (doson0),a
  266.         ;ld a,0x10 ;for basic48
  267.         ld (_fd),a
  268.         ;xor a
  269.         ld (_dffd),a
  270.         CALL eoutDFFD;дальше идёт на eout7FFD
  271.  
  272.        if 0
  273.         LD HL,0
  274.         ld d,h
  275.         ld e,l
  276.         ld b,h
  277.         ld c,l
  278.         PUSH HL
  279.         POP AF
  280.         ld (immode),a
  281.         PUSH HL
  282.         POP ix
  283.         ld (_IZ),hl
  284.         ld (_AF),hl
  285.         ld (_BC),hl
  286.         ld (_DE),hl
  287.         ld (_HL),hl
  288.         EXX
  289.         EXA
  290.        endif
  291.  
  292.         LD DE,0x0000 ;=PC
  293. Jumpin
  294.       IF margins
  295.        ;LD HL,emulcurpg0000
  296.        ;LD (curquart),HL
  297.        ; LD A,(HL)
  298.        ; OUTPGCOM
  299.        ; ld de,0x4000 ;пересчитанный PC
  300.         CALCiypgcom
  301.       endif
  302.  
  303.         ld a,0xdd
  304.         ld (oldprefix),a ;ix содержит ix
  305.  
  306.         xor a
  307.         ld (immode),a
  308.  
  309.         LD IY,EMUCHECKQ
  310.        ;EMUDATABUS ;ШД0..2 на бордюр
  311.        ;EMUADDRBUS ;ША8..10 ма бордюр
  312.        ;EMUCHECKPOINT ;проверка адреса или условия
  313.                       ;проверка числа тактов до INT?
  314. jpiyer
  315.         ld hl,jpiyer
  316.         push hl
  317.         jp (iy)
  318.  
  319. Quit
  320.         call swapimer
  321.         QUIT
  322.  
  323. Loadsnapshot
  324.         ld sp,STACK
  325.  
  326.         ld de,snapshotram3name
  327.         ld a,(temulpgs+3)
  328.         call loadfile_in_ahl
  329.         ld de,snapshotram5name
  330.         ld a,(temulpgs+5)
  331.         call loadfile_in_ahl
  332.         ld de,snapshotram8name
  333.         ld a,(temulpgs+8)
  334.         call loadfile_in_ahl
  335.         ld de,snapshotram9name
  336.         ld a,(temulpgs+9)
  337.         call loadfile_in_ahl
  338.         ld de,snapshotramaname
  339.         ld a,(temulpgs+10)
  340.         call loadfile_in_ahl
  341.  
  342.         ld de,snapshotscrname
  343.         ld a,(temulpgs+6)
  344.         call loadfile_in_ahl
  345.         ld de,snapshotattrname
  346.         ld a,(temulpgs+PGATTR1);0x3a
  347.         call loadfile_in_ahl
  348.  
  349.         ld de,snapshotname
  350.         OS_OPENHANDLE
  351.         ld a,(temulpgs+0)
  352.         call loadsnappg
  353.         ld a,(temulpgs+1)
  354.         call loadsnappg
  355.         ld a,(temulpgs+2)
  356.         call loadsnappg
  357.         ld a,(temulpgs+7)
  358.         call loadsnappg
  359.         OS_CLOSEHANDLE
  360.  
  361.        if 0;extpg5
  362.         ld a,0xc9
  363.         ld (screenin4000_flag),a
  364.         ld a,0xc9
  365.         ld (screenin0000_flag),a
  366.         ld a,0xc9
  367.         ld (screenin8000_flag),a
  368.         ld a,0xc9
  369.         ld (screeninc000_flag),a
  370.        endif
  371.  
  372.         ;ld a,(temulpgs+1)
  373.         ;ld (emulcurpg4000),a
  374.         ;SETPG4000 ;TODO убрать
  375.         ;ld a,(temulpgs+2)
  376.         ;ld (emulcurpg8000),a
  377.         ;SETPG8000
  378.  
  379.         ld hl,0xe6fb
  380.         ld (_SP),hl
  381.  
  382.         ld a,-1 ;impossible value
  383.         ld (oldcurvideomode),a
  384.         ld (oldcurscr7ffd),a
  385.  
  386.        ;ld a,-1
  387.        ;ld (doson0),a
  388.         xor a
  389.         ld (doson0),a
  390.         ld a,0x09 ;screen 1
  391.         ld (_fd),a
  392.         ld a,0xb8
  393.         CALL eoutDFFD;дальше идёт на eout7FFD
  394.        
  395.         ld a,0xff
  396.         ex af,af' ;'
  397.         ld bc,0xff00
  398.         ld de,0x321f ;важно!!!
  399.         ld hl,0xffff
  400.         ld ix,0x001d ;?0038?
  401.         exx
  402.        
  403.         ld de,0x07a2
  404.         jp Jumpin
  405.  
  406. ;oldpc
  407. ;        dw 0
  408.  
  409. EMUCHECKQ
  410.        ;ld a,(0x4000)
  411.        ;or a
  412.        ;jr z,$
  413.        ;ld a,d
  414.        ;sub 0x7c
  415.        ;cp 2
  416.        ;jr nc,$
  417.        ;ld (oldpc),de
  418.         get
  419.         next
  420.        IF stats
  421.        PUSH HL
  422.         LD L,A
  423.         LD H,comstats/256-1
  424.         INC H
  425.         INC (HL)
  426.         jr Z,$-2
  427.        POP HL
  428.        ENDIF
  429.         LD L,A
  430.         ld H,MAINCOMS/256
  431.         LD C,(HL)
  432.         INC H
  433.         LD H,(HL)
  434.         ld L,C
  435.         JP (HL)
  436. ;можно выиграть 11(-JP=1) тактов:
  437.        ;LD L,A
  438.        ;AND 3 ;3 для JP, а можно(?) целые п/п: 7/15/31
  439.        ;ADD A,'MAINCOMS
  440.        ;LD H,A
  441.        ;JP (HL) ;L=код команды, если надо ;но надо менять обработчики, они сейчас ждут код в A!
  442. ;или ld l,a:ld h,NN:ld h,(hl):jp (hl)
  443. ;или ld l,a:or 0xc0:ld h,a:jp (hl)
  444.  
  445. CBPREFIX
  446.         get
  447.         next
  448.         LD L,A
  449.         ld H,CBCOMS/256
  450.         LD C,(HL)
  451.         INC H
  452.         LD H,(HL)
  453.         ld L,C
  454.         JP (HL)
  455.  
  456. EDPREFIX
  457.         get
  458.         next
  459.         LD L,A
  460.         ld H,EDCOMS/256
  461.         LD C,(HL)
  462.         INC H
  463.         LD H,(HL)
  464.         ld L,C
  465.         JP (HL)
  466.  
  467. FDPREFIX
  468. DDPREFIX
  469. oldprefix=$+1
  470.         CP #DD
  471.         jr Z,DDFDold
  472.         LD (oldprefix),A
  473. ;сменили префикс! меняем местами IX и _IZ
  474.         LD HL,(_IZ)
  475.         LD (_IZ),IX
  476.         PUSH HL
  477.         POP IX
  478. DDFDold
  479.         get
  480.         next
  481.         LD L,A
  482.         ld H,DDCOMS/256
  483.         LD C,(HL)
  484.         INC H
  485.         LD H,(HL)
  486.         ld L,C
  487.         JP (HL)
  488.  
  489. DDCBPREFIX
  490.         getdIXtoHL
  491.        PUSH HL
  492.         get
  493.         next
  494.         LD L,A
  495.         ld H,DDCBCOMS/256
  496.         LD C,(HL)
  497.         INC H
  498.         LD H,(HL)
  499.         ld L,C
  500.        EX (SP),HL
  501.        RET
  502.  
  503. EMUDATABUS
  504.         LD A,(DE)
  505.        OUT (-2),A
  506.         JP EMUCHECKQ
  507.  
  508. EMUADDRBUS
  509.         LD A,D
  510.        OUT (-2),A
  511.         JP EMUCHECKQ
  512.  
  513. EMUCHECKPOINT
  514. retfromim=$+1
  515.         LD HL,0
  516.         XOR A
  517.         SBC HL,DE
  518.         JP NZ,EMUCHECKQ
  519.         LD A,(_fe)
  520.        OUT (-2),A
  521.         JP EMUCHECKQ
  522.  
  523. clearpg
  524.         OUTPG4000
  525.         ld hl,0x4000
  526.         ld de,0x4001
  527.         ld bc,0x3fff
  528.         ld (hl),l
  529.         ldir
  530.         ret
  531.  
  532. keymatrix
  533.         ds 8,0xff
  534.  
  535. DOSrdindex
  536.         LD A,E
  537.         cp #08
  538.         jr z,DOSsetheadwait
  539.         CP #b2 ;#3eb2
  540.         jr nz,jpiy;ret nz
  541. ;Адрес #3EB2. Проверка индексной области дорожки. Установите #5CD1 и поместите в B время перемещения головки дисковода. Выбирается верхняя сторона и при ошибке в #5D17 помещается #FF. В регистр H помещается номер текущей дорожки. Используется также с адреса: #3EE7 (обработка ошибки NO DISC).
  542.        ld a,(dos3F) ;trk
  543.        exx
  544.        ld h,a
  545.        exx
  546.         jp imitret
  547. DOSsetheadwait
  548.         ld a,3
  549.         ld (fddstatemask),a ;костыль!!!
  550.         jp imitret
  551.  
  552. DOSER
  553. ;после каждой команды, меняющей PC ;выход по jp (iy)
  554. ;если мы не в досе, то проверяем, что D=#3D
  555. ;если мы в досе, то проверяем, что D<=#40
  556. ;если мы в 128K (TODO или в ОЗУ 0000), то ничего не делаем
  557. DOSSTATE_FROM48=0x18 ;jr DOSERny
  558. DOSSTATE_FROMDOS=0x3e ;ld a,N (skip jr)
  559. DOSSTATE_FROM128=0xc9 ;ret
  560.         ;LD A,(doson0)
  561.         ;OR A
  562.         ;jr NZ,DOSERny
  563. DOSER_state=$
  564.         jr DOSERny
  565.        if margins
  566.         ld a,(curquart)
  567.         cp 3 ;0000?
  568.        ;cpl
  569.        ;and 3
  570.         jr z,DOSDOS ;DOS -> DOS
  571.        else
  572.         LD A,D
  573.         CP #40
  574.         jr C,DOSDOS ;DOS -> DOS
  575.        endif
  576. ;DOS -> неDOS
  577. ;выкл. стр. доса
  578.         LD A,-1
  579.         LD (doson0),A ;DOS ports off
  580.         ld a,DOSSTATE_FROM48
  581.         ld (DOSER_state),a
  582.         LD A,(_fd)
  583.         call eout7FFD
  584. jpiy
  585.         jp (iy)
  586. DOSDOS
  587.   ;для SYS не перехватываем!
  588.         LD A,(_fd)
  589.         AND 16
  590.         jr z,jpiy;RET Z
  591.         ld a,d
  592. ;перехваты процедур доса
  593.        if margins
  594.         cp 0x3e+0x40
  595.        else
  596.         cp 0x3e
  597.        endif
  598.         jr z,DOSrdindex
  599.        if margins
  600.         cp 0x3f+0x40
  601.        else
  602.         cp 0x3f
  603.        endif
  604.         jr nz,jpiy;RET NZ ;не перехватываем
  605. ;имитировать RET после неё
  606.         LD A,E
  607.         CP #D5 ;#3fd5
  608.         jr Z,DOSRD
  609.         CP #E5 ;#3fe5
  610.         jr Z,DOSRD
  611.         CP #BA ;#3fba
  612.         jr z,DOSWR
  613.         jp (iy) ;RET NZ
  614. DOSRD
  615.         xor a
  616.         ld (fddstatemask),a ;костыль!!! иначе читает через раз
  617.      PUSH DE,IX,IY
  618.         EXX
  619.         PUSH HL
  620.         INC H
  621.         EXX
  622.         POP HL
  623.         LD C,5
  624.         LD A,(dos3F) ;trk
  625.         ADD A,A
  626.         LD D,A
  627.         LD A,(dosFF)
  628.         BIT 4,A
  629.         jr nz,$+3
  630.         INC D
  631.         LD A,(dos5F) ;sec
  632.         DEC A
  633.         LD E,A
  634.         CALL DOSrdsec
  635.      POP IY,IX,DE
  636. DOSWR
  637. ;TODO
  638.         jp imitret
  639.  
  640. DOSERny
  641. ;from 48/RAM
  642.        if margins
  643.         ld a,d
  644.         cp 0x3d+0x40
  645.         jr nz,jpiy;RET NZ
  646.         ld a,(curquart)
  647.         cp 3 ;0000?
  648.        ;cpl
  649.        ;and 3
  650.         jr nz,jpiy;RET NZ
  651.        else
  652.         LD A,D
  653.         CP #3D
  654.         jr nz,jpiy;RET NZ
  655.        endif
  656.   ;для 128 васика запрещено! иначе глючит калькулятор
  657.         ;LD A,(_fd)
  658.         ;AND 16
  659.         ;RET Z
  660. ;неDOS -> DOS
  661.        LD A,E
  662.        CP #13
  663.        jr Z,DOS3D13 ;если убрать, будет значительно медленнее
  664. DOSSWON
  665. ;вкл. стр. доса
  666. ;имитация RET не катит для точки #3D2F
  667.         XOR A
  668.         LD (doson0),A ;DOS ports on
  669.         ld a,DOSSTATE_FROMDOS
  670.         ld (DOSER_state),a
  671.         LD A,(_fd)
  672.         call eout7FFD
  673.         jp (iy)
  674. DOS3D13
  675.         exx
  676.         ld a,c
  677.         exx
  678.         cp 6
  679.         jr z,DOSWRSEC
  680.         cp 5
  681.         jr nz,DOSSWON ;(for other functions)
  682. DOSRDSEC
  683. DOSWRSEC
  684.         exx
  685. D3D5S0
  686.         CALL DOSrdsec ;c=5(read)/6(write)
  687.         inc h
  688.         inc e
  689.         bit 4,e
  690.         jr z,$+5
  691.         inc d
  692.         ld e,0
  693.         DJNZ D3D5S0
  694. ;write de to virtual 23796:
  695.         ld hl,23796
  696.         ld b,d
  697.         ld c,e
  698.         putmemBC
  699.         exx
  700.        jp imitret ;имитировать RET после неё
  701.  
  702. DOSrdsec
  703. ;hl=addr
  704. ;d=track
  705. ;e=sector
  706. ;c=5(read)/6(write)
  707.        PUSH BC
  708.        PUSH de
  709.        PUSH HL
  710.        EXX
  711.        EXA
  712.         PUSH AF
  713.         PUSH BC,DE,HL
  714.         push ix,iy
  715.        EXA
  716.        EXX
  717.         push hl ;addr
  718.         ld a,e ;de=trsec
  719.         add a,a
  720.         add a,a
  721.         add a,a
  722.         add a,a
  723.         ld l,d ;track
  724.         ld h,0 ;0la=trsec*16
  725.         dup 4
  726.         add a,a
  727.         adc hl,hl
  728.         edup ;hl0=trsec*256
  729.         ld d,a;0
  730.         ld e,h
  731.         ld h,l
  732.         ld l,a;0 ;dehl=shift in file
  733. diskhandle=$+1
  734.         ld b,0
  735.        push bc ;c=5/6
  736.         OS_SEEKHANDLE
  737.        pop bc ;c=5/6, b=handle
  738.         pop hl ;addr
  739.        bit 0,c
  740.        jr nz,DOSrdsec5
  741.         ld de,secbuf
  742.         push bc
  743.         push de
  744.         ld b,0
  745. DOSwrseccopy0
  746.         push bc
  747.         push hl
  748.         getmem
  749.         ld (de),a
  750.         pop hl
  751.         pop bc
  752.         inc hl
  753.         inc de
  754.         djnz DOSwrseccopy0
  755.         pop de ;secbuf
  756.         pop bc ;b=handle
  757.         ld hl,256 ;de=phys addr ;hl=size
  758.         OS_WRITEHANDLE
  759.        jr DOSrdsec5ok
  760. DOSrdsec5
  761.          push hl ;addr
  762.          ld de,secbuf
  763.          push de
  764.         ld hl,256 ;size
  765.         OS_READHANDLE
  766.          pop hl ;secbuf
  767.          pop de ;addr
  768.         ex de,hl ;de->hl
  769.         ld b,0
  770. DOSrdseccopy0
  771.         push bc
  772.         push hl
  773.         ld a,(de)
  774.         putmem
  775.         pop hl
  776.         pop bc
  777.         inc hl
  778.         inc de
  779.         djnz DOSrdseccopy0
  780. DOSrdsec5ok
  781.        exx
  782.        EXA
  783.         pop iy,ix
  784.         pop hl,de,bc
  785.         pop af
  786.        EXA
  787.        EXX
  788.         pop hl,de,bc    
  789.         ret
  790.  
  791.         include "debugsrv.asm"
  792.         include "debugger.asm"
  793.         include "disasm.asm"
  794.  
  795.         include "asmsrv.asm"
  796.         include "asmsubr.asm"
  797.         include "asm.asm"
  798.  
  799.         include "editline.asm"
  800.  
  801.         include "ports.asm"
  802.  
  803.         include "z80cmd.asm"
  804.  
  805.         include "rst38.asm"
  806.  
  807. on_int
  808.         PUSH AF,HL
  809.  
  810.         ex af,af' ;'
  811.         push af
  812.  
  813.         push bc,de
  814.         exx
  815.         push bc
  816.         push de
  817.         push hl
  818.         push ix
  819.         push iy
  820.  
  821.         ld a,(curscr)
  822. oldcurscr=$+1
  823.         cp 0
  824.         jr z,IMERnoscr
  825.         ld (oldcurscr),a
  826.         rrca
  827.         rrca
  828.         rrca
  829.         ld e,a
  830.         OS_SETSCREEN
  831. IMERnoscr
  832.  
  833.         ld a,(_fe)
  834.         and 7
  835. oldcurborder=$+1
  836.         cp 0
  837.         jr z,IMERnoborder
  838.         ld (oldcurborder),a
  839.         ld e,a
  840.         OS_SETBORDER
  841. IMERnoborder
  842.         call oldimer
  843.  
  844.        if 0
  845.         ld bc,0x7ffe
  846.         in a,(c)
  847.         ld lx,a  ;lx=%???bnmS_
  848.         ld b,0xbf
  849.         in a,(c)
  850.         ld hx,a  ;hx=%???hjklE
  851.         ld b,0xdf
  852.         in l,(c)  ;l=%???yuiop
  853.         ld b,0xef
  854.         in h,(c)  ;h=%???67890
  855.         ld b,0xf7
  856.         in e,(c)  ;e=%???54321
  857.         ld b,0xfb
  858.         in d,(c)  ;d=%???trewq
  859.         ld a,0xfd
  860.         in a,(0xfe);c=%???gfdsa
  861.         ld b,c;0xfe
  862.         in b,(c)  ;b=%???vcxzC
  863.         ld c,a
  864.        else
  865.         OS_GETKEYMATRIX ;out: bcdehlix = halfrows cs...space
  866.        endif
  867.         ld (keymatrix),ix
  868.         ld (keymatrix+2),hl
  869.         ld (keymatrix+4),de
  870.         ld (keymatrix+6),bc
  871.         OS_GETKEY
  872. ;        A - код символа(кнопки). Допустимые коды смотри в 'sysdefs.asm' секция 'Usable key codes'
  873. ;        C - код символа(кнопки) без учета текущего языкового модификатора. Как правило, используется дляи обработки "горячих кнопок"
  874. ;        DE - позиция мыши (y,x) (возвращает 0 при отсутствии фокуса)
  875. ;        L - кнопки мыши (bits 0(LMB),1(RMB),2(MMB): 0=pressed; bits 7..4=положение колёсика)
  876. ;        LX - Kempston joystick (0bP2JFUDLR): 1=pressed, - при отсутствии джойстика 0 (а не 0xff)
  877. ;        Флаг Z - если 0(NZ), то отсутствует фокус.
  878.         jr nz,IMERnofocus
  879.         ld a,e
  880.         ld (mousex),a
  881.         ld a,d
  882.         ld (mousey),a
  883.         ld a,l
  884.         ld (mousebuttons),a
  885.         ld a,lx
  886.         ld (kempston),a
  887. IMERnofocus
  888.  
  889.         pop iy
  890.         pop ix
  891.         pop hl
  892.         pop de
  893.         pop bc
  894.         exx
  895.         pop de,bc      
  896.  
  897.         pop af
  898.         ex af,af' ;'
  899.  
  900. debugon=$
  901.         or a
  902.         jr c,imerskipdebug
  903.  
  904. ;здесь опрос клавиш эмулятора
  905.        ld a,0xef
  906.        in a,(0xfe)
  907.        and 0b10101 ;6+8+0
  908.        jp z,Reset
  909.        ld a,0xf7
  910.        in a,(0xfe)
  911.        push af
  912.        and 0b10101 ;1+3+5
  913.        jp z,Quit
  914.        pop af
  915.        push af
  916.        and 0b10011 ;1+2+5
  917.        jp z,Loadsnapshot
  918.        pop af
  919.        and 0b11000 ;4+5
  920.        jp z,GotoDebugger
  921.  
  922.        LD A,(iff1)
  923.        OR A
  924.        jr NZ,IMEREI
  925. imerskipdebug
  926.         POP HL,AF
  927.         EI
  928.         RET        
  929. IMEREI
  930.         XOR A
  931.         LD (iff1),A
  932.         LD (iff2),A ;для NMI надо только iff1!
  933. ;перед эмуляцией INT завершаем тек.команду (перехват на EMULOOP)
  934.         LD (keepemuchecker),IY
  935.         LD IY,IMINT
  936.         POP HL,AF
  937.         RET  ;di!
  938. GotoDebugger
  939. ;перед входом в отладчик завершаем тек.команду (перехват на EMULOOP)
  940.         LD (keepemuchecker),IY
  941.         LD IY,IMDEBUG
  942.         POP HL,AF
  943.         EI
  944.         RET
  945. IMDEBUG
  946.        ld a,55 ;scf
  947.        ld (debugon),a
  948.  
  949. ;запоминаем регистры в переменные
  950.        CALCpc ;de=old PC
  951.        ld (curpc),de
  952.        exx
  953.        ld (curbc),bc
  954.        ld (curde),de
  955.        ld (curhl),hl
  956.        ex af,af' ;'
  957.        push af
  958.        pop hl
  959.        ld (curaf),hl
  960. ;ставим, что был префикс #dd, кладём curix,curiy
  961.         ld a,(oldprefix)
  962.         CP #DD
  963.         jr Z,IMDEBUGwasdd
  964. ;был префикс #fd, ix содержит "iy"
  965.         ld a,#dd
  966.         LD (oldprefix),A
  967.         LD HL,(_IZ) ;=curiy
  968.         ld (curiy),ix ;=_IZ
  969.         ld (curix),hl
  970.         jr IMDEBUGwasddq
  971. IMDEBUGwasdd
  972.         ld (curix),ix
  973.         ;ld (curiy),hl ;=_IZ
  974. IMDEBUGwasddq
  975.  
  976.         call Debugger
  977.  
  978. ;берём регистры из переменных (уже установлено "был префикс #dd")
  979.         ld ix,(curix)
  980.         ;ld hl,(curiy) ;=_IZ
  981.         ;ld (_IZ),hl
  982.        ld hl,(curaf)
  983.        push hl
  984.        pop af
  985.        ex af,af' ;'
  986.        ld hl,(curhl)
  987.        ld de,(curde)
  988.        ld bc,(curbc)
  989.        exx
  990.        
  991.        ld a,55+128 ;or a
  992.        ld (debugon),a
  993.         ld iy,(keepemuchecker)
  994.        ld de,(curpc)
  995.        _LoopC_JP
  996. IMINT
  997. keepemuchecker=$+2
  998.         LD IY,0
  999.        LD (retfromim),DE ;для индикации времени обработки прерыв
  1000.        LD A,(immode)
  1001.        CP #18 ;IM2
  1002.         LD HL,#38 ;new PC
  1003.        jr NZ,IMERIM1
  1004.         LD HL,(_I-1)
  1005.         LD L,#FF ;состояние пассивной ШД
  1006.         getmemBC
  1007.         ld h,b
  1008.         ld l,c
  1009.         JR IMERIM
  1010. GETIY
  1011.         LD HL,(_IZ)
  1012.         LD A,(oldprefix)
  1013.         CP #DD
  1014.         RET Z
  1015.         PUSH IX
  1016.         POP HL
  1017.         RET
  1018. IMERIM1
  1019.      IF skipIM1
  1020.         ;ld a,(romstate_flag)
  1021.         ;cp ROMSTATE_ON
  1022.         ld a,(emulcurpg0000)
  1023. pgrom48_im1check=$+1
  1024.         cp 0
  1025.         jr nz,IMERIM
  1026.        PUSH HL
  1027.         CALL GETIY
  1028.         LD BC,23610
  1029.         OR A
  1030.         SBC HL,BC
  1031.        POP HL
  1032.         JR NZ,IMERIM
  1033. ;вообще-то надо и SP проверить...
  1034.       push ix
  1035.       PUSH IY
  1036.      if margins;MEM48C0
  1037.         call setmem4000
  1038.      endif
  1039.       LD IY,23610
  1040.       call L0038;basicrst38
  1041.       LD A,-1
  1042.       LD (iff1),A
  1043.       LD (iff2),A
  1044.       POP IY
  1045.       pop ix
  1046.      _LoopC ;RET уже был (адрес со стека снят)
  1047.      ENDIF
  1048. IMERIM
  1049. ;hl=new PC
  1050.         EI
  1051.        CALCpc ;de=old PC
  1052.         ex de,hl ;DE=new PC
  1053.         LD B,H
  1054.         ld C,L ;BC=old PC
  1055.         LD HL,(_SP)
  1056.         DEC HL,HL
  1057.         LD (_SP),HL
  1058.         putmemBC
  1059.        _LoopC_JP
  1060.  
  1061. writescreen_6912
  1062.         bit 1,a
  1063.         ld a,(user_scr0_high) ;ok
  1064.         jr z,$+5
  1065.         ld a,(user_scr1_high) ;ok
  1066. ;curscreenc000pgaddr=$+1
  1067.         ;ld a,(user_scr1_high) ;ok
  1068.        push bc
  1069.         OUTPG4000
  1070.        pop bc
  1071.        ld (hl),c
  1072.         ret
  1073.  
  1074. writescreen_profi
  1075. ;hl=0x4000+ (keep)
  1076. ;c=data (keep bc)
  1077. ;a=logicpg
  1078.       push hl
  1079.        push bc
  1080. ;y=%TTYYYyyy
  1081. ;hl=%010TTyyy YYYxxxxx
  1082.        push af
  1083.         ld a,h
  1084.         xor l
  1085.         and 0x1f
  1086.         xor l
  1087.        ld c,l
  1088.         ld l,a
  1089.        ld a,c
  1090.        and 0x1f
  1091.        ld b,0
  1092.        bit 5,h
  1093.        jr nz,$+4
  1094.        ld b,0x20
  1095.         ld h,tprofiy/256
  1096.         ld c,(hl)
  1097.         inc h
  1098.         ld h,(hl)
  1099.         ld l,a
  1100.         add hl,bc
  1101. ;addr=0x4000+(half*0x2000)+y*40+x
  1102.        pop af
  1103.        bit 4,a
  1104.        jr z,writescreen_profi_outpg_pix
  1105.         bit 1,a
  1106.         ld a,(user_scr0_low) ;ok
  1107.         jr z,writescreen_profi_outpg
  1108.         ld a,(user_scr1_low) ;ok
  1109.         jr writescreen_profi_outpg
  1110. writescreen_profi_outpg_pix
  1111.         bit 1,a
  1112.         ld a,(user_scr0_high) ;ok
  1113.         jr z,writescreen_profi_outpg
  1114.         ld a,(user_scr1_high) ;ok
  1115. writescreen_profi_outpg
  1116.         OUTPG4000
  1117.        pop bc
  1118.        ld (hl),c
  1119.       pop hl
  1120.         ret
  1121.  
  1122.        if margins;MEM48C0    
  1123.  
  1124.        if extpg5
  1125. setmem8000c000writec
  1126. ;CY=1, keep CY (keep A for rra:ld h,a)
  1127.         jp m,setmemc000writec
  1128.         ld (hl),c
  1129. screenin8000_flag=$
  1130.         ret ;/nop for screen in 8000
  1131.        ld a,(_logicpg8000)
  1132. SCREEN8000_VIDEOMODE_6912=0x30 ;jr nc
  1133. SCREEN8000_VIDEOMODE_PROFI=0x38 ;jr c
  1134. screen8000_videomode=$
  1135.         jr nc,screen8000_profi
  1136.         bit 5,h
  1137.         jr nz,setmem8000writec_skip
  1138.         res 7,h
  1139.         set 6,h
  1140.         call writescreen_6912
  1141.        push bc
  1142.         LD bc,(curquart)
  1143.         LD A,(bc)
  1144.         OUTPGCOM ;надо именно тут, т.к. OUTcomCY15 работает только после обращения к <0x8000
  1145.        pop bc
  1146.         set 7,h
  1147.         res 6,h
  1148. setmem8000writec_skip
  1149.        ld a,h
  1150.        add a,a
  1151.         ret
  1152. screen8000_profi
  1153.         res 7,h
  1154.         set 6,h
  1155.         call writescreen_profi
  1156.        push bc
  1157.         LD bc,(curquart)
  1158.         LD A,(bc)
  1159.         OUTPGCOM ;надо именно тут, т.к. OUTcomCY15 работает только после обращения к <0x8000
  1160.        pop bc
  1161.         set 7,h
  1162.         res 6,h
  1163.        ld a,h
  1164.        add a,a
  1165.         ret
  1166. setmemc000writec
  1167.         ld (hl),c
  1168. screeninc000_flag=$
  1169.         ret ;/nop for screen in c000
  1170.        ld a,(_logicpgc000)
  1171. ;screenc000_branchvideomode
  1172. SCREENC000_VIDEOMODE_6912=0x30 ;jr nc
  1173. SCREENC000_VIDEOMODE_PROFI=0x38 ;jr c
  1174. screenc000_videomode=$
  1175.         jr nc,screenc000_profi
  1176.         bit 5,h
  1177.         jr nz,setmemc000writec_skip
  1178.         res 7,h
  1179.         call writescreen_6912
  1180.        push bc
  1181.         LD bc,(curquart)
  1182.         LD A,(bc)
  1183.         OUTPGCOM ;надо именно тут, т.к. OUTcomCY15 работает только после обращения к <0x8000
  1184.        pop bc
  1185.         set 7,h
  1186. setmemc000writec_skip
  1187.        ld a,h
  1188.        add a,a
  1189.         ret
  1190. screenc000_profi
  1191.         res 7,h
  1192.         call writescreen_profi
  1193.        push bc
  1194.         LD bc,(curquart)
  1195.         LD A,(bc)
  1196.         OUTPGCOM ;надо именно тут, т.к. OUTcomCY15 работает только после обращения к <0x8000
  1197.        pop bc
  1198.         set 7,h
  1199.        ld a,h
  1200.        add a,a
  1201.         ret
  1202.        endif
  1203.        
  1204. setmem00004000writec
  1205. ;NC, keep CY (keep A for rra:ld h,a)
  1206.        if !extpg5
  1207. ROMSTATE_ON=0xf2 ;jp p
  1208. ROMSTATE_OFF=0xda ;jp c
  1209.        else
  1210. ROMSTATE_ON=0xf0 ;ret p
  1211. ROMSTATE_OFF=0xd8 ;ret c
  1212.        endif
  1213.         jp m,setmem4000writec
  1214.        if !extpg5
  1215. romstate_flag=$
  1216.        jp p,setmem00004000writec_skip
  1217.        else
  1218. romstate_flag=$
  1219.         ret p
  1220.        endif
  1221.         set 6,h
  1222.         ld a,0x3e
  1223.         ld (set4000com),a
  1224.         ld a,(emulcurpg0000) ;0000
  1225.        push bc
  1226.         OUTPG4000
  1227.        pop bc
  1228.        if extpg5
  1229.        ld (hl),c
  1230.        endif
  1231.        ld a,h
  1232.        sub 64
  1233.        add a,a
  1234. screenin0000_flag=$
  1235.         ret ;/nop for screen in 0000
  1236. ;TODO write C to screen if screen in 0000
  1237.        if extpg5
  1238.        
  1239.         ret
  1240.        endif
  1241. setmem4000writec
  1242.         ld a,0x3e
  1243.         ld (set4000com),a
  1244.         ld a,(emulcurpg4000) ;4000
  1245.        push bc
  1246.         OUTPG4000
  1247.        pop bc
  1248.        if extpg5
  1249.        ld (hl),c
  1250.        endif
  1251.        ld a,h
  1252.        add a,a
  1253. screenin4000_flag=$
  1254.         ret ;/nop for screen in 4000
  1255. ;CY=0
  1256.        if extpg5
  1257.        ld a,(_logicpg4000)
  1258. screen4000_branchvideomode
  1259. SCREEN4000_VIDEOMODE_6912=0x38 ;jr c
  1260. SCREEN4000_VIDEOMODE_PROFI=0x30 ;jr nc
  1261. screen4000_videomode=$
  1262.         jr c,screen4000_profi
  1263.         bit 5,h
  1264.         call z,writescreen_6912
  1265. setmem4000writec_skip
  1266.        ld a,h
  1267.        add a,a
  1268.         ret
  1269. screen4000_profi
  1270.         call writescreen_profi
  1271.        ld a,h
  1272.        add a,a
  1273.         ret
  1274.        endif
  1275.  
  1276.        if !extpg5
  1277. setmem00004000writec_skip
  1278.         ld h,secbuf/256
  1279.         ret
  1280.        endif
  1281.  
  1282. ;for read
  1283. setmem00004000
  1284.         jp m,setmem4000
  1285.         set 6,h
  1286.         ld a,0x3e
  1287.         ld (set4000com),a
  1288.         ld a,(emulcurpg0000) ;0000
  1289.        push bc
  1290.         OUTPG4000
  1291.        pop bc
  1292.        ld a,h
  1293.        sub 64
  1294.        add a,a
  1295.         ret
  1296. setmem4000
  1297.         ld a,0x3e
  1298.         ld (set4000com),a
  1299.         ld a,(emulcurpg4000) ;4000
  1300.        push bc
  1301.         OUTPG4000
  1302.        pop bc
  1303.        ld a,h
  1304.        add a,a
  1305.         ret
  1306.  
  1307. ;for PC
  1308. set4000com
  1309.         ld a,0xc9 ;/RET
  1310.         ld (set4000com),a
  1311.         LD HL,(curquart)
  1312.         LD A,(HL)
  1313.         OUTPGCOM
  1314.         ret
  1315.        
  1316. next_incd
  1317.         inc d
  1318.         ret nz
  1319.         ld d,0xc0
  1320.         ld hl,(curquart)
  1321.         inc l
  1322.         res 2,l
  1323.         ld (curquart),hl
  1324.         ld a,(hl)
  1325.         OUTPGCOM
  1326.         ret
  1327.        endif
  1328.  
  1329. pgrom48
  1330.         db 0
  1331. pgrom128
  1332.         db 0
  1333. pgromDOS
  1334.         db 0
  1335. pgromSYS
  1336.         db 0
  1337.  
  1338. curregs ;for debugger
  1339. curaf   dw 0 ;for debugger
  1340. curbc   dw 0 ;for debugger
  1341. curde   dw 0 ;for debugger
  1342. curhl   dw 0 ;for debugger
  1343. _AF     DW 0 ;AF'
  1344. _BC     DW 0 ;BC'
  1345. _DE     DW 0 ;DE'
  1346. _HL     DW 0 ;HL'
  1347. _SP     DW 0
  1348. curpc   dw 0 ;for debugger
  1349. curix   dw 0 ;for debugger
  1350. ;curiy   dw 0 ;for debugger
  1351. curiy ;for debugger
  1352. _IZ     DW 0
  1353. _R      DB 0
  1354. _I      DB 0
  1355.  
  1356. iff1    DB 0
  1357. iff2    DB 0
  1358. immode  DB 0 ;#18=IM2, иначе IM1
  1359. _fd     DB 0;#10 ;с точки зрения эмулимой проги
  1360. _dffd   db 0
  1361. _logicpg0000 db 0 ;TODO
  1362. _logicpg4000 db 0
  1363. _logicpg8000 db 0
  1364. _logicpgc000 db 0
  1365. _fe     DB 0
  1366. dos3F   DB 0
  1367. dos5F   DB 0
  1368. dosFF   DB 0
  1369.  
  1370.        if margins
  1371. curquart
  1372.         DW emulcurpg0000
  1373.        endif
  1374.  
  1375. curscr  DB 0 ;0/8
  1376.  
  1377. ;romon0  DB 0 ;#C0=ОЗУ, 0=ПЗУ в нижних 16k ;теперь в romstate
  1378. doson0  DB 0;-1 ;0=SYS/DOS, -1=48/128
  1379.  
  1380. loadfile_in_ahl
  1381. ;de=имя файла
  1382. ;[hl=куда грузим (0xc000)]
  1383. ;a=в какой странице
  1384.         SETPGC000 ;включили страницу A в 0xc000
  1385.         ;push hl ;куда грузим
  1386.         OS_OPENHANDLE
  1387.         ;pop de ;куда грузим
  1388.         ;push bc ;b=handle
  1389.         ;ld hl,0x4000 ;столько грузим (если столько есть в файле)
  1390.         ;OS_READHANDLE
  1391.         ;pop bc ;b=handle
  1392.         call loadpg
  1393.         OS_CLOSEHANDLE
  1394.         ret;jp setpgmainc000 ;включили страницу программы в c000, как было
  1395.  
  1396. loadsnappg
  1397. ;b=handle
  1398.         push bc
  1399.         SETPGC000 ;включили страницу A в 0xc000
  1400.         pop bc
  1401. loadpg
  1402.         ld de,0xc000 ;куда грузим
  1403.         ld hl,0x4000 ;столько грузим (если столько есть в файле)
  1404.         push bc ;b=handle
  1405.         OS_READHANDLE
  1406.         pop bc ;b=handle
  1407.         ret
  1408.  
  1409. path
  1410.         db "z80",0
  1411.  
  1412. diskname
  1413.         db "SYS.TRD",0
  1414. snapshotname
  1415.         db "SOLI",0
  1416. snapshotscrname
  1417.         db "ram6",0
  1418. snapshotattrname
  1419.         db "ram3a",0
  1420. snapshotram3name
  1421.         db "ram3",0
  1422. snapshotram5name
  1423.         db "ram5",0
  1424. snapshotram8name
  1425.         db "ram8",0
  1426. snapshotram9name
  1427.         db "ram9",0
  1428. snapshotramaname
  1429.         db "rama",0
  1430.        
  1431. trom48
  1432.         ;DB "2006.ROM",0
  1433.         ;DB "1982.ROM",0
  1434.         DB "48for128.rom",0
  1435.         ;DB "testatm.rom",0
  1436. trom128
  1437.         DB "128tr.rom",0
  1438.         ;DB "testatm.rom",0
  1439. tromSYS
  1440.         DB "GLUKPEN.ROM",0
  1441.         ;DB "testatm.rom",0
  1442. tromDOS
  1443.         DB "DOS6_10E.ROM",0
  1444.         ;DB "testatm.rom",0
  1445.  
  1446. swapimer
  1447.         di
  1448.         ld de,0x0038
  1449.         ld hl,oldimer
  1450.         ld bc,3
  1451. swapimer0
  1452.         ld a,(de)
  1453.         ldi ;[oldimer] -> [0x0038]
  1454.         dec hl
  1455.         ld (hl),a ;[0x0038] -> [oldimer]
  1456.         inc hl
  1457.         jp pe,swapimer0
  1458.         ei
  1459.         ret
  1460. oldimer
  1461.         jp on_int
  1462.         jp 0x0038+3
  1463.  
  1464.         align 256
  1465.         include "z80table.asm"
  1466.         align 256
  1467.        if margins
  1468.         align 256 ;почему не работает 8? TODO
  1469.        endif
  1470. ;реальные банки (лежат подряд с адреса, делящегося на 8, для margins)
  1471. emulcurpg4000=$  ;DB 0 ;for 4000
  1472. emulcurpg8000=$+1  ;DB 0 ;for 8000
  1473. emulcurpgc000=$+2  ;DB 0 ;for c000
  1474. emulcurpg0000=$+3  ;DB 0 ;for 0000
  1475.         ;ds 4
  1476. t866toatm
  1477.         incbin "../kernel/866toatm"
  1478.        IF stats
  1479.         align 256
  1480. comstats
  1481.         DISPLAY "comstats=",$
  1482.         DS #400
  1483.        ENDIF
  1484.         align 256 ;for setmem00004000forwrite
  1485. secbuf
  1486.         ds 256
  1487.         align 256
  1488. tprofiy
  1489. _chr=0
  1490.         dup 32
  1491. ;_chr=%000YYYTT
  1492. _Y=((_chr*8)&0x18)+((_chr/4)&0x07) ;_Y=%000TTYYY
  1493.         ;db 200 ;invisible line
  1494. _egay=_Y*8;7 ;- 4
  1495.         dup 8;7
  1496.        if (_egay >= 200) || (_egay < 0)
  1497.         ;db 200 ;invisible line
  1498.         DCOM (0x4000+4+(200*40))
  1499.        else
  1500.         ;db _egay
  1501.         DCOM (0x4000+4+(_egay*40))
  1502.        endif
  1503. _egay=_egay+1
  1504.         edup
  1505. _chr=_chr+1
  1506.         edup
  1507.         ;ds (-$)&0xff,200 ;invisible line
  1508.         org $+256
  1509.         align 256
  1510. temulpgs
  1511.         ds 64 ;пока используем 8
  1512.  
  1513.         display $
  1514. end
  1515.  
  1516.         savebin "z80.com",begin,end-begin
  1517.  
  1518.         LABELSLIST "../../us/user.l"
  1519.