Subversion Repositories NedoOS

Rev

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

  1.         DEVICE ZXSPECTRUM1024
  2.         include "../_sdk/sys_h.asm"
  3.  
  4. DEBUG=0;1
  5. CRUTCH=1 ;костыль для movb
  6. DEBUGWR=0
  7.  
  8.         include "bk.ini"
  9.  
  10. STACK=0x4000
  11.  
  12. ;PC=0x4000...
  13. ;data=0xC000...
  14.         include "macros.asm"
  15.  
  16.         org PROGSTART
  17. begin
  18.         jp init
  19. initq
  20. Reset
  21.        ld a,(pgprog)
  22.        SETPG4000
  23.        jp resetpp
  24.  
  25. quiter
  26.        ld a,(pgprog)
  27.        SETPG4000
  28.        jp farquiter
  29.        
  30.        if 0
  31. jpiyer
  32.         ld hl,jpiyer
  33.         push hl
  34.         jp (iy)
  35.        endif
  36.  
  37. EMUCHECKQ
  38.         ;call getflags_bc
  39.         ;call makeflags_frombc
  40.         ;call getflags_bc
  41.        if DEBUG
  42.       push de
  43.        decodePC
  44.       if 1;0
  45.        ;ld a,(_SP)
  46.        ;rra
  47.        ;jr c,$
  48.        ;ld (oldpc),de
  49. oldpcaddr=$+1
  50.         ld hl,oldpc
  51.         ld (hl),e
  52.         inc l
  53.         ld (hl),d
  54.         inc l
  55.         ld bc,(_R1)
  56.         ld (hl),c
  57.         inc l
  58.         ld (hl),b
  59.         inc l
  60.         ld (oldpcaddr),hl
  61.        endif
  62.        ld a,d
  63.        ;sub 0x40+((STARTPC/256)&0x3f);0x7c
  64.        ;or e;cp 0x30
  65.        cp 1
  66.        jr z,$
  67.       ld hl,0x1f74;0x0258;0x3dc8
  68.       or a
  69.       sbc hl,de
  70.       pop de
  71.       ;jr nc,$
  72.       ;jr z,$
  73.        endif
  74.         get
  75.         next
  76.         ld c,a
  77.         get
  78.         next
  79.         LD L,A
  80.         ld H,MAINCOMS/256
  81.         LD b,(HL)
  82.         INC H
  83.         LD H,(HL)
  84.         ld L,b ;ac=cmd
  85.         JP (HL)
  86.  
  87. ;иначе pop iy запорет iy от обработчика прерывания
  88. disable_iff0_keep_iy
  89.       ;di
  90.         ld (iykeeper_iy),iy
  91.         ld a,55 ;scf
  92.         ld (iykeeper_on),a ;keep hl,de!
  93.         ret
  94. ;иначе pop iy запорет iy от обработчика прерывания
  95. enable_iff0_remember_iy
  96. iykeeper_iy=$+2
  97.         ld iy,0
  98.         ld hl,iykeeper_on
  99.         ld (hl),55+128 ;or a ;keep a!
  100.       ;ei
  101.         ret
  102.  
  103. on_int
  104.         PUSH AF,HL
  105.         push bc,de
  106.         exx
  107.         push bc
  108.         push de
  109.         push hl
  110.         push ix
  111.         push iy
  112.         ex af,af' ;'
  113.         push af
  114.         call oldimer
  115.        
  116.         ;ld hl,(timer)
  117.         ;inc hl
  118.         ;ld (timer),hl
  119.        ld a,0xf7
  120.        in a,(0xfe)
  121.        and 0b10101
  122.        jp z,quiter ;1+3+5 = quit
  123.  
  124.        ld a,(curpg4000) ;ok
  125.        push af
  126.        ld a,(pgprog)
  127.        SETPG4000
  128.         call KEYB
  129. iskeymessage=$
  130.         or a ;/scf
  131.         jr c,int_alreadyhavekey
  132.         call keyscan_getkey
  133.         ld (bk_curkey),a
  134.         ld a,55 ;"scf"
  135.         ld (iskeymessage),a ;message
  136. int_alreadyhavekey
  137.        pop af
  138.        SETPG4000
  139.         ;OS_GETKEY
  140. ;        A - код символа(кнопки). Допустимые коды смотри в 'sysdefs.asm' секция 'Usable key codes'
  141. ;        C - код символа(кнопки) без учета текущего языкового модификатора. Как правило, используется для обработки "горячих кнопок"
  142. ;        DE - позиция мыши (y,x) (возвращает 0 при отсутствии фокуса)
  143. ;        L - кнопки мыши (bits 0(LMB),1(RMB),2(MMB): 0=pressed; bits 7..4=положение колёсика)
  144. ;        LX - Kempston joystick (0bP2JFUDLR): 1=pressed, - при отсутствии джойстика 0 (а не 0xff)
  145. ;        Флаг Z - если 0(NZ), то отсутствует фокус.  
  146.         pop af
  147.         ex af,af' ;'
  148.         pop iy
  149.         pop ix
  150.         pop hl
  151.         pop de
  152.         pop bc
  153.         exx
  154.         pop de,bc
  155.        LD A,(iff1)
  156.        OR A
  157.        jr NZ,IMEREI
  158.         POP HL,AF
  159.         EI
  160.        RET
  161.  
  162. IMEREI
  163.         XOR A
  164.         LD (iff1),A
  165. ;перед эмуляцией INT завершаем тек.команду (перехват на EMULOOP)
  166.         LD (keepemuchecker),IY
  167.         LD IY,IMINT
  168.         POP HL,AF
  169.         RET  ;di!
  170.  
  171. IMINT
  172. keepemuchecker=$+2
  173.         LD IY,0
  174. iykeeper_on=$
  175.         or a ;scf=on
  176.         jr nc,IMINT_noiykeeperdata
  177.         ld iy,(iykeeper_iy)
  178. IMINT_noiykeeperdata
  179.        ;LD (retfromim),DE ;для индикации времени обработки прерыв
  180.              
  181.       ld a,(tpgs)
  182.       SETPGC000
  183.  
  184.         ;call KEYB ;TODO в странице
  185. GKEYADR=$+1
  186.         LD HL,KEYBUFF ;адрес конца списка
  187.  
  188. ;04 -- ошибка шины/HALT/"СТОП"
  189. ;60 (0x30) -- клавиатура
  190. ;274 (0xbc) -- клавиатура с нажатой АР2
  191. ;на 11М еще 100 (0x40) -- кадровое прерывание
  192. ;10 (0x08) -- нелегальная команда
  193. ;ещё есть программные EMT/TRAP/BPT/IOT
  194.  
  195.       ld hl,(0x30*4+0xc000) ;pc
  196.       ld bc,(0x30*4+0xc002) ;psw
  197.       ld a,h
  198.       or l
  199.      xor a
  200.       jp z,STIer ;костыль для неинициализированного прерывания
  201.        
  202. gotoint
  203. ;push psw; push pc (адрес после команды)
  204.        push hl
  205.        call getflags_bc
  206.         set 7,c ;interrupt enable
  207.        putmemspBC
  208.  
  209.        decodePC_to_ae
  210.         LD b,a
  211.         ld c,e ;=old PC
  212.        pop de ;new PC
  213.         putmemspBC
  214.  
  215.        _LoopC_JP
  216.  
  217.        if 1;AFFLAG_16BIT
  218. ;как сформировать ZF,SF, не трогая AF?
  219. ;для этого надо сформировать число с нужными свойствами и сделать inc
  220.          ;ZF SF AF OF
  221. ;ff даёт  1  0  1  0 ;имитирует флаги после inc ffff
  222. ;7f даёт  0  1  1  1 ;имитирует флаги после inc 7fff
  223. ;80 даёт  0  1  0  0 ;имитирует флаги после inc 8000
  224. ;8f даёт  0  1  1  0 ;имитирует флаги после inc 800f
  225. ;т.е. ff, 7f надо формировать только для 7fff, ffff
  226. ;а в остальных случаях надо брать (h&0x80) + (l&0x08)
  227. ;если l!=ff, l!=7f, то можно просто сделать inc l
  228. ;если l=ff, то нельзя просто сделать inc h - запортится AF!
  229. inchlwithflags_l00 ;inc h needed
  230.         inc h
  231.         ret z ;set ZF=1(ok), AF=1(ok), OF=0(ok)
  232.         jp pe,inchlwithflags_overflow
  233. inchlwithflags_a0_setAF ;set ZF=0(ok), SF=h7(ok), AF=1, keep CY
  234. ;a=0
  235.         jp m,$+5
  236.         ld a,0x80 ;after dec: a7=h7
  237.         dec a ;set ZF=0, SF=h7, AF=1, keep CY
  238.         ret
  239. incbcwithflags_c00 ;inc b needed
  240.         inc b
  241.         ret z ;set ZF=1(ok), AF=1(ok), OF=0(ok)
  242.         jp po,inchlwithflags_a0_setAF
  243. inchlwithflags_overflow
  244.         exx
  245.         ld e,0x80 ;overflow (e7!=e6)
  246.         exx
  247.         ret
  248.  
  249. inchlwithflags_l80 ;fix SF, keep AF=1, ZF=0
  250. ;a=0x80
  251.         bit 7,h
  252.         jr z,inchlwithflags_l80_p
  253. inchlwithflags_l80_m
  254.         ld a,0 ;keep CY!
  255.         dec a ;00->ff ;set ZF=0, SF=h7, AF=1, keep CY
  256.         ret
  257. incbcwithflags_c80 ;fix SF, keep AF=1, ZF=0
  258. ;a=0x80
  259.         bit 7,b
  260.         jr nz,inchlwithflags_l80_m
  261. inchlwithflags_l80_p
  262.         dec a ;80->7f ;set ZF=0, SF=h7, AF=1, keep CY
  263.         ret
  264.  
  265. dechlwithflags_fixflags
  266.         ex af,af' ;'
  267.         dec l
  268.         ld a,l
  269.         exx
  270.         ld d,a ;parity data
  271.         ld e,0 ;overflow data
  272.         exx
  273.         jr z,dechlwithflags_l00 ;maybe zero
  274.         inc a
  275.         jp pe,inchlwithflags_l80;dechlwithflags_l7f ;fix SF, keep AF=1, ZF=0
  276.         ret nz
  277.         dec h
  278.         jp pe,inchlwithflags_overflow
  279.         jr nz,inchlwithflags_a0_setAF ;set ZF=0, SF=h7, AF=1, keep CY
  280. ;a=0, hl=0x00ff
  281.         inc a ;set ZF=0, SF=0, AF=0, keep CY
  282.         ret
  283. dechlwithflags_l00 ;maybe zero
  284. ;a=0
  285.         inc h
  286.         dec h
  287.         ret z ;set ZF=1, SF=0, AF=0
  288.         ld a,h
  289.         res 0,a ;for ZF=0, AF=0
  290.         inc a ;set ZF=0, SF=h7, AF=0, keep CY
  291.         ret
  292.  
  293. decbcwithflags_fixflags
  294.         ex af,af' ;'
  295.         dec c
  296.         ld a,c
  297.         exx
  298.         ld d,a ;parity data
  299.         ld e,0 ;overflow data
  300.         exx
  301.         jr z,decbcwithflags_c00 ;maybe zero
  302.         inc a
  303.         jp pe,inchlwithflags_l80;dechlwithflags_l7f ;fix SF, keep AF=1, ZF=0
  304.         ret nz
  305.         dec b
  306.         jp pe,inchlwithflags_overflow
  307.         jr nz,inchlwithflags_a0_setAF ;set ZF=0, SF=h7, AF=1, keep CY
  308. ;a=0, bc=0x00ff
  309.         inc a ;set ZF=0, SF=0, AF=0, keep CY
  310.         ret
  311. decbcwithflags_c00 ;maybe zero
  312. ;a=0
  313.         inc b
  314.         dec b
  315.         ret z ;set ZF=1, SF=0, AF=0
  316.         ld a,b
  317.         res 0,a ;for ZF=0, AF=0
  318.         inc a ;set ZF=0, SF=h7, AF=0, keep CY
  319.         ret
  320.  
  321.        endif
  322.  
  323. recountpc_inc ;keep CY!
  324.         inc d
  325.         ret p ;<0x8000
  326.         push af
  327.         push bc
  328.         dec de
  329.         decodePC ;de->de
  330.         inc de
  331.         encodePC ;de->de
  332.         pop bc
  333.         pop af
  334.         ;ld de,0x4000
  335.         ret
  336.  
  337. inchnextpg
  338.         inc h
  339.         ret nz
  340. hlnextpg
  341.         push af
  342.         push bc
  343.         ld a,lx
  344.         add a,0x40
  345.         ;adc a,0
  346.         ld c,a
  347.         ld b,tpgs/256
  348.         ld a,(bc)
  349.         SETPGC000
  350.         pop bc
  351.         pop af
  352.         ld h,0xc0
  353.         ret
  354.  
  355. putscreen_c
  356.          ;halt
  357.        push hl
  358.        push bc
  359.        ld b,tmirror/256
  360.        ld a,(bc)
  361.        push af
  362. ;TODO bw/color
  363. ;y=%TTYYYyyy
  364. ;hl=%01TTYYYy yyxxxxxx
  365.        ld b,0
  366.        bit 0,l
  367.        jr z,$+4
  368.        ld b,0x20
  369.         ld a,l
  370.         rra
  371.         and 0x1f
  372.        add hl,hl
  373.        add hl,hl
  374.        ld l,h
  375.         ld h,ty/256
  376.         ld c,(hl)
  377.         inc h
  378.         ld h,(hl) ;hc = ybase
  379.         ld l,a
  380.         add hl,bc
  381. ;addr=0x8000+(half*0x2000)+y*40+x
  382.         ld a,(user_scr0_high) ;ok
  383.         SETPG8000 ;TODO щёлкать только в color      
  384.        pop af
  385.         ld (hl),a
  386.        pop bc
  387.        pop hl
  388.         ret
  389.  
  390. getflags_bc
  391. ;формат PSW такой: IxxTNZVC
  392. ;разрешение прерываний -- маска 0200(0x80) в PSW
  393. ;T - разрешение трассировочного прерывания
  394.         ex af,af' ;'
  395.         push af
  396.         ex af,af' ;'
  397.         pop bc
  398. ;c=%SZ???V?C
  399.         ld a,c ;flags
  400.         ld bc,0
  401.         add a,a
  402.         jr nc,$+4
  403.         set 3,c ;N=S
  404.         jp p,$+5
  405.         set 2,c ;Z
  406.         rra ;a=flags
  407.         rra
  408.         jr nc,$+3
  409.         inc c ;C
  410.         rra
  411.         rra
  412.         jr nc,$+4
  413.         set 1,c ;V
  414.         ld a,(iff1)
  415.        and 0x80
  416.        or c
  417.        ld c,a
  418.         ret
  419.  
  420. makeflags_frombc
  421. ;c=IxxTNZVC
  422.         ld a,c
  423.         rla ;interrupt enable
  424.         sbc a,a
  425.         ld (iff1),a
  426.         ld a,c
  427.         ld c,0
  428.         rra
  429.         jr nc,$+3
  430.         inc c ;C
  431.         rra
  432.         jr nc,$+4
  433.         set 2,c ;V
  434.         rra
  435.         jr nc,$+4
  436.         set 6,c ;Z
  437.         rra
  438.         jr nc,$+4
  439.         set 7,c ;Z
  440. ;c=%SZ???V?C
  441.         push bc
  442.         ex af,af' ;'
  443.         pop af
  444.         ex af,af' ;'
  445.         ret
  446.        
  447. STIer
  448.         ld a,-1
  449.         ld (iff1),a
  450.        _LoopC
  451.  
  452. getmemspBCpp
  453.         ld hl,(_SP)
  454.         inc hl
  455.         inc hl
  456.         ld (_SP),hl
  457.         dec hl
  458.         dec hl
  459.         ld a,h
  460.         and 0xc0
  461.         ld c,a
  462.         ld b,tpgs/256
  463.         set 7,h
  464.         set 6,h
  465.         ld a,(bc)
  466.         SETPGC000
  467.         ld c,(hl)
  468.         inc l
  469.         ld b,(hl)
  470.         ret nz
  471.         push bc
  472.         ld hl,(_SP)
  473.         dec hl
  474.         ld a,h
  475.         and 0xc0
  476.         ld c,a
  477.         ld b,tpgs/256
  478.         set 7,h
  479.         set 6,h
  480.         ld a,(bc)
  481.         SETPGC000
  482.         pop bc
  483.         ld b,(hl)
  484.         ret
  485.  
  486. recountsp_inc
  487.         push bc
  488.         ld hl,(_SP)
  489.         inc hl
  490.         ld a,h
  491.         and 0xc0
  492.         ld c,a
  493.         ld b,tpgs/256
  494.         set 7,h
  495.         set 6,h
  496.         ld a,(bc)
  497.         SETPGC000
  498.         pop bc
  499.         ret
  500.  
  501. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  502.  
  503. getdest8_aisc
  504. ;out: c=dest, a=cmdLSB
  505. ;15-12 Opcode
  506. ;11-9 Src
  507. ;8-6 Register
  508. ;5-3 Dest
  509. ;2-0 Register
  510.         rla
  511.         and 0x0e
  512.         ld l,a ;0000rrr0
  513.         ld h,_R0/256
  514.          ;ld l,(hl) ;TODO
  515.         bit 3,c
  516.         jr nz,readdest8op_xx1
  517.         bit 4,c
  518.         jr nz,readdest8op_x10
  519.         bit 5,c
  520.         jp nz,readdest8op_100
  521. ;000 Register ;TODO pc
  522.          ld a,c
  523.         ld c,(hl)
  524.         ret
  525. readdest8op_x10
  526.         bit 5,c
  527.         jp nz,readdest8op_110
  528.         jp readdest8op_010
  529. readdest8op_xx1
  530.         bit 4,c
  531.         jr nz,readdest8op_x11
  532.         bit 5,c
  533.         jp nz,readdest8op_101
  534.         jp readdest8op_001
  535. readdest8op_x11
  536.         bit 5,c
  537.         jp nz,readdest8op_111
  538.         jp readdest8op_011
  539.  
  540. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  541. ;c=data, a=cmdLSB = %??fmtRRR
  542. putdest8_Loop
  543. ;15-12 Opcode
  544. ;11-9 Src
  545. ;8-6 Register
  546. ;5-3 Dest
  547. ;2-0 Register
  548.         ld h,a
  549.         rla
  550.         and 0x0e
  551.         ld l,a ;0000rrr0
  552.         ld a,h
  553.         ld h,_R0/256
  554.          ;ld l,(hl) ;TODO
  555.         rla
  556.         rla
  557.         rla
  558.         jp c,putdestop8_1xx
  559.         add a,a
  560.         jr c,putdestop8_01x
  561.         jp m,putdestop8_001
  562. ;000 Register
  563.         ld a,l
  564.         cp 0x0e
  565.         jp z,bctoPCLoop
  566.         ld (hl),c
  567.        if 0 ;не надо расширять знак (Alexander Tishin), кроме movb (см. там отдельно)
  568.        inc l
  569.        ld a,c
  570.        rla
  571.        sbc a,a
  572.        ld (hl),a
  573.        endif
  574.         _LoopC
  575.  
  576. putdestop8_001 ;(Rn): Rn contains the address of the operand
  577.         ld a,(hl)
  578.         inc l
  579.         ld h,(hl)
  580.         ld l,a
  581.         WRMEM8_hl_LoopC
  582. putdestop8_01x
  583.         jp m,putdestop8_011
  584. ;putdestop_010 ;(Rn)+
  585. ;при адресациях (reg)+ и -(reg), есть особый случай: если регистр -- это r6 или r7, то регистр всегда изменяется на 2, даже если команда байтовая
  586.         ld a,l
  587.         cp 0x0c
  588.         ld a,(hl)
  589.         ;jr nc,putdestop_010_sppc
  590.        jr c,$+2+2+1
  591.        jr nz,putdestop8_010_pc
  592.        inc (hl) ;sp/pc +=2 ;TODO нечётный?
  593.         inc (hl)
  594.         inc hl
  595.         jr nz,$+2+3+2
  596.          inc (hl)
  597.          ld h,(hl)
  598.          dec h
  599.          jr $+3
  600.        ld h,(hl)
  601.         ld l,a
  602.         WRMEM8_hl_LoopC
  603. putdestop8_010_pc ;TODO так ли при dest=(pc+)?
  604.         ld a,c
  605.         ld (de),a
  606.         next
  607.         ;ld a,b
  608.         ;ld (de),a
  609.         next
  610.        _LoopC
  611.  
  612. putdestop8_011 ;@(Rn)+
  613.         ld a,l
  614.         cp 0x0e
  615.         jr z,putdestop8_011_pc
  616.        push de
  617.         ld e,(hl)
  618.         inc l
  619.         ld d,(hl)
  620.         inc de
  621.         inc de
  622.         ld (hl),d
  623.         dec l
  624.         ld (hl),e
  625.         dec de
  626.         dec de
  627.         ex de,hl
  628.        pop de
  629. putdestop8_memfrommem      
  630.         ld a,h
  631.         and 0xc0
  632.         ld c,a
  633.        ld lx,a
  634.         ld b,tpgs/256
  635.         set 7,h
  636.         set 6,h
  637.         ld a,(bc)
  638.         SETPGC000
  639.         ld b,(hl)
  640.         inc l
  641.         call z,inchnextpg
  642.         ld h,(hl)
  643.         ld l,b
  644.         WRMEM8_hl_LoopC
  645. putdestop8_011_pc
  646.         get
  647.         next
  648.         ld l,a
  649.         get
  650.         next
  651.         ld h,a
  652.         WRMEM8_hl_LoopC
  653.  
  654. putdestop8_1xx
  655.         add a,a
  656.         jp c,putdestop8_11x
  657.         jp m,putdestop8_101
  658. ;putdestop8_100
  659. ;100 -(Rn)
  660. ;при адресациях (reg)+ и -(reg), есть особый случай: если регистр -- это r6 или r7, то регистр всегда изменяется на 2, даже если команда байтовая
  661.         ld a,l
  662.         cp 0x0c
  663.        push de
  664.         ld e,(hl)
  665.         inc l
  666.         ld d,(hl)
  667.         dec de
  668.        jr c,$+2+2+1
  669.        jr nz,putdestop8_100_pc
  670.        dec de ;sp/pc +=2
  671.         ld (hl),d
  672.         dec l
  673.         ld (hl),e
  674.         ex de,hl
  675.        pop de
  676.      ;inc hl
  677.        ;jr $
  678.         WRMEM8_hl_LoopC
  679. putdestop8_100_pc ;TODO так ли при -(pc)?
  680.        pop af ;skip
  681.         decodePC
  682.         dec de
  683.         dec de
  684.         encodePC
  685.         ld a,c
  686.         ld (de),a
  687.        _LoopC
  688.        
  689. putdestop8_101
  690. ;101 @-(Rn) ;всегда -=2
  691.         ;ld a,l
  692.         ;cp 0x0e
  693.         ;jr z,readdestop_101_pc ;TODO pc
  694.         ld c,(hl)
  695.         inc l
  696.         ld b,(hl)
  697.         dec bc
  698.         dec bc
  699.         ld (hl),b
  700.         dec l
  701.         ld (hl),c
  702.         ld h,b
  703.         ld l,c
  704.         jp putdestop8_memfrommem
  705. putdestop8_11x
  706.         jp m,putdestop8_111
  707. ;putdestop8_110
  708. ;110 Index: X(Rn): Rn+X is the address of the operand
  709.         get
  710.         next
  711.         add a,(hl)
  712.        push af
  713.         inc l
  714.         get
  715.         next
  716.         adc a,(hl)
  717.         ld h,a
  718.        pop af
  719.         ld l,a ;hl=Rn+X
  720.         WRMEM8_hl_LoopC
  721. putdestop8_111
  722. ;111 Index deferred: @X(Rn): Rn+X is the address of the address of the operand
  723.         get
  724.         next
  725.         add a,(hl)
  726.        push af
  727.         inc l
  728.         get
  729.         next
  730.         adc a,(hl)
  731.         ld h,a
  732.        pop af
  733.         ld l,a ;hl=Rn+X
  734.         jp putdestop8_memfrommem
  735.  
  736. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  737.  
  738. ;a=cmdLSB = %??fmtRRR
  739. getdest_aisc
  740. ;out: bc=dest, a=cmdLSB
  741. ;15-12 Opcode
  742. ;11-9 Src
  743. ;8-6 Register
  744. ;5-3 Dest
  745. ;2-0 Register
  746.         rla
  747.         and 0x0e
  748.         ld l,a ;0000rrr0
  749.         ld h,_R0/256
  750.          ;ld l,(hl) ;TODO
  751.         bit 3,c
  752.         jr nz,readdestop_xx1
  753.         bit 4,c
  754.         jr nz,readdestop_x10
  755.         bit 5,c
  756.         jp nz,readdestop_100
  757. ;000 Register ;TODO pc
  758.          ld a,c
  759.         ld c,(hl)
  760.         inc l
  761.         ld b,(hl)
  762.         ret
  763. readdestop_x10
  764.         bit 5,c
  765.         jp nz,readdestop_110
  766.         jp readdestop_010
  767. readdestop_xx1
  768.         bit 4,c
  769.         jr nz,readdestop_x11
  770.         bit 5,c
  771.         jp nz,readdestop_101
  772.         jp readdestop_001
  773. readdestop_x11
  774.         bit 5,c
  775.         jp nz,readdestop_111
  776.         jp readdestop_011
  777.  
  778. readdest8op_011 ;@(Rn)+ ;всегда +=2 ;TODO optimize
  779.         ld a,l
  780. readdestop_011 ;@(Rn)+ ;всегда +=2
  781.        ld hx,c
  782.         cp 0x0e
  783.         jr z,readdestop_011_pc
  784.         ld c,(hl)
  785.         inc l
  786.         ld a,(hl)
  787.         jp readsourceop_addrfromaddr_ac
  788. readdestop_011_pc
  789. ;инкремент не делаем, чтобы его делал putdest
  790.         get
  791.         inc e ;next без переключения страниц!!! FIXME
  792.         ld c,a
  793.         get
  794.         dec e ;FIXME
  795.         RDMEM_ac_ret ;bc=result, a=hx
  796.  
  797. readdest8op_100
  798. ;100 -(Rn)
  799. ;при адресациях (reg)+ и -(reg), есть особый случай: если регистр -- это r6 или r7, то регистр всегда изменяется на 2, даже если команда байтовая
  800.         ld a,l
  801.         cp 0x0c
  802.        ld hx,c
  803.         ld c,(hl)
  804.         inc l
  805.         ld b,(hl)
  806.         dec bc
  807.        jr c,$+3 ;+2
  808.         ;jr nz,readdest8op_100_pc ;TODO pc
  809.        dec bc ;sp/pc +=2
  810.         ld a,b
  811.         RDMEM_ac_ret ;bc=result, a=hx ;TODO optimize
  812.  
  813. readdestop_100
  814. ;100 -(Rn)
  815. ;при адресациях (reg)+ и -(reg), есть особый случай: если регистр -- это r6 или r7, то регистр всегда изменяется на 2, даже если команда байтовая
  816.         ;cp 0x0e
  817.         ;jr z,readdestop_100_pc ;TODO pc
  818.        ld hx,c
  819.         ld c,(hl)
  820.         inc l
  821.         ld b,(hl)
  822.         dec bc
  823.         dec bc
  824.         ld a,b
  825.         RDMEM_ac_ret ;bc=result, a=hx
  826.  
  827. readdest8op_101
  828.         ;ld a,l
  829. readdestop_101
  830. ;101 @-(Rn) ;всегда -=2
  831.         ;cp 0x0e
  832.         ;jr z,readdestop_101_pc ;TODO pc
  833.        ld hx,c
  834.         ld c,(hl)
  835.         inc l
  836.         ld b,(hl)
  837.         dec bc
  838.         dec bc
  839.         ld a,b
  840.         jp readsourceop_addrfromaddr_ac
  841.  
  842. readdest8op_110 ;TODO optimize
  843.         ld a,l
  844. readdestop_110
  845. ;X(Rn)
  846.        ld hx,c
  847.        cp 0x0e
  848.        jr z,readdestop_110_pc
  849.         get
  850.         inc e
  851.         add a,(hl)
  852.         ld c,a
  853.         inc l
  854.         get
  855.         dec e ;FIXME
  856.         adc a,(hl) ;ac=Rn+X
  857.         RDMEM_ac_ret ;bc=result, a=hx
  858. readdestop_110_pc ;for mona
  859.         get
  860.         inc e
  861.         ld c,a
  862.         inc l
  863.         get
  864.         dec e ;FIXME
  865.         ld b,a
  866.        decodePC_to_ae
  867.         ld h,a
  868.        ld a,c
  869.        add a,e
  870.        ld c,a
  871.        ld a,b
  872.        adc a,h ;ac=pc+X
  873.         RDMEM_ac_ret ;bc=result, a=hx
  874.  
  875. readdestop_111
  876. readdest8op_111 ;TODO optimize
  877. ;111 Index deferred: @X(Rn): Rn+X is the address of the address of the operand
  878.        ld hx,c
  879.         get
  880.         inc e
  881.         add a,(hl)
  882.         ld c,a
  883.         inc l
  884.         get
  885.         dec e ;FIXME
  886.         adc a,(hl) ;ac=Rn+X
  887.         jp readsourceop_addrfromaddr_ac
  888.  
  889. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  890.  
  891. ;bc=data, a=cmdLSB = %??fmtRRR
  892. putdest_Loop
  893. ;15-12 Opcode
  894. ;11-9 Src
  895. ;8-6 Register
  896. ;5-3 Dest
  897. ;2-0 Register
  898.         ld h,a
  899.         rla
  900.         and 0x0e
  901.         ld l,a ;0000rrr0
  902.         ld a,h
  903.         ld h,_R0/256
  904.          ;ld l,(hl) ;TODO
  905.         rla
  906.         rla
  907.         rla
  908.         jp c,putdestop_1xx
  909.         add a,a
  910.         jr c,putdestop_01x
  911.         jp m,putdestop_001
  912. ;000 Register
  913.         ld a,l
  914.         cp 0x0e
  915.         jp z,bctoPCLoop
  916.         ld (hl),c
  917.         inc l
  918.         ld (hl),b
  919.         _LoopC
  920. putdestop_001 ;(Rn): Rn contains the address of the operand
  921.         ld a,(hl)
  922.         inc l
  923.         ld h,(hl)
  924.         ld l,a
  925.         WRMEM_hl_LoopC
  926. putdestop_01x
  927.         jp m,putdestop_011
  928. ;putdestop_010 ;(Rn)+
  929. ;при адресациях (reg)+ и -(reg), есть особый случай: если регистр -- это r6 или r7, то регистр всегда изменяется на 2, даже если команда байтовая
  930. ;а тут небайтовая, значит, всегда +=2
  931.         ld a,l
  932.         cp 0x0e
  933.        jr z,putdestop_010_pc
  934.        push de
  935.         ld e,(hl)
  936.         inc l
  937.         ld d,(hl)
  938.         inc de
  939.         inc de
  940.         ld (hl),d
  941.         dec l
  942.         ld (hl),e
  943.         dec de
  944.         dec de
  945.         ex de,hl
  946.        pop de
  947.         WRMEM_hl_LoopC
  948.  
  949. putdestop_010_pc
  950. ;TODO так ли при dest=(pc+)? mona: mov r4,#0
  951.         ld a,c
  952.         ld (de),a
  953.         next
  954.         ld a,b
  955.         ld (de),a
  956.         next
  957.        _LoopC
  958.  
  959. putdestop_011 ;@(Rn)+
  960.         ld a,l
  961.         cp 0x0e
  962.         jr z,putdestop_011_pc
  963.        push de
  964.         ld e,(hl)
  965.         inc l
  966.         ld d,(hl)
  967.         inc de
  968.         inc de
  969.         ld (hl),d
  970.         dec l
  971.         ld (hl),e
  972.         dec de
  973.         dec de
  974.         ex de,hl
  975.        pop de
  976. putdestop_memfrommem
  977.         ld a,h
  978.         and 0xc0
  979.         ld c,a
  980.        ld lx,a
  981.         ld b,tpgs/256
  982.         set 7,h
  983.         set 6,h
  984.         ld a,(bc)
  985.         SETPGC000
  986.         ld a,(hl)
  987.        push af
  988.         inc l
  989.         call z,inchnextpg
  990.         ld h,(hl)
  991.        pop af
  992.         ld l,a
  993.         WRMEM_hl_LoopC
  994. putdestop_011_pc
  995.         get
  996.         next
  997.         ld l,a
  998.         get
  999.         next
  1000.         ld h,a
  1001.         WRMEM_hl_LoopC
  1002.  
  1003. putdestop_1xx
  1004.         add a,a
  1005.         jp c,putdestop_11x
  1006.         jp m,putdestop_101
  1007. ;putdestop_100
  1008. ;100 -(Rn)
  1009. ;при адресациях (reg)+ и -(reg), есть особый случай: если регистр -- это r6 или r7, то регистр всегда изменяется на 2, даже если команда байтовая
  1010.         cp 0x0e
  1011.         jr z,putdestop_100_pc
  1012.        push de
  1013.         ld e,(hl)
  1014.         inc l
  1015.         ld d,(hl)
  1016.         dec de
  1017.         dec de
  1018.         ld (hl),d
  1019.         dec l
  1020.         ld (hl),e
  1021.         ex de,hl
  1022.        pop de
  1023.         WRMEM_hl_LoopC
  1024. putdestop_100_pc ;TODO так ли при -(pc)?
  1025.         decodePC
  1026.         dec de
  1027.         dec de
  1028.         encodePC
  1029.         ld a,c
  1030.         ld (de),a
  1031.         inc e
  1032.         ld a,b
  1033.         ld (de),a
  1034.         dec e
  1035.        _LoopC
  1036.  
  1037. putdestop_101
  1038. ;101 @-(Rn) ;всегда -=2
  1039.         ;cp 0x0e
  1040.         ;jr z,readdestop_101_pc ;TODO pc
  1041.         ld c,(hl)
  1042.         inc l
  1043.         ld b,(hl)
  1044.         dec bc
  1045.         dec bc
  1046.         ld (hl),b
  1047.         dec l
  1048.         ld (hl),c
  1049.         ld h,b
  1050.         ld l,c
  1051.         jp putdestop_memfrommem
  1052. putdestop_11x
  1053.         jp m,putdestop_111
  1054. ;putdestop_110
  1055. ;110 Index: X(Rn): Rn+X is the address of the operand
  1056.        cp 0x0e
  1057.        jr z,putdestop_110_pc
  1058.         get
  1059.         next
  1060.         add a,(hl)
  1061.        push af
  1062.         inc l
  1063.         get
  1064.         next
  1065.         adc a,(hl)
  1066.         ld h,a
  1067.        pop af
  1068.         ld l,a ;hl=Rn+X
  1069.         WRMEM_hl_LoopC
  1070.        
  1071. putdestop_110_pc ;for mona
  1072.         get
  1073.         inc e
  1074.         ld c,a
  1075.         inc l
  1076.         get
  1077.         dec e ;FIXME
  1078.         ld b,a
  1079.        decodePC_to_ae
  1080.         ld h,a
  1081.         ld l,e
  1082.         add hl,bc ;hl=pc+X
  1083.         WRMEM_hl_LoopC
  1084.  
  1085. putdestop_111
  1086. ;111 Index deferred: @X(Rn): Rn+X is the address of the address of the operand
  1087.         get
  1088.         next
  1089.         add a,(hl)
  1090.        push af
  1091.         inc l
  1092.         get
  1093.         next
  1094.         adc a,(hl)
  1095.         ld h,a
  1096.        pop af
  1097.         ld l,a ;hl=Rn+X
  1098.         jp putdestop_memfrommem
  1099.  
  1100. ;15c2
  1101. ;0001 0101 1100 0010
  1102. ;0 001 010 111 000 010
  1103. ;mov  ;src;(pc)+;dst ;r2
  1104.  
  1105. ;65c0
  1106. ;0110 0101 1100 0000
  1107. ;0 110 010 111 000 000
  1108. ;add ;src;(pc)+;dst ;r0
  1109.  
  1110. ;02fc
  1111. ;0000 0010 1111 1100
  1112. ;0 000 001 011 111 100
  1113.      ;bne
  1114.      
  1115. ;1c71 ;mov barofs(r1), nhbar(r1)
  1116. ;0001 1100 0111 0001
  1117. ;0 001 110 001 110 001
  1118.       ;src;X(r1);dst;X(r1)
  1119.  
  1120. ;7951
  1121. ;0111 1001 0101 0001
  1122. ;0 111 100 101 010 001
  1123.      ;XOR ;r5;dst;(r1)+
  1124.  
  1125. ;7e85 ;sob
  1126. ;0111 1110 1000 0101
  1127. ;0 111 111 010 000 101
  1128.  
  1129. ;[025c]:2017 ;cmp r0,#...
  1130. ;0010 0000 0001 0111
  1131. ;0 010 000 000 010 111
  1132.       ;src;r0 ;dst;(pc)+
  1133.  
  1134. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1135.  
  1136. ;a=cmdLSB = %??fmtRRR
  1137. getdest_aisc_autoinc ;TODO всегда +=2
  1138. ;out: bc=dest, a=cmdLSB
  1139.        rra
  1140.        rra
  1141.        ld b,a      
  1142.         ld a,c
  1143.         rla
  1144.         jp readsourceop_go
  1145.  
  1146. getdest8_aisc_autoinc
  1147. ;out: c=dest, a=cmdLSB
  1148.        rra
  1149.        rra
  1150.        ld b,a      
  1151.         ld a,c
  1152.         rla
  1153.         jp readsource8op_go
  1154.  
  1155. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1156.  
  1157. readsourceop
  1158. ;ac=cmd
  1159. ;out: bc=sourceop, a=cmdLSB
  1160. ;15-12 Opcode
  1161. ;11-9 Src
  1162. ;8-6 Register
  1163. ;5-3 Dest
  1164. ;2-0 Register
  1165.         ld b,a
  1166.         rra
  1167.         ld a,c
  1168.         rra ;rrr?????
  1169.          rra
  1170.          rra
  1171.          rra
  1172.          rra
  1173. readsourceop_go
  1174.          and 0x0e
  1175.         ld l,a ;0000rrr0
  1176.         ld h,_R0/256
  1177.          ;ld l,(hl) ;TODO
  1178.  
  1179. ;0n     Register        Rn      The operand is in Rn
  1180. ;1n     Register deferred       (Rn)    Rn contains the address of the operand
  1181. ;2n     Autoincrement   (Rn)+   Rn contains the address of the operand, then increment Rn
  1182. ;3n     Autoincrement deferred  @(Rn)+  Rn contains the address of the address of the operand, then increment Rn by 2
  1183. ;4n     Autodecrement   −(Rn) Decrement Rn, then use the result as the address of the operand
  1184. ;5n     Autodecrement deferred  @−(Rn)        Decrement Rn by 2, then use the result as the address of the address of the operand
  1185. ;6n     Index   X(Rn)   Rn+X is the address of the operand
  1186. ;7n     Index deferred  @X(Rn)  Rn+X is the address of the address of the operand
  1187.         bit 1,b
  1188.         jr nz,readsourceop_xx1
  1189.         bit 2,b
  1190.         jr nz,readsourceop_x10
  1191.         bit 3,b
  1192.         jp nz,readsourceop_100
  1193. ;000 Register
  1194.        cp 0x0e
  1195.        jr z,readsourceop_000_pc
  1196.          ld a,c
  1197.         ld c,(hl)
  1198.         inc l
  1199.         ld b,(hl)
  1200.         ret
  1201. readsourceop_000_pc
  1202.         decodePC_to_ae
  1203.         ld b,a
  1204.          ld a,c
  1205.         ld c,e
  1206.         ret
  1207.  
  1208. readsourceop_xx1
  1209.         bit 2,b
  1210.         jp nz,readsourceop_x11
  1211.         bit 3,b
  1212.         jp nz,readsourceop_101
  1213. ;001: (Rn)
  1214. readdestop_001 ;(Rn): Rn contains the address of the operand
  1215. readdestop_010 ;(Rn)+ ;инкремент не делаем, чтобы его делал putdest
  1216.        ld hx,c
  1217.        cp 0x0e
  1218.        jr z,readsourceop_001_pc
  1219.         ld c,(hl)
  1220.         inc l
  1221.         ld a,(hl)
  1222.         RDMEM_ac_ret ;bc=result
  1223. readsourceop_001_pc
  1224.         get
  1225.         ld c,a
  1226.         inc e
  1227.         get
  1228.         ld b,a
  1229.         dec e ;TODO нечётные
  1230.        ld a,hx
  1231.         ret
  1232.  
  1233. readsourceop_x10
  1234.         bit 3,b
  1235.         jp nz,readsourceop_110
  1236. ;(Rn)+
  1237. ;при адресациях (reg)+ и -(reg), есть особый случай: если регистр -- это r6 или r7, то регистр всегда изменяется на 2, даже если команда байтовая
  1238.        ld hx,c
  1239.         cp 0x0e
  1240.        jr z,readsourceop_010_pc
  1241.         ld c,(hl)
  1242.         inc (hl) ;sp/pc +=2 ;TODO нечётный?
  1243.         inc (hl)
  1244.         inc hl
  1245.         ld a,(hl)
  1246.         jr nz,$+3
  1247.         inc (hl)
  1248.         RDMEM_ac_ret ;bc=result, a=hx
  1249. readsourceop_010_pc
  1250.         get
  1251.         next
  1252.         ld c,a
  1253.         get
  1254.         next
  1255.         ld b,a
  1256.        ld a,hx
  1257.         ret
  1258.  
  1259. readsourceop_x11
  1260.         bit 3,b
  1261.         jp nz,readsourceop_111
  1262. readsourceop_011 ;@(Rn)+ ;всегда +=2
  1263.        ld hx,c
  1264.         cp 0x0e
  1265.         jr z,readsourceop_011_pc
  1266.         ld c,(hl)
  1267.         inc l
  1268.         ld b,(hl)
  1269.         inc bc
  1270.         inc bc
  1271.         ld (hl),b
  1272.         dec l
  1273.         ld (hl),c
  1274.         dec bc
  1275.         dec bc
  1276.         ld a,b
  1277. readsourceop_addrfromaddr_ac
  1278.         ld l,c
  1279.         ld h,a
  1280.         and 0xc0
  1281.         ld c,a
  1282.        ld lx,a
  1283.         ld b,tpgs/256
  1284.         set 7,h
  1285.         set 6,h
  1286.         ld a,(bc)
  1287.         SETPGC000
  1288.         ld c,(hl)
  1289.         inc l
  1290.         call z,inchnextpg
  1291.         ld a,(hl)
  1292.         RDMEM_ac_ret ;bc=result, a=hx
  1293.  
  1294. readsourceop_011_pc
  1295.         get
  1296.         next
  1297.         ld c,a
  1298.         get
  1299.         next
  1300.         RDMEM_ac_ret ;bc=result, a=hx
  1301.  
  1302. readsourceop_100
  1303. ;100 -(Rn)
  1304. ;при адресациях (reg)+ и -(reg), есть особый случай: если регистр -- это r6 или r7, то регистр всегда изменяется на 2, даже если команда байтовая
  1305.         cp 0x0e ;TODO pc
  1306.        ld hx,c
  1307.         ld c,(hl)
  1308.         inc l
  1309.         ld b,(hl)
  1310.         dec bc
  1311.         dec bc
  1312.         ld (hl),b
  1313.         dec l
  1314.         ld (hl),c
  1315.         ld a,b
  1316.         RDMEM_ac_ret ;bc=result, a=hx
  1317.  
  1318. readsourceop_101
  1319. ;101 @-(Rn) ;всегда -=2
  1320.         ;cp 0x0e
  1321.         ;jr z,readsourceop_101_pc ;TODO pc
  1322.        ld hx,c
  1323.         ld c,(hl)
  1324.         inc l
  1325.         ld b,(hl)
  1326.         dec bc
  1327.         dec bc
  1328.         ld (hl),b
  1329.         dec l
  1330.         ld (hl),c
  1331.         ld a,b
  1332.         jp readsourceop_addrfromaddr_ac
  1333.  
  1334. readsourceop_110
  1335. ;110 Index: X(Rn): Rn+X is the address of the operand
  1336.        ld hx,c
  1337.         cp 0x0e
  1338.         jr z,readsourceop_110_pc
  1339.         get
  1340.         next
  1341.         add a,(hl)
  1342.         ld c,a
  1343.         inc l
  1344.         get
  1345.         next
  1346.         adc a,(hl) ;ac=Rn+X
  1347.         RDMEM_ac_ret ;bc=result, a=hx
  1348. readsourceop_110_pc
  1349.         get
  1350.         next
  1351.         ld c,a
  1352.         get
  1353.         next
  1354.         ld b,a
  1355.         decodePC_to_ae
  1356.          ld h,a
  1357.         ld a,c
  1358.         add a,e
  1359.         ld c,a
  1360.         ld a,b
  1361.         adc a,h;d
  1362.         ld b,a
  1363.        ld a,hx
  1364.         ret
  1365.  
  1366. readsourceop_111
  1367. ;111 Index deferred: @X(Rn): Rn+X is the address of the address of the operand
  1368.        ld hx,c
  1369.         get
  1370.         next
  1371.         add a,(hl)
  1372.         ld c,a
  1373.         inc l
  1374.         get
  1375.         next
  1376.         adc a,(hl) ;ac=Rn+X
  1377.         jp readsourceop_addrfromaddr_ac
  1378.  
  1379. ;;;;;;;;;;;;;;;;;;;;;;;
  1380. readsource8op
  1381. ;ac=cmd
  1382. ;out: c=sourceop, a=cmdLSB
  1383. ;15-12 Opcode
  1384. ;11-9 Src
  1385. ;8-6 Register
  1386. ;5-3 Dest
  1387. ;2-0 Register
  1388.         ld b,a
  1389.         rra
  1390.         ld a,c
  1391.         rra ;rrr?????
  1392.          rra
  1393.          rra
  1394.          rra
  1395.          rra
  1396. readsource8op_go
  1397.          and 0x0e
  1398.         ld l,a ;0000rrr0
  1399.         ld h,_R0/256
  1400.          ;ld l,(hl) ;TODO
  1401.  
  1402. ;0n     Register        Rn      The operand is in Rn
  1403. ;1n     Register deferred       (Rn)    Rn contains the address of the operand
  1404. ;2n     Autoincrement   (Rn)+   Rn contains the address of the operand, then increment Rn
  1405. ;3n     Autoincrement deferred  @(Rn)+  Rn contains the address of the address of the operand, then increment Rn by 2
  1406. ;4n     Autodecrement   −(Rn) Decrement Rn, then use the result as the address of the operand
  1407. ;5n     Autodecrement deferred  @−(Rn)        Decrement Rn by 2, then use the result as the address of the address of the operand
  1408. ;6n     Index   X(Rn)   Rn+X is the address of the operand
  1409. ;7n     Index deferred  @X(Rn)  Rn+X is the address of the address of the operand
  1410.         bit 1,b
  1411.         jr nz,readsource8op_xx1
  1412.         bit 2,b
  1413.         jr nz,readsource8op_x10
  1414.         bit 3,b
  1415.         jp nz,readsource8op_100
  1416. ;000 Register
  1417.          ld a,c
  1418.         ld c,(hl)
  1419.         ;inc l
  1420.         ;ld b,(hl)
  1421.         ret
  1422.  
  1423. readsource8op_xx1
  1424.         bit 2,b
  1425.         jp nz,readsource8op_x11
  1426.         bit 3,b
  1427.         jp nz,readsource8op_101
  1428. ;001: (Rn)
  1429. readdest8op_001 ;(Rn): Rn contains the address of the operand ;TODO optimize
  1430. readdest8op_010 ;(Rn)+ ;инкремент не делаем, чтобы его делал putdest ;TODO optimize
  1431.        ld hx,c
  1432.        cp 0x0e
  1433.        ;jr z,readsource8op_001_pc
  1434.        jp z,readsourceop_001_pc
  1435.         ld c,(hl)
  1436.         inc l
  1437.         ld a,(hl)
  1438.         RDMEM_ac_ret ;bc=result
  1439.  
  1440. readsource8op_x10
  1441.         bit 3,b
  1442.         jp nz,readsource8op_110
  1443. ;(Rn)+
  1444. ;при адресациях (reg)+ и -(reg), есть особый случай: если регистр -- это r6 или r7, то регистр всегда изменяется на 2, даже если команда байтовая
  1445.        ld hx,c
  1446.         cp 0x0e
  1447.        ;jr z,readsource8op_010_pc
  1448.        jp z,readsourceop_010_pc
  1449.         ld c,(hl)
  1450.       cp 0x0c
  1451.       jr c,$+3 ;для textshow
  1452.          inc (hl) ;sp/pc +=2 ;TODO нечётный?
  1453.         inc (hl)
  1454.         inc hl
  1455.         ld a,(hl)
  1456.         jr nz,$+3
  1457.         inc (hl)
  1458.         RDMEM_ac_ret ;bc=result, a=hx
  1459.  
  1460. readsource8op_x11
  1461.         bit 3,b
  1462.         jp nz,readsourceop_111
  1463. readsource8op_011 ;@(Rn)+ ;всегда +=2
  1464.        ld hx,c
  1465.         cp 0x0e
  1466.         ;jr z,readsource8op_011_pc
  1467.         jp z,readsourceop_011_pc
  1468.         ld c,(hl)
  1469.         inc l
  1470.         ld b,(hl)
  1471.        push bc
  1472.       cp 0x0c
  1473.       jr c,$+3 ;не проверяется в textshow!
  1474.          inc bc
  1475.         inc bc
  1476.         ld (hl),b
  1477.         dec l
  1478.         ld (hl),c
  1479.        pop bc
  1480.         ld a,b
  1481. readsource8op_addrfromaddr_ac
  1482.         ld l,c
  1483.         ld h,a
  1484.         and 0xc0
  1485.         ld c,a
  1486.        ld lx,a
  1487.         ld b,tpgs/256
  1488.         set 7,h
  1489.         set 6,h
  1490.         ld a,(bc)
  1491.         SETPGC000
  1492.         ld c,(hl)
  1493.         inc l
  1494.         call z,inchnextpg
  1495.         ld a,(hl)
  1496.         RDMEM_ac_ret ;bc=result, a=hx ;TODO optimize
  1497.  
  1498. readsource8op_100
  1499. ;100 -(Rn)
  1500. ;при адресациях (reg)+ и -(reg), есть особый случай: если регистр -- это r6 или r7, то регистр всегда изменяется на 2, даже если команда байтовая
  1501.         cp 0x0c
  1502.        ld hx,c
  1503.         ld c,(hl)
  1504.         inc l
  1505.         ld b,(hl)
  1506.         dec bc
  1507.        jr c,$+3
  1508.        dec bc ;sp/pc +=2 ;TODO pc
  1509.         ld (hl),b
  1510.         dec l
  1511.         ld (hl),c
  1512.         ld a,b
  1513.         RDMEM_ac_ret ;bc=result, a=hx
  1514.  
  1515. readsource8op_101
  1516. ;101 @-(Rn) ;всегда -=2
  1517.         ;cp 0x0e
  1518.         ;jr z,readsourceop_101_pc ;TODO pc
  1519.        ld hx,c
  1520.         ld c,(hl)
  1521.         inc l
  1522.         ld b,(hl)
  1523.       ;cp 0x0c
  1524.       ;jr c,$+3 ;костыль для textshow
  1525.          dec bc
  1526.         dec bc
  1527.         ld (hl),b
  1528.         dec l
  1529.         ld (hl),c
  1530.         ld a,b
  1531.         jp readsourceop_addrfromaddr_ac
  1532.  
  1533. readsource8op_110=readsourceop_110 ;TODO optimize
  1534. ;110 Index: X(Rn): Rn+X is the address of the operand
  1535.  
  1536. readsource8op_111=readsourceop_111 ;TODO optimize
  1537. ;111 Index deferred: @X(Rn): Rn+X is the address of the address of the operand
  1538.  
  1539. ;;;;;;;;;;;;;;;;;;;;;;;;
  1540. rdport_c
  1541.         ld a,c
  1542. ;FFB0=177660 регистр состояния клавиатуры (Разряд 6 - маска прерываний от клавиатуры. разряд доступен по записи и чтению. “0” - разрешено прерывание от клавиатуры; “1” - запрещено прерывание от клавиатуры. Разряд 7 - флаг состояния клавиатуры. Устанавливается в единицу при поступлении в регистр данных клавиатуры нового кода. Сбрасывается в “0” при чтении регистра данных клавиатуры.)
  1543. ;FFB2=177662 Регистр данных клавиатуры
  1544.         ld a,l
  1545.         cp 0xb0
  1546.         jr z,2f ;kbd state
  1547.         cp 0xb2
  1548.         jr nz,9f ;no ports
  1549. ;kbd data
  1550. bk_curkey=$+1
  1551.         ld bc,0
  1552.         ld a,55+128 ;"or a"
  1553.         ld (iskeymessage),a ;no message (INT прочитает новую кнопку)
  1554.         ret
  1555. 2 ;kbd state
  1556.         ld a,(iskeymessage) ;a7=no message
  1557.         rra
  1558.         and 0x40
  1559.         ld c,a
  1560.         ld b,0
  1561.         ret
  1562. 9
  1563. ;TODO прерывание ошибки шины
  1564.         ret
  1565.  
  1566.         include "bkcmd.asm"
  1567.  
  1568.         align 256
  1569. tpgs
  1570.         ds 256 ;%10765432
  1571.  
  1572.         align 256
  1573. tmirror
  1574.        dup 256
  1575. _7=$&0x80
  1576. _6=$&0x40
  1577. _5=$&0x20
  1578. _4=$&0x10
  1579. _3=$&0x08
  1580. _2=$&0x04
  1581. _1=$&0x02
  1582. _0=$&0x01
  1583.         db (_7>>7)+(_6>>5)+(_5>>3)+(_4>>1)+(_3<<1)+(_2<<3)+(_1<<5)+(_0<<7)
  1584.        edup
  1585.  
  1586.         align 256
  1587. ty
  1588. _=0
  1589.         dup 32
  1590.         db 0xff&(_*40+4)
  1591.         dup 7
  1592.         db 0xff&(_*40+4)
  1593. _=_+1
  1594.        if _>200
  1595. _=200
  1596.        endif
  1597.         edup
  1598.         edup
  1599. _=0
  1600.         dup 32
  1601.         db (_*40+4)/256+0x80
  1602.         dup 7
  1603.         db (_*40+4)/256+0x80
  1604. _=_+1        
  1605.        if _>200
  1606. _=200
  1607.        endif
  1608.         edup
  1609.         edup
  1610.  
  1611.  
  1612.         align 256
  1613. ;8 r16s
  1614. _R0
  1615.         dw 0
  1616. _R1
  1617.         dw 0
  1618. _R2
  1619.         dw 0
  1620. _R3
  1621.         dw 0
  1622. _R4
  1623.         dw 0
  1624. _R5
  1625.         dw 0
  1626. _R6
  1627. _SP
  1628.         dw 0
  1629. _R7
  1630.         dw 0
  1631.  
  1632. ansipal ;можно убрать в ints
  1633. ;DDp palette: %grbG11RB(low),%grbG11RB(high), inverted
  1634.         ;dw 0xffff,0xfefe,0xfdfd,0xfcfc,0xefef,0xeeee,0xeded,0xecec
  1635.         ;dw 0xffff,0xdede,0xbdbd,0x9c9c,0x6f6f,0x4e4e,0x2d2d,0x0c0c
  1636. ;по сравнению с цветами терминала переставлено:
  1637. ;1-4
  1638. ;3-6
  1639.         dw 0xffff,0xfefe,0xefef,0xeeee,0xfdfd,0xfcfc,0xeded,0xecec
  1640.         dw 0x1f1f,0x1e1e,0x0f0f,0x0e0e,0x1d1d,0x1c1c,0x0d0d,0x0c0c
  1641.  
  1642. pc_high
  1643.         db 0
  1644. iff1
  1645.         db 0
  1646. pgprog
  1647.         db 0 ;там можно хранить дополнительный код (напр., отладчик)
  1648. oldimer
  1649.         jp on_int
  1650.         jp 0x0038+3
  1651.        
  1652.         align 256
  1653.         include "bktable.asm"
  1654.  
  1655.        if DEBUG
  1656.        align 256
  1657. oldpc
  1658.         ;dw 0
  1659.         ds 256
  1660.        endif
  1661.  
  1662. ;генерируется для textmode
  1663.         align 256
  1664. ttextaddr
  1665.         ds 128
  1666.  
  1667.         display "killable=",$
  1668. ;killable
  1669.  
  1670.         display "lowend=",$
  1671.         ds 0x3fc0-$
  1672.         ds 0x4000-$
  1673.         include "ints.asm"
  1674.         include "keyscan.asm"
  1675.         display "end=",$
  1676. end
  1677.  
  1678.         savebin "bk.com",begin,end-begin
  1679.  
  1680.         LABELSLIST "../../us/user.l"
  1681.