Login

Subversion Repositories NedoOS

Rev

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

;PC=0x4000...
;SP=0x8000...
;data=0xC000...

       macro UNTESTED
       if DEBUG
        jr $
       endif
       endm

       macro GOOD
       endm

     macro DISABLE_IFF0_KEEP_IY ;╨╕╨╜╨░╤З╨╡ pop iy ╨╖╨░╨┐╨╛╤А╨╡╤В iy ╨╛╤В ╨╛╨▒╤А╨░╨▒╨╛╤В╤З╨╕╨║╨░ ╨┐╤А╨╡╤А╤Л╨▓╨░╨╜╨╕╤П
        call disable_iff0_keep_iy
     endm
     macro ENABLE_IFF0_REMEMBER_IY ;╨╕╨╜╨░╤З╨╡ pop iy ╨╖╨░╨┐╨╛╤А╨╡╤В iy ╨╛╤В ╨╛╨▒╤А╨░╨▒╨╛╤В╤З╨╕╨║╨░ ╨┐╤А╨╡╤А╤Л╨▓╨░╨╜╨╕╤П
        call enable_iff0_remember_iy
     endm


        MACRO _Loop_
        JP (IY) ;EMULOOP (╨╜╤Г╨╢╨╜╤Л╨╣ marg ╨╕╨╗╨╕ ╨╜╤Г╨╢╨╜╤Л╨╣ ╨╛╨▒╤А╨░╨▒╨╛╤В╤З╨╕╨║ b/p)
        ENDM

;╨╡╤Б╨╗╨╕ ╨▓╨╝╨╡╤Б╤В╨╛ ╤Б╤В╤А.╨║╨╛╨╝╨░╨╜╨┤ ╨▓╨║╨╗╤О╤З╨╕╨╗╨╕ ╨┤╤А.╤Б╤В╤А.
        MACRO _LoopC
        ;OUTcom
        JP (IY)
        ENDM

;╨╡╤Б╨╗╨╕ ╤А╨╡╨╖╨║╨╛ ╤Б╨╝╨╡╨╜╨╕╨╗╤Б╤П PC (╨┐╨╛╨╗╨╜╤Л╨╣ DE)
        MACRO _LoopJP
        encodePC;CALCiypgcom
        JP (IY)
        ENDM

;╨╡╤Б╨╗╨╕ ╨▓╤Л╨║╨╗╤О╤З╨╕╨╗╨╕ ╨┤╤А.╤Б╤В╤А. ╨╕ ╤А╨╡╨╖╨║╨╛ ╤Б╨╝╨╡╨╜╨╕╨╗╤Б╤П PC (╨┐╨╛╨╗╨╜╤Л╨╣ DE)
        MACRO _LoopC_JP
        encodePC;CALCiypgcom
        JP (IY)
        ENDM

;╨╡╤Б╨╗╨╕ IN/OUT (╨╝╨╛╨│╨╗╨░ ╨╕╨╖╨╝╨╡╨╜╨╕╤В╤М╤Б╤П ╨║╨╛╨╜╤Д╨╕╨│╤Г╤А╨░╤Ж╨╕╤П ╨┐╨░╨╝╤П╤В╨╕)
        MACRO _LoopSWI
        ;CALCpgcom
        JP (IY)
        ENDM

        macro decodePC ;de,pc_high -> de
        ld a,(pc_high)
        xor d
        and 0xc0
        xor d
        ld d,a
        endm

        macro decodePC_to_ae ;de,pc_high -> ae
        ld a,(pc_high)
        xor d
        and 0xc0
        xor d
        endm

        macro encodePC_AisD
       ld (pc_high),a
       and 0xc0
        ld c,a
        ld b,tpgs/256
        res 7,d
        set 6,d
        ld a,(bc)
        SETPG4000
        ld a,0xaa
        ld (oddpc),a ;even, for for jp pc; TODO jp oddaddr?
        endm

        macro encodePC
       ld a,d
       encodePC_AisD
        endm

        macro get
        ld a,(de)
        endm

        macro next
        inc e
        call z,recountpc_inc ;keep CY!
        endm

        macro getHL
        get
        next
        ld l,a
        get
        next
        ld h,a
        endm

        macro getBC
        get
        next
        ld c,a
        get
        next
        ld b,a
        endm

       macro putmemspBC
       push bc
        ld hl,(_SP)
        dec hl
        dec hl
        ld (_SP),hl
       res 0,l ;for cputest
        ld a,h
        and 0xc0
        ld c,a
        ld b,tpgs/256
        set 7,h
        set 6,h
        ld a,(bc)
        SETPGC000
       pop bc
        ld (hl),c
        inc l
        call z,recountsp_inc
        ld (hl),b
       endm

       macro getmemspBC
        call getmemspBCpp
       endm

