?login_element?

Subversion Repositories NedoOS

Rev

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