?login_element?

Subversion Repositories NedoOS

Rev

Rev 1406 | 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. BASIC=1;0
  8.  
  9.         include "bk.ini"
  10.  
  11. STACK=0x4000
  12.  
  13. ;PC=0x4000...
  14. ;data=0xC000...
  15.         include "macros.asm"
  16.  
  17.         org PROGSTART
  18. begin
  19.         jp init
  20. initq
  21. Reset
  22.        ld a,(pgprog)
  23.        SETPG4000
  24.        jp resetpp
  25.  
  26. quiter
  27.        ld a,(pgprog)
  28.        SETPG4000
  29.        jp farquiter
  30.  
  31.        if 0
  32. jpiyer
  33.         ld hl,jpiyer
  34.         push hl
  35.         jp (iy)
  36.        endif
  37.  
  38. EMUCHECKQ
  39.         ;call getflags_bc
  40.         ;call makeflags_frombc
  41.         ;call getflags_bc
  42.        if DEBUG
  43.       bit 0,e
  44.       jr nz,$
  45.       ld a,d
  46.       sub 0x40
  47.       cp 0x40
  48.       jr nc,$
  49.  
  50.       push de
  51.        decodePC
  52.       if 1;0
  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 bc,(_R1)
  64.         ld (hl),c
  65.         inc l
  66.         ld (hl),b
  67.         inc l
  68.         ld (oldpcaddr),hl
  69.        endif
  70.        ld a,d
  71.        ;sub 0x40+((STARTPC/256)&0x3f);0x7c
  72.        ;or e;cp 0x30
  73.        ;cp 1
  74.        ;jr z,$
  75.       ld hl,0x954;0x228;0x8252;0x0318;0x32c8;0x3222;0x3262;0x1f74;0x0258;0x3dc8
  76.       or a
  77.       sbc hl,de
  78.       pop de
  79.       ;jr z,$
  80.        endif
  81.         get
  82.         next
  83.         ld c,a
  84.         get
  85.         next
  86.         LD L,A
  87.         ld H,MAINCOMS/256
  88.         LD b,(HL)
  89.         INC H
  90.         LD H,(HL)
  91.         ld L,b ;ac=cmd
  92.         JP (HL)
  93.  
  94. ;иначе pop iy запорет iy от обработчика прерывания
  95. disable_iff0_keep_iy
  96.       ;di
  97.         ld (iykeeper_iy),iy
  98.         ld a,55 ;scf
  99.         ld (iykeeper_on),a ;keep hl,de!
  100.         ret
  101. ;иначе pop iy запорет iy от обработчика прерывания
  102. enable_iff0_remember_iy
  103. iykeeper_iy=$+2
  104.         ld iy,0
  105.         ld hl,iykeeper_on
  106.         ld (hl),55+128 ;or a ;keep a!
  107.       ;ei
  108.         ret
  109.  
  110. on_int
  111.         PUSH AF,HL
  112.         push bc,de
  113.         exx
  114.         push bc
  115.         push de
  116.         push hl
  117.         push ix
  118.         push iy
  119.         ex af,af' ;'
  120.         push af
  121.         call oldimer ;делает ei!!! двигать позже нельзя, он ставит палитру в верхнем бордере и потом не будет второй раз!
  122.  
  123.         ;ld hl,(timer)
  124.         ;inc hl
  125.         ;ld (timer),hl
  126.        ld a,0xf7
  127.        in a,(0xfe)
  128.        and 0b10101
  129.        jp z,quiter ;1+3+5 = quit
  130.  
  131.        ld a,(curpg4000) ;ok
  132.        push af
  133.        ld a,(pgprog)
  134.        SETPG4000
  135.  
  136.        ld a,0xf7
  137.        in a,(0xfe)
  138.        and 0b11000
  139. on_int_oldchgfxmodekey=$+1
  140.         cp 0
  141.         ld (on_int_oldchgfxmodekey),a
  142.         cp c
  143.         jr z,on_int_nochgfxmode
  144.        or a
  145.        call z,changegfxmode ;4+5 = change gfx mode
  146. on_int_nochgfxmode
  147.  
  148.         call KEYB
  149. ;iskeymessage=$
  150. ;        or a ;/scf
  151. ;        jr c,int_alreadyhavekey
  152.        ;ld a,(bk_curkey)
  153.        ;or a
  154.        ;jr nz,int_alreadyhavekey
  155.         call keyscan_getkey
  156.        jr z,int_alreadyhavekey ;no keys in buf
  157.         ld (bk_curkey),a
  158.         ;ld a,55 ;"scf"
  159.         ;ld (iskeymessage),a ;message
  160. int_alreadyhavekey
  161.        pop af
  162.        SETPG4000
  163.         ;OS_GETKEY
  164. ;        A - код символа(кнопки). Допустимые коды смотри в 'sysdefs.asm' секция 'Usable key codes'
  165. ;        C - код символа(кнопки) без учета текущего языкового модификатора. Как правило, используется для обработки "горячих кнопок"
  166. ;        DE - позиция мыши (y,x) (возвращает 0 при отсутствии фокуса)
  167. ;        L - кнопки мыши (bits 0(LMB),1(RMB),2(MMB): 0=pressed; bits 7..4=положение колёсика)
  168. ;        LX - Kempston joystick (0bP2JFUDLR): 1=pressed, - при отсутствии джойстика 0 (а не 0xff)
  169. ;        Флаг Z - если 0(NZ), то отсутствует фокус.
  170.         pop af
  171.         ex af,af' ;'
  172.         pop iy
  173.         pop ix
  174.         pop hl
  175.         pop de
  176.         pop bc
  177.         exx
  178.         pop de,bc
  179.        LD A,(iff1)
  180.        OR A
  181.        jr NZ,IMEREI
  182.         POP HL,AF
  183.         EI
  184.        RET
  185.  
  186. IMEREI
  187.         XOR A
  188.         LD (iff1),A
  189. ;перед эмуляцией INT завершаем тек.команду (перехват на EMULOOP)
  190.         LD (keepemuchecker),IY
  191.         LD IY,IMINT
  192.         POP HL,AF
  193.         RET  ;di!
  194.  
  195. IMINT
  196. keepemuchecker=$+2
  197.         LD IY,0
  198. iykeeper_on=$
  199.         or a ;scf=on
  200.         jr nc,IMINT_noiykeeperdata
  201.         ld iy,(iykeeper_iy)
  202. IMINT_noiykeeperdata
  203.  
  204.       ld a,(tpgs)
  205.       SETPGC000
  206.  
  207. GKEYADR=$+1
  208.         LD HL,KEYBUFF ;адрес конца списка
  209.  
  210. ;04 -- ошибка шины/HALT/"СТОП"
  211. ;60 (0x30) -- клавиатура
  212. ;274 (0xbc) -- клавиатура с нажатой АР2
  213. ;на 11М еще 100 (0x40) -- кадровое прерывание
  214. ;10 (0x08) -- нелегальная команда
  215. ;ещё есть программные EMT/TRAP/BPT/IOT
  216.  
  217.       ld hl,(0x30+0xc000) ;pc
  218.       ld bc,(0x30+0xc002) ;psw
  219.       ld a,h
  220.       or l
  221.      ;xor a
  222.       jp z,STIer ;костыль для неинициализированного прерывания
  223.  
  224. ;должно вызываться только при нажатии на клавишу
  225.         ld a,(bk_curkey)
  226.         or a
  227.         jp z,STIer
  228.  
  229.         ld a,-1
  230.         LD (iff1),A ;почему-то сам обработчик в бейсике не выставляет??? но всё равно не работает ввод в бейсике
  231. ;gotoint
  232. ;push psw; push pc (адрес после команды)
  233.        push hl
  234.        call getflags_bc
  235.         set 7,c ;interrupt enable
  236.        putmemspBC
  237.  
  238.        decodePC_to_ae
  239.         LD b,a
  240.         ld c,e ;=old PC
  241.        pop de ;new PC
  242.         putmemspBC
  243.  
  244.        _LoopC_JP
  245.  
  246.        if 1;AFFLAG_16BIT
  247. ;как сформировать ZF,SF, не трогая AF?
  248. ;для этого надо сформировать число с нужными свойствами и сделать inc
  249.          ;ZF SF AF OF
  250. ;ff даёт  1  0  1  0 ;имитирует флаги после inc ffff
  251. ;7f даёт  0  1  1  1 ;имитирует флаги после inc 7fff
  252. ;80 даёт  0  1  0  0 ;имитирует флаги после inc 8000
  253. ;8f даёт  0  1  1  0 ;имитирует флаги после inc 800f
  254. ;т.е. ff, 7f надо формировать только для 7fff, ffff
  255. ;а в остальных случаях надо брать (h&0x80) + (l&0x08)
  256. ;если l!=ff, l!=7f, то можно просто сделать inc l
  257. ;если l=ff, то нельзя просто сделать inc h - запортится AF!
  258. inchlwithflags_l00 ;inc h needed
  259.         inc h
  260.         ret z ;set ZF=1(ok), AF=1(ok), OF=0(ok)
  261.         jp pe,inchlwithflags_overflow
  262. inchlwithflags_a0_setAF ;set ZF=0(ok), SF=h7(ok), AF=1, keep CY
  263. ;a=0
  264.         jp m,$+5
  265.         ld a,0x80 ;after dec: a7=h7
  266.         dec a ;set ZF=0, SF=h7, AF=1, keep CY
  267.         ret
  268. incbcwithflags_c00 ;inc b needed
  269.         inc b
  270.         ret z ;set ZF=1(ok), AF=1(ok), OF=0(ok)
  271.         jp po,inchlwithflags_a0_setAF
  272. inchlwithflags_overflow
  273.         exx
  274.         ld e,0x80 ;overflow (e7!=e6)
  275.         exx
  276.         ret
  277.  
  278. inchlwithflags_l80 ;fix SF, keep AF=1, ZF=0
  279. ;a=0x80
  280.         bit 7,h
  281.         jr z,inchlwithflags_l80_p
  282. inchlwithflags_l80_m
  283.         ld a,0 ;keep CY!
  284.         dec a ;00->ff ;set ZF=0, SF=h7, AF=1, keep CY
  285.         ret
  286. incbcwithflags_c80 ;fix SF, keep AF=1, ZF=0
  287. ;a=0x80
  288.         bit 7,b
  289.         jr nz,inchlwithflags_l80_m
  290. inchlwithflags_l80_p
  291.         dec a ;80->7f ;set ZF=0, SF=h7, AF=1, keep CY
  292.         ret
  293.  
  294. dechlwithflags_fixflags
  295.         ex af,af' ;'
  296.         dec l
  297.         ld a,l
  298.         exx
  299.         ld d,a ;parity data
  300.         ld e,0 ;overflow data
  301.         exx
  302.         jr z,dechlwithflags_l00 ;maybe zero
  303.         inc a
  304.         jp pe,inchlwithflags_l80;dechlwithflags_l7f ;fix SF, keep AF=1, ZF=0
  305.         ret nz
  306.         dec h
  307.         jp pe,inchlwithflags_overflow
  308.         jr nz,inchlwithflags_a0_setAF ;set ZF=0, SF=h7, AF=1, keep CY
  309. ;a=0, hl=0x00ff
  310.         inc a ;set ZF=0, SF=0, AF=0, keep CY
  311.         ret
  312. dechlwithflags_l00 ;maybe zero
  313. ;a=0
  314.         inc h
  315.         dec h
  316.         ret z ;set ZF=1, SF=0, AF=0
  317.         ld a,h
  318.         res 0,a ;for ZF=0, AF=0
  319.         inc a ;set ZF=0, SF=h7, AF=0, keep CY
  320.         ret
  321.  
  322. decbcwithflags_fixflags
  323.         ex af,af' ;'
  324.         dec c
  325.         ld a,c
  326.         exx
  327.         ld d,a ;parity data
  328.         ld e,0 ;overflow data
  329.         exx
  330.         jr z,decbcwithflags_c00 ;maybe zero
  331.         inc a
  332.         jp pe,inchlwithflags_l80;dechlwithflags_l7f ;fix SF, keep AF=1, ZF=0
  333.         ret nz
  334.         dec b
  335.         jp pe,inchlwithflags_overflow
  336.         jr nz,inchlwithflags_a0_setAF ;set ZF=0, SF=h7, AF=1, keep CY
  337. ;a=0, bc=0x00ff
  338.         inc a ;set ZF=0, SF=0, AF=0, keep CY
  339.         ret
  340. decbcwithflags_c00 ;maybe zero
  341. ;a=0
  342.         inc b
  343.         dec b
  344.         ret z ;set ZF=1, SF=0, AF=0
  345.         ld a,b
  346.         res 0,a ;for ZF=0, AF=0
  347.         inc a ;set ZF=0, SF=h7, AF=0, keep CY
  348.         ret
  349.  
  350.        endif
  351.  
  352. recountpc_inc ;keep CY!
  353.         inc d
  354.         ret p ;<0x8000
  355.         push af
  356.         push bc
  357.          dec de
  358.          decodePC ;de->de
  359.          inc de
  360.         encodePC ;de->de, setpg
  361.         pop bc
  362.         pop af
  363.         ret
  364.  
  365. inchnextpg
  366.         inc h
  367.         ret nz
  368. hlnextpg
  369.         push af
  370.         push bc
  371.         ld a,lx
  372.         add a,0x40
  373.         ;adc a,0
  374.         ld c,a
  375.         ld b,tpgs/256
  376.         ld a,(bc)
  377.         SETPGC000
  378.         pop bc
  379.         pop af
  380.         ld h,0xc0
  381.         ret
  382.  
  383. putscreen_c
  384. putscreen_c_patch=$
  385. PUTSCREEN_C_PATCH_MONO=0x3e
  386. PUTSCREEN_C_PATCH_COLOR=0x18
  387.         jr putscreen_c_color
  388.        push hl
  389.        push bc
  390.        ld b,tmirror/256
  391.        ld a,(bc)
  392.        push af
  393. ;y=%TTYYYyyy
  394. ;hl=%01TTYYYy yyxxxxxx
  395.        ld b,0
  396.        bit 0,l
  397.        jr z,$+4
  398.        ld b,0x20
  399.         ld a,l
  400.         rra
  401.         and 0x1f
  402.        add hl,hl
  403.        add hl,hl
  404.        ld l,h
  405.         ld h,ty/256
  406.         ld c,(hl)
  407.         inc h
  408.         ld h,(hl) ;hc = ybase
  409.         ld l,a
  410.         add hl,bc
  411. ;addr=0x8000+(half*0x2000)+y*40+x
  412.         ld a,(user_scr0_high) ;ok
  413.         SETPG8000 ;TODO щёлкать только в color
  414.        pop af
  415.         ld (hl),a
  416.        pop bc
  417.        pop hl
  418.         ret
  419.  
  420. putscreen_c_color
  421.        push hl
  422.        push bc
  423. ;y=%TTYYYyyy
  424. ;hl=%01TTYYYy yyxxxxxx
  425.        ld b,0
  426.        bit 0,l
  427.        jr z,$+4
  428.        ld b,0x20
  429.         ld a,l
  430.         rra
  431.         and 0x1f
  432.        add hl,hl
  433.        add hl,hl
  434.        ld l,h
  435.         ld h,ty/256
  436.         ld c,(hl)
  437.         inc h
  438.         ld h,(hl) ;hc = ybase
  439.         ld l,a
  440.         add hl,bc
  441. ;addr=0x8000+(half*0x2000)+y*40+x
  442.         ld a,(user_scr0_low) ;ok
  443.         SETPG8000
  444.        pop bc
  445.        push bc
  446.         ld b,tleftpixels/256
  447.         ld a,(bc)
  448.         ld (hl),a
  449.         ld a,c
  450.         rlca
  451.         rlca
  452.         rlca
  453.         rlca
  454.         ld c,a
  455.         ld a,(bc)
  456.        push af
  457.         ld a,(user_scr0_high) ;ok
  458.         SETPG8000
  459.        pop af
  460.         ld (hl),a
  461.        pop bc
  462.        pop hl
  463.         ret
  464.  
  465. getflags_bc
  466. ;формат PSW такой: IxxTNZVC
  467. ;разрешение прерываний -- маска 0200(0x80) в PSW
  468. ;T - разрешение трассировочного прерывания
  469.         ex af,af' ;'
  470.         push af
  471.         ex af,af' ;'
  472.         pop bc
  473. ;c=%SZ???V?C
  474.         ld a,c ;flags
  475.         ld bc,0
  476.         add a,a
  477.         jr nc,$+4
  478.         set 3,c ;N=S
  479.         jp p,$+5
  480.         set 2,c ;Z
  481.         rra ;a=flags
  482.         rra
  483.         jr nc,$+3
  484.         inc c ;C
  485.         rra
  486.         rra
  487.         jr nc,$+4
  488.         set 1,c ;V
  489.         ld a,(iff1)
  490.        and 0x80
  491.        or c
  492.        ld c,a
  493.         ret
  494.  
  495. makeflags_frombc
  496. ;c=IxxTNZVC
  497.         ld a,c
  498.         rla ;interrupt enable
  499.         sbc a,a
  500.         ld (iff1),a
  501.         ld a,c
  502.         ld c,0
  503.         rra
  504.         jr nc,$+3
  505.         inc c ;C
  506.         rra
  507.         jr nc,$+4
  508.         set 2,c ;V
  509.         rra
  510.         jr nc,$+4
  511.         set 6,c ;Z
  512.         rra
  513.         jr nc,$+4
  514.         set 7,c ;Z
  515. ;c=%SZ???V?C
  516.         push bc
  517.         ex af,af' ;'
  518.         pop af
  519.         ex af,af' ;'
  520.         ret
  521.  
  522. STIer
  523.         ld a,-1
  524.         ld (iff1),a
  525.        _LoopC
  526.  
  527. getmemspBCpp
  528.         ld hl,(_SP)
  529.         inc hl
  530.         inc hl
  531.         ld (_SP),hl
  532.         dec hl
  533.         dec hl
  534.         ld a,h
  535.         and 0xc0
  536.         ld c,a
  537.         ld b,tpgs/256
  538.         set 7,h
  539.         set 6,h
  540.         ld a,(bc)
  541.         SETPGC000
  542.         ld c,(hl)
  543.         inc l
  544.         ld b,(hl)
  545.         ret nz
  546.         push bc
  547.         ld hl,(_SP)
  548.         dec hl
  549.         ld a,h
  550.         and 0xc0
  551.         ld c,a
  552.         ld b,tpgs/256
  553.         set 7,h
  554.         set 6,h
  555.         ld a,(bc)
  556.         SETPGC000
  557.         pop bc
  558.         ld b,(hl)
  559.         ret
  560.  
  561. recountsp_inc
  562.         push bc
  563.         ld hl,(_SP)
  564.         inc hl
  565.         ld a,h
  566.         and 0xc0
  567.         ld c,a
  568.         ld b,tpgs/256
  569.         set 7,h
  570.         set 6,h
  571.         ld a,(bc)
  572.         SETPGC000
  573.         pop bc
  574.         ret
  575.  
  576. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  577.  
  578. getdest8_aisc
  579. ;out: c=dest, a=cmdLSB
  580. ;15-12 Opcode
  581. ;11-9 Src
  582. ;8-6 Register
  583. ;5-3 Dest
  584. ;2-0 Register
  585.         rla
  586.         and 0x0e
  587.         ld l,a ;0000rrr0
  588.         ld h,_R0/256
  589.          ;ld l,(hl) ;TODO
  590.         bit 3,c
  591.         jr nz,rddest8_xx1
  592.         bit 4,c
  593.         jr nz,rddest8_x10
  594.         bit 5,c
  595.         jr nz,rddest8_100
  596. ;000 Register ;TODO pc
  597.        cp 0x0e
  598.        jr z,$
  599.          ld a,c
  600.         ld c,(hl)
  601.         ret
  602. rddest8_x10
  603.         bit 5,c
  604.         jp nz,rddest8_110
  605.         jp rddest8_010
  606. rddest8_xx1
  607.         bit 4,c
  608.         jr nz,rddest8_x11
  609.         bit 5,c
  610.         jp nz,rddest8_101
  611.         jp rddest8_001
  612. rddest8_x11
  613.         bit 5,c
  614.         jp nz,rddest8_111
  615.         ;jp rddest8_011
  616. ;rddest8_011 ;@(Rn)+ ;всегда +=2
  617.         ld a,l
  618.        ld hx,c
  619.         cp 0x0e
  620.         jr z,rddest8_011_pc
  621.         UNTESTED ;GOOD ;road2cafe ;нет в leopol
  622.         ld c,(hl)
  623.         inc l
  624.         ld a,(hl)
  625.         jp rdsrc8_addrfromaddr_ac
  626. rddest8_011_pc
  627.         UNTESTED ;GOOD ;bubbler ;нет в leopol
  628. ;инкремент не делаем, чтобы его делал putdest
  629.         get
  630.         inc e ;next без переключения страниц!!! FIXME
  631.         ld c,a
  632.         get
  633.         dec e ;FIXME
  634.         RDMEM8_ac_ret ;c=result, a=hx
  635.  
  636. rddest8_100
  637. ;100 -(Rn)
  638. ;при адресациях (reg)+ и -(reg), есть особый случай: если регистр -- это r6 или r7, то регистр всегда изменяется на 2, даже если команда байтовая
  639.         ld a,l
  640.        ld hx,c
  641.        cp 0x0e
  642.        jr z,$;rddest8_100_pc
  643.         cp 0x0c
  644.         ld c,(hl)
  645.         inc l
  646.         ld b,(hl)
  647.         dec bc
  648.        jr c,$+3
  649.        dec bc ;sp/pc +=2
  650.         UNTESTED
  651. rdmem8_bc_to_c
  652.         ld a,b
  653.         RDMEM8_ac_ret ;c=result, a=hx
  654.  
  655. rddest8_101
  656.         ld a,l
  657. ;101 @-(Rn) ;всегда -=2
  658.        ld hx,c
  659.        cp 0x0e
  660.        jr z,$;rddest8_101_pc
  661.         UNTESTED
  662.         ld c,(hl)
  663.         inc l
  664.         ld b,(hl)
  665.         dec bc
  666.         dec bc
  667.         ld a,b
  668.         jp rdsrc8_addrfromaddr_ac
  669.  
  670. rddest8_110
  671.         ld a,l
  672. ;X(Rn)
  673.        ld hx,c
  674.        cp 0x0e
  675.        jr z,rddest8_110_pc
  676.         GOOD ;pacman ;leopol демо2
  677.         get
  678.         inc e
  679.         add a,(hl)
  680.         ld c,a
  681.         inc l
  682.         get
  683.         dec e ;FIXME
  684.         adc a,(hl) ;ac=Rn+X
  685.         RDMEM8_ac_ret ;c=result, a=hx
  686. rddest8_110_pc ;for mona
  687.         GOOD ;morf
  688.         get
  689.         inc e
  690.         ld c,a
  691.         ;inc l
  692.         get
  693.         dec e ;FIXME
  694.         ld b,a
  695.        decodePC_to_ae
  696.       inc bc
  697.       inc bc
  698.         ld h,a
  699.        ld a,c
  700.        add a,e
  701.        ld c,a
  702.        ld a,b
  703.        adc a,h ;ac=pc+X
  704.         RDMEM8_ac_ret ;c=result, a=hx
  705.  
  706. rddest8_111
  707.        ld a,l
  708. ;111 Index deferred: @X(Rn): Rn+X is the address of the address of the operand
  709.        ld hx,c
  710.        cp 0x0e
  711.        jr z,rddest8_111_pc
  712.         UNTESTED
  713.         get
  714.         inc e
  715.         add a,(hl)
  716.         ld c,a
  717.         inc l
  718.         get
  719.         dec e ;FIXME
  720.         adc a,(hl) ;ac=Rn+X
  721.         jp rdsrc8_addrfromaddr_ac
  722. rddest8_111_pc ;for leopol?
  723. ;[[pc+X]]
  724.         UNTESTED ;GOOD ;leopold когда уже появилась грязь вместо мышей
  725.         get
  726.         inc e
  727.         ld c,a
  728.         ;inc l
  729.         get
  730.         dec e ;FIXME
  731.         ld b,a
  732.        decodePC_to_ae
  733.       inc bc
  734.       inc bc ;TODO надо ли?
  735.         ld h,a
  736.        ld a,c
  737.        add a,e
  738.        ld c,a
  739.        ld a,b
  740.        adc a,h ;ac=pc+X
  741.         jp rdsrc8_addrfromaddr_ac
  742.  
  743. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  744. ;c=data, a=cmdLSB = %??fmtRRR
  745. putdest8_Loop
  746. ;15-12 Opcode
  747. ;11-9 Src
  748. ;8-6 Register
  749. ;5-3 Dest
  750. ;2-0 Register
  751.         ld h,a
  752.         rla
  753.         and 0x0e
  754.         ld l,a ;0000rrr0
  755.         ld a,h
  756.         ld h,_R0/256
  757.          ;ld l,(hl) ;TODO
  758.         rla
  759.         rla
  760.         rla
  761.         jp c,wrdest8_1xx
  762.         add a,a
  763.         jr c,wrdest8_01x
  764.         jp m,wrdest8_001
  765. ;000 Register
  766.         ld a,l
  767.         cp 0x0e
  768.         jp z,$;bctoPCLoop
  769.         ld (hl),c ;не надо расширять знак (Alexander Tishin), кроме movb (см. там отдельно)
  770.         _LoopC
  771.  
  772. wrdest8_001 ;(Rn): Rn contains the address of the operand
  773.        ld a,l
  774.        cp 0x0e
  775.        jr z,$
  776.         GOOD ;leopol начало
  777.         ld a,(hl)
  778.         inc l
  779.         ld h,(hl)
  780.         ld l,a
  781.         WRMEM8_hl_LoopC
  782. wrdest8_01x
  783.         jp m,wrdest8_011
  784. ;wrdest_010 ;(Rn)+
  785. ;при адресациях (reg)+ и -(reg), есть особый случай: если регистр -- это r6 или r7, то регистр всегда изменяется на 2, даже если команда байтовая
  786.         ld a,l
  787.         cp 0x0c
  788.         ld a,(hl)
  789.        jr c,$+2+2+1
  790.        jr nz,wrdest8_010_pc
  791.        inc (hl) ;sp/pc +=2 ;TODO нечётный?
  792.         GOOD ;leopol демо
  793.         inc (hl)
  794.         inc hl
  795.         jr nz,$+2+3+2
  796.          inc (hl)
  797.          ld h,(hl)
  798.          dec h
  799.          jr $+3
  800.        ld h,(hl)
  801.         ld l,a
  802.         WRMEM8_hl_LoopC
  803. wrdest8_010_pc ;TODO так ли при dest=(pc+)? bkscope
  804.         GOOD ;bkscope ;нет в leopol
  805.         ld a,c
  806.         ld (de),a
  807.         next
  808.         ;ld a,b
  809.         ;ld (de),a
  810.         next
  811.        _LoopC
  812.  
  813. wrdest8_011 ;@(Rn)+
  814.         ld a,l
  815.         cp 0x0e
  816.         jr z,wrdest8_011_pc
  817.         UNTESTED
  818.        push de
  819.         ld e,(hl)
  820.         inc l
  821.         ld d,(hl)
  822.         inc de
  823.         inc de
  824.         ld (hl),d
  825.         dec l
  826.         ld (hl),e
  827.         dec de
  828.         dec de
  829.         ex de,hl
  830.        pop de
  831. wrdest8_memfrommem
  832.        push bc
  833.         ld a,h
  834.         and 0xc0
  835.         ld c,a
  836.        ld lx,a
  837.         ld b,tpgs/256
  838.         set 7,h
  839.         set 6,h
  840.         ld a,(bc)
  841.         SETPGC000
  842.         ld b,(hl)
  843.         inc l
  844.         call z,inchnextpg
  845.         ld h,(hl)
  846.         ld l,b
  847.        pop bc
  848.         WRMEM8_hl_LoopC
  849. wrdest8_011_pc
  850.         GOOD ;pacman
  851.         get
  852.         next
  853.         ld l,a
  854.         get
  855.         next
  856.         ld h,a
  857.         WRMEM8_hl_LoopC
  858.  
  859. wrdest8_1xx
  860.         add a,a
  861.         jp c,wrdest8_11x
  862.         jp m,wrdest8_101
  863. ;wrdest8_100
  864. ;100 -(Rn)
  865. ;при адресациях (reg)+ и -(reg), есть особый случай: если регистр -- это r6 или r7, то регистр всегда изменяется на 2, даже если команда байтовая
  866.         ld a,l
  867.         cp 0x0c
  868.        push de
  869.         ld e,(hl)
  870.         inc l
  871.         ld d,(hl)
  872.         dec de
  873.        jr c,$+2+2+1
  874.        jr nz,wrdest8_100_pc
  875.        dec de ;sp/pc +=2
  876.         GOOD ;leopol начало
  877.         ld (hl),d
  878.         dec l
  879.         ld (hl),e
  880.         ex de,hl
  881.        pop de
  882.      ;inc hl
  883.        ;jr $
  884.         WRMEM8_hl_LoopC
  885. wrdest8_100_pc ;TODO так ли при -(pc)?
  886.        jr $
  887.        pop af ;skip
  888.         decodePC
  889.         dec de
  890.         dec de
  891.         encodePC
  892.         ld a,c
  893.         ld (de),a
  894.        _LoopC
  895.  
  896. wrdest8_101
  897. ;101 @-(Rn) ;всегда -=2
  898.        ld a,l
  899.        cp 0x0e
  900.        jr z,$;wrdest8_101_pc ;TODO pc
  901.         UNTESTED
  902.         ld c,(hl)
  903.         inc l
  904.         ld b,(hl)
  905.         dec bc
  906.         dec bc
  907.         ld (hl),b
  908.         dec l
  909.         ld (hl),c
  910.         ld h,b
  911.         ld l,c
  912.         jp wrdest8_memfrommem
  913. wrdest8_11x
  914.         jp m,wrdest8_111
  915. ;wrdest8_110
  916. ;110 Index: X(Rn): Rn+X is the address of the operand
  917.        ld a,l
  918.        cp 0x0e
  919.        jr z,wrdest8_110_pc
  920.         GOOD ;bkscope
  921.         get
  922.         next
  923.         add a,(hl)
  924.        push af
  925.         inc l
  926.         get
  927.         next
  928.         adc a,(hl)
  929.         ld h,a
  930.        pop af
  931.         ld l,a ;hl=Rn+X
  932.         WRMEM8_hl_LoopC
  933. wrdest8_110_pc
  934.         GOOD ;leopol начало
  935.        push bc
  936.         get
  937.         next;inc e
  938.         ld c,a
  939.         get
  940.         next;dec e
  941.         ld b,a
  942.        decodePC_to_ae
  943.         ld h,a
  944.         ld l,e
  945.         add hl,bc ;hl=pc+X
  946.        pop bc
  947.         WRMEM8_hl_LoopC
  948.  
  949. wrdest8_111
  950. ;111 Index deferred: @X(Rn): Rn+X is the address of the address of the operand
  951.        ld a,l
  952.        cp 0x0e
  953.        jr z,wrdest8_111_pc
  954.         UNTESTED
  955.         get
  956.         next
  957.         add a,(hl)
  958.        push af
  959.         inc l
  960.         get
  961.         next
  962.         adc a,(hl)
  963.         ld h,a
  964.        pop af
  965.         ld l,a ;hl=Rn+X
  966.         jp wrdest8_memfrommem
  967. wrdest8_111_pc
  968.         GOOD ;pacman
  969.        push bc
  970.         get
  971.         next;inc e
  972.         ld c,a
  973.         get
  974.         next;dec e
  975.         ld b,a
  976.        decodePC_to_ae
  977.         ld h,a
  978.         ld l,e
  979.         add hl,bc ;hl=pc+X
  980.        pop bc
  981.         jp wrdest8_memfrommem
  982.  
  983. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  984.  
  985. ;a=cmdLSB = %??fmtRRR
  986. getdest_aisc
  987. ;out: bc=dest, a=cmdLSB
  988. ;15-12 Opcode
  989. ;11-9 Src
  990. ;8-6 Register
  991. ;5-3 Dest
  992. ;2-0 Register
  993.         rla
  994.         and 0x0e
  995.         ld l,a ;0000rrr0
  996.         ld h,_R0/256
  997.          ;ld l,(hl) ;TODO
  998.         bit 3,c
  999.         jr nz,rddest_xx1
  1000.         bit 4,c
  1001.         jr nz,rddest_x10
  1002.         bit 5,c
  1003.         jp nz,rddest_100
  1004. ;000 Register
  1005.        cp 0x0e
  1006.        jr z,rddest_000_pc
  1007.          ld a,c
  1008.         ld c,(hl)
  1009.         inc l
  1010.         ld b,(hl)
  1011.         ret
  1012. rddest_000_pc ;cd.bk - TODO правильно ли? программа не работает
  1013.         GOOD ;basic
  1014.       ld hx,c
  1015.        decodePC_to_ae
  1016.        ld b,a
  1017.        ld c,e
  1018.       ld a,hx
  1019.         ret
  1020. rddest_x10
  1021.         bit 5,c
  1022.         jp nz,rddest_110
  1023.         jp rddest_010
  1024. rddest_xx1
  1025.         bit 4,c
  1026.         jr nz,rddest_x11
  1027.         bit 5,c
  1028.         jp nz,rddest_101
  1029.         jp rddest_001
  1030. rddest_x11
  1031.         bit 5,c
  1032.         jp nz,rddest_111
  1033.         ;jp rddest_011
  1034. ;rddest_011 ;@(Rn)+ ;всегда +=2
  1035.        ld hx,c
  1036.         cp 0x0e
  1037.         jr z,rddest_011_pc
  1038.         GOOD ;road2cafe ;нет в leopol
  1039.         ld c,(hl)
  1040.         inc l
  1041.         ld a,(hl)
  1042.         jp rdsrc_addrfromaddr_ac
  1043. rddest_011_pc
  1044.         GOOD ;bubbler ;нет в leopol
  1045. ;инкремент не делаем, чтобы его делал putdest
  1046.         get
  1047.         inc e ;next без переключения страниц!!! FIXME
  1048.         ld c,a
  1049.         get
  1050.         dec e ;FIXME
  1051.         RDMEM_ac_ret ;bc=result, a=hx
  1052.  
  1053. rddest_100
  1054. ;100 -(Rn)
  1055. ;при адресациях (reg)+ и -(reg), есть особый случай: если регистр -- это r6 или r7, то регистр всегда изменяется на 2, даже если команда байтовая
  1056.        ld hx,c
  1057.        cp 0x0e
  1058.        jr z,$;rddest_100_pc ;TODO pc
  1059.         GOOD ;sokoban ;нет в leopol
  1060.         ld c,(hl)
  1061.         inc l
  1062.         ld b,(hl)
  1063.         dec bc
  1064.         dec bc
  1065.         ld a,b
  1066.         RDMEM_ac_ret ;bc=result, a=hx
  1067.  
  1068. rddest_101
  1069. ;101 @-(Rn) ;всегда -=2
  1070.        ld hx,c
  1071.        cp 0x0e
  1072.        jr z,rddest_101_pc
  1073.         UNTESTED
  1074.         ld c,(hl)
  1075.         inc l
  1076.         ld b,(hl)
  1077.         dec bc
  1078.         dec bc
  1079.         ld a,b
  1080.         jp rdsrc_addrfromaddr_ac
  1081. rddest_101_pc ;TODO
  1082.         jr $
  1083.  
  1084. rddest_110
  1085. ;X(Rn)
  1086.        ld hx,c
  1087.        cp 0x0e
  1088.        jr z,rddest_110_pc
  1089.         GOOD ;leopol демо2
  1090.         get
  1091.         inc e
  1092.         add a,(hl)
  1093.         ld c,a
  1094.         inc l
  1095.         get
  1096.         dec e ;FIXME
  1097.         adc a,(hl) ;ac=Rn+X
  1098.         RDMEM_ac_ret ;bc=result, a=hx
  1099. rddest_110_pc ;for mona
  1100.         GOOD ;leopol начало
  1101.         get
  1102.         inc e
  1103.         ld c,a
  1104.         ;inc l
  1105.         get
  1106.         dec e ;FIXME
  1107.         ld b,a
  1108.        decodePC_to_ae
  1109.       inc bc
  1110.       inc bc
  1111.         ld h,a
  1112.        ld a,c
  1113.        add a,e
  1114.        ld c,a
  1115.        ld a,b
  1116.        adc a,h ;ac=pc+X
  1117.         RDMEM_ac_ret ;bc=result, a=hx
  1118.  
  1119. rddest_111
  1120. ;111 Index deferred: @X(Rn): Rn+X is the address of the address of the operand
  1121.        ld hx,c
  1122.        cp 0x0e
  1123.        jr z,rddest_111_pc
  1124.         UNTESTED ;miraclebk
  1125.         get
  1126.         inc e
  1127.         add a,(hl)
  1128.         ld c,a
  1129.         inc l
  1130.         get
  1131.         dec e ;FIXME
  1132.         adc a,(hl) ;ac=Rn+X
  1133.         jp rdsrc_addrfromaddr_ac
  1134. rddest_111_pc ;for leopol?
  1135. ;[[pc+X]]
  1136.         GOOD ;leopold когда уже появилась грязь вместо мышей
  1137.         get
  1138.         inc e
  1139.         ld c,a
  1140.         ;inc l
  1141.         get
  1142.         dec e ;FIXME
  1143.         ld b,a
  1144.        decodePC_to_ae
  1145.       inc bc
  1146.       inc bc ;TODO надо ли?
  1147.         ld h,a
  1148.        ld a,c
  1149.        add a,e
  1150.        ld c,a
  1151.        ld a,b
  1152.        adc a,h ;ac=pc+X
  1153.         jp rdsrc_addrfromaddr_ac
  1154.  
  1155. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1156.  
  1157. ;bc=data, a=cmdLSB = %??fmtRRR
  1158. putdest_Loop
  1159. ;15-12 Opcode
  1160. ;11-9 Src
  1161. ;8-6 Register
  1162. ;5-3 Dest
  1163. ;2-0 Register
  1164.         ld h,a
  1165.         rla
  1166.         and 0x0e
  1167.         ld l,a ;0000rrr0
  1168.         ld a,h
  1169.         ld h,_R0/256
  1170.          ;ld l,(hl) ;TODO
  1171.         rla
  1172.         rla
  1173.         rla
  1174.         jp c,wrdest_1xx
  1175.         add a,a
  1176.         jr c,wrdest_01x
  1177.         jp m,wrdest_001
  1178. ;000 Register
  1179.         ld a,l
  1180.         cp 0x0e
  1181.         jp z,bctoPCLoop
  1182.         ld (hl),c
  1183.         inc l
  1184.         ld (hl),b
  1185.         _LoopC
  1186. wrdest_001 ;(Rn): Rn contains the address of the operand
  1187.        ld a,l
  1188.        cp 0x0e
  1189.        jr z,$
  1190.         ld a,(hl)
  1191.         inc l
  1192.         ld h,(hl)
  1193.         ld l,a
  1194.         WRMEM_hl_LoopC
  1195. wrdest_01x
  1196.         jp m,wrdest_011
  1197. ;wrdest_010 ;(Rn)+
  1198. ;при адресациях (reg)+ и -(reg), есть особый случай: если регистр -- это r6 или r7, то регистр всегда изменяется на 2, даже если команда байтовая
  1199. ;а тут небайтовая, значит, всегда +=2
  1200.         ld a,l
  1201.         cp 0x0e
  1202.        jr z,wrdest_010_pc
  1203.         GOOD ;textshow
  1204.        push de
  1205.         ld e,(hl)
  1206.         inc l
  1207.         ld d,(hl)
  1208.         inc de
  1209.         inc de
  1210.         ld (hl),d
  1211.         dec l
  1212.         ld (hl),e
  1213.         dec de
  1214.         dec de
  1215.         ex de,hl
  1216.        pop de
  1217.         WRMEM_hl_LoopC
  1218.  
  1219. wrdest_010_pc
  1220. ;dest=(pc+) mona: mov r4,#0 ;space4k: dec #6000
  1221.         ld a,c
  1222.         ld (de),a
  1223.         next
  1224.         ld a,b
  1225.         ld (de),a
  1226.         next
  1227.        _LoopC
  1228.  
  1229. wrdest_011 ;@(Rn)+
  1230.         ld a,l
  1231.         cp 0x0e
  1232.         jr z,wrdest_011_pc
  1233.         GOOD;UNTESTED ;road2cafe после этого портит экран
  1234.        push de
  1235.         ld e,(hl)
  1236.         inc l
  1237.         ld d,(hl)
  1238.         inc de
  1239.         inc de
  1240.         ld (hl),d
  1241.         dec l
  1242.         ld (hl),e
  1243.         dec de
  1244.         dec de
  1245.         ex de,hl
  1246.        pop de
  1247. wrdest_memfrommem
  1248.        push bc
  1249.         ld a,h
  1250.         and 0xc0
  1251.         ld c,a
  1252.        ld lx,a
  1253.         ld b,tpgs/256
  1254.         set 7,h
  1255.         set 6,h
  1256.         ld a,(bc)
  1257.         SETPGC000
  1258.         ld a,(hl)
  1259.        push af
  1260.         inc l
  1261.         call z,inchnextpg
  1262.         ld h,(hl)
  1263.        pop af
  1264.         ld l,a
  1265.        pop bc
  1266.         WRMEM_hl_LoopC
  1267. wrdest_011_pc
  1268.         GOOD ;textshow
  1269.         get
  1270.         next
  1271.         ld l,a
  1272.         get
  1273.         next
  1274.         ld h,a
  1275.         WRMEM_hl_LoopC
  1276.  
  1277. wrdest_1xx
  1278.         add a,a
  1279.         jp c,wrdest_11x
  1280.         jp m,wrdest_101
  1281. ;wrdest_100
  1282. ;100 -(Rn)
  1283. ;при адресациях (reg)+ и -(reg), есть особый случай: если регистр -- это r6 или r7, то регистр всегда изменяется на 2, даже если команда байтовая
  1284.         ld a,l
  1285.         cp 0x0e
  1286.         jr z,wrdest_100_pc
  1287.         GOOD ;textshow
  1288.        push de
  1289.         ld e,(hl)
  1290.         inc l
  1291.         ld d,(hl)
  1292.         dec de
  1293.         dec de
  1294.         ld (hl),d
  1295.         dec l
  1296.         ld (hl),e
  1297.         ex de,hl
  1298.        pop de
  1299.         WRMEM_hl_LoopC
  1300. wrdest_100_pc ;TODO так ли при -(pc)?
  1301.        jr $
  1302.         decodePC
  1303.         dec de
  1304.         dec de
  1305.         encodePC
  1306.         ld a,c
  1307.         ld (de),a
  1308.         inc e
  1309.         ld a,b
  1310.         ld (de),a
  1311.         dec e
  1312.        _LoopC
  1313.  
  1314. wrdest_101
  1315. ;101 @-(Rn) ;всегда -=2
  1316.        ld a,l
  1317.        cp 0x0e
  1318.        jr z,$;rddest_101_pc ;TODO pc
  1319.         UNTESTED
  1320.         ld c,(hl)
  1321.         inc l
  1322.         ld b,(hl)
  1323.         dec bc
  1324.         dec bc
  1325.         ld (hl),b
  1326.         dec l
  1327.         ld (hl),c
  1328.         ld h,b
  1329.         ld l,c
  1330.         jp wrdest_memfrommem
  1331. wrdest_11x
  1332.         jp m,wrdest_111
  1333. ;wrdest_110
  1334. ;110 Index: X(Rn): Rn+X is the address of the operand
  1335.         ld a,l
  1336.        cp 0x0e
  1337.        jr z,wrdest_110_pc
  1338.         GOOD ;leopol демо3
  1339.         get
  1340.         next
  1341.         add a,(hl)
  1342.        push af
  1343.         inc l
  1344.         get
  1345.         next
  1346.         adc a,(hl)
  1347.         ld h,a
  1348.        pop af
  1349.         ld l,a ;hl=Rn+X
  1350.         WRMEM_hl_LoopC
  1351. wrdest_110_pc ;for mona, leopol
  1352.         GOOD ;leopol начало
  1353.        push bc
  1354.         get
  1355.         next;inc e
  1356.         ld c,a
  1357.         get
  1358.         next;dec e
  1359.         ld b,a
  1360.        decodePC_to_ae
  1361.         ld h,a
  1362.         ld l,e
  1363.         add hl,bc ;hl=pc+X
  1364.        pop bc
  1365.         WRMEM_hl_LoopC
  1366.  
  1367. wrdest_111
  1368. ;111 Index deferred: @X(Rn): Rn+X is the address of the address of the operand
  1369.         ld a,l
  1370.        cp 0x0e
  1371.        jr z,wrdest_111_pc
  1372.         UNTESTED ;miraclebk
  1373.         get
  1374.         next
  1375.         add a,(hl)
  1376.        push af
  1377.         inc l
  1378.         get
  1379.         next
  1380.         adc a,(hl)
  1381.         ld h,a
  1382.        pop af
  1383.         ld l,a ;hl=Rn+X
  1384.         jp wrdest_memfrommem
  1385. wrdest_111_pc
  1386. ;[[pc+X]]
  1387.         GOOD ;leopold глубоко во время игрового процесса (появление мышей?)
  1388.        push bc
  1389.         get
  1390.         next;inc e
  1391.         ld c,a
  1392.         get
  1393.         next;dec e
  1394.         ld b,a
  1395.        decodePC_to_ae
  1396.         ld h,a
  1397.         ld l,e
  1398.         add hl,bc ;hl=pc+X
  1399.        pop bc
  1400.         jp wrdest_memfrommem
  1401.  
  1402.  
  1403. ;15c2
  1404. ;0001 0101 1100 0010
  1405. ;0 001 010 111 000 010
  1406. ;mov  ;src;(pc)+;dst ;r2
  1407.  
  1408. ;65c0
  1409. ;0110 0101 1100 0000
  1410. ;0 110 010 111 000 000
  1411. ;add ;src;(pc)+;dst ;r0
  1412.  
  1413. ;02fc
  1414. ;0000 0010 1111 1100
  1415. ;0 000 001 011 111 100
  1416.      ;bne
  1417.  
  1418. ;1c71 ;mov barofs(r1), nhbar(r1)
  1419. ;0001 1100 0111 0001
  1420. ;0 001 110 001 110 001
  1421.       ;src;X(r1);dst;X(r1)
  1422.  
  1423. ;7951
  1424. ;0111 1001 0101 0001
  1425. ;0 111 100 101 010 001
  1426.      ;XOR ;r5;dst;(r1)+
  1427.  
  1428. ;7e85 ;sob
  1429. ;0111 1110 1000 0101
  1430. ;0 111 111 010 000 101
  1431.  
  1432. ;[025c]:2017 ;cmp r0,#...
  1433. ;0010 0000 0001 0111
  1434. ;0 010 000 000 010 111
  1435.       ;src;r0 ;dst;(pc)+
  1436.  
  1437. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1438.  
  1439. ;a=cmdLSB = %??fmtRRR
  1440. getdest_aisc_autoinc ;TODO всегда +=2
  1441. ;out: bc=dest, a=cmdLSB
  1442.        rra
  1443.        rra
  1444.        ld b,a
  1445.         ld a,c
  1446.         rla
  1447.         jp rdsrc_go
  1448.  
  1449. getdest8_aisc_autoinc
  1450. ;out: c=dest, a=cmdLSB
  1451.        rra
  1452.        rra
  1453.        ld b,a
  1454.         ld a,c
  1455.         rla
  1456.         jp rdsrc8_go
  1457.  
  1458. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1459.  
  1460. rdsrcop
  1461. ;ac=cmd
  1462. ;out: bc=sourceop, a=cmdLSB
  1463. ;15-12 Opcode
  1464. ;11-9 Src
  1465. ;8-6 Register
  1466. ;5-3 Dest
  1467. ;2-0 Register
  1468.         ld b,a
  1469.         rra
  1470.         ld a,c
  1471.         rra ;rrr?????
  1472.          rra
  1473.          rra
  1474.          rra
  1475.          rra
  1476. rdsrc_go
  1477.          and 0x0e
  1478.         ld l,a ;0000rrr0
  1479.         ld h,_R0/256
  1480.          ;ld l,(hl) ;TODO
  1481.  
  1482. ;0n     Register        Rn      The operand is in Rn
  1483. ;1n     Register deferred       (Rn)    Rn contains the address of the operand
  1484. ;2n     Autoincrement   (Rn)+   Rn contains the address of the operand, then increment Rn
  1485. ;3n     Autoincrement deferred  @(Rn)+  Rn contains the address of the address of the operand, then increment Rn by 2
  1486. ;4n     Autodecrement   ?(Rn)   Decrement Rn, then use the result as the address of the operand
  1487. ;5n     Autodecrement deferred  @?(Rn)  Decrement Rn by 2, then use the result as the address of the address of the operand
  1488. ;6n     Index   X(Rn)   Rn+X is the address of the operand
  1489. ;7n     Index deferred  @X(Rn)  Rn+X is the address of the address of the operand
  1490.         bit 1,b
  1491.         jr nz,rdsrc_xx1
  1492.         bit 2,b
  1493.         jr nz,rdsrc_x10
  1494.         bit 3,b
  1495.         jp nz,rdsrc_100
  1496. ;000 Register
  1497.        cp 0x0e
  1498.        jr z,rdsrc_000_pc
  1499.          ld a,c
  1500.         ld c,(hl)
  1501.         inc l
  1502.         ld b,(hl)
  1503.         ret
  1504. rdsrc_000_pc
  1505.         GOOD ;leopol начало
  1506.         decodePC_to_ae
  1507.         ld b,a
  1508.          ld a,c
  1509.         ld c,e
  1510.         ret
  1511.  
  1512. rdsrc_xx1
  1513.         bit 2,b
  1514.         jp nz,rdsrc_x11
  1515.         bit 3,b
  1516.         jp nz,rdsrc_101
  1517. ;001: (Rn)
  1518. rddest_001 ;(Rn): Rn contains the address of the operand
  1519. rddest_010 ;(Rn)+ ;инкремент не делаем, чтобы его делал putdest
  1520.        ld hx,c
  1521.        cp 0x0e
  1522.        jr z,rdsrc_001_pc
  1523.         ld c,(hl)
  1524.         inc l
  1525.         ld a,(hl)
  1526.         RDMEM_ac_ret ;bc=result
  1527. rdsrc_001_pc
  1528.         GOOD ;bkscope
  1529.         get
  1530.         ld c,a
  1531.         inc e
  1532.         get
  1533.         ld b,a
  1534.         dec e ;TODO нечётные
  1535.        ld a,hx
  1536.         ret
  1537.  
  1538. rdsrc_x10
  1539.         bit 3,b
  1540.         jp nz,rdsrc_110
  1541. ;(Rn)+
  1542. ;при адресациях (reg)+ и -(reg), есть особый случай: если регистр -- это r6 или r7, то регистр всегда изменяется на 2, даже если команда байтовая
  1543.        ld hx,c
  1544.         cp 0x0e
  1545.        jr z,rdsrc_010_pc
  1546.         GOOD ;textshow
  1547.         ld c,(hl)
  1548.         inc (hl) ;sp/pc +=2 ;TODO нечётный?
  1549.         inc (hl)
  1550.         inc hl
  1551.         ld a,(hl)
  1552.         jr nz,$+3
  1553.         inc (hl)
  1554.         RDMEM_ac_ret ;bc=result, a=hx
  1555. rdsrc_010_pc
  1556.         GOOD ;textshow
  1557.         get
  1558.         next
  1559.         ld c,a
  1560.         get
  1561.         next
  1562.         ld b,a
  1563.        ld a,hx
  1564.         ret
  1565.  
  1566. rdsrc_x11
  1567.         bit 3,b
  1568.         jp nz,rdsrc_111
  1569. rdsrc_011 ;@(Rn)+ ;всегда +=2
  1570.        ld hx,c
  1571.         cp 0x0e
  1572.         jr z,rdsrc_011_pc
  1573.         GOOD ;mars1
  1574.         ld c,(hl)
  1575.         inc l
  1576.         ld b,(hl)
  1577.         inc bc
  1578.         inc bc
  1579.         ld (hl),b
  1580.         dec l
  1581.         ld (hl),c
  1582.         dec bc
  1583.         dec bc
  1584.         ld a,b
  1585. rdsrc_addrfromaddr_ac
  1586.         ld l,c
  1587.         ld h,a
  1588.         and 0xc0
  1589.         ld c,a
  1590.        ld lx,a
  1591.         ld b,tpgs/256
  1592.         set 7,h
  1593.         set 6,h
  1594.         ld a,(bc)
  1595.         SETPGC000
  1596.         ld c,(hl)
  1597.         inc l
  1598.         call z,inchnextpg
  1599.         ld a,(hl)
  1600.         RDMEM_ac_ret ;bc=result, a=hx
  1601. rdsrc_011_pc
  1602.         GOOD ;leopol демо4(кот у цифр)
  1603.         get
  1604.         next
  1605.         ld c,a
  1606.         get
  1607.         next
  1608.         RDMEM_ac_ret ;bc=result, a=hx
  1609.  
  1610. rdsrc_100
  1611. ;100 -(Rn)
  1612. ;при адресациях (reg)+ и -(reg), есть особый случай: если регистр -- это r6 или r7, то регистр всегда изменяется на 2, даже если команда байтовая
  1613.        ld hx,c
  1614.         cp 0x0e ;TODO pc
  1615.         jr z,$ ;ninza_1 сюда не должен попадать
  1616.         GOOD ;leopol начало
  1617.         ld c,(hl)
  1618.         inc l
  1619.         ld b,(hl)
  1620.         dec bc
  1621.         dec bc
  1622.         ld (hl),b
  1623.         dec l
  1624.         ld (hl),c
  1625. rdmem_bc_to_bc
  1626.         ld a,b
  1627. rdmem_ac_to_bc
  1628.         RDMEM_ac_ret ;bc=result, a=hx
  1629.  
  1630. rdsrc_101
  1631. ;101 @-(Rn) ;всегда -=2
  1632.        ld hx,c
  1633.         cp 0x0e
  1634.         jr z,$;rdsrc_101_pc ;TODO pc
  1635.         UNTESTED
  1636.         ld c,(hl)
  1637.         inc l
  1638.         ld b,(hl)
  1639.         dec bc
  1640.         dec bc
  1641.         ld (hl),b
  1642.         dec l
  1643.         ld (hl),c
  1644.         ld a,b
  1645.         jp rdsrc_addrfromaddr_ac
  1646.  
  1647. rdsrc_110
  1648. ;110 Index: X(Rn): Rn+X is the address of the operand
  1649.        ld hx,c
  1650.         cp 0x0e
  1651.         jr z,rdsrc_110_pc
  1652.         GOOD ;leopol начало
  1653.         get
  1654.         next
  1655.         add a,(hl)
  1656.         ld c,a
  1657.         inc l
  1658.         get
  1659.         next
  1660.         adc a,(hl) ;ac=Rn+X
  1661.         RDMEM_ac_ret ;bc=result, a=hx
  1662. rdsrc_110_pc
  1663.         GOOD ;leopol демо
  1664.         get
  1665.         next
  1666.         ld c,a
  1667.         get
  1668.         next
  1669.         ld b,a
  1670.         decodePC_to_ae
  1671.          ld h,a
  1672.         ld a,c
  1673.         add a,e
  1674.         ld c,a
  1675.         ld a,b
  1676.         adc a,h;d
  1677.         RDMEM_ac_ret ;bc=result, a=hx
  1678.  
  1679. rdsrc_111
  1680. ;111 Index deferred: @X(Rn): Rn+X is the address of the address of the operand
  1681.        ld hx,c
  1682.        cp 0x0e
  1683.        jr z,rdsrc_111_pc
  1684.         GOOD ;klad ;нет в leopol
  1685.         get
  1686.         next
  1687.         add a,(hl)
  1688.         ld c,a
  1689.         inc l
  1690.         get
  1691.         next
  1692.         adc a,(hl) ;ac=Rn+X
  1693.         jp rdsrc_addrfromaddr_ac
  1694. rdsrc_111_pc ;for morf
  1695.         GOOD ;leopol появление мышей2?
  1696.         get
  1697.         next
  1698.         ld c,a
  1699.         get
  1700.         next
  1701.         ld b,a
  1702.         decodePC_to_ae
  1703.         ld h,a
  1704.         ld l,e
  1705.         add hl,bc
  1706.         ld a,h
  1707.         ld c,l ;ac=Rn+X
  1708.         jp rdsrc_addrfromaddr_ac
  1709.  
  1710. ;;;;;;;;;;;;;;;;;;;;;;;
  1711. rdsrc8op
  1712. ;ac=cmd
  1713. ;out: c=sourceop, a=cmdLSB
  1714. ;15-12 Opcode
  1715. ;11-9 Src
  1716. ;8-6 Register
  1717. ;5-3 Dest
  1718. ;2-0 Register
  1719.         ld b,a
  1720.         rra
  1721.         ld a,c
  1722.         rra ;rrr?????
  1723.          rra
  1724.          rra
  1725.          rra
  1726.          rra
  1727. rdsrc8_go
  1728.          and 0x0e
  1729.         ld l,a ;0000rrr0
  1730.         ld h,_R0/256
  1731.          ;ld l,(hl) ;TODO
  1732.  
  1733. ;0n     Register        Rn      The operand is in Rn
  1734. ;1n     Register deferred       (Rn)    Rn contains the address of the operand
  1735. ;2n     Autoincrement   (Rn)+   Rn contains the address of the operand, then increment Rn
  1736. ;3n     Autoincrement deferred  @(Rn)+  Rn contains the address of the address of the operand, then increment Rn by 2
  1737. ;4n     Autodecrement   ?(Rn)   Decrement Rn, then use the result as the address of the operand
  1738. ;5n     Autodecrement deferred  @?(Rn)  Decrement Rn by 2, then use the result as the address of the address of the operand
  1739. ;6n     Index   X(Rn)   Rn+X is the address of the operand
  1740. ;7n     Index deferred  @X(Rn)  Rn+X is the address of the address of the operand
  1741.         bit 1,b
  1742.         jr nz,rdsrc8_xx1
  1743.         bit 2,b
  1744.         jr nz,rdsrc8_x10
  1745.         bit 3,b
  1746.         jp nz,rdsrc8_100
  1747. ;000 Register
  1748.          ld a,c
  1749.         ld c,(hl)
  1750.         ;inc l
  1751.         ;ld b,(hl)
  1752.         ret
  1753.  
  1754. rdsrc8_xx1
  1755.         bit 2,b
  1756.         jp nz,rdsrc8_x11
  1757.         bit 3,b
  1758.         jp nz,rdsrc8_101
  1759. ;001: (Rn)
  1760. rddest8_001 ;(Rn): Rn contains the address of the operand
  1761. rddest8_010 ;(Rn)+ ;инкремент не делаем, чтобы его делал putdest
  1762.        ld hx,c
  1763.        cp 0x0e
  1764.        jr z,rdsrc8_001_pc
  1765.         ld c,(hl)
  1766.         inc l
  1767.         ld a,(hl)
  1768.         RDMEM8_ac_ret ;bc=result
  1769. rdsrc8_001_pc
  1770.         UNTESTED ;GOOD ;bkscope
  1771.         get
  1772.         ld c,a
  1773.        ld a,hx
  1774.         ret
  1775.  
  1776. rdsrc8_x10
  1777.         bit 3,b
  1778.         jp nz,rdsrc8_110
  1779. ;(Rn)+
  1780. ;при адресациях (reg)+ и -(reg), есть особый случай: если регистр -- это r6 или r7, то регистр всегда изменяется на 2, даже если команда байтовая
  1781.        ld hx,c
  1782.         cp 0x0e
  1783.        jr z,rdsrc8_010_pc
  1784.         GOOD ;textshow
  1785.         ld c,(hl)
  1786.       cp 0x0c
  1787.       jr c,$+3 ;для textshow
  1788.          inc (hl) ;sp/pc +=2 ;TODO нечётный?
  1789.         inc (hl)
  1790.         inc hl
  1791.         ld a,(hl)
  1792.         jr nz,$+3
  1793.         inc (hl)
  1794.         RDMEM8_ac_ret ;bc=result, a=hx
  1795. rdsrc8_010_pc
  1796.         GOOD ;dark
  1797.         get
  1798.         next
  1799.         ld c,a
  1800.         next
  1801.        ld a,hx
  1802.         ret
  1803.  
  1804. rdsrc8_x11
  1805.         bit 3,b
  1806.         jp nz,rdsrc8_111
  1807. rdsrc8_011 ;@(Rn)+ ;всегда +=2
  1808.        ld hx,c
  1809.         cp 0x0e
  1810.        jr z,rdsrc8_011_pc
  1811.         UNTESTED
  1812.         ld c,(hl)
  1813.         inc l
  1814.         ld b,(hl)
  1815.        push bc
  1816.       cp 0x0c
  1817.       jr c,$+3 ;не проверяется в textshow!
  1818.          inc bc
  1819.         inc bc
  1820.         ld (hl),b
  1821.         dec l
  1822.         ld (hl),c
  1823.        pop bc
  1824.         ld a,b
  1825. rdsrc8_addrfromaddr_ac
  1826.         ld l,c
  1827.         ld h,a
  1828.         and 0xc0
  1829.         ld c,a
  1830.        ld lx,a
  1831.         ld b,tpgs/256
  1832.         set 7,h
  1833.         set 6,h
  1834.         ld a,(bc)
  1835.         SETPGC000
  1836.         ld c,(hl)
  1837.         inc l
  1838.         call z,inchnextpg
  1839.         ld a,(hl)
  1840.         RDMEM8_ac_ret ;c=result, a=hx
  1841. rdsrc8_011_pc
  1842.         GOOD ;digger
  1843.         get
  1844.         next
  1845.         ld c,a
  1846.         get
  1847.         next
  1848.         RDMEM8_ac_ret ;c=result, a=hx
  1849.  
  1850. rdsrc8_100
  1851. ;100 -(Rn)
  1852. ;при адресациях (reg)+ и -(reg), есть особый случай: если регистр -- это r6 или r7, то регистр всегда изменяется на 2, даже если команда байтовая
  1853.        ld hx,c
  1854.         cp 0x0e
  1855.        jr z,$;rdsrc8_100_pc
  1856.         GOOD ;leopol начало
  1857.         ld c,(hl)
  1858.         inc l
  1859.         ld b,(hl)
  1860.         dec bc
  1861.        cp 0x0c
  1862.        jr c,$+3
  1863.        dec bc ;sp/pc +=2
  1864.         ld (hl),b
  1865.         dec l
  1866.         ld (hl),c
  1867.         ld a,b
  1868.         RDMEM8_ac_ret ;bc=result, a=hx
  1869.  
  1870. rdsrc8_101
  1871. ;101 @-(Rn) ;всегда -=2
  1872.        ld hx,c
  1873.         cp 0x0e
  1874.        jr z,$;rdsrc8_101_pc
  1875.         UNTESTED
  1876.         ld c,(hl)
  1877.         inc l
  1878.         ld b,(hl)
  1879.          dec bc
  1880.         dec bc
  1881.         ld (hl),b
  1882.         dec l
  1883.         ld (hl),c
  1884.         ld a,b
  1885.         jp rdsrc8_addrfromaddr_ac
  1886.  
  1887. rdsrc8_110
  1888. ;110 Index: X(Rn): Rn+X is the address of the operand
  1889.        ld hx,c
  1890.         cp 0x0e
  1891.        jr z,rdsrc8_110_pc
  1892.         GOOD ;cindy2 начало
  1893.         get
  1894.         next
  1895.         add a,(hl)
  1896.         ld c,a
  1897.         inc l
  1898.         get
  1899.         next
  1900.         adc a,(hl) ;ac=Rn+X
  1901.         RDMEM8_ac_ret ;c=result, a=hx
  1902. rdsrc8_110_pc
  1903.         GOOD ;dark
  1904.         get
  1905.         next
  1906.         ld c,a
  1907.         get
  1908.         next
  1909.         ld b,a
  1910.         decodePC_to_ae
  1911.          ld h,a
  1912.         ld a,c
  1913.         add a,e
  1914.         ld c,a
  1915.         ld a,b
  1916.         adc a,h;d
  1917.         RDMEM8_ac_ret ;c=result, a=hx
  1918.  
  1919. rdsrc8_111
  1920. ;111 Index deferred: @X(Rn): Rn+X is the address of the address of the operand
  1921.        ld hx,c
  1922.         cp 0x0e
  1923.        jr z,rdsrc8_111_pc
  1924.         GOOD ;klad
  1925.         get
  1926.         next
  1927.         add a,(hl)
  1928.         ld c,a
  1929.         inc l
  1930.         get
  1931.         next
  1932.         adc a,(hl) ;ac=Rn+X
  1933.         jp rdsrc8_addrfromaddr_ac
  1934. rdsrc8_111_pc ;for morf
  1935.         GOOD ;klad ;pacman
  1936.         get
  1937.         next
  1938.         ld c,a
  1939.         get
  1940.         next
  1941.         ld b,a
  1942.         decodePC_to_ae
  1943.         ld h,a
  1944.         ld l,e
  1945.         add hl,bc
  1946.         ld a,h
  1947.         ld c,l ;ac=Rn+X
  1948.         jp rdsrc8_addrfromaddr_ac
  1949.  
  1950. ;;;;;;;;;;;;;;;;;;;;;;;;
  1951. rdport_c
  1952. ;out: a=hx!!!
  1953.        ;ld b,a
  1954.         ld a,c
  1955. ;FFB0=177660 регистр состояния клавиатуры (Разряд 6 - маска прерываний от клавиатуры. разряд доступен по записи и чтению. "0" - разрешено прерывание от клавиатуры; "1" - запрещено прерывание от клавиатуры. Разряд 7 - флаг состояния клавиатуры. Устанавливается в единицу при поступлении в регистр данных клавиатуры нового кода. Сбрасывается в "0" при чтении регистра данных клавиатуры.)
  1956. ;FFB2=177662 Регистр данных клавиатуры
  1957. ;bit #100,@#177716 (ffce): tapestate, Разряд 6 служит индикатором нажатия клавиши ("лог 0" - клавиша нажата, "лог 1" - клавиша отжата). Используется при реализации режима "повтор".
  1958. ;177714: Регистр порта ввода-вывода
  1959. ;177664 предназначен для указания начала экранного ОЗУ и организации рулонного сдвига экрана. При начальной установке экрана в регистре записывается значение 1330 (0x02d8). Изменение этого значения на 1 приводит к сдвигу изображения на экране по вертикали на 1 точечную строку. Сразу же после включения питания разряд 9 устанавливается в "1". При включении режима расширенной памяти разряд сбрасывается в "0". Разряды 8, 10-15 не используются.
  1960.         cp 0xb0 ;177660
  1961.         jr z,2f ;kbd state
  1962.          cp 0xb4 ;177662
  1963.          jr z,rdport_c_scrshift ;Bubbler
  1964.          cp 0xcc
  1965.          jr z,rdport_c_io ;Клад
  1966.          cp 0xc8 ;177710 ;Таймер работает независимо от работы программы. Содержимое счётчика времени определяется как результат функции PEEK(&O177710) и периодически уменьшается от S0 до 0 (рис. 10).
  1967.          jr z,rdport_c_timer ;kld19nm_bk10
  1968.         cp 0xce ;177716
  1969.         jr z,rdport_c_tapestate
  1970.         cp 0xcf
  1971.         jr z,rdport_c_tapestate_hsb
  1972.          ;cp 0x70 ;В *560м регистре имеются два бита, 6й и 7й. 7 бит *560го регистра устанавливается по reset или если во входной регистр *562 поступил новый байт, а если перед приемом байтов установить в 1 6й бит *560го регистра, то произойдет прерывание с вектором, адрес которого читается из регистра *566
  1973.          ;cp 0x72 ;*562й регистр - буфер приемника, оттуда считывается последний принятый байт, по записи регистр ничего не делает
  1974.          cp 0x74 ;В регистре *564 имеются тоже два бита, 6й и 7й, с тем же назначением, что и у приемника, 7й бит устанавливается в 0, когда процессор пишет байт в буфер передатчика, *566, и устанавливается в 1, когда заканчивается передача, т.е. когда буфер готов к приему следующего байта. Если при установке 7го бита был установлен 6й, то по готовности передатчика возникает прерывание с вектором, на 4 бОльшим, чем считываемое из регистра *566 значение.
  1975.          jr z,rdport_c_testconsole_txstate
  1976.          ;cp 0x76 ;буфер передатчика
  1977.         cp 0xb2
  1978.         jr nz,9f ;no ports
  1979. ;kbd data
  1980. bk_oldkey=$+1
  1981.         ld c,0
  1982. bk_curkey=$+1
  1983.         ld a,0
  1984.         or a
  1985.         jr z,bk_port_getkey_no
  1986.         ld (bk_oldkey),a
  1987.         ld c,a
  1988. bk_port_getkey_no
  1989.         xor a
  1990.         ld (bk_curkey),a ;no message (INT прочитает новую кнопку)
  1991.        ld a,hx
  1992.        ld b,0
  1993.         ret
  1994. 2 ;kbd state
  1995.         ;ld a,(iskeymessage) ;a7=no message
  1996.         ;rra
  1997.        ld a,(bk_curkey)
  1998.        sub 1
  1999.        sbc a,a ;CY=no message
  2000.         and 0x40
  2001.         ld c,a
  2002.        ld a,hx
  2003.        ld b,0
  2004.         ret
  2005. rdport_c_io
  2006.        ld a,hx
  2007.        ld bc,0
  2008.         ret
  2009. rdport_c_scrshift
  2010.        ld a,hx
  2011. bkscroll=$
  2012.        ld bc,0x02d8
  2013.         ret
  2014. 9
  2015. ;TODO прерывание ошибки шины
  2016.         ;jr $ ;бейсик читает ff5a
  2017.        ld a,hx
  2018.         ret
  2019. rdport_c_timer ;kld19nm_bk10
  2020. ;177710 ;Таймер работает независимо от работы программы. Содержимое счётчика времени определяется как результат функции PEEK(&O177710) и периодически уменьшается от S0 до 0 (рис. 10).
  2021. bktimer=$+1
  2022.         ld bc,0
  2023.         dec bc
  2024.         ld (bktimer),bc
  2025.        ld a,hx
  2026.         ret
  2027.  
  2028. rdport_c_testconsole_txstate
  2029. ;В регистре *564 имеются тоже два бита, 6й и 7й, с тем же назначением, что и у приемника, 7й бит устанавливается в 0, когда процессор пишет байт в буфер передатчика, *566, и устанавливается в 1, когда заканчивается передача, т.е. когда буфер готов к приему следующего байта. Если при установке 7го бита был установлен 6й, то по готовности передатчика возникает прерывание с вектором, на 4 бОльшим, чем считываемое из регистра *566 значение.
  2030.        ld bc,0x80 ;ready
  2031.        ld a,hx
  2032.         ret
  2033. rdport_c_tapestate
  2034. ;Разряд 6 служит индикатором нажатия клавиши ("лог 0" - клавиша нажата, "лог 1" - клавиша отжата). Используется при реализации режима "повтор".
  2035. ;labyrinh ждёт в (0xffce) 0x80a0
  2036. iskeypressed=$+1
  2037.         ld a,0;(iskeypressed) ;0=not pressed
  2038.        ;ld a,(bk_curkey) ;не помогает
  2039.         sub 1
  2040.        ;scf ;не помогает (Клад не видит нажатий в игре)
  2041.         sbc a,a ;-1=not pressed
  2042.         and 0x40
  2043.        or 0xa0
  2044.         ld c,a
  2045.        ld a,hx
  2046.        ld b,0x80
  2047.         ret
  2048. rdport_c_tapestate_hsb ;for morf
  2049.        ld a,hx
  2050.        ld bc,0x0080
  2051.         ret
  2052.  
  2053. buserror
  2054. ;из rdmem
  2055. JMPer_error
  2056.         ld sp,STACK
  2057. ;TRAP to 4
  2058.         call getflags_bc
  2059.         putmemspBC
  2060.         decodePC_to_ae
  2061.         ld b,a
  2062.         ld c,e
  2063.         putmemspBC
  2064.         ld bc,0x06
  2065.         call rdmem_bc_to_bc
  2066.         call makeflags_frombc
  2067.         ld bc,0x04
  2068.         call rdmem_bc_to_bc
  2069.         ld d,b
  2070.         ld e,c
  2071.        _LoopC_JP
  2072.  
  2073. wrongcmd
  2074.         ld sp,STACK
  2075. ;TRAP to 10
  2076.         call getflags_bc
  2077.         putmemspBC
  2078.         decodePC_to_ae
  2079.         ld b,a
  2080.         ld c,e
  2081.         putmemspBC
  2082.         ld bc,0x0a
  2083.         call rdmem_bc_to_bc
  2084.         call makeflags_frombc
  2085.         ld bc,0x08
  2086.         call rdmem_bc_to_bc
  2087.         ld d,b
  2088.         ld e,c
  2089.        _LoopC_JP
  2090.  
  2091.  
  2092. cls_bk
  2093.         ld a,(tpgs+0x40)
  2094.        ;jp clpga
  2095. clpga
  2096.         ld e,0
  2097. clpga_e
  2098.         SETPGC000
  2099.         ld hl,0xc000
  2100.        ld a,e
  2101.         ld d,h
  2102.         ld e,l
  2103.         inc e
  2104.         ld bc,0x3fff
  2105.        ld (hl),a;0
  2106.         ldir
  2107.         ret
  2108.  
  2109.         include "bkcmd.asm"
  2110.  
  2111.         align 256
  2112. tpgs
  2113.         ds 256 ;%10765432
  2114.  
  2115.         align 256
  2116. tmirror
  2117. tleftpixels
  2118.        dup 256
  2119. _7=$&0x80
  2120. _6=$&0x40
  2121. _5=$&0x20
  2122. _4=$&0x10
  2123. _3=$&0x08
  2124. _2=$&0x04
  2125. _1=$&0x02
  2126. _0=$&0x01
  2127.         db (_7>>7)+(_6>>5)+(_5>>3)+(_4>>1)+(_3<<1)+(_2<<3)+(_1<<5)+(_0<<7)
  2128.        edup
  2129.  
  2130.         align 256
  2131. ty
  2132. __=0
  2133.         dup 32
  2134.         dup 8
  2135. _=__-8 ;логический номер строки БК
  2136.        if (_<0)
  2137. _=200
  2138.        endif
  2139.        if (_>200)
  2140. _=200
  2141.        endif
  2142.        if ($&7)==0
  2143. _=200
  2144.        endif
  2145.         db 0xff&(_*40+4)
  2146.        if ($&7)
  2147. __=__+1
  2148.        endif
  2149.         edup
  2150.         edup
  2151. __=0
  2152.         dup 32
  2153.         dup 8
  2154. _=__-8 ;логический номер строки БК
  2155.        if (_<0)
  2156. _=200
  2157.        endif
  2158.        if (_>200)
  2159. _=200
  2160.        endif
  2161.        if ($&7)==0
  2162. _=200
  2163.        endif
  2164.         db (_*40+4)/256+0x80
  2165.        if ($&7)
  2166. __=__+1
  2167.        endif
  2168.         edup
  2169.         edup
  2170.  
  2171.  
  2172.         align 256
  2173. ;8 r16s
  2174. _R0
  2175.         dw 0
  2176. _R1
  2177.         dw 0
  2178. _R2
  2179.         dw 0
  2180. _R3
  2181.         dw 0
  2182. _R4
  2183.         dw 0
  2184. _R5
  2185.         dw 0
  2186. _R6
  2187. _SP
  2188.         dw 0
  2189. _R7
  2190.         dw 0
  2191.  
  2192. pc_high
  2193.         db 0
  2194. iff1
  2195.         db 0
  2196. pgprog
  2197.         db 0 ;там можно хранить дополнительный код (напр., отладчик)
  2198. oldimer
  2199.         jp on_int
  2200.         jp 0x0038+3
  2201.  
  2202. print_bc_to_log
  2203. print_bc_to_log_addr=$+1
  2204.         ld hl,log
  2205.         ld (hl),c
  2206.         inc l
  2207.         ld (print_bc_to_log_addr),hl
  2208.         ret
  2209.  
  2210.         align 256
  2211. log
  2212.         ds 256
  2213.  
  2214.         align 256
  2215.         include "bktable.asm"
  2216.  
  2217.        if DEBUG
  2218.        align 256
  2219. oldpc
  2220.         ;dw 0
  2221.         ds 256
  2222.        endif
  2223.  
  2224. font
  2225.         incbin "866_code.fnt"
  2226.         display "tkoi=",$
  2227. tkoi
  2228.         dup 0xc0
  2229.         db $&0xff
  2230.         edup
  2231.         db "юабцдефгхийклмнопярстужвьызшэщч "
  2232.         db "ЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧ "
  2233.  
  2234. ;генерируется для textmode
  2235.         align 256
  2236. ttextaddr
  2237.         ds 128
  2238.  
  2239.         display "killable=",$
  2240. ;killable
  2241.  
  2242.         display "lowend=",$
  2243.         ds 0x3fc0-$
  2244.         ds 0x4000-$
  2245.         include "ints.asm"
  2246.         include "keyscan.asm"
  2247.         display "end=",$
  2248. end
  2249.  
  2250.         savebin "bk.com",begin,end-begin
  2251.  
  2252.         LABELSLIST "../../us/user.l",1
  2253.