;c=cmdLSB
       macro GETDEST_cmdc
        ld a,c
        call getdest_aisc
       endm ;bc=dest, a=cmdLSB

;a=cmdLSB
       macro GETDEST_cmda
        ld c,a
        call getdest_aisc
       endm ;bc=dest, a=cmdLSB

;c=cmdLSB
       macro GETDEST_cmdc_autoinc
        ld a,c
        call getdest_aisc_autoinc
       endm ;bc=dest, a=cmdLSB

;a=cmdLSB
       macro GETDEST_cmda_autoinc
        ld c,a
        call getdest_aisc_autoinc
       endm ;bc=dest, a=cmdLSB

;c=cmdLSB
       macro GETDEST8_cmdc
        ld a,c
        call getdest8_aisc
       endm ;c=dest, a=cmdLSB

;a=cmdLSB
       macro GETDEST8_cmda
        ld c,a
        call getdest8_aisc
       endm ;c=dest, a=cmdLSB

;c=cmdLSB
       macro GETDEST8_cmdc_autoinc
        ld a,c
        call getdest8_aisc_autoinc
       endm ;c=dest, a=cmdLSB

;a=cmdLSB
       macro GETDEST8_cmda_autoinc
        ld c,a
        call getdest8_aisc_autoinc
       endm ;c=dest, a=cmdLSB

;bc=data, a=cmdLSB
       macro PUTDEST_Loop
        jp putdest_Loop
       endm

;c=data, a=cmdLSB
       macro PUTDEST8_Loop
        jp putdest8_Loop
       endm

;hl=addr, bc=data
       macro WRMEM_hl_LoopC
       res 0,l ;16-bit write always at even addr
        ld a,h
        and 0xc0
       jp m,2f ;ROM/ports
       push bc
        ld c,a
       ;ld lx,a
        ld b,tpgs/256
        set 7,h
        set 6,h
       cp 0x40
       jr z,1f ;screen
      if DEBUGWR
      ld a,h
      cp 0xc1 ;stack
      jr c,$
      endif
        ld a,(bc)
        SETPGC000
       pop bc
        ld (hl),c
        inc l
        ;call z,inchnextpg
        ld (hl),b
        _LoopC
1 ;screen
        ld a,(bc)
        SETPGC000
       pop bc
        ld (hl),c
        call putscreen_c
        inc l
        ;jr z,3f;screen inchnextpg
;5
        ld (hl),b
        ld c,b
        call putscreen_c
        _LoopC
;3
;        inc h
;        jr nz,5b
;screen nextpg = ROM
;        ;call hlnextpg
;        _LoopC
2 ;ROM/ports
      if 1
       inc h
       jp nz,wrmemrom_LoopC ;no ports
