ZXNet эхоконференция «zxnet.pc»


тема: ULA в EMUZWin, продолжение. Часть 3



от: Владимир Кладов
кому: All
дата: 19 Jan 2007
Hello, Vladimir Kladov А вот это - реализация команд LDI/LDIR/LDD/LDDR. Разберитесь, если есть желание. ┌─- CODE ─── @@_ld&direction.r; //; LDIR, LDDR .IF (FastLDIR <> 0) and ("&LDIRHL" <> "") CMP B[&ZX].DebuggerVisible, 0 JNZ @@_ld&direction.r_usual MOVZX ECX, W[&ZX].Regs.Reg_BC DEC ECX JZ @@_ld&direction.r_usual MOVZX EDX, W[&ZX].Regs.Reg_DE MOV ECX, EBX DEC CX CMP CX, DX JZ @@_ld&direction.r_usual .if MemPtrNew MOV [&ZX].reg_Hidden, CH .endif DEC CX CMP CX, DX JZ @@_ld&direction.r_usual MOV EBX, ECX PUSH EAX .IF "&LDIRHL" = "BX" PUSH EBX .ENDIF MOVZX &ELDIRHL, W[&ZX].Regs.Reg_HL .IF GeneralSnd ADD D[&ZX].TStatesToExecute, 16 .ENDIF .IF MultiColor MOV [&ZX].TempFlip, EDI ADD D[&ZX].TempFlip, 256 .ENDIF JMP SHORT @@_ld&direction.r_fast_next @@_ld&direction.r_fast_loop; .IF; RZX_play ADD D[&ZX].NumFetches, 2 .ELSEIF GeneralSnd INC D[&ZX].NumFetches .ENDIF .IF MultiColor ADD B[&ZX].TactRCount, 2 .IF NoDelay ADD EDI, 8 .ELSEIF "&LDIRHL" = "BX" POP EAX PUSH EAX Delay Time=4, Mem=A, Temp=C INC AX Delay Time=4, Mem=A, Temp=C .ELSE Delay Time=4, Mem=B, Temp=C INC BX Delay Time=4, Mem=B, Temp=C DEC BX .ENDIF .ELSEIF MultiColor = 0 ADD D[&ZX].TactRCount, $100002 AND W[&ZX].TactRCount, $7F .ENDIF @@_ld&direction.r_fast_next; .IF; "&LDIRHL" = "BX" Delay Time=3, Mem=B, Temp=C GetMem1 Dest=AL, Addr=B, Temp=C, Gfx=mm0 .ELSE MOV EAX, &ELDIRHL Delay Time=3, Mem=A, Temp=C GetMem1 Dest=AL, Addr=A, Temp=C, Gfx=mm0 .ENDIF .IF Plus3 or NoDelay Delay Time=5, Mem=D, Temp=C // задержка DE wr:5 .ELSE Delay Time=3, Mem=D, Temp=C // задержка DE wr:3 DelayMore Temp=C, Count=2 .ENDIF PutMem Addr=D, Reg=AL, Temp=C, Gfx=mm0 DEC W[&ZX].Regs.Reg_BC JZ @@_ld&direction.r_fast_end_incRegs .IF "&direction" = "i" INC DX INC &LDIRHL .IF "&LDIRHL" = "BX" CMP DX, [ESP] .ELSE AND &ELDIRHL, $FFFF CMP DX, BX .ENDIF JZ SHORT @@_ld&direction.r_fast_fin .IF MultiColor CMP EDI, 60000 JGE SHORT @@_ld&direction.r_fast_fin .ENDIF .ELSE DEC DX DEC &LDIRHL DEC DX .IF "&LDIRHL" = "BX" CMP DX, [ESP] .ELSE AND &ELDIRHL, $FFFF CMP DX, BX .ENDIF JZ SHORT @@_ld&direction.r_fast_fin_INCDX .IF MultiColor CMP EDI, 60000 JGE SHORT @@_ld&direction.r_fast_fin_INCDX .ENDIF INC DX .ENDIF .IF MultiColor = 0 ADD W[&ZX].TactRCount + 2, 5 JS SHORT @@_ld&direction.r_fast_fin .ELSE .IF Plus3 or NoDelay Delay Time=5, Mem=D, Temp=C // дополнительно 5 задержек DE:1 .ELSE Delay Time=1, Mem=D, Temp=C // дополнительно 5 задержек DE:1 DelayMore Temp=C, Count=4 .ENDIF .ENDIF .IF GeneralSnd SUB [&ZX].TStatesToExecute, 21 CMP [&ZX].TStatesToExecute, 21 JG @@_ld&direction.r_fast_loop MOV ECX, [&ZX].NumFetches CMP ECX, [&ZX].MaxFetches JGE @@_ld&direction.r_fast_fin .ELSEIF RZX_play MOV ECX, [&ZX].NumFetches CMP ECX, [&ZX].MaxFetches JGE @@_ld&direction.r_fast_fin .IF MultiColor CMP B[EDI+MC_IntSignal_Table], 0 JNZ SHORT @@_ld&direction.r_fast_fin .ENDIF .ELSE .IF MultiColor CMP B[EDI+MC_IntSignal_Table], 0 JNZ SHORT @@_ld&direction.r_fast_fin CMP EDI, [&ZX].TempFlip JGE SHORT @@_ld&direction.r_fast_fin .ELSE .ENDIF .ENDIF JMP LONG @@_ld&direction.r_fast_loop @@_ld&direction.r_fast_fin_INCDX; INC; DX @@_ld&direction.r_fast_fin; //; завершаем цикл быстрого LDIR по разным причинам, // кроме исчерпания Reg_BC MOV ECX, &ELDIRHL MOV [&ZX].Regs.Reg_HL, CX MOV [&ZX].Regs.Reg_DE, DX .IF "&LDIRHL" = "BX" POP EBX .ENDIF POP ECX MOV AH, CH ADD AL, [&ZX].Reg_A // !!! формируем флажки X и Y !!! .IF LDIR_BY_TABLE AND EAX, $FFFF MOV AX, W[EAX*2+Table_LDIR1] .ELSE // !!! формируем флажки X и Y !!! MOV CL, AL AND CL, 2 SAL CL, 4 AND AL, $F OR AL, CL //------------------------------- AND AH, not flag_H .ENDIF OR AH, flag_N or flag_P NextInstr @@_ld&direction.r_fast_end_incRegs; //; завершение быстрого LDIR по исчерпании Reg_BC .IF "&direction" = "i" INC DX INC &LDIRHL .ELSE DEC DX DEC &LDIRHL .ENDIF @@_ld&direction.r_fast_end; //; завершение быстрого LDIR по исчерпании Reg_BC .IF GeneralSnd ADD D[&ZX].TStatesToExecute, 5 .ENDIF MOV ECX, &ELDIRHL MOV [&ZX].Regs.Reg_HL, CX MOV [&ZX].Regs.Reg_DE, DX .IF "&LDIRHL" = "BX" POP EBX .ENDIF POP ECX MOV AH, CH ADD AL, [&ZX].Reg_A // !!! формируем флажки X и Y !!! .IF LDIR_BY_TABLE AND EAX, $FFFF MOV AX, W[EAX*2+Table_LDIR1] .ELSE // !!! формируем флажки X и Y !!! MOV CL, AL AND CL, 2 SAL CL, 4 AND AL, $F OR AL, CL //------------------------------- AND AH, not (flag_P or flag_H) .ENDIF OR AH, flag_N INC BX INC BX NextInstr .ENDIF @@_ld&direction.r_usual; INC_TactRCount; Value=5, ReturnTStates=16, ReturnPC=2, ReturnR=2, ReturnFetches=1 MOVZX ECX, W[&ZX].Regs.reg_HL Delay Time=3, Mem=C // задержка HL:3 GetMem1 Dest=AL, Addr=C, Gfx=mm0 MOVZX ECX, W[&ZX].Regs.reg_DE .IF Plus3 or NoDelay Delay Time=5, Mem=C // задержка DE wr:5 .ELSE Delay Time=3, Mem=C // задержка DE wr:3 DelayMore Count=2 .ENDIF PutMem Addr=C, Reg=AL, Gfx=mm0 ADD AL, [&ZX].Reg_A // !!! формируем флажки X и Y !!! .IF LDIR_BY_TABLE AND EAX, $FFFF MOV AX, W[EAX*2+Table_LDIR1] .ELSE // !!! формируем флажки X и Y !!! MOV CL, AL AND CL, 2 SAL CL, 4 AND AL, $F OR AL, CL //------------------------------- AND AH, not (flag_P or flag_H) OR AH, flag_N .ENDIF MOVZX EDX, W[&ZX].Regs.reg_DE .IF "&direction" = "i" INC W[&ZX].Regs.reg_HL INC W[&ZX].Regs.reg_DE .ELSE DEC W[&ZX].Regs.reg_HL DEC W[&ZX].Regs.reg_DE .ENDIF DEC W[&ZX].Regs.reg_BC JZ SHORT @@ld&direction.r_exit .IF Plus3 or NoDelay Delay Time=5, Mem=D // дополнительно 5 задержек DE:1 .ELSE Delay Time=1, Mem=D // дополнительно 5 задержек DE:1 DelayMore Count=4 .ENDIF OR AH, flag_P DEC BX .if MemPtrNew MOV [&ZX].reg_Hidden, BH .endif DEC BX @@ld&direction.r_exit; NextInstr; .ENDFOR //direction └── CODE ─── я жебил, я не шерхан, хавал жёваны штаны...




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Вступление - стихи и содержание номера.
Софтятиня - Black Raven - Mission editor.
Интервью - интервью с разработчиком клона HOBBIT (2-я часть).
Железо - маленькая схемка стереоусилителя для ZX Spectrum.
Новье !? - О играх: Gremlin 2: The New Batch, Tornado ECR, Turbo Skate Fighter, NARC.

В этот день...   8 мая