You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

143 lines
4.7 KiB

;
;==================================================================================================
; HELPER MACROS FOR TARGETING EZ80 CPU INSTRUCTIONS
;==================================================================================================
;
; EMIT PREFIX REQUIRED BY EZ80 TO ENSURE CORRECT 16 BIT IO OPERATION
;
#IF (CPUFAM == CPU_EZ80)
; RST.L $08
#DEFINE EZ80_IO .DB $49, $CF
; RST.L $10
#DEFINE EZ80_FN .DB $49, $D7
; RST.L $18
#DEFINE EZ80_DELAY .DB $49, $DF
#DEFINE EZ80_UTIL_VER_EXCH XOR A \ LD B, 0 \ EZ80_FN
#DEFINE EZ80_UTIL_DELAY XOR A \ LD B, 1 \ EZ80_FN
#DEFINE EZ80_UTIL_SET_BUSTM XOR A \ LD B, 3 \ EZ80_FN
#DEFINE EZ80_UTIL_SET_BUSFQ XOR A \ LD B, 4 \ EZ80_FN
#DEFINE EZ80_UTIL_GET_CPU_FQ XOR A \ LD B, 5 \ EZ80_FN
#DEFINE EZ80_UTIL_DEBUG XOR A \ LD B, 7 \ EZ80_FN
#DEFINE EZ80_UTIL_MEMTM_SET XOR A \ LD B, 8 \ EZ80_FN
#DEFINE EZ80_UTIL_IOTM_SET XOR A \ LD B, 9 \ EZ80_FN
#DEFINE EZ80_UTIL_MEMTM_GET XOR A \ LD B, 10 \ EZ80_FN
#DEFINE EZ80_UTIL_IOTM_GET XOR A \ LD B, 11 \ EZ80_FN
#DEFINE EZ80_UTIL_MEMTMFQ_SET XOR A \ LD B, 12 \ EZ80_FN
#DEFINE EZ80_UTIL_IOTMFQ_SET XOR A \ LD B, 13 \ EZ80_FN
#DEFINE EZ80_UTIL_FLSHWS_SET XOR A \ LD B, 14 \ EZ80_FN
#DEFINE EZ80_UTIL_FLSHWS_GET XOR A \ LD B, 15 \ EZ80_FN
#DEFINE EZ80_UTIL_FLSHFQ_SET XOR A \ LD B, 16 \ EZ80_FN
#DEFINE EZ80_RTC_INIT LD A, 1 \ LD B, 0 \ EZ80_FN
#DEFINE EZ80_RTC_GET_TIME LD A, 1 \ LD B, 1 \ EZ80_FN
#DEFINE EZ80_RTC_SET_TIME LD A, 1 \ LD B, 2 \ EZ80_FN
#DEFINE EZ80_TMR_GET_TICKS LD A, 2 \ LD B, 0 \ EZ80_FN
#DEFINE EZ80_TMR_GET_SECONDS LD A, 2 \ LD B, 1 \ EZ80_FN
#DEFINE EZ80_TMR_SET_TICKS LD A, 2 \ LD B, 2 \ EZ80_FN
#DEFINE EZ80_TMR_SET_SECONDS LD A, 2 \ LD B, 3 \ EZ80_FN
#DEFINE EZ80_TMR_GET_FREQTICK LD A, 2 \ LD B, 4 \ EZ80_FN
#DEFINE EZ80_TMR_SET_FREQTICK LD A, 2 \ LD B, 5 \ EZ80_FN
#DEFINE EZ80_TMR_THROTTLE_START LD A, 2 \ LD B, 6 \ EZ80_FN
#DEFINE EZ80_TMR_THROTTLE_WAIT LD A, 2 \ LD B, 7 \ EZ80_FN
#DEFINE EZ80_TMR_INT_DISABLE LD A, 2 \ LD B, 8 \ EZ80_FN
#DEFINE EZ80_TMR_INT_ENABLE LD A, 2 \ LD B, 9 \ EZ80_FN
#DEFINE EZ80_TMR_IS_TICK_ISR LD A, 2 \ LD B, 10 \ EZ80_FN
#DEFINE EZ80_TMR_DELAY LD A, 2 \ LD B, 11 \ EZ80_FN
#DEFINE EZ80_EX_USB_INIT LD A, 6 \ LD B, 0 \ EZ80_FN
#DEFINE EZ80_THROTTLE_START(p,store) \
#DEFCONT \ PUSH AF
#DEFCONT \ PUSH BC
#DEFCONT \ PUSH HL
#DEFCONT \ LD A, 2
#DEFCONT \ LD BC, (6 * 256) + p
#DEFCONT \ EZ80_FN
#DEFCONT \ LD (store), HL
#DEFCONT \ POP HL
#DEFCONT \ POP BC
#DEFCONT \ POP AF
#DEFINE EZ80_THROTTLE_WAIT(p,store) \
#DEFCONT \ PUSH AF
#DEFCONT \ PUSH BC
#DEFCONT \ PUSH HL
#DEFCONT \ LD A, 2
#DEFCONT \ LD BC, (7 * 256) + p
#DEFCONT \ LD HL, (store)
#DEFCONT \ EZ80_FN
#DEFCONT \ LD (store), HL
#DEFCONT \ POP HL
#DEFCONT \ POP BC
#DEFCONT \ POP AF
#DEFINE EZ80_UART_IN LD A, 3 \ LD B, 0 \ EZ80_FN
#DEFINE EZ80_UART_OUT LD A, 3 \ LD B, 1 \ EZ80_FN
#DEFINE EZ80_UART_IN_STAT LD A, 3 \ LD B, 2 \ EZ80_FN
#DEFINE EZ80_UART_OUT_STAT LD A, 3 \ LD B, 3 \ EZ80_FN
#DEFINE EZ80_UART_CONFIG LD A, 3 \ LD B, 4 \ EZ80_FN
#DEFINE EZ80_UART_QUERY LD A, 3 \ LD B, 5 \ EZ80_FN
#DEFINE EZ80_UART_RESET LD A, 3 \ LD B, 6 \ EZ80_FN
#DEFINE RET.L .DB $49 \ RET
#DEFINE IN0_A(p) .DB $ED,$38,p
#DEFINE IN0_B(p) .DB $ED,$00,p
#DEFINE IN0_C(p) .DB $ED,$08,p
#DEFINE IN0_D(p) .DB $ED,$10,p
#DEFINE IN0_E(p) .DB $ED,$18,p
#DEFINE IN0_H(p) .DB $ED,$20,p
#DEFINE IN0_L(p) .DB $ED,$28,p
#DEFINE OUT0_A(p) .DB $ED,$39,p
#DEFINE OUT0_B(p) .DB $ED,$01,p
#DEFINE OUT0_C(p) .DB $ED,$09,p
#DEFINE OUT0_D(p) .DB $ED,$11,p
#DEFINE OUT0_E(p) .DB $ED,$19,p
#DEFINE OUT0_H(p) .DB $ED,$21,p
#DEFINE OUT0_L(p) .DB $ED,$29,p
#DEFINE LDHLMM.LIL(Mmn) \
#defcont \ .DB $5B
#defcont \ LD HL, Mmn
#defcont \ .DB (Mmn >> 16) & $FF
#DEFINE LDBCMM.LIL(Mmn) \
#defcont \ .DB $5B
#defcont \ LD BC, Mmn & $FFFF
#defcont \ .DB (Mmn >> 16) & $FF
#DEFINE SBCHLBC.LIL \
#defcont \ .DB $49
#defcont \ SBC HL, BC
IO_SEGMENT .EQU $FF ; THE UPPER 8-BIT ADDRESS FOR I/O
#DEFINE OUT_NN_A(addr) \
#DEFCONT \ PUSH BC
#DEFCONT \ LD BC, IO_SEGMENT << 8 | addr
#DEFCONT \ OUT (C), A
#DEFCONT \ POP BC
#DEFINE IN_A_NN(addr) \
#DEFCONT \ LD A, IO_SEGMENT
#DEFCONT \ IN A, (addr)
#define EZ80_CPY_EHL_TO_UHL CALL _EZ80_CPY_EHL_TO_UHL
#define EZ80_CPY_UHL_TO_EHL CALL _EZ80_CPY_UHL_TO_EHL
#ELSE
#DEFINE EZ80_IO
#DEFINE EZ80_THROTTLE_START(p,store)
#DEFINE EZ80_THROTTLE_WAIT(p,store)
IO_SEGMENT .EQU $FF ; THE UPPER 8-BIT ADDRESS FOR I/O
#DEFINE OUT_NN_A(addr) OUT (addr), A
#DEFINE IN_A_NN(addr) IN A, (addr)
#ENDIF