; ; Calculateur de cpu pour une routine ; Longshot / Logon System ; V2 Correction bug sur simulation OUTI/OUTD ; Restitution SP ; V3 Correction bug restitution SP ; Option pour sauvegarde et restitution des registres ; Correction bug sur OUT(n),A et IN A,(n) ; V4 Correction systeme de retour pour le cas ou le programme simule modifie le contenu de la pile et altere l'adresse de retour. ; ; ; debutCalcCpu equ #f8d0 ; org debutCalcCpu ; ; simu_test EQU 0 ; 1 pour gestion du test du simulateur (Resultat test sans R donne 2013 usec (7dd)) simu_regr EQU 1 ; 1 pour compiler avec gestion du registre R (Resultat test avec R donne 2076 usec (81C)) simu_sovreg EQU 1 ; 1 pour compiler avec gestion de sauvegarde des registres (af, af', ix, iy, et registres EXX) ; ; ;=================================================================================================================================================== ; La fonction sert a calculer le nombre de nop d'une routine. ; Son objectif n'est pas de simuler le comportement complet d'un cpc avec un cpc. ; (car sinon, il faudrait simuler les interruptions, elles-memes influencees par les circuits, qu'il faudrait donc simuler aussi) ; Elle simule le fonctionnement du Z80A pour toutes les instructions possibles. ; Les instructions sans prefixe et toutes les instructions avec prefixe ou surprefixe (cb, ed, dd, fd, ddcb, fdcb) sont vraiment executees par le z80a. ; Les instructions lues sont injectees dans un "bac a sable" et donc reellement executees, ce qui rend le simulateur tres fiable sur l'etat des flags (sur un vrai cpc). ; Les instructions de saut sont interpretees (mais non executees) (jr, jp, call, ret, rst) ; Les instructions d'i/o sont simulees uniquement pour le calcul du temps cpu. Donc les flags ne sont pas modifies par les IN (pour attente d'une vsync par ex) ; La seule exception concerne les acces IO sur le PAL (ram) ou le GA (roms), (sauf avec OUT(n),A) qui sont vraiment executees.(donc attention ou se trouve le code du simulateur) ; L'instruction halt est traitee comme un nop. [L'objectif n'est pas de simuler le cpc] ; L'instruction ei est traitee comme un nop. [L'objectif n'est pas de simuler le cpc]. Note - Le simulateur fonctionne en di. ; Le registre R est gere en assemblant la fonction avec simu_regr equ 1 ; Les operations sur le registre I sont executees, mais on ne peut pas activer les interruptions. ; Le changement de mode d'interruption est execute. Le simulateur revient cependant en mode Im1. ; Attention, car la routine traitee affecte rellement la memoire et les connexions rom/ram. ; En consequence, il ne faut pas que le code simule "saborde" la ram ou se trouve le simulateur. ; En consequence, si le code est utilise APRES l'appel au simulateur, il faut garder a l'esprit que le code a ete "pre execute" et donc des variables (voir du code ; en cas d'automodification) ont ete modifies. Une solution consiste a sauvegarder votre code avant le calcul, le restituer ensuite, et utiliser ensuite le resultat du calcul ; Usage ; Entree hl=ptr debut code ; de=fin du code (l'instruction a cette adresse n'est pas prise en compte) ; Sortie bc=nb usec de la fonction. Considerer que tous les registres sont modifies. ; ; Principe general - Un octet est lu et un octet de parametre est lu dans une table de 256. Le parametre contient plusieurs informations specifiques ; a l'instruction. Les instructions standard sont definies par leur taille, leur temps cpu, et si elle doivent etre executees ou simulees. ; Elles sont simulees lorsque les flags ne sont pas affectes. ; Le parametre permet de gerer d'autres situations, comme les differents sauts possibles, les i/o, les transferts, ce qui induit pour partie ; des executions et pour partie des simulations (par exemple pour les instructions complexes comme CPIR, LDIR, ...) ; ; Pour gerer le registre R, cela implique de controler les instructions LD A,R et LD R,A afin simuler l'affectation de A avec une valeur calculee ; et reinialiser cette valeur. Le calcul de R s'effectue via l'interpretation des opcodes des instructions. Ce qui signifie qu'il faut ajouter ; 1 a chaque instruction (et 2 lorqu'il s'agit d'une instruction prefixee). Par ailleurs LD R,A avec A=0 met R=0. Mais LD A,R ajoute 2 a R avant d'affecter A ; ;=================================================================================================================================================== ;; ;--------------------------------------------------------- ; Definition interpretation instruction ; bits 7.6 = type instruction ; 0.0= instruction simulable en bac a sable ; bits 2.1.0 = nb usec instruction-1 ; bits 4.3 = nb octets instruction ; bit 5 = 1=noexe (inst no flag) ; 1.0= instructions de saut simple ; bit 1.0 = flag test Z,C,P,S ; bit 2 = relatif (1)/absolu (0) ; bit 3 = sens condition (0=not) ; bit 4 = pas de condition (1) ; bit 5 = djnz (1) sinon autre saut ; 1.1= instructions de saut pile (sauf jp(reg)) ; bit 1.0 = flag test Z,C,P,S ; bit 2 = Pas de condition (1) (0=condition) ; bit 3 = Sens condition (0=not) ; bit 5.4 = instruction 00=call, 01=ret, 10=rst nn, 11 jp(reg) ; si jp(reg), alors bit 0=1 si hl sinon bit 1=1 pr IX, bit 1=0 pr IY ; 0.1= instructions specifiques ; bit 5 = instruction etendue (CB,ED,DD,FD) si 1 ; bit 4 = i/o si 1 ; bit 3 = instruction repetitive si 1 ; bit 2 = i/o sur ptr si 1 ; bit 1 = sens rep 1=++ 0=-- ; bit 0 = instruction cp ptr si 1 ;--------------------------------------------------------- ins_r_1_1 EQU %00000000 ins_s_1_1 EQU %00100000 ins_r_1_2 EQU %00000001 ins_r_1_3 EQU %00000010 ins_r_1_4 EQU %00000011 ins_r_1_6 EQU %00000101 ins_r_2_2 EQU %00001001 ins_s_2_2 EQU %00101001 ins_r_2_3 EQU %00001010 ins_s_2_3 EQU %00101010 ins_r_2_4 EQU %00001011 ins_r_2_7 EQU %00001110 ins_s_2_4 EQU %00101011 ins_r_2_5 EQU %00001100 ins_r_3_3 EQU %00010010 ins_r_3_4 EQU %00010011 ins_r_3_5 EQU %00010100 ins_r_3_6 EQU %00010101 ins_r_4_4 EQU %00011011 ins_r_4_6 EQU %00011101 ins_r_4_7 EQU %00011110 ins_djnz EQU %10100100 ins_jrnz EQU %10000100 ins_jrnc EQU %10000101 ins_jrz EQU %10001100 ins_jrc EQU %10001101 ins_jr EQU %10010100 ins_jpnz EQU %10000000 ins_jpz EQU %10001000 ins_jpnc EQU %10000001 ins_jpc EQU %10001001 ins_jppo EQU %10000010 ins_jppe EQU %10001010 ins_jpp EQU %10000011 ins_jpm EQU %10001011 ins_jp EQU %10010000 ins_retnz EQU %11010000 ins_retz EQU %11011000 ins_callnz EQU %11000000 ins_callz EQU %11001000 ins_rst EQU %11100100 ins_jphl EQU %11110101 ins_jpix EQU %11110110 ins_jpiy EQU %11110100 ins_ret EQU %11010100 ins_reti EQU %11011100 ins_call EQU %11000100 ins_retnc EQU %11010001 ins_retc EQU %11011001 ins_callnc EQU %11000001 ins_callc EQU %11001001 ins_retpo EQU %11010010 ins_retpe EQU %11011010 ins_callpo EQU %11000010 ins_callpe EQU %11001010 ins_retp EQU %11010011 ins_retm EQU %11011011 ins_callp EQU %11000011 ins_callm EQU %11001011 ins_prefix EQU %01100000 ins_io EQU %01010000 ins_ioptrplus EQU %01010110 ins_ioptrmoins EQU %01010100 ins_ioptrrepplus EQU %01011110 ins_ioptrrepmoins EQU %01011100 ins_trrep EQU %01001000 ins_cprepmoins EQU %01001001 ins_cprepplus EQU %01001011 ins_prefixxDCB EQU %11111111 ; calc_cpucode di ld (pccurr+1),hl ld (pctstf+1),de pop hl ld (sovspmaster+1),sp ld (sovptmaster+1),hl ld hl,0 ld (tcpu),hl if simu_sovreg ld sp,stackreg push ix push iy push af exx push hl push de push bc ex af,af' push af exx endif ld sp,simustack nextinst if simu_regr call regr_inc endif pccurr ld hl,#2121 ; pointeur courant code a simuler ld e,(hl) ; lire opcode pctstf ld bc,#0101 ; pointeur code fin or a ; fin atteinte ? sbc hl,bc jr nz,noendcode ; im 1 ; a voir pour le retour si on peut identifier im1 ou 2 if simu_sovreg ld sp,stackreg-14 pop af ex af,af' pop bc pop de pop hl exx pop af pop iy pop ix endif ld bc,(tcpu) ; retour du nb de nop sovspmaster ld sp,0 sovptmaster jp sovptmaster noendcode ld d,0 ld b,d ld hl,tabexeopc interPrefix add hl,de ld a,e ld e,(hl) ; lire prm interpretation opcode interPrefix_ar bit 7,e jr nz,simuBranch ; bit 7.6=1.x (1.0 / 1.1) 1xxxxxxx bit 6,e ; jr z,simuReel ; Bit 7.6=0.0 00xxxxxx bit 5,e ; Bit 7.6=0.1 Instruction prefixe? jr nz,gere_prefix ; oui, gestion prefixe 011xxxxx bit 4,e ; Non test inst io jp nz,simu_ioinst ; oui, gestion instruction io 0101xxxx jp simu_transf gere_prefix if simu_regr call regr_inc endif ld hl,(pccurr+1) ; Ptr code courant sur prefixe inc hl ; octet suivant le prefixe ld e,(hl) ; lire 2nd octet cp #cb ; Prefixe CB ? ld hl,tabopcCB jr z,interPrefix ; Oui inc h cp #ed ; Prefixe ED ? if simu_regr jr nz,autrePrefix call regr_gest ; gestion ld a,r ou ld r,a jr interPrefix autrePrefix else jr z,interPrefix endif inc h ; Prefixe DD ou FD add hl,de ; Lire prm octet apres prefixe ld e,a ; sov opcode apres prefixe ld a,(hl) ; lire prm trt opcode DDxx FDxx cp ins_jpix ; jp Ix ou jp iy jr nz,gere_prefcasgen bit 5,e ; si DD alors table ok jr z,gere_prefcasgen ; res 1,a ; sinon jp(ix) devient jp(iy) gere_prefcasgen ld e,a inc a ; Test si second prefixe CB ? jr nz,interPrefix_ar ; Pas de prefixe CB, trt instr if simu_regr call regr_inc endif ld hl,(pccurr+1) ; Instruction DDCBnnII ou FDCBnnII inc hl inc hl inc hl ld a,(hl) ; Lire prm instruction ld e,ins_r_4_7 ; Par deft 4 octets pour 7 nop rla jr c,simuReel ; opcode >#7F rla ; opcode <#40 jr nc,simuReel dec e ; instruction 4 octets 6 nop (bit...) simuReel call simuInst jp nextinst ;--------------------------------------------------------------------------- ; Gestion des sauts et branchement divers (call, ret, jp, jr, rst, ...) ;--------------------------------------------------------------------------- ; simuBranch bit 6,e jr nz,simuCall ; Gestion des appels avec pile bit 5,e ; Djnz ? jr z,not_djnz ld hl,regbc+1 ; oui. decrementer b courant dec (hl) ; jr z,ins_djnz_end ; fin du djnz ld c,4 ; 4 nop (djnz ne positionne pas les flag) saut_gen call calc_ptrcurr ; non=> calcul du ptr branchement updtcpu call addtcpu ; jp nextinst ins_djnz_end ld c,3 ; 3 nop si fin de boucle ins_retnonok call addtcpu dec c call addpccur jp nextinst not_djnz ld c,3 ; 3 octets/3 nop bit 4,e ; Conditions? jr nz,saut_gen ; Non simul branchement call TstMaskF ; Traitement des conditions jr c,saut_gen nosaut bit 2,e jr z,absoluteptr dec c absoluteptr call addpccur jr updtcpu ;-------------------------------------------------------------------------- ; Simulation d'un call, ret, rst ou jp(reg) ;-------------------------------------------------------------------------- simuCall bit 2,e ; condition ? jr nz,gc_nocond ; pas de condition (rst dans tous les cas) call TstMaskF ; C=1 si condition remplie jr c,gcallret ; Gestion rebranch call cond, ou ret cond bit 4,e ; test si call cond non remplie ld c,2 ; 2 nop ret non servi pour 1 octet jr nz,ins_retnonok inc c ; 3 nop call non servi jr absoluteptr gc_nocond ; call, ret, rst, jp(reg) bit 5,e jr z,gcallret ; gestion call ou ret bit 4,e ; jr z,grstxx ; Gestion rsx bit 0,e ; gestion jp(reg). hl ? ld hl,(reghl) ld c,1 ; 1 b / 1 nop jr nz,gjpreg ; gestion saut vers hl inc c ; 2 b / 2 nop bit 1,e ; jp(ix) ? ld hl,(regix) jr nz,gjpreg ld hl,(regiy) gjpreg ld (pccurr+1),hl ; affectation du nouveau pointeur jr updtcpu ; mise a jour t cpu grstxx ld hl,(pccurr+1) ; gestion rst, lecture instruction ld a,(hl) and %00111000 ; pour deduire l'adresse inc hl ld (pccurr+1),a ; qui est effecte au prochain ptr code xor a ld (pccurr+2),a ld c,4 ; 4 nop et gestion d'empilement adresse de retour jr grstcall gcallret bit 4,e ; call ou ret jr z,gcall ld c,3 ; cpu ret non conditionnel bit 2,e jr z,gretnocond_b ; si ret est conditionnel ajouter 1 nop cpu bit 3,e ; Si ret sans condition mais si condition "not" , indique cas retn/reti pour calcul tcpu jr z,gretnocond ; on ajoute 1 nop cpu pour reti/retn si bit 3=1 gretnocond_b inc c gretnocond ld (gretsovsp+1),sp ld sp,(regspcod+1) pop hl ld (pccurr+1),hl ; retour du call ld (regspcod+1),sp gretsovsp ld sp,0 jp updtcpu gcall ld c,5 ld hl,(pccurr+1) ; ptr instruction courante inc hl ; ptr sur adresse branchement ld a,(hl) ; pd faible ld (pccurr+1),a ; devient le nouveau ptr code inc hl ld a,(hl) ld (pccurr+2),a inc hl ; ptr adresse retour grstcall ld (gcallsovsp+1),sp ld sp,(regspcod+1) ; stockage pile push hl ld (regspcod+1),sp gcallsovsp ld sp,0 jp updtcpu ;--------------------------------------------------------- ; Simulation d'une entree sortie ;--------------------------------------------------------- simu_ioinst ld a,(regbc+1) ; recuperation du port I/O bit 2,e ; est on sur ini, inir, outi, outd, ... jr nz,simu_ioptr rla ; i/o g.a rom ou pal ram ? ld e,ins_s_2_4 ; simulation instruction 2b,4 nop jp c,simuReel ; instruction simulee non executee res 5,e ; autorise execution instr jp simuReel ; execute l'io simu_ioptr bit 3,e ; instruction rep jr nz,simu_ioptrrep ; Oui gestion du merdier improbable bit 7,a jr nz,simu_ioptrrep ld e,ins_r_2_5 ; Execution si inst ga/pal jp simuReel ; instruction executee (correction v2) simu_ioptrrep ld c,4 simu_ioptr_bcl inc c ; 5 nop pour outd, outi, ini, ind, 6 pour repet call addtcpu ; ou "dernier" otdr, otir, inir, indr ld hl,(reghl) ; chargement hl bit 1,e jr nz,simu_ioptr_inc dec hl dec hl simu_ioptr_inc inc hl ld (reghl),hl dec a ; simule decrementation de B ld (regbc+1),a ; mise a jour push af ; sauvegarde de F pop bc ld a,c ld (regaf),a ; mise a jour de F (partielle) bit 3,e ; repetition necessaire ? jp z,simu_io_norepet ld a,b ld bc,5 ; preparer boucle a 6 nop or a jr nz,simu_ioptr_bcl simu_io_norepet ld bc,2 call addpccur jp nextinst ;--------------------------------------------------------- ; Simulation d'un ldir/lddr, cpir/cpdr ;--------------------------------------------------------- simu_transf bit 0,e jr nz,simu_cptr ld de,(regbc) ld bc,6 simu_transf_bcl dec de ld a,d or e jr z,simu_transf_end call addtcpu jr simu_transf_bcl simu_transf_end ld e,ins_r_2_5 jp simuReel simu_cptr ld hl,(reghl) ; recup hl courant ld bc,(regbc) ; recup bc courant ld a,(regaf+1) ; recup a courant simu_cptrbcl bit 1,e ; gestion sens instruction jr nz,cptrplus cpd jr simu_cptr_2 cptrplus cpi simu_cptr_2 jr z,simu_cptrend jp po,simu_cptrend push bc push hl ld bc,6 call addtcpu pop hl pop bc jr simu_cptrbcl simu_cptrend ld b,0 ld e,ins_r_2_4 jp simuReel ;--------------------------------------------------------- ; Param in e=octet interpretation instruction ; Determine le flag teste et verifie la condition par ; rapport a F et positionne Carry=1 si condition remplie ;--------------------------------------------------------- TstMaskF ld d,c ; sauvegarde c ld a,e ; saut conditionnel and %11 ; type de condition ld c,a ld hl,tabmaskF ; Recup du masque pour le flag concerne add hl,bc ld c,d ; restitue c ld d,(hl) ld a,(regaf) ; recup F bit 3,e ; type de condition negatif/positif jr z,stconds1 and d jr nz,stconds2 ret stconds1 and d ; teste flag ret nz ; stconds2 scf ; C=1 saut ret ;------------------------------------------------------------------------------------------------ ; Bac a sable pour instruction Z80A ; Param in. e=parametre pour l'instruction qui permet le calcul du nb de usec et du nb octets ; L'instruction est transferee dans la zone de simulation et executee dans le bon contexte ; A l'exception des instructions dangereuses ; BC=nb octet instruction avec donnees ;------------------------------------------------------------------------------------------------ simuInst ld a,e and %111 ; isoler nb usec instruction inc a ; 1 a 8 usec ld c,a call addtcpu ld a,e rrca rrca rrca and %11 inc a ; isoler nb octet(s) instruction ld c,a bit 5,e ; instruction a executer ? jr nz,addpccur ; non, simuler des nop ld hl,0 ld (instexec),hl ld (instexec+2),hl ld hl,(pccurr+1) ld de,instexec ; Transfert de l'instruction ldir ld (pccurr+1),hl ld (spcurr+1),sp ld sp,regcurr pop ix pop iy pop hl pop de pop bc pop af ex af,af' exx pop hl pop de pop bc pop af regspcod ld sp,0000 instexec db 0,0,0,0 ld (regspcod+1),sp ld sp,regcurrend push af push bc push de push hl exx ex af,af' push af push bc push de push hl push iy push ix spcurr ld sp,0 ret ;--------------------------------------------------------- ; Gestion du registre R ;--------------------------------------------------------- if simu_regr ;--------------------------------------------------------- ; incrementation du registre R (sur 7 bits) ;--------------------------------------------------------- regr_inc push hl ld hl,regr inc (hl) res 7,(hl) pop hl ret ;--------------------------------------------------------- ; simulation ld a,r / ld r,a ;--------------------------------------------------------- regr_gest ld a,e ; lire octet apres prefixe cp #5f ; ld a,r jr nz,not_ldar push hl ld hl,(regaf) ; recupere AF simule push hl ; sur la pile pour affect AF reel ld a,(regr) ; recupere R qui est deja +2 ld (regaf+1),a ; et affecte le A simule dec l dec l res 7,l ; calcule R-2 dans L pop af ; Recup F ld a,l ; Et A avec R-2 ld r,a ; A=A+2 et F upd push af ; sauve F pop hl ; L=F ld a,l ld (regaf),a ; F simule mis a jour pop hl ret not_ldar cp #4f ; ld r,a ret nz ld a,(regaf+1) ; lire A ld (regr),a ; qui affecte R simule ret endif ;--------------------------------------------------------- ; Calcule le prochain pointeur Code en additionnant BC ;--------------------------------------------------------- addpccur ld hl,(pccurr+1) add hl,bc ld (pccurr+1),hl ret ;--------------------------------------------------------- ; Ajoute au compteur de NOP la valeur dans BC ;--------------------------------------------------------- addtcpu ld hl,(tcpu) add hl,bc ld (tcpu),hl ret ;--------------------------------------------------------- ; Cacule le prochain pointeur Code pour un branchement ; en tenant compte si l'instruction fait un saut relatif ; ou absolu ;--------------------------------------------------------- calc_ptrcurr ld hl,(pccurr+1) ; sinon lire ptr sur instruction inc hl ld a,(hl) ; lire offset depl inc hl bit 2,e ; absolu ou relatif ? jr z,calc_ptr_abs push bc ld c,a rlca and 1 neg ld b,a add hl,bc ld (pccurr+1),hl pop bc ret calc_ptr_abs ld hl,(pccurr+1) inc hl ld a,(hl) inc hl ld h,(hl) ld l,a ld (pccurr+1),hl ret ;--------------------------------------------------------- ; Tables et variables ;--------------------------------------------------------- tcpu dw 0 ; resultat en nop du temps de la routine tabmaskF db %01000000 ; Flag Z db %00000001 ; Flag C db %00000100 ; Flag P db %10000000 ; Flag S ds 10,0 simustack if simu_sovreg ds 14,0 ; Sauvegarde de 7 registres stackreg endif ;--------------------------------------------------------- ; Registres simules ;--------------------------------------------------------- if simu_regr regr db 0 ; valeur r endif regcurr regix dw 0 ; valeur ix regiy dw 0 ; valeur iy dw 0 ; valeur hl' dw 0 ; valeur de' dw 0 ; valeur bc' dw 0 ; valeur af' reghl dw 0 ; valeur hl dw 0 ; valeur de regbc dw 0 ; valeur bc regaf dw 0 ; valeur af regcurrend ; ;------------------------------------------------------------------- ; Table interpretation instructions lues sans prefixe ; Voir EQU pour definition des parametrages instructions ;------------------------------------------------------------------- tabexeopc db ins_s_1_1 ; nop db ins_r_3_3 ; ld bc,nnnn db ins_r_1_2 ; ld (bc),a db ins_r_1_2 ; inc bc db ins_r_1_1 ; inc b db ins_r_1_1 ; dec b db ins_r_2_2 ; ld b,n db ins_r_1_1 ; rlca db ins_r_1_1 ; ex af,af' db ins_r_1_3 ; add hl,bc db ins_r_1_2 ; ld a,(bc) db ins_r_1_2 ; dec bc db ins_r_1_1 ; inc c db ins_r_1_1 ; dec c db ins_r_2_2 ; ld c,n db ins_r_1_1 ; rrca ; db ins_djnz ; djnz db ins_r_3_3 ; ld de,nnnn db ins_r_1_2 ; ld (de),a db ins_r_1_2 ; inc de db ins_r_1_1 ; inc d db ins_r_1_1 ; dec d db ins_r_2_2 ; ld d,n db ins_r_1_1 ; rla db ins_jr ; jr db ins_r_1_3 ; add hl,de db ins_r_1_2 ; ld a,(de) db ins_r_1_2 ; dec de db ins_r_1_1 ; inc e db ins_r_1_1 ; dec e db ins_r_2_2 ; ld e,n db ins_r_1_1 ; rra ; db ins_jrnz ; jr nz db ins_r_3_3 ; ld hl,nnnn db ins_r_3_5 ; ld (nn),hl db ins_r_1_2 ; inc hl db ins_r_1_1 ; inc h db ins_r_1_1 ; dec h db ins_r_2_2 ; ld h,n db ins_r_1_1 ; daa db ins_jrz ; jr z db ins_r_1_3 ; add hl,hl db ins_r_3_5 ; ld hl,(nn) db ins_r_1_2 ; dec hl db ins_r_1_1 ; inc l db ins_r_1_1 ; dec l db ins_r_2_2 ; ld l,n db ins_r_1_1 ; cpl ; db ins_jrnc ; jr nc db ins_r_3_3 ; ld sp,nnnn db ins_r_3_4 ; ld (nn),a db ins_r_1_2 ; inc sp db ins_r_1_3 ; inc (hl) db ins_r_1_3 ; dec (hl) db ins_r_2_3 ; ld (hl),n db ins_r_1_1 ; scf db ins_jrc ; jr c db ins_r_1_3 ; add hl,sp db ins_r_3_4 ; ld a,(nn) db ins_r_1_2 ; dec sp db ins_r_1_1 ; inc a db ins_r_1_1 ; dec a db ins_r_2_2 ; ld a,n db ins_r_1_1 ; ccf ; db ins_r_1_1 ; ld b,b db ins_r_1_1 ; ld b,c db ins_r_1_1 ; ld b,d db ins_r_1_1 ; ld b,e db ins_r_1_1 ; ld b,h db ins_r_1_1 ; ld b,l db ins_r_1_2 ; ld b,(hl) db ins_r_1_1 ; ld b,a db ins_r_1_1 ; ld c,b db ins_r_1_1 ; ld c,c db ins_r_1_1 ; ld c,d db ins_r_1_1 ; ld c,e db ins_r_1_1 ; ld c,h db ins_r_1_1 ; ld c,l db ins_r_1_2 ; ld c,(hl) db ins_r_1_1 ; ld c,a ; db ins_r_1_1 ; ld d,b db ins_r_1_1 ; ld d,c db ins_r_1_1 ; ld d,d db ins_r_1_1 ; ld d,e db ins_r_1_1 ; ld d,h db ins_r_1_1 ; ld d,l db ins_r_1_2 ; ld d,(hl) db ins_r_1_1 ; ld d,a db ins_r_1_1 ; ld e,b db ins_r_1_1 ; ld e,c db ins_r_1_1 ; ld e,d db ins_r_1_1 ; ld e,e db ins_r_1_1 ; ld e,h db ins_r_1_1 ; ld e,l db ins_r_1_2 ; ld e,(hl) db ins_r_1_1 ; ld e,a ; db ins_r_1_1 ; ld h,b db ins_r_1_1 ; ld h,c db ins_r_1_1 ; ld h,d db ins_r_1_1 ; ld h,e db ins_r_1_1 ; ld h,h db ins_r_1_1 ; ld h,l db ins_r_1_2 ; ld h,(hl) db ins_r_1_1 ; ld h,a db ins_r_1_1 ; ld l,b db ins_r_1_1 ; ld l,c db ins_r_1_1 ; ld l,d db ins_r_1_1 ; ld l,e db ins_r_1_1 ; ld l,h db ins_r_1_1 ; ld l,l db ins_r_1_2 ; ld l,(hl) db ins_r_1_1 ; ld l,a ; db ins_r_1_2 ; ld (hl),b db ins_r_1_2 ; ld (hl),c db ins_r_1_2 ; ld (hl),d db ins_r_1_2 ; ld (hl),e db ins_r_1_2 ; ld (hl),h db ins_r_1_2 ; ld (hl),l db ins_s_1_1 ; halt traite comme un nop db ins_r_1_2 ; ld (hl),a db ins_r_1_1 ; ld a,b db ins_r_1_1 ; ld a,c db ins_r_1_1 ; ld a,d db ins_r_1_1 ; ld a,e db ins_r_1_1 ; ld a,h db ins_r_1_1 ; ld a,l db ins_r_1_2 ; ld a,(hl) db ins_r_1_1 ; ld a,a ; db ins_r_1_1 ; add a,b db ins_r_1_1 ; add a,c db ins_r_1_1 ; add a,d db ins_r_1_1 ; add a,e db ins_r_1_1 ; add a,h db ins_r_1_1 ; add a,l db ins_r_1_2 ; add a,(hl) db ins_r_1_1 ; add a,a db ins_r_1_1 ; adc a,b db ins_r_1_1 ; adc a,c db ins_r_1_1 ; adc a,d db ins_r_1_1 ; asc a,e db ins_r_1_1 ; adc a,h db ins_r_1_1 ; adc a,l db ins_r_1_2 ; adc a,(hl) db ins_r_1_1 ; adc a,a ; db ins_r_1_1 ; sub b db ins_r_1_1 ; sub c db ins_r_1_1 ; sub d db ins_r_1_1 ; sub e db ins_r_1_1 ; sub h db ins_r_1_1 ; sub l db ins_r_1_2 ; sub (hl) db ins_r_1_1 ; sub a db ins_r_1_1 ; sbc a,b db ins_r_1_1 ; sbc a,c db ins_r_1_1 ; sbc a,d db ins_r_1_1 ; sbc a,e db ins_r_1_1 ; sbc a,h db ins_r_1_1 ; sbc a,l db ins_r_1_2 ; sbc a,(hl) db ins_r_1_1 ; sbc a,a ; db ins_r_1_1 ; and b db ins_r_1_1 ; and c db ins_r_1_1 ; and d db ins_r_1_1 ; and e db ins_r_1_1 ; and h db ins_r_1_1 ; and l db ins_r_1_2 ; and (hl) db ins_r_1_1 ; and a db ins_r_1_1 ; xor b db ins_r_1_1 ; xor c db ins_r_1_1 ; xor d db ins_r_1_1 ; xor e db ins_r_1_1 ; xor h db ins_r_1_1 ; xor l db ins_r_1_2 ; xor (hl) db ins_r_1_1 ; xor a ; db ins_r_1_1 ; or b db ins_r_1_1 ; or c db ins_r_1_1 ; or d db ins_r_1_1 ; or e db ins_r_1_1 ; or h db ins_r_1_1 ; or l db ins_r_1_2 ; or (hl) db ins_r_1_1 ; or a db ins_r_1_1 ; cp b db ins_r_1_1 ; cp c db ins_r_1_1 ; cp d db ins_r_1_1 ; cp e db ins_r_1_1 ; cp h db ins_r_1_1 ; cp l db ins_r_1_2 ; cp (hl) db ins_r_1_1 ; cp a ; db ins_retnz ; ret nz db ins_r_1_3 ; pop bc db ins_jpnz ; jp nz db ins_jp ; jp db ins_callnz ; call nz db ins_r_1_4 ; push bc db ins_r_2_2 ; add a,n db ins_rst ; rst 00 db ins_retz ; ret z db ins_ret ; ret db ins_jpz ; jp z db ins_prefix ; INS PREFIXE CB db ins_callz ; call z db ins_call ; call nn db ins_r_2_2 ; adc a,n db ins_rst ; rst 8 ; db ins_retnc ; ret nc db ins_r_1_3 ; pop de db ins_jpnc ; jp nc db ins_s_2_3 ; out (n),a (3 nop) db ins_callnc ; call nc db ins_r_1_4 ; push de db ins_r_2_2 ; sub n db ins_rst ; rst 16 db ins_retc ; ret c db ins_r_1_1 ; exx db ins_jpc ; jp c db ins_s_2_3 ; in a,(n) db ins_callc ; call c db ins_prefix ; INS PREFIXE DD db ins_r_2_2 ; sbc a,n db ins_rst ; rst 24 (18h) ; db ins_retpo ; ret po db ins_r_1_3 ; pop hl db ins_jppo ; jp po db ins_r_1_6 ; ex (sp),hl db ins_callpo ; call po db ins_r_1_4 ; push hl db ins_r_2_2 ; and n db ins_rst ; rst 32 db ins_retpe ; ret pe db ins_jphl ; jp (hl) db ins_jppe ; jp pe db ins_r_1_1 ; ex de,hl db ins_callpe ; call pe db ins_prefix ; INS PREFIXE ED db ins_r_2_2 ; xor n db ins_rst ; rst 40 (28h) ; db ins_retp ; ret p db ins_r_1_3 ; pop af db ins_jpp ; jp p db ins_s_1_1 ; di db ins_callp ; call p db ins_r_1_4 ; push af db ins_r_2_2 ; or n db ins_rst ; rst 48 db ins_retm ; ret m db ins_r_1_2 ; ld sp,hl db ins_jpc ; jp m db ins_s_1_1 ; ei (traite comme un nop) db ins_callm ; call m db ins_prefix ; INS PREFIXE FD db ins_r_2_2 ; cp n db ins_rst ; rst 56 (38h) ;------------------------------------------------------------------- ; Table interpretation instructions lues prefixe CB ;------------------------------------------------------------------- tabopcCB db ins_r_2_2 ; rlc b db ins_r_2_2 ; rlc c db ins_r_2_2 ; rlc d db ins_r_2_2 ; rlc e db ins_r_2_2 ; rlc h db ins_r_2_2 ; rlc l db ins_r_2_4 ; rlc(hl) db ins_r_2_2 ; rlc a db ins_r_2_2 ; rrc b db ins_r_2_2 ; rrc c db ins_r_2_2 ; rrc d db ins_r_2_2 ; rrc e db ins_r_2_2 ; rrc h db ins_r_2_2 ; rrc l db ins_r_2_4 ; rrc(hl) db ins_r_2_2 ; rrc a ; db ins_r_2_2 ; rl b db ins_r_2_2 ; rl c db ins_r_2_2 ; rl d db ins_r_2_2 ; rl e db ins_r_2_2 ; rl h db ins_r_2_2 ; rl l db ins_r_2_4 ; rl(hl) db ins_r_2_2 ; rl a db ins_r_2_2 ; rr b db ins_r_2_2 ; rr c db ins_r_2_2 ; rr d db ins_r_2_2 ; rr e db ins_r_2_2 ; rr h db ins_r_2_2 ; rr l db ins_r_2_4 ; rr(hl) db ins_r_2_2 ; rr a ; db ins_r_2_2 ; sla b db ins_r_2_2 ; sla c db ins_r_2_2 ; sla d db ins_r_2_2 ; sla e db ins_r_2_2 ; sla h db ins_r_2_2 ; sla l db ins_r_2_4 ; sla(hl) db ins_r_2_2 ; sla a db ins_r_2_2 ; sra b db ins_r_2_2 ; sra c db ins_r_2_2 ; sra d db ins_r_2_2 ; sra e db ins_r_2_2 ; sra h db ins_r_2_2 ; sra l db ins_r_2_4 ; sra(hl) db ins_r_2_2 ; sra a ; db ins_r_2_2 ; sll b db ins_r_2_2 ; sll c db ins_r_2_2 ; sll d db ins_r_2_2 ; sll e db ins_r_2_2 ; sll h db ins_r_2_2 ; sll l db ins_r_2_4 ; sll(hl) db ins_r_2_2 ; sll a db ins_r_2_2 ; srl b db ins_r_2_2 ; srl c db ins_r_2_2 ; srl d db ins_r_2_2 ; srl e db ins_r_2_2 ; srl h db ins_r_2_2 ; srl l db ins_r_2_4 ; srl(hl) db ins_r_2_2 ; srl a ; db ins_r_2_2 ; bit 0,b db ins_r_2_2 ; bit 0,c db ins_r_2_2 ; bit 0,d db ins_r_2_2 ; bit 0,e db ins_r_2_2 ; bit 0,h db ins_r_2_2 ; bit 0,l db ins_r_2_3 ; bit 0,(hl) db ins_r_2_2 ; bit 0,a db ins_r_2_2 ; bit 1,b db ins_r_2_2 ; bit 1,c db ins_r_2_2 ; bit 1,d db ins_r_2_2 ; bit 1,e db ins_r_2_2 ; bit 1,h db ins_r_2_2 ; bit 1,l db ins_r_2_3 ; bit 1,(hl) db ins_r_2_2 ; bit 1,a ; db ins_r_2_2 ; bit 2,b db ins_r_2_2 ; bit 2,c db ins_r_2_2 ; bit 2,d db ins_r_2_2 ; bit 2,e db ins_r_2_2 ; bit 2,h db ins_r_2_2 ; bit 2,l db ins_r_2_3 ; bit 2,(hl) db ins_r_2_2 ; bit 2,a db ins_r_2_2 ; bit 3,b db ins_r_2_2 ; bit 3,c db ins_r_2_2 ; bit 3,d db ins_r_2_2 ; bit 3,e db ins_r_2_2 ; bit 3,h db ins_r_2_2 ; bit 3,l db ins_r_2_3 ; bit 3,(hl) db ins_r_2_2 ; bit 3,a ; db ins_r_2_2 ; bit 4,b db ins_r_2_2 ; bit 4,c db ins_r_2_2 ; bit 4,d db ins_r_2_2 ; bit 4,e db ins_r_2_2 ; bit 4,h db ins_r_2_2 ; bit 4,l db ins_r_2_3 ; bit 4,(hl) db ins_r_2_2 ; bit 4,a db ins_r_2_2 ; bit 5,b db ins_r_2_2 ; bit 5,c db ins_r_2_2 ; bit 5,d db ins_r_2_2 ; bit 5,e db ins_r_2_2 ; bit 5,h db ins_r_2_2 ; bit 5,l db ins_r_2_3 ; bit 5,(hl) db ins_r_2_2 ; bit 5,a ; db ins_r_2_2 ; bit 6,b db ins_r_2_2 ; bit 6,c db ins_r_2_2 ; bit 6,d db ins_r_2_2 ; bit 6,e db ins_r_2_2 ; bit 6,h db ins_r_2_2 ; bit 6,l db ins_r_2_3 ; bit 6,(hl) db ins_r_2_2 ; bit 6,a db ins_r_2_2 ; bit 7,b db ins_r_2_2 ; bit 7,c db ins_r_2_2 ; bit 7,d db ins_r_2_2 ; bit 7,e db ins_r_2_2 ; bit 7,h db ins_r_2_2 ; bit 7,l db ins_r_2_3 ; bit 7,(hl) db ins_r_2_2 ; bit 7,a ; db ins_r_2_2 ; res 0,b db ins_r_2_2 ; res 0,c db ins_r_2_2 ; res 0,d db ins_r_2_2 ; res 0,e db ins_r_2_2 ; res 0,h db ins_r_2_2 ; res 0,l db ins_r_2_4 ; res 0,(hl) db ins_r_2_2 ; res 0,a db ins_r_2_2 ; res 1,b db ins_r_2_2 ; res 1,c db ins_r_2_2 ; res 1,d db ins_r_2_2 ; res 1,e db ins_r_2_2 ; res 1,h db ins_r_2_2 ; res 1,l db ins_r_2_4 ; res 1,(hl) db ins_r_2_2 ; res 1,a ; db ins_r_2_2 ; res 2,b db ins_r_2_2 ; res 2,c db ins_r_2_2 ; res 2,d db ins_r_2_2 ; res 2,e db ins_r_2_2 ; res 2,h db ins_r_2_2 ; res 2,l db ins_r_2_4 ; res 2,(hl) db ins_r_2_2 ; res 2,a db ins_r_2_2 ; res 3,b db ins_r_2_2 ; res 3,c db ins_r_2_2 ; res 3,d db ins_r_2_2 ; res 3,e db ins_r_2_2 ; res 3,h db ins_r_2_2 ; res 3,l db ins_r_2_4 ; res 3,(hl) db ins_r_2_2 ; res 3,a ; db ins_r_2_2 ; res 4,b db ins_r_2_2 ; res 4,c db ins_r_2_2 ; res 4,d db ins_r_2_2 ; res 4,e db ins_r_2_2 ; res 4,h db ins_r_2_2 ; res 4,l db ins_r_2_4 ; res 4,(hl) db ins_r_2_2 ; res 4,a db ins_r_2_2 ; res 5,b db ins_r_2_2 ; res 5,c db ins_r_2_2 ; res 5,d db ins_r_2_2 ; res 5,e db ins_r_2_2 ; res 5,h db ins_r_2_2 ; res 5,l db ins_r_2_4 ; res 5,(hl) db ins_r_2_2 ; res 5,a ; db ins_r_2_2 ; res 6,b db ins_r_2_2 ; res 6,c db ins_r_2_2 ; res 6,d db ins_r_2_2 ; res 6,e db ins_r_2_2 ; res 6,h db ins_r_2_2 ; res 6,l db ins_r_2_4 ; res 6,(hl) db ins_r_2_2 ; res 6,a db ins_r_2_2 ; res 7,b db ins_r_2_2 ; res 7,c db ins_r_2_2 ; res 7,d db ins_r_2_2 ; res 7,e db ins_r_2_2 ; res 7,h db ins_r_2_2 ; res 7,l db ins_r_2_4 ; res 7,(hl) db ins_r_2_2 ; res 7,a ; db ins_r_2_2 ; set 0,b db ins_r_2_2 ; set 0,c db ins_r_2_2 ; set 0,d db ins_r_2_2 ; set 0,e db ins_r_2_2 ; set 0,h db ins_r_2_2 ; set 0,l db ins_r_2_4 ; set 0,(hl) db ins_r_2_2 ; set 0,a db ins_r_2_2 ; set 1,b db ins_r_2_2 ; set 1,c db ins_r_2_2 ; set 1,d db ins_r_2_2 ; set 1,e db ins_r_2_2 ; set 1,h db ins_r_2_2 ; set 1,l db ins_r_2_4 ; set 1,(hl) db ins_r_2_2 ; set 1,a ; db ins_r_2_2 ; set 2,b db ins_r_2_2 ; set 2,c db ins_r_2_2 ; set 2,d db ins_r_2_2 ; set 2,e db ins_r_2_2 ; set 2,h db ins_r_2_2 ; set 2,l db ins_r_2_4 ; set 2,(hl) db ins_r_2_2 ; set 2,a db ins_r_2_2 ; set 3,b db ins_r_2_2 ; set 3,c db ins_r_2_2 ; set 3,d db ins_r_2_2 ; set 3,e db ins_r_2_2 ; set 3,h db ins_r_2_2 ; set 3,l db ins_r_2_4 ; set 3,(hl) db ins_r_2_2 ; set 3,a ; db ins_r_2_2 ; set 4,b db ins_r_2_2 ; set 4,c db ins_r_2_2 ; set 4,d db ins_r_2_2 ; set 4,e db ins_r_2_2 ; set 4,h db ins_r_2_2 ; set 4,l db ins_r_2_4 ; set 4,(hl) db ins_r_2_2 ; set 4,a db ins_r_2_2 ; set 5,b db ins_r_2_2 ; set 5,c db ins_r_2_2 ; set 5,d db ins_r_2_2 ; set 5,e db ins_r_2_2 ; set 5,h db ins_r_2_2 ; set 5,l db ins_r_2_4 ; set 5,(hl) db ins_r_2_2 ; set 5,a ; db ins_r_2_2 ; set 6,b db ins_r_2_2 ; set 6,c db ins_r_2_2 ; set 6,d db ins_r_2_2 ; set 6,e db ins_r_2_2 ; set 6,h db ins_r_2_2 ; set 6,l db ins_r_2_4 ; set 6,(hl) db ins_r_2_2 ; set 6,a db ins_r_2_2 ; set 7,b db ins_r_2_2 ; set 7,c db ins_r_2_2 ; set 7,d db ins_r_2_2 ; set 7,e db ins_r_2_2 ; set 7,h db ins_r_2_2 ; set 7,l db ins_r_2_4 ; set 7,(hl) db ins_r_2_2 ; set 7,a ;------------------------------------------------------------------- ; Table interpretation instructions lues prefixe ED ; ATTENTION cette table doit se trouver immediatement derriere ; lma table tabopcCB ;------------------------------------------------------------------- tabopcED db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu ; db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu ; db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu ; db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu ; db ins_s_2_4 ; in b,(c) db ins_io ; out(c),b db ins_r_2_4 ; sbc hl,bc db ins_r_4_6 ; ld(nn),bc db ins_r_2_2 ; neg db ins_reti ; retn db ins_s_2_2 ; im 0 db ins_r_2_3 ; ld i,a db ins_s_2_4 ; in c,(c) db ins_io ; out (c),c db ins_r_2_4 ; adc hl,bc db ins_r_4_6 ; ld bc,(nn) db ins_r_2_2 ; neg db ins_reti ; reti db ins_s_2_2 ; im 0 if simu_regr db ins_s_2_3 ; ld r,a else db ins_r_2_3 ; ld r,a endif ; db ins_s_2_4 ; in d,(c) db ins_io ; out(c),d db ins_r_2_4 ; sbc hl,de db ins_r_4_6 ; ld(nn),de db ins_r_2_2 ; neg db ins_reti ; retn db ins_s_2_2 ; im 1 db ins_r_2_3 ; ld a,i db ins_s_2_4 ; in e,(c) db ins_io ; out (c),e db ins_r_2_4 ; adc hl,de db ins_r_4_6 ; ld de,(nn) db ins_r_2_2 ; neg db ins_reti ; retn db ins_s_2_2 ; im 2 if simu_regr db ins_s_2_3 ; ld a,r else db ins_r_2_3 ; ld a,r endif ; db ins_s_2_4 ; in h,(c) db ins_io ; out(c),h db ins_r_2_4 ; sbc hl,hl db ins_r_4_6 ; ld (nn),hl db ins_r_2_2 ; neg db ins_reti ; retn db ins_s_2_2 ; im 0 db ins_r_2_5 ; rrd db ins_s_2_4 ; in l,(c) db ins_io ; out (c),l db ins_r_2_4 ; adc hl,hl db ins_r_4_6 ; ld hl,(nn) db ins_r_2_2 ; neg db ins_reti ; retn db ins_s_2_2 ; im 0 db ins_r_2_5 ; rld ; db ins_s_2_4 ; in f,(c) db ins_io ; out(c),0 db ins_r_2_4 ; sbc hl,sp db ins_r_4_6 ; ld (nn),sp db ins_r_2_2 ; neg db ins_reti ; retn db ins_s_2_2 ; im 1 db ins_r_2_2 ; nop db ins_s_2_4 ; in a,(c) db ins_io ; out (c),a db ins_r_2_4 ; adc hl,sp db ins_r_4_6 ; ld sp,(nn) db ins_r_2_2 ; neg db ins_reti ; retn db ins_s_2_2 ; im 2 db ins_r_2_2 ; nop ; db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu ; db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu ; db ins_r_2_5 ; ldi db ins_r_2_4 ; cpi db ins_ioptrplus; ini db ins_ioptrplus; outi db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_r_2_5 ; ldd db ins_r_2_4 ; cpd db ins_ioptrmoins; ind db ins_ioptrmoins; outd db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu ; db ins_trrep ; ldir db ins_cprepplus; cpir db ins_ioptrrepplus; inir db ins_ioptrrepplus; otir db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_trrep ; lddr db ins_cprepmoins; cpdr db ins_ioptrrepmoins; indr db ins_ioptrrepmoins; otdr db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu ; db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu ; db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu ; db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu ; db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu db ins_s_2_2 ; inconnu ; ;------------------------------------------------------------------- ; Table interpretation instructions lues prefixe DD/FD ; ATTENTION cette table doit se trouver immediatement derriere ; Cette table est utilisee pour les 2 prefixes donc IX et IY ; la table tabopcED ;------------------------------------------------------------------- tabopcDDFD db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_r_2_4 ; add ix,bc db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu ; db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_r_2_4 ; add ix,de db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu ; db ins_s_1_1 ; inconnu db ins_r_4_4 ; ld ix,nn db ins_r_4_6 ; ld (nn),ix db ins_r_2_3 ; inc ix db ins_r_2_2 ; inc ixh db ins_r_2_2 ; dec ixh db ins_r_3_3 ; ld ixh,n db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_r_2_4 ; add ix,ix db ins_r_4_6 ; ld ix,(nn) db ins_r_2_3 ; dec ix db ins_r_2_2 ; inc ixl db ins_r_2_2 ; dec ixl db ins_r_3_3 ; ld ixl,n db ins_s_1_1 ; inconnu ; db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_r_3_6 ; inc (ix+n) db ins_r_3_6 ; dec (ix+n) db ins_r_4_6 ; ld (ix+n),m db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_r_2_4 ; add ix,sp db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu ; db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_r_2_2 ; ld b,ixh db ins_r_2_2 ; ld b,ixl db ins_r_3_5 ; ld b,(ix+n) db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_r_2_2 ; ld c,ixh db ins_r_2_2 ; ld c,ixl db ins_r_3_5 ; ld c,(ix+n) db ins_s_1_1 ; inconnu ; db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_r_2_2 ; ld d,ixh db ins_r_2_2 ; ld d,ixl db ins_r_3_5 ; ld d,(ix+n) db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_r_2_2 ; ld e,ixh db ins_r_2_2 ; ld e,ixl db ins_r_3_5 ; ld e,(ix+n) db ins_s_1_1 ; inconnu ; db ins_r_2_2 ; ld ixh,b db ins_r_2_2 ; ld ixh,c db ins_r_2_2 ; ld ixh,d db ins_r_2_2 ; ld ixh,e db ins_r_2_2 ; ld ixh,ixh db ins_r_2_2 ; ld ixh,ixl db ins_r_3_5 ; ld h,(ix+n) db ins_r_2_2 ; ld ixh,a db ins_r_2_2 ; ld ixl,b db ins_r_2_2 ; ld ixl,c db ins_r_2_2 ; ld ixl,d db ins_r_2_2 ; ld ixl,e db ins_r_2_2 ; ld ixl,ixh db ins_r_2_2 ; ld ixl,ixl db ins_r_3_5 ; ld l,(ix+n) db ins_r_2_2 ; ld ixl,a ; db ins_r_3_5 ; ld (ix+n),b db ins_r_3_5 ; ld (ix+n),c db ins_r_3_5 ; ld (ix+n),d db ins_r_3_5 ; ld (ix+n),e db ins_r_3_5 ; ld (ix+n),h db ins_r_3_5 ; ld (ix+n),l db ins_s_1_1 ; inconnu db ins_r_3_5 ; ld (ix+n),a db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_r_2_2 ; ld a,ixh db ins_r_2_2 ; ld a,ixl db ins_r_3_5 ; ld a,(ix+n) db ins_s_1_1 ; inconnu ; db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_r_2_2 ; add a,ixh db ins_r_2_2 ; add a,ixl db ins_r_3_5 ; add a,(ix+n) db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_r_2_2 ; adc a,ixh db ins_r_2_2 ; adc a,ixl db ins_r_3_5 ; adc a,(ix+n) db ins_s_1_1 ; inconnu ; db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_r_2_2 ; sub a,ixh db ins_r_2_2 ; sub a,ixl db ins_r_3_5 ; sub a,(ix+n) db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_r_2_2 ; sbc a,ixh db ins_r_2_2 ; sbc a,ixl db ins_r_3_5 ; sbc a,(ix+n) db ins_s_1_1 ; inconnu ; db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_r_2_2 ; and a,ixh db ins_r_2_2 ; and a,ixl db ins_r_3_5 ; and a,(ix+n) db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_r_2_2 ; xor a,ixh db ins_r_2_2 ; xor a,ixl db ins_r_3_5 ; xor a,(ix+n) db ins_s_1_1 ; inconnu ; db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_r_2_2 ; or a,ixh db ins_r_2_2 ; or a,ixl db ins_r_3_5 ; or a,(ix+n) db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_r_2_2 ; cp ixh db ins_r_2_2 ; cp ixl db ins_r_3_5 ; cp (ix+n) db ins_s_1_1 ; inconnu ; db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_prefixxDCB; SUR PREFIXE CB db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu ; db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; SUR PREFIXE DD db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu ; db ins_s_1_1 ; inconnu db ins_r_2_4 ; pop ix db ins_s_1_1 ; inconnu db ins_r_2_7 ; ex (sp),ix db ins_s_1_1 ; inconnu db ins_r_2_5 ; push ix db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_jpix ; jp (ix) db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; SUR PREFIXE ED db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu ; db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_r_2_3 ; ld sp,ix db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu db ins_s_1_1 ; SUR PREFIXE FD db ins_s_1_1 ; inconnu db ins_s_1_1 ; inconnu finCalcCpu if simu_test org #5000 run $ ; ld hl,moncode ld de,fincode call calc_cpucode moi jr moi org #4000 moncode di ld hl,coucou ld ix,coucou+3 ld iy,coucou+7 scf call nc,appelnc call nc,appelc or a call c,appelnc call c,appelc xor a call m,appelm call m,appelp dec a call p,appelp call p,appelm xor a call z,appelz call z,appelnz dec a call nz,appelz call nz,appelnz call appelpo call appelpe ccf cp (hl) cp (ix+4) cp (iy+7) cp a cp b cp c cp d cp e cp h cp l cp 5 cpd cpi cpl daa dec (hl) dec (ix+10) dec (iy+11) gloub dec a dec b dec bc dec c test dec d dec de dec e dec h dec hl dec ix inc ix dec iy inc iy dec l dec sp inc sp ex (sp),hl ex (sp),ix ex (sp),iy ld hl,coucou ld ix,coucou+3 ld iy,coucou+7 ex af,af' ex de,hl ex de,hl ld b,5 exx ld b,10 exx moi1 djnz moi1 exx moi2 djnz moi2 ld hl,test ld bc,15 ld a,(test+5) cpir ld hl,test ld bc,15 ld a,#ff cpir ld hl,test ld bc,10 ld a,(gloub) cpdr ld hl,test ld bc,10 ld a,#ff cpdr ld hl,coucou im 0 im 1 im 2 ld b,#f5 in a,(c) in b,(c) in c,(c) in d,(c) in e,(c) in h,(c) in l,(c) ld hl,coucou inc (hl) inc (ix+5) inc (iy+7) inc a inc b inc bc inc c inc d inc de inc e inc h inc hl inc ix inc iy inc l inc sp ld hl,coucou ld bc,coucou+2 ld de,coucou+4 ; ld (bc),a ld (de),a ld (hl),a ld (hl),b ld (hl),c ld (hl),d ld (hl),e ld (hl),h ld (hl),l ;=== ld (hl),#33 ld (ix+1),a ld (ix+1),b ld (ix+1),c ld (ix+1),d ld (ix+1),e ld (ix+1),h ld (ix+1),l ; ld (ix+1),2 ld (iy+1),a ld (iy+1),b ld (iy+1),c ld (iy+1),d ld (iy+1),e ld (iy+1),h ld (iy+1),l ld (iy+1),4 ;=== ld (coucou),a ld (coucou),bc ld (coucou),de ld (coucou),hl ld (coucou),ix ld (coucou),iy ld (coucou),sp ; ld a,(bc) ld a,(de) ld a,(hl) ld a,(ix+3) ld a,(iy+5) ld a,(hello) ld a,a ld a,b ld a,c ld a,d ld a,e ld a,h ld a,i ld a,l ld a,5 ld a,r ld b,(hl) ld b,(ix+10) ld b,(iy+11) ld b,a ld b,b ld b,c ld b,d ld b,e ld b,h ld b,12 ld bc,(hello) ld bc,hello ld c,(hl) ld c,(ix+10) ld c,(iy+11) ld c,a ld c,b ld c,c ld c,d ld c,e ld c,h ld c,12 ld d,(hl) ld d,(ix+10) ld d,(iy+11) ld d,a ld d,b ld d,c ld d,d ld d,e ld d,h ld d,12 ld de,(hello) ld de,hello ld e,(hl) ld e,(ix+10) ld e,(iy+11) ld e,a ld e,b ld e,c ld e,d ld e,e ld e,h ld e,13 ld h,(hl) ld h,(ix+10) ld h,(iy+11) ld h,a ld h,b ld h,c ld h,d ld h,e ld h,h ld h,14 ld hl,(hello) ld hl,hello ld i,a ld ix,(coucou) ld ix,coucou ld iy,(hello) ld iy,hello ld l,(hl) ld l,(ix+3) ld l,(iy+4) ld l,a ld l,b ld l,c ld l,d ld l,e ld l,h ld l,15 ld r,a ld sp,(coucou) ld sp,hl ld sp,ix ld sp,iy ld hl,coucou+10 ld de,coucou+10 ld bc,5 ldd lddr ld bc,6 ldir neg nop or(hl) or (ix+3) or (iy+4) or a or b or c or d or e or h or 15 ;ok ld bc,#bd00 outi inc b outd pop af pop bc pop de pop hl pop ix pop iy push iy push ix push hl push de push bc push af ld hl,coucou ld ix,coucou+1 ld iy,coucou+2 res 0,(hl) res 0,(ix+3) res 0,(iy+4) res 1,(hl) res 1,(ix+3) res 1,(iy+4) res 2,(hl) res 2,(ix+3) res 2,(iy+4) res 3,(hl) res 3,(ix+3) res 3,(iy+4) res 4,(hl) res 4,(ix+3) res 4,(iy+4) res 5,(hl) res 5,(ix+3) res 5,(iy+4) res 6,(hl) res 6,(ix+3) res 6,(iy+4) res 7,(hl) res 7,(ix+3) res 7,(iy+4) rl (hl) rl (ix+4) rl (iy+5) rlc (hl) rlc (ix+3) rlc (iy+5) rr (hl) rr (ix+3) rr (iy+6) rrc (hl) rrc (ix+3) rrc (iy+6) res 0,a res 0,b res 0,c res 0,d res 0,e res 0,h res 0,l res 1,a res 1,b res 1,c res 1,d res 1,e res 1,h res 1,l res 2,a res 2,b res 2,c res 2,d res 2,e res 2,h res 2,l res 3,a res 3,b res 3,c res 3,d res 3,e res 3,h res 3,l res 4,a res 4,b res 4,c res 4,d res 4,e res 4,h res 4,l res 5,a res 5,b res 5,c res 5,d res 5,e res 5,h res 5,l res 6,a res 6,b res 6,c res 6,d res 6,e res 6,h res 6,l res 7,a res 7,b res 7,c res 7,d res 7,e res 7,h res 7,l rl a rl b rl c rl d rl e rl h rl l rla rlc a rlc b rlc c rlc d rlc e rlc h rlc l rlca rr a rr b rr c rr d rr e rr h rr l rra rrc a rrc b rrc c rrc d rrc e rrc h rrc l rrca ld hl,coucou rld ld hl,coucou+1 rrd ld hl,#30 ld a,(hl) ld (hl),#c9 rst #30 ld (hl),a sbc a,4 sbc a,(hl) sbc a,(ix+3) sbc a,(iy+6) sbc a,a sbc a,b sbc a,c sbc a,d sbc a,e sbc a,h sbc a,l sbc hl,bc sbc hl,de sbc hl,hl sbc hl,sp ld hl,coucou set 0,(hl) set 0,(ix+3) set 0,(iy+4) set 1,(hl) set 1,(ix+3) set 1,(iy+4) set 2,(hl) set 2,(ix+3) set 2,(iy+4) set 3,(hl) set 3,(ix+3) set 3,(iy+4) set 4,(hl) set 4,(ix+3) set 4,(iy+4) set 5,(hl) set 5,(ix+3) set 5,(iy+4) set 6,(hl) set 6,(ix+3) set 6,(iy+4) set 7,(hl) set 7,(ix+3) set 7,(iy+4) sla (hl) sla (ix+3) sla (iy+4) sra (hl) sra (ix+3) sra (iy+4) srl (hl) srl (ix+3) srl (iy+4) sub (hl) sub (ix+3) sub (iy+4) xor (hl) xor (ix+3) xor (iy+4) set 0,a set 0,b set 0,c set 0,d set 0,e set 0,h set 0,l set 1,a set 1,b set 1,c set 1,d set 1,e set 1,h set 1,l set 2,a set 2,b set 2,c set 2,d set 2,e set 2,h set 2,l set 3,a set 3,b set 3,c set 3,d set 3,e set 3,h set 3,l set 4,a set 4,b set 4,c set 4,d set 4,e set 4,h set 4,l set 5,a set 5,b set 5,c set 5,d set 5,e set 5,h set 5,l set 6,a set 6,b set 6,c set 6,d set 6,e set 6,h set 6,l set 7,a set 7,b set 7,c set 7,d set 7,e set 7,h set 7,l ; sla a sla b sla c sla d sla e sla h sla l sra a sra b sra c sra d sra e sra h sra l srl a srl b srl c srl d srl e srl h srl l sub a sub b sub c sub d sub e sub h sub l sub #40 xor a xor b xor c xor d xor e xor h xor l xor #51 if simu_regr ld a,6 ld r,a endif call testreti call testretn if simu_regr ld a,r boink dec a jr nz,boink endif jr fincode testreti reti testretn retn appelc ret c ret appelnc ret nc ret appelz ret z ret appelnz ret nz ret appelpe ret pe ret appelpo ret po ret appelp ret p ret appelm ret m ret hello ld hl,4 ret c ret nc ret z ret nz ret m ret p ret fincode coucou fincoucou endif save "CalcCpuF8d0.bin",debutCalcCpu,finCalcCpu-debutCalcCpu