;FFB0=177660 ╤А╨╡╨│╨╕╤Б╤В╤А ╤Б╨╛╤Б╤В╨╛╤П╨╜╨╕╤П ╨║╨╗╨░╨▓╨╕╨░╤В╤Г╤А╤Л (╨а╨░╨╖╤А╤П╨┤ 6 - ╨╝╨░╤Б╨║╨░ ╨┐╤А╨╡╤А╤Л╨▓╨░╨╜╨╕╨╣ ╨╛╤В ╨║╨╗╨░╨▓╨╕╨░╤В╤Г╤А╤Л. ╤А╨░╨╖╤А╤П╨┤ ╨┤╨╛╤Б╤В╤Г╨┐╨╡╨╜ ╨┐╨╛ ╨╖╨░╨┐╨╕╤Б╨╕ ╨╕ ╤З╤В╨╡╨╜╨╕╤О. тАЬ0тАЭ - ╤А╨░╨╖╤А╨╡╤И╨╡╨╜╨╛ ╨┐╤А╨╡╤А╤Л╨▓╨░╨╜╨╕╨╡ ╨╛╤В ╨║╨╗╨░╨▓╨╕╨░╤В╤Г╤А╤Л; тАЬ1тАЭ - ╨╖╨░╨┐╤А╨╡╤Й╨╡╨╜╨╛ ╨┐╤А╨╡╤А╤Л╨▓╨░╨╜╨╕╨╡ ╨╛╤В ╨║╨╗╨░╨▓╨╕╨░╤В╤Г╤А╤Л. ╨а╨░╨╖╤А╤П╨┤ 7 - ╤Д╨╗╨░╨│ ╤Б╨╛╤Б╤В╨╛╤П╨╜╨╕╤П ╨║╨╗╨░╨▓╨╕╨░╤В╤Г╤А╤Л. ╨г╤Б╤В╨░╨╜╨░╨▓╨╗╨╕╨▓╨░╨╡╤В╤Б╤П ╨▓ ╨╡╨┤╨╕╨╜╨╕╤Ж╤Г ╨┐╤А╨╕ ╨┐╨╛╤Б╤В╤Г╨┐╨╗╨╡╨╜╨╕╨╕ ╨▓ ╤А╨╡╨│╨╕╤Б╤В╤А ╨┤╨░╨╜╨╜╤Л╤Е ╨║╨╗╨░╨▓╨╕╨░╤В╤Г╤А╤Л ╨╜╨╛╨▓╨╛╨│╨╛ ╨║╨╛╨┤╨░. ╨б╨▒╤А╨░╤Б╤Л╨▓╨░╨╡╤В╤Б╤П ╨▓ тАЬ0тАЭ ╨┐╤А╨╕ ╤З╤В╨╡╨╜╨╕╨╕ ╤А╨╡╨│╨╕╤Б╤В╤А╨░ ╨┤╨░╨╜╨╜╤Л╤Е ╨║╨╗╨░╨▓╨╕╨░╤В╤Г╤А╤Л.)
;FFB2=177662 ╨а╨╡╨│╨╕╤Б╤В╤А ╨┤╨░╨╜╨╜╤Л╤Е ╨║╨╗╨░╨▓╨╕╨░╤В╤Г╤А╤Л
;177664 ╨┐╤А╨╡╨┤╨╜╨░╨╖╨╜╨░╤З╨╡╨╜ ╨┤╨╗╤П ╤Г╨║╨░╨╖╨░╨╜╨╕╤П ╨╜╨░╤З╨░╨╗╨░ ╤Н╨║╤А╨░╨╜╨╜╨╛╨│╨╛ ╨Ю╨Ч╨г ╨╕ ╨╛╤А╨│╨░╨╜╨╕╨╖╨░╤Ж╨╕╨╕ ╤А╤Г╨╗╨╛╨╜╨╜╨╛╨│╨╛ ╤Б╨┤╨▓╨╕╨│╨░ ╤Н╨║╤А╨░╨╜╨░. ╨Я╤А╨╕ ╨╜╨░╤З╨░╨╗╤М╨╜╨╛╨╣ ╤Г╤Б╤В╨░╨╜╨╛╨▓╨║╨╡ ╤Н╨║╤А╨░╨╜╨░ ╨▓ ╤А╨╡╨│╨╕╤Б╤В╤А╨╡ ╨╖╨░╨┐╨╕╤Б╤Л╨▓╨░╨╡╤В╤Б╤П ╨╖╨╜╨░╤З╨╡╨╜╨╕╨╡ 1330 (0x02d8). ╨Ш╨╖╨╝╨╡╨╜╨╡╨╜╨╕╨╡ ╤Н╤В╨╛╨│╨╛ ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П ╨╜╨░ 1 ╨┐╤А╨╕╨▓╨╛╨┤╨╕╤В ╨║ ╤Б╨┤╨▓╨╕╨│╤Г ╨╕╨╖╨╛╨▒╤А╨░╨╢╨╡╨╜╨╕╤П ╨╜╨░ ╤Н╨║╤А╨░╨╜╨╡ ╨┐╨╛ ╨▓╨╡╤А╤В╨╕╨║╨░╨╗╨╕ ╨╜╨░ 1 ╤В╨╛╤З╨╡╤З╨╜╤Г╤О ╤Б╤В╤А╨╛╨║╤Г. ╨б╤А╨░╨╖╤Г ╨╢╨╡ ╨┐╨╛╤Б╨╗╨╡ ╨▓╨║╨╗╤О╤З╨╡╨╜╨╕╤П ╨┐╨╕╤В╨░╨╜╨╕╤П ╤А╨░╨╖╤А╤П╨┤ 9 ╤Г╤Б╤В╨░╨╜╨░╨▓╨╗╨╕╨▓╨░╨╡╤В╤Б╤П ╨▓ "1". ╨Я╤А╨╕ ╨▓╨║╨╗╤О╤З╨╡╨╜╨╕╨╕ ╤А╨╡╨╢╨╕╨╝╨░ ╤А╨░╤Б╤И╨╕╤А╨╡╨╜╨╜╨╛╨╣ ╨┐╨░╨╝╤П╤В╨╕ ╤А╨░╨╖╤А╤П╨┤ ╤Б╨▒╤А╨░╤Б╤Л╨▓╨░╨╡╤В╤Б╤П ╨▓ "0". ╨а╨░╨╖╤А╤П╨┤╤Л 8, 10-15 ╨╜╨╡ ╨╕╤Б╨┐╨╛╨╗╤М╨╖╤Г╤О╤В╤Б╤П.
        ld a,l
        cp 0xb0
        jr z,9f ;kbd state ;TODO ╤Б╤О╨┤╨░ ╨┐╨╕╤И╨╡╤В labyrinh, ╨┐╨╛╤В╨╛╨╝ ╨╢╨┤╤С╤В ╨▓ (0xffce) 0x80a0
        cp 0xb2
        jr z,9f ;kbd data
        cp 0xb4
        jr z,8f ;scroll
        cp 0x76 ;╨▒╤Г╤Д╨╡╤А ╨┐╨╡╤А╨╡╨┤╨░╤В╤З╨╕╨║╨░
        ;jr nz,9f ;no ports
        call z,print_bc_to_log
      endif
