Изменил часть кода и добавил расчет смещения на экране в зависимости от координаты Y. Часто в программах встречается всевозможные способы подсчета адреса, даже внесенные в таблицу адреса.
*m=AllocateMemory(6912)
ReadFile(0,"esprit.scr")
ReadData(0,*m,6912)
CloseFile(0)
Procedure.l zxcol(zxv)
If zxv&8
w=255
Else
w=191
EndIf
If zxv&1
bb=w
Else
bb=0
EndIf
If zxv&2
rr=w
Else
rr=0
EndIf
If zxv&4
gg=w
Else
gg=0
EndIf
ProcedureReturn RGB(rr,gg,bb)
EndProcedure
If OpenWindow(0, 0, 0, 512, 384, "ZX Screen", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CanvasGadget(0, 0, 0, 512, 384)
If StartDrawing(CanvasOutput(0))
For y=0 To 191
disp=Int(y/64)*2048+(y&7)*256+((y>>3)&7)*32
For x=0 To 31
zxa=PeekA(*m+6144+x+32*Int(y/8))
If zxa&64
inkc=zxcol(zxa&7+8)
Else
inkc=zxcol(zxa&7)
EndIf
papc=zxcol((zxa>>3)&15)
a.a=PeekA(*m+disp+x)
b.a=128
For i=0 To 7
If b&a
putc=inkc
Else
putc=papc
EndIf
Box((x*8+i)*2,y*2,2,2,putc)
b=b>>1
Next i
Next x
Next y
StopDrawing()
EndIf
Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
EndIf
FreeMemory(*m)
ReadFile(0,"esprit.scr")
ReadData(0,*m,6912)
CloseFile(0)
Procedure.l zxcol(zxv)
If zxv&8
w=255
Else
w=191
EndIf
If zxv&1
bb=w
Else
bb=0
EndIf
If zxv&2
rr=w
Else
rr=0
EndIf
If zxv&4
gg=w
Else
gg=0
EndIf
ProcedureReturn RGB(rr,gg,bb)
EndProcedure
If OpenWindow(0, 0, 0, 512, 384, "ZX Screen", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CanvasGadget(0, 0, 0, 512, 384)
If StartDrawing(CanvasOutput(0))
For y=0 To 191
disp=Int(y/64)*2048+(y&7)*256+((y>>3)&7)*32
For x=0 To 31
zxa=PeekA(*m+6144+x+32*Int(y/8))
If zxa&64
inkc=zxcol(zxa&7+8)
Else
inkc=zxcol(zxa&7)
EndIf
papc=zxcol((zxa>>3)&15)
a.a=PeekA(*m+disp+x)
b.a=128
For i=0 To 7
If b&a
putc=inkc
Else
putc=papc
EndIf
Box((x*8+i)*2,y*2,2,2,putc)
b=b>>1
Next i
Next x
Next y
StopDrawing()
EndIf
Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
EndIf
FreeMemory(*m)

Комментарии
Отправить комментарий