?login_element?

Subversion Repositories NedoOS

Rev

Rev 1383 | Blame | Compare with Previous | Last modification | View Log | Download

  1.         DEVICE ZXSPECTRUM1024
  2.         include "../_sdk/sys_h.asm"
  3.  
  4. DEBUG=0
  5. DEBUGSTOP=0;1
  6. DEBUG03=0
  7. FULL1M=1;0
  8.  
  9.         include "x86.ini"
  10.  
  11. STACK=0x4000
  12.  
  13. SHIFTCOUNTMASK=1 ;and 31
  14. AFFLAG_16BIT=1 ;only for add_test
  15. FASTADC16WITHFLAGS=0 ;NS
  16.  
  17. maxszPUTscreen=0x50
  18.  
  19. ;PC=0x4000...
  20. ;SP=0x8000...
  21. ;data=0xC000...
  22.         include "macros.asm"
  23.  
  24.         org PROGSTART
  25. begin
  26.         jp init
  27. initq
  28. Reset
  29.        ld a,(pgprog)
  30.        SETPG4000
  31.        jp resetpp
  32.  
  33. quiter
  34.        ld a,(pgprog)
  35.        SETPG4000
  36.        jp farquiter
  37.        
  38.        if 0
  39. jpiyer
  40.         ld hl,jpiyer
  41.         push hl
  42.         jp (iy)
  43.        endif
  44.  
  45. EMUCHECKQ
  46.         ;call getflags_bc
  47.         ;call makeflags_frombc
  48.         ;call getflags_bc
  49.        if DEBUGSTOP
  50.       push de
  51.        decodePC
  52.       if 1
  53.        ;ld a,(_SP)
  54.        ;rra
  55.        ;jr c,$
  56.        ;ld (oldpc),de
  57. oldpcaddr=$+1
  58.         ld hl,oldpc
  59.         ld (hl),e
  60.         inc l
  61.         ld (hl),d
  62.         inc l
  63.         ld (oldpcaddr),hl
  64.        endif
  65.        ;ld a,(_CS+1)
  66.        ;or a
  67.        ;jr z,$
  68.        ;ld a,d
  69.        ;sub 0x40+((STARTPC/256)&0x3f);0x7c
  70.        ;or e;cp 0x30
  71.        ;cp 0x97
  72.       ld hl,0x03ce;iret;0x0304;int;0x2d09;0x2976
  73.       or a
  74.       sbc hl,de
  75.       pop de
  76.       ;jr nc,$
  77.       call z,breakpoint
  78.        endif
  79.         get
  80.         next
  81.         LD L,A
  82.         ld H,MAINCOMS/256
  83.         LD b,(HL)
  84.         INC H
  85.         LD H,(HL)
  86.         ld L,b ;чётный для всех rm-команд
  87.         JP (HL)
  88. breakpoint
  89.         jr $
  90.  
  91. ;иначе pop iy запорет iy от обработчика прерывания
  92. disable_iff0_keep_iy
  93.       ;di
  94.         ld (iykeeper_iy),iy
  95.         ld a,55 ;scf
  96.         ld (iykeeper_on),a ;keep hl,de!
  97.         ret
  98. ;иначе pop iy запорет iy от обработчика прерывания
  99. enable_iff0_remember_iy
  100. iykeeper_iy=$+2
  101.         ld iy,0
  102.         ld hl,iykeeper_on
  103.         ld (hl),55+128 ;or a ;keep a!
  104.       ;ei
  105.         ret
  106.  
  107. on_int
  108.         PUSH AF,HL
  109.         push bc,de
  110.         exx
  111.         push bc
  112.         push de
  113.         push hl
  114.         push ix
  115.         push iy
  116.         ex af,af' ;'
  117.         push af
  118.         call oldimer
  119.        
  120.                                 ;(65536 / 50) * 18,206 Hz
  121.                                 ;23862,96832 = $5D37
  122. timer_frq = $+1
  123.         ld de,0x5D37
  124. timer_cnt = $+1
  125.         ld hl,0x0000
  126.         add hl,de
  127.         ld (timer_cnt),hl
  128.         jr nc,timer_inc_skip
  129. timer = $+1
  130.         ld hl,0x0000
  131.         inc hl
  132.         ld (timer),hl
  133. timer_inc_skip
  134.         ;ld hl,(timer)
  135.         ;inc hl
  136.         ;ld (timer),hl
  137.  
  138.        ld a,(curpg4000) ;ok
  139.        push af
  140.        ld a,(pgprog)
  141.        SETPG4000
  142.         call KEYB ;TODO ниже
  143.        pop af
  144.        SETPG4000
  145.         ;OS_GETKEY
  146. ;        A - код символа(кнопки). Допустимые коды смотри в 'sysdefs.asm' секция 'Usable key codes'
  147. ;        C - код символа(кнопки) без учета текущего языкового модификатора. Как правило, используется для обработки "горячих кнопок"
  148. ;        DE - позиция мыши (y,x) (возвращает 0 при отсутствии фокуса)
  149. ;        L - кнопки мыши (bits 0(LMB),1(RMB),2(MMB): 0=pressed; bits 7..4=положение колёсика)
  150. ;        LX - Kempston joystick (0bP2JFUDLR): 1=pressed, - при отсутствии джойстика 0 (а не 0xff)
  151. ;        Флаг Z - если 0(NZ), то отсутствует фокус.  
  152.         pop af
  153.         ex af,af' ;'
  154.         pop iy
  155.         pop ix
  156.         pop hl
  157.         pop de
  158.         pop bc
  159.         exx
  160.         pop de,bc
  161.  
  162. debugon=$
  163.         scf;or a ;для нормального старта пока пропускаем все активности до JumpIn
  164.         jr c,imerskipdebug
  165.  
  166.        ld a,0xf7
  167.        in a,(0xfe)
  168.        push af
  169.        and 0b10101
  170.        jp z,quiter ;1+3+5 = quit
  171.        pop af
  172.        and 0b11000 ;4+5
  173.        jp z,GotoDebugger
  174.  
  175.        LD A,(iff1)
  176.        OR A
  177.        jr NZ,IMEREI
  178. imerskipdebug
  179.         POP HL,AF
  180.         EI
  181.        RET
  182.  
  183. IMEREI
  184.         XOR A
  185.         LD (iff1),A
  186. ;перед эмуляцией INT завершаем тек.команду (перехват на EMULOOP)
  187.         LD (keepemuchecker),IY
  188.         LD IY,IMINT
  189.         POP HL,AF
  190.         RET  ;di!
  191.  
  192. GotoDebugger
  193. ;перед входом в отладчик завершаем тек.команду (перехват на EMULOOP)
  194.         LD (keepemuchecker),IY
  195.         LD IY,IMDEBUG
  196.         POP HL,AF
  197.         EI
  198.         RET
  199. IMDEBUG
  200.        ld a,55 ;scf
  201.        ld (debugon),a
  202.  
  203. ;запоминаем регистры в переменные
  204.        decodePC ;de=old PC
  205.        ld (curpc),de
  206.        ;exx
  207.        ;ex af,af' ;'
  208.        ;push af
  209.        ;pop hl
  210.        call getflags_bc
  211.        ld (curflags),bc
  212.  
  213.        ld a,(pgprog)
  214.        SETPG4000
  215.        
  216.         ld de,ansipal
  217.         OS_SETPAL
  218.         call Debugger
  219.  
  220.         ld a,(curgfxmode)
  221.         call INT_setgfx_a
  222.         call redraw_screen_memory
  223.  
  224.        ld bc,(curflags)
  225.        call makeflags_frombc
  226.        
  227.        ld a,55+128 ;or a
  228.        ld (debugon),a
  229.         ld iy,(keepemuchecker)
  230.        ld de,(curpc)
  231.        _LoopC_JP
  232.  
  233. IMINT
  234. keepemuchecker=$+2
  235.         LD IY,0
  236. iykeeper_on=$
  237.         or a ;scf=on
  238.         jr nc,IMINT_noiykeeperdata
  239.         ld iy,(iykeeper_iy)
  240. IMINT_noiykeeperdata
  241.        ;LD (retfromim),DE ;для индикации времени обработки прерыв
  242.        
  243. ;NS:
  244. ;Planeta запускаетсо кода [0000:041A] != [0000:041c]
  245. ;это на вид именно сиистемные переменные
  246. ;они дрыгаются так же в досе
  247. ;там еще всякие щифты рядом
  248. ;это начало и конец буфера клавиатуры
  249.        
  250.       ld a,(tpgs)
  251.       SETPGC000
  252.  
  253.         ;call KEYB ;TODO в странице
  254. GKEYADR=$+1
  255.         LD HL,KEYBUFF ;адрес конца списка
  256.         ld (0x041c+0xc000),hl
  257.         ld hl,KEYBUFF
  258.         ld (0x041a+0xc000),hl
  259.  
  260. ;int 0 - Переполнение при делении (Goody, Ms Pacman) - убитый (в cs там лежит свободная память, но даже при cs=0 лажа)
  261. ;int 1 - cpu generated??? Пошаговое прерывание (есть обработчик в mision, но если его поставить, всё время стреляет)
  262. ;int 8 - timer (ratillery for music)
  263. ;int 9 - keyboard
  264. ;int 1c - timer Пользовательское прерывание по таймеру (pitman)
  265.  
  266. ;INT 00h: Переполнение при делении.
  267. ;INT 01h: Пошаговое прерывание.
  268. ;INT 02h: Немаскируемое прерывание.
  269. ;INT 03h: Прерывание по точке.
  270. ;INT 04h: Прерывание по переполнению.
  271. ;INT 05h: Печать экрана.
  272. ;INT 06h: Неверная команда.
  273. ;INT 07h: Сопроцессор отсутсвует..
  274. ;INT 08h: IRQ 0 Прерывание от таймера.
  275. ;INT 09h: IRQ 1 Прерывание от клавиатуры.
  276. ;INT 0Ah: IRQ 2 Оборудование.
  277. ;INT 0Bh: IRQ 3 Оборудование (COM 2).
  278. ;INT 0Ch: IRQ 4 Оборудование (COM 1).
  279. ;INT 0Dh: IRQ 5 Оборудование (LPT, на оригинальном IBM PC - жёсткий диск).
  280. ;INT 0Eh: IRQ 6 Прерывание от дискеты.
  281. ;INT 0Fh: IRQ 7 Оборудование.
  282. ;INT 10h: Видео сервис.
  283. ;INT 11h: Список оборудования.
  284. ;INT 12h: Размер используемой памяти.
  285. ;INT 13h: Дисковый ввод/вывод.
  286. ;INT 14h: Ввод/вывод через COM порт.
  287. ;INT 15h: Дополнительные функции.
  288. ;INT 16h: Ввод/вывод клавиатуры, управление процессором и кэшем.
  289. ;INT 17h: Ввод/вывод LPT.
  290. ;INT 18h: Возврат в BIOS.
  291. ;INT 19h: Загрузка.
  292. ;INT 1Ah: Ввод/вывод таймера и сервисы PCI BIOS.
  293. ;INT 1Bh: Прерывание клавиатуры.
  294. ;INT 1Ch: Пользовательское прерывание по таймеру
  295. ;INT 1Dh: Видео параметры
  296. ;INT 1Eh: Параметры дискет
  297. ;INT 1Fh: Символы графики
  298.  
  299. ;INT 70h: IRQ 8 Оборудование (RTC).
  300. ;INT 71h: IRQ 9 Оборудование.
  301. ;INT 72h: IRQ 10 Оборудование.
  302. ;INT 73h: IRQ 11 Оборудование.
  303. ;INT 74h: IRQ 12 Оборудование (Мышь).
  304. ;INT 75h: IRQ 13 Оборудование (Сопроцессор 80287+).
  305. ;INT 76h: IRQ 14 Оборудование (Жёсткий диск).
  306. ;INT 77h: IRQ 15 Оборудование.
  307.  
  308.       ld hl,(9*4+0xc000) ;ip
  309.       ld bc,(9*4+0xc002) ;cs
  310.      ld a,0x55
  311.      rlca
  312.      ld ($-2),a
  313.      jr c,int_no8
  314.       ld hl,(8*4+0xc000) ;ip
  315.        ld bc,0x0221
  316.        or a
  317.        sbc hl,bc
  318.        add hl,bc
  319.        jr z,int_1c ;костыль для PATROL - 0221 не работает
  320.       ld bc,(8*4+0xc002) ;cs
  321.      ld a,0x55
  322.      rlca
  323.      ld ($-2),a
  324.      jr c,int_no8
  325. int_1c
  326.       ld hl,(0x1c*4+0xc000) ;ip
  327.       ld bc,(0x1c*4+0xc002) ;cs
  328. int_no8
  329.       ld a,h
  330.       or l
  331.      ;xor a
  332.       jp z,STIer ;костыль для неинициализированного прерывания
  333.       ;jr $
  334.        
  335. gotoint
  336. ;push cs; push ip (адрес после команды); push flags (iret читает flags,ip,cs)
  337.       push bc
  338.       push hl
  339.        ld bc,(_CS)
  340.         putmemspBC ;old CS
  341. ;абсолютный адрес ip, cs
  342.         ;ld a,(tpgs)
  343.         ;SETPGC000
  344.       pop hl
  345.       pop bc
  346.         ;ld hl,(9*4+0xc000) ;ip
  347.         ;ld bc,(9*4+0xc002) ;cs
  348.        push hl
  349.         ld (_CS),bc ;new CS
  350.         countCS
  351.        decodePC
  352.         LD b,d
  353.         ld c,e ;=old PC
  354.        pop de ;new PC
  355.         putmemspBC
  356.  
  357.        call getflags_bc
  358.         set 1,b ;interrupt enable
  359.        putmemspBC
  360.  
  361.      jp JRer_qslow ;_LoopC_JP
  362.  
  363. INT1
  364.        UNTESTED
  365.       ld a,(tpgs)
  366.       SETPGC000
  367.       ld hl,(1*4+0xc000) ;ip
  368.       ld bc,(1*4+0xc002) ;cs
  369.         jp gotoint
  370. INT3
  371.        UNTESTED
  372.       ld a,(tpgs)
  373.       SETPGC000
  374.       ld hl,(3*4+0xc000) ;ip
  375.       ld bc,(3*4+0xc002) ;cs
  376.         jp gotoint
  377. INTOer
  378.        UNTESTED
  379.         exx
  380.         ld a,e ;overflow data
  381.         and 0x40
  382.         rla
  383.         xor e
  384.         exx
  385.         JP p,NOPer
  386.       ld a,(tpgs)
  387.       SETPGC000
  388.       ld hl,(4*4+0xc000) ;ip
  389.       ld bc,(4*4+0xc002) ;cs
  390.         jp gotoint
  391.  
  392.        if 1;AFFLAG_16BIT
  393. ;как сформировать ZF,SF, не трогая AF?
  394. ;для этого надо сформировать число с нужными свойствами и сделать inc
  395.          ;ZF SF AF OF
  396. ;ff даёт  1  0  1  0 ;имитирует флаги после inc ffff
  397. ;7f даёт  0  1  1  1 ;имитирует флаги после inc 7fff
  398. ;80 даёт  0  1  0  0 ;имитирует флаги после inc 8000
  399. ;8f даёт  0  1  1  0 ;имитирует флаги после inc 800f
  400. ;т.е. ff, 7f надо формировать только для 7fff, ffff
  401. ;а в остальных случаях надо брать (h&0x80) + (l&0x08)
  402. ;если l!=ff, l!=7f, то можно просто сделать inc l
  403. ;если l=ff, то нельзя просто сделать inc h - запортится AF!
  404. inchlwithflags_l00 ;inc h needed
  405.         inc h
  406.         ret z ;set ZF=1(ok), AF=1(ok), OF=0(ok)
  407.         jp pe,inchlwithflags_overflow
  408. inchlwithflags_a0_setAF ;set ZF=0(ok), SF=h7(ok), AF=1, keep CY
  409. ;a=0
  410.         jp m,$+5
  411.         ld a,0x80 ;after dec: a7=h7
  412.         dec a ;set ZF=0, SF=h7, AF=1, keep CY
  413.         ret
  414. incbcwithflags_c00 ;inc b needed
  415.         inc b
  416.         ret z ;set ZF=1(ok), AF=1(ok), OF=0(ok)
  417.         jp po,inchlwithflags_a0_setAF
  418. inchlwithflags_overflow
  419.         exx
  420.         ld e,0x80 ;overflow (e7!=e6)
  421.         exx
  422.         ret
  423.  
  424. inchlwithflags_l80 ;fix SF, keep AF=1, ZF=0
  425. ;a=0x80
  426.         bit 7,h
  427.         jr z,inchlwithflags_l80_p
  428. inchlwithflags_l80_m
  429.         ld a,0 ;keep CY!
  430.         dec a ;00->ff ;set ZF=0, SF=h7, AF=1, keep CY
  431.         ret
  432. incbcwithflags_c80 ;fix SF, keep AF=1, ZF=0
  433. ;a=0x80
  434.         bit 7,b
  435.         jr nz,inchlwithflags_l80_m
  436. inchlwithflags_l80_p
  437.         dec a ;80->7f ;set ZF=0, SF=h7, AF=1, keep CY
  438.         ret
  439.  
  440. dechlwithflags_fixflags
  441.         ex af,af' ;'
  442.         dec l
  443.         ld a,l
  444.         exx
  445.         ld d,a ;parity data
  446.         ld e,0 ;overflow data
  447.         exx
  448.         jr z,dechlwithflags_l00 ;maybe zero
  449.         inc a
  450.         jp pe,inchlwithflags_l80;dechlwithflags_l7f ;fix SF, keep AF=1, ZF=0
  451.         ret nz
  452.         dec h
  453.         jp pe,inchlwithflags_overflow
  454.         jr nz,inchlwithflags_a0_setAF ;set ZF=0, SF=h7, AF=1, keep CY
  455. ;a=0, hl=0x00ff
  456.         inc a ;set ZF=0, SF=0, AF=0, keep CY
  457.         ret
  458. dechlwithflags_l00 ;maybe zero
  459. ;a=0
  460.         inc h
  461.         dec h
  462.         ret z ;set ZF=1, SF=0, AF=0
  463.         ld a,h
  464.         res 0,a ;for ZF=0, AF=0
  465.         inc a ;set ZF=0, SF=h7, AF=0, keep CY
  466.         ret
  467.  
  468. decbcwithflags_fixflags
  469.         ex af,af' ;'
  470.         dec c
  471.         ld a,c
  472.         exx
  473.         ld d,a ;parity data
  474.         ld e,0 ;overflow data
  475.         exx
  476.         jr z,decbcwithflags_c00 ;maybe zero
  477.         inc a
  478.         jp pe,inchlwithflags_l80;dechlwithflags_l7f ;fix SF, keep AF=1, ZF=0
  479.         ret nz
  480.         dec b
  481.         jp pe,inchlwithflags_overflow
  482.         jr nz,inchlwithflags_a0_setAF ;set ZF=0, SF=h7, AF=1, keep CY
  483. ;a=0, bc=0x00ff
  484.         inc a ;set ZF=0, SF=0, AF=0, keep CY
  485.         ret
  486. decbcwithflags_c00 ;maybe zero
  487. ;a=0
  488.         inc b
  489.         dec b
  490.         ret z ;set ZF=1, SF=0, AF=0
  491.         ld a,b
  492.         res 0,a ;for ZF=0, AF=0
  493.         inc a ;set ZF=0, SF=h7, AF=0, keep CY
  494.         ret
  495.  
  496.        endif
  497.  
  498. countXS_bc_to_ahl
  499.         ld h,b
  500.         ld l,c
  501.         xor a
  502.         add hl,hl
  503.         rla
  504.         add hl,hl
  505.         rla
  506.         add hl,hl
  507.         rla
  508.         add hl,hl
  509.         rla
  510.         ret
  511.  
  512.        if 1
  513. getmemspBCpp
  514.         ld bc,(_SP)
  515.         ld hl,(ss_LSW)
  516.         ld a,(ss_HSB)
  517.         ADDSEGMENT_hl_abc_to_ahl
  518.         inc bc
  519.         inc bc
  520.         ld (_SP),bc
  521.         ld c,a
  522.         ld b,tpgs/256
  523.         set 7,h
  524.         res 6,h
  525.         ld a,(bc)
  526.         SETPG8000
  527.         ld c,(hl)
  528.         inc l
  529.         ld b,(hl)
  530.         ret nz
  531.         push bc
  532.         ld hl,(_SP)
  533.         dec hl;inc hl
  534.         memSS
  535.         pop bc
  536.         ld b,(hl)
  537.         ret
  538. recountsp_inc
  539.         push bc
  540.         ld hl,(_SP)
  541.         inc hl
  542.         memSS
  543.         pop bc
  544.         ret
  545.        else
  546. ;не работает при некруглых сегментах
  547. putmemspBC_pp
  548.         ;LD HL,(_SP)
  549.         inc l
  550.         dec l
  551.         call z,recountsp_dec
  552.         dec l
  553.        push hl
  554.        res 6,h
  555.        set 7,h
  556.         ld (hl),b
  557.        pop hl
  558.         call z,recountsp_dec
  559.         dec l
  560.         LD (_SP),HL    
  561.        res 6,h
  562.        set 7,h
  563.         ld (hl),c
  564.        pop hl
  565.         ld bc,_putmemspBC_skipsize
  566.         add hl,bc
  567.         jp (hl)
  568.  
  569. getmemspBC_pp
  570.         ;LD HL,(_SP)
  571.        push hl
  572.        res 6,h
  573.        set 7,h
  574.         ld c,(hl)
  575.        pop hl
  576.         inc l
  577.         call z,recountsp_inc
  578.        push hl
  579.        res 6,h
  580.        set 7,h
  581.         ld b,(hl)
  582.        pop hl
  583.         inc l
  584.         call z,recountsp_inc
  585.         LD (_SP),HL
  586.        pop hl
  587.        push bc
  588.         ld bc,_getmemspBC_skipsize
  589.         add hl,bc
  590.        pop bc
  591.         jp (hl)
  592.  
  593. recountsp_inc
  594.         inc h
  595.         jr recountsp_incdec
  596. recountsp_dec
  597. ;вызывается до dec l!
  598.         dec h
  599. recountsp_incdec
  600.         push bc
  601.         push hl
  602.         memSS
  603.         pop hl
  604.         pop bc
  605.         ret
  606.        endif
  607.  
  608. recountpc_inc ;keep CY!
  609.         inc d
  610.         ret p ;<0x8000
  611.         push af
  612.         push bc
  613.         dec de
  614.         decodePC ;de->de
  615.         inc de
  616.         encodePC ;de->de
  617.         pop bc
  618.         pop af
  619.         ;ld de,0x4000
  620.         ret
  621.  
  622. PUTscreen_logpgc_zxaddrhl_datamhl_keephlpg_do
  623.        push hl
  624.        push bc
  625.        call PUTscreen_logpgc_zxaddrhl_datamhl_do ;не получится inline, т.к. многие вызывают прямо PUTscreen_logpgc_zxaddrhl_datamhl_do
  626.        pop bc
  627.         ld b,tpgs/256
  628.         ld a,(bc)
  629.         SETPGC000 ;как было
  630.        pop hl
  631.         ret
  632.  
  633. PUTscreen_logpgc_zxaddrhl_datamhl_do
  634.         ds maxszPUTscreen;0x52;100
  635.  
  636.         ;include "keyscan.asm"
  637.        display "--",$
  638.         include "rmbyte.asm"
  639.        display "--",$
  640.         include "rmbytcmd.asm"
  641.        display "--",$
  642.         include "extcmd.asm"
  643.         include "x86cmd.asm"
  644.        display "--",$
  645.         include "x86math.asm"
  646.        display "--",$
  647.         include "x86logic.asm"
  648.        display "--",$
  649.         include "ports.asm"
  650.        display "--",$
  651.  
  652.         align 256
  653. tpgs
  654.         ds 256 ;%10765432
  655. tscreenpgs
  656.         ds 256,tscreenpgs/256 ;%10765432 ;номер страницы в экране или tscreenpgs/256, если не экранная
  657. trecolour
  658. ;trecolour = tscreenpgs+256
  659. ;сюда копируется либо wastrecolour, либо wast866toatm
  660.         incbin "../_sdk/codepage/866toatm"
  661.  
  662.         align 256
  663. ;8 r16s
  664. _AX
  665. _AL     DB 0
  666. _AH     DB 0
  667. _CX
  668. _CL     DB 0
  669. _CH     DB 0
  670. _DX
  671. _DL     DB 0
  672. _DH     DB 0
  673. _BX
  674. _BL     DB 0
  675. _BH     DB 0
  676. _SP     DW 0 ;use encodeSP (with hl=(_SP)) after write!
  677. _BP     DW 0
  678. _SI     DW 0
  679. _DI     DW 0
  680. ;0x10
  681. ;4 sregs + 2
  682. _ES     DW 0
  683. _CS     DW 0
  684. _SS     DW 0
  685. _DS     DW 0
  686. _FS     DW 0
  687. _GS     DW 0
  688. curpc    dw 0 ;for debugger
  689. curflags dw 0 ;for debugger
  690.  
  691.         ds _ES+0x10-$
  692. ;0x20
  693. es_HSB  db 0
  694.         nop
  695. cs_HSB  db 0
  696.         nop
  697. ss_HSB  db 0
  698.         nop
  699. ds_HSB  db 0
  700.         nop
  701. fs_HSB  db 0
  702.         nop
  703. gs_HSB  db 0
  704.  
  705.         ds _ES+0x20-$
  706. ;0x30
  707. es_LSW  dw 0
  708. cs_LSW  dw 0
  709. ss_LSW  dw 0
  710. ds_LSW  dw 0
  711. fs_LSW  dw 0
  712. gs_LSW  dw 0
  713.      display $
  714.  
  715. ansipal ;можно убрать в ints
  716. ;DDp palette: %grbG11RB(low),%grbG11RB(high), inverted
  717.         ;dw 0xffff,0xfefe,0xfdfd,0xfcfc,0xefef,0xeeee,0xeded,0xecec
  718.         ;dw 0xffff,0xdede,0xbdbd,0x9c9c,0x6f6f,0x4e4e,0x2d2d,0x0c0c
  719. ;по сравнению с цветами терминала переставлено:
  720. ;1-4
  721. ;3-6
  722.         dw 0xffff,0xfefe,0xefef,0xeeee,0xfdfd,0xfcfc,0xeded,0xecec
  723.         dw 0x1f1f,0x1e1e,0x0f0f,0x0e0e,0x1d1d,0x1c1c,0x0d0d,0x0c0c
  724.  
  725. pc_high
  726.         db 0
  727. ;_DIRECTION
  728.         ;db 0
  729. iff1
  730.         db 0
  731. pgprog
  732.         db 0 ;там можно хранить дополнительный код (напр., отладчик)
  733. oldimer
  734.         jp on_int
  735.         jp 0x0038+3
  736.        
  737. ;000... -> 000 ;al
  738. ;001... -> 010 ;cl
  739. ;010... -> 100 ;dl
  740. ;011... -> 110 ;bl
  741. ;100... -> 001 ;ah
  742. ;101... -> 011 ;ch
  743. ;110... -> 101 ;dh
  744. ;111... -> 111 ;bh
  745.        ds _AX+128-$
  746.      display "=",$
  747. ;decode rm
  748.         dup 8
  749.         db _AL&0xff
  750.         db _CL&0xff
  751.         db _DL&0xff
  752.         db _BL&0xff
  753.         db _AH&0xff
  754.         db _CH&0xff
  755.         db _DH&0xff
  756.         db _BH&0xff
  757.         edup
  758.        ds _AX+192-$
  759. ;decode r8 (TODO поменять местами с decode rm, т.к. rm нужно чаще)
  760.         ds 8,_AL&0xff
  761.         ds 8,_CL&0xff
  762.         ds 8,_DL&0xff
  763.         ds 8,_BL&0xff
  764.         ds 8,_AH&0xff
  765.         ds 8,_CH&0xff
  766.         ds 8,_DH&0xff
  767.         ds 8,_BH&0xff
  768.         align 256
  769.         include "x86table.asm"
  770.  
  771.        if DEBUGSTOP
  772.        align 256
  773. oldpc
  774.         ;dw 0
  775.         ds 256
  776.        endif
  777.  
  778. ;генерируется для textmode
  779.         align 256
  780. ttextaddr
  781.         ds 128
  782.  
  783.         display "killable=",$
  784. ;killable
  785.  
  786.         display "lowend=",$
  787.         ds 0x3fc0-$
  788.         ds 0x4000-$
  789.         include "ints.asm"
  790.         include "keyscan.asm"
  791.         include "decoder.asm"
  792.         include "opcodes.asm"
  793.         include "nametables.asm"
  794.         include "functions.asm" ;prchar for disasm
  795.         include "routines.asm"
  796.         include "debugger.asm"
  797.         include "editline.asm"
  798. ; Чтение их памяти по адресу HL++
  799. ; _param_ip -- это РЕАЛЬНЫЙ ip, который должен быть сконвертирован
  800. ;              на память спектрума
  801. ; ----------------------------------------------------------------------
  802.  
  803. read:       push    hl
  804.             ld      hl, (_param_ip)
  805.             ;ld      a, (hl)
  806.            call Debugger_GetMem_hl_to_a
  807.             inc     hl
  808.             ld      (_param_ip), hl
  809.             pop     hl
  810.             ret
  811.  
  812. ; Реальный IP (в данном случае совпадает с адресом в памяти спектрума)
  813. _param_ip:  defw    0
  814.  
  815. Debugger_PutMem_hl_a
  816.        push bc
  817.        push hl
  818.        push af
  819.         ld bc,(cs_LSW)
  820.         ld a,(cs_HSB)
  821.         ADDSEGMENT_hl_abc_to_ahl
  822.         ld c,a
  823.         ld b,tpgs/256
  824.         set 7,h
  825.         set 6,h
  826.         ld a,(bc)
  827.         SETPGC000
  828.        pop af
  829.         ld (hl),a
  830.        pop hl
  831.        pop bc
  832.         ret
  833. Debugger_GetMem_hl_to_a
  834.        push bc
  835.        push hl
  836.         ld bc,(cs_LSW)
  837.         ld a,(cs_HSB)
  838.         ADDSEGMENT_hl_abc_to_ahl
  839.         ld c,a
  840.         ld b,tpgs/256
  841.         set 7,h
  842.         set 6,h
  843.         ld a,(bc)
  844.         SETPGC000
  845.         ld a,(hl)
  846.        pop hl
  847.        pop bc
  848.         ret
  849.  
  850.         align 256
  851. t866toatm
  852.         incbin "../_sdk/codepage/866toatm"
  853.  
  854.         display "end=",$
  855. end
  856.  
  857.         savebin "x86.com",begin,end-begin
  858.  
  859.         LABELSLIST "../../us/user.l"
  860.