?login_element?

Subversion Repositories NedoOS

Rev

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

  1. ;PC=0x4000...
  2. ;SP=0x8000...
  3. ;data=0xC000...
  4.  
  5.        macro UNTESTED
  6.        if DEBUG
  7.         jr $
  8.        endif
  9.        endm
  10.  
  11.        macro GOOD
  12.        endm
  13.  
  14.      macro DISABLE_IFF0_KEEP_IY ;иначе pop iy запорет iy от обработчика прерывания
  15.         call disable_iff0_keep_iy
  16.      endm
  17.      macro ENABLE_IFF0_REMEMBER_IY ;иначе pop iy запорет iy от обработчика прерывания
  18.         call enable_iff0_remember_iy
  19.      endm
  20.  
  21.  
  22.         MACRO _Loop_
  23.         JP (IY) ;EMULOOP (нужный marg или нужный обработчик b/p)
  24.         ENDM
  25.  
  26. ;если вместо стр.команд включили др.стр.
  27.         MACRO _LoopC
  28.         ;OUTcom
  29.         JP (IY)
  30.         ENDM
  31.  
  32. ;если резко сменился PC (полный DE)
  33.         MACRO _LoopJP
  34.         encodePC;CALCiypgcom
  35.         JP (IY)
  36.         ENDM
  37.  
  38. ;если выключили др.стр. и резко сменился PC (полный DE)
  39.         MACRO _LoopC_JP
  40.         encodePC;CALCiypgcom
  41.         JP (IY)
  42.         ENDM
  43.  
  44. ;если IN/OUT (могла измениться конфигурация памяти)
  45.         MACRO _LoopSWI
  46.         ;CALCpgcom
  47.         JP (IY)
  48.         ENDM
  49.  
  50.         macro decodePC ;de,pc_high -> de
  51.         ld a,(pc_high)
  52.         xor d
  53.         and 0xc0
  54.         xor d
  55.         ld d,a
  56.         endm
  57.  
  58.         macro decodePC_to_ae ;de,pc_high -> ae
  59.         ld a,(pc_high)
  60.         xor d
  61.         and 0xc0
  62.         xor d
  63.         endm
  64.  
  65.         macro encodePC_AisD
  66.        ld (pc_high),a
  67.        and 0xc0
  68.         ld c,a
  69.         ld b,tpgs/256
  70.         res 7,d
  71.         set 6,d
  72.         ld a,(bc)
  73.         SETPG4000
  74.         ld a,0xaa
  75.         ld (oddpc),a ;even, for for jp pc; TODO jp oddaddr?
  76.         endm
  77.  
  78.         macro encodePC
  79.        ld a,d
  80.        encodePC_AisD
  81.         endm
  82.  
  83.         macro get
  84.         ld a,(de)
  85.         endm
  86.  
  87.         macro next
  88.         inc e
  89.         call z,recountpc_inc ;keep CY!
  90.         endm
  91.  
  92.         macro getHL
  93.         get
  94.         next
  95.         ld l,a
  96.         get
  97.         next
  98.         ld h,a
  99.         endm
  100.  
  101.         macro getBC
  102.         get
  103.         next
  104.         ld c,a
  105.         get
  106.         next
  107.         ld b,a
  108.         endm
  109.  
  110.        macro putmemspBC
  111.        push bc
  112.         ld hl,(_SP)
  113.         dec hl
  114.         dec hl
  115.         ld (_SP),hl
  116.        res 0,l ;for cputest
  117.         ld a,h
  118.         and 0xc0
  119.         ld c,a
  120.         ld b,tpgs/256
  121.         set 7,h
  122.         set 6,h
  123.         ld a,(bc)
  124.         SETPGC000
  125.        pop bc
  126.         ld (hl),c
  127.         inc l
  128.         call z,recountsp_inc
  129.         ld (hl),b
  130.        endm
  131.  
  132.        macro getmemspBC
  133.         call getmemspBCpp
  134.        endm
  135.  
  136. ;c=cmdLSB
  137.        macro GETDEST_cmdc
  138.         ld a,c
  139.         call getdest_aisc
  140.        endm ;bc=dest, a=cmdLSB
  141.  
  142. ;a=cmdLSB
  143.        macro GETDEST_cmda
  144.         ld c,a
  145.         call getdest_aisc
  146.        endm ;bc=dest, a=cmdLSB
  147.  
  148. ;c=cmdLSB
  149.        macro GETDEST_cmdc_autoinc
  150.         ld a,c
  151.         call getdest_aisc_autoinc
  152.        endm ;bc=dest, a=cmdLSB
  153.  
  154. ;a=cmdLSB
  155.        macro GETDEST_cmda_autoinc
  156.         ld c,a
  157.         call getdest_aisc_autoinc
  158.        endm ;bc=dest, a=cmdLSB
  159.  
  160. ;c=cmdLSB
  161.        macro GETDEST8_cmdc
  162.         ld a,c
  163.         call getdest8_aisc
  164.        endm ;c=dest, a=cmdLSB
  165.  
  166. ;a=cmdLSB
  167.        macro GETDEST8_cmda
  168.         ld c,a
  169.         call getdest8_aisc
  170.        endm ;c=dest, a=cmdLSB
  171.  
  172. ;c=cmdLSB
  173.        macro GETDEST8_cmdc_autoinc
  174.         ld a,c
  175.         call getdest8_aisc_autoinc
  176.        endm ;c=dest, a=cmdLSB
  177.  
  178. ;a=cmdLSB
  179.        macro GETDEST8_cmda_autoinc
  180.         ld c,a
  181.         call getdest8_aisc_autoinc
  182.        endm ;c=dest, a=cmdLSB
  183.  
  184. ;bc=data, a=cmdLSB
  185.        macro PUTDEST_Loop
  186.         jp putdest_Loop
  187.        endm
  188.  
  189. ;c=data, a=cmdLSB
  190.        macro PUTDEST8_Loop
  191.         jp putdest8_Loop
  192.        endm
  193.  
  194. ;hl=addr, bc=data
  195.        macro WRMEM_hl_LoopC
  196.        res 0,l ;16-bit write always at even addr
  197.         ld a,h
  198.         and 0xc0
  199.        jp m,2f ;ROM/ports
  200.        push bc
  201.         ld c,a
  202.        ;ld lx,a
  203.         ld b,tpgs/256
  204.         set 7,h
  205.         set 6,h
  206.        cp 0x40
  207.        jr z,1f ;screen
  208.       if DEBUGWR
  209.       ld a,h
  210.       cp 0xc1 ;stack
  211.       jr c,$
  212.       endif
  213.         ld a,(bc)
  214.         SETPGC000
  215.        pop bc
  216.         ld (hl),c
  217.         inc l
  218.         ;call z,inchnextpg
  219.         ld (hl),b
  220.         _LoopC
  221. 1 ;screen
  222.         ld a,(bc)
  223.         SETPGC000
  224.        pop bc
  225.         ld (hl),c
  226.         call putscreen_c
  227.         inc l
  228.         ;jr z,3f;screen inchnextpg
  229. ;5
  230.         ld (hl),b
  231.         ld c,b
  232.         call putscreen_c
  233.         _LoopC
  234. ;3
  235. ;        inc h
  236. ;        jr nz,5b
  237. ;screen nextpg = ROM
  238. ;        ;call hlnextpg
  239. ;        _LoopC
  240. 2 ;ROM/ports
  241.       if 1
  242.        inc h
  243.        jp nz,wrmemrom_LoopC ;no ports
  244. ;FFB0=177660 регистр состояния клавиатуры (Разряд 6 - маска прерываний от клавиатуры. разряд доступен по записи и чтению. “0” - разрешено прерывание от клавиатуры; “1” - запрещено прерывание от клавиатуры. Разряд 7 - флаг состояния клавиатуры. Устанавливается в единицу при поступлении в регистр данных клавиатуры нового кода. Сбрасывается в “0” при чтении регистра данных клавиатуры.)
  245. ;FFB2=177662 Регистр данных клавиатуры
  246. ;177664 предназначен для указания начала экранного ОЗУ и организации рулонного сдвига экрана. При начальной установке экрана в регистре записывается значение 1330 (0x02d8). Изменение этого значения на 1 приводит к сдвигу изображения на экране по вертикали на 1 точечную строку. Сразу же после включения питания разряд 9 устанавливается в "1". При включении режима расширенной памяти разряд сбрасывается в "0". Разряды 8, 10-15 не используются.
  247.         ld a,l
  248.         cp 0xb0
  249.         jr z,9f ;kbd state ;TODO сюда пишет labyrinh, потом ждёт в (0xffce) 0x80a0
  250.         cp 0xb2
  251.         jr z,9f ;kbd data
  252.         cp 0xb4
  253.         jr z,8f ;scroll
  254.         cp 0x76 ;буфер передатчика
  255.         ;jr nz,9f ;no ports
  256.         call z,print_bc_to_log
  257.       endif
  258. 9
  259.         _LoopC
  260. 8
  261.         ld (bkscroll),bc
  262.         _LoopC
  263.        endm
  264.  
  265. ;hl=addr, c=data
  266.        macro WRMEM8_hl_LoopC
  267.         ld a,h
  268.         and 0xc0
  269.        jp m,2f ;ROM/ports
  270.        push bc
  271.         ld c,a
  272.        ld lx,a
  273.         ld b,tpgs/256
  274.         set 7,h
  275.         set 6,h
  276.        cp 0x40
  277.        jr z,1f ;screen
  278.         ld a,(bc)
  279.         SETPGC000
  280.        pop bc
  281.         ld (hl),c
  282.         _LoopC
  283. 1 ;screen
  284.         ld a,(bc)
  285.         SETPGC000
  286.        pop bc
  287.         ld (hl),c
  288.         call putscreen_c
  289.         _LoopC
  290. 2 ;ROM/ports
  291.        inc h
  292.        jp nz,wrmemrom_LoopC ;no ports
  293. ;TODO ports
  294.         _LoopC
  295.        endm
  296.  
  297.        macro RDMEM_ac_ret ;bc=result, a=hx
  298.         ld h,a
  299.        res 0,c ;16-bit read always at even addr
  300.        cp 0xff
  301.        jp z,rdport_c
  302.       if BASIC == 0
  303.        cp 0xa0
  304.        jp nc,buserror
  305.       endif
  306.         ld l,c
  307.         and 0xc0
  308.         ld c,a
  309.        ;ld lx,a ;for nextpg
  310.         ld b,tpgs/256
  311.         set 7,h
  312.         set 6,h
  313.         ld a,(bc)
  314.         SETPGC000
  315.        ld a,hx
  316.         ld c,(hl)
  317.         inc l
  318.         ld b,(hl)
  319.         ;ret nz
  320.         ;inc h
  321.         ;call z,hlnextpg
  322.         ;ld b,(hl)
  323.         ret
  324.        endm
  325.  
  326.        macro RDMEM8_ac_ret ;c=result, a=hx
  327.         ld h,a
  328.        cp 0xff
  329.        jp z,rdport_c
  330.       if BASIC == 0
  331.        cp 0xa0
  332.        jp nc,buserror
  333.       endif
  334.         ld l,c
  335.         and 0xc0
  336.         ld c,a
  337.        ;ld lx,a ;for nextpg
  338.         ld b,tpgs/256
  339.         set 7,h
  340.         set 6,h
  341.         ld a,(bc)
  342.         SETPGC000
  343.        ld a,hx
  344.         ld c,(hl)
  345.         ret
  346.        endm
  347.