9
        _LoopC
8
        ld (bkscroll),bc
        _LoopC
       endm

;hl=addr, c=data
       macro WRMEM8_hl_LoopC
        ld a,h
        and 0xc0
       jp m,2f ;ROM/ports
       push bc
        ld c,a
       ld lx,a
        ld b,tpgs/256
        set 7,h
        set 6,h
       cp 0x40
       jr z,1f ;screen
        ld a,(bc)
        SETPGC000
       pop bc
        ld (hl),c
        _LoopC
1 ;screen
        ld a,(bc)
        SETPGC000
       pop bc
        ld (hl),c
        call putscreen_c
        _LoopC
2 ;ROM/ports
       inc h
       jp nz,wrmemrom_LoopC ;no ports
;TODO ports
        _LoopC
       endm

       macro RDMEM_ac_ret ;bc=result, a=hx
        ld h,a
       res 0,c ;16-bit read always at even addr
       cp 0xff
       jp z,rdport_c
      if BASIC == 0
       cp 0xa0
       jp nc,buserror
      endif
        ld l,c
        and 0xc0
        ld c,a
       ;ld lx,a ;for nextpg
        ld b,tpgs/256
        set 7,h
        set 6,h
        ld a,(bc)
        SETPGC000
       ld a,hx
        ld c,(hl)
        inc l
        ld b,(hl)
        ;ret nz
        ;inc h
        ;call z,hlnextpg
        ;ld b,(hl)
        ret
       endm

       macro RDMEM8_ac_ret ;c=result, a=hx
        ld h,a
       cp 0xff
       jp z,rdport_c
      if BASIC == 0
       cp 0xa0
       jp nc,buserror
      endif
        ld l,c
        and 0xc0
        ld c,a
       ;ld lx,a ;for nextpg
        ld b,tpgs/256
        set 7,h
        set 6,h
        ld a,(bc)
        SETPGC000
       ld a,hx
        ld c,(hl)
        ret
       endm