And now - a few useful
Boards of music lovers
DEMO:
EYE ACHE 2 - if, during
podgruzki from CD music begins to slow down, try to rewrite the
program to disk with alternating sectors = 1 (be sure to start
disk!)
RAGE - when you start holding down SPACE
(Or run in a mode of 48K), you can read the interesting text,
which contains a few tips for beginners demomeykeram.
*
(C) Ivan Roshchin, Moscow, 1997
Rapid transfer of screen
It is known that the transfer of content on-screen memory (#
1800 bytes) took more time
than the interval between two interrupts. Nevertheless, if
image should not change
every 1 / 50 seconds, and at least
every 1 / 25 seconds, there is a way
so do shipping, that while the beam draws the current frame - we
see the first picture, when the beam
draws the next frame - we see
already the second picture.
Consider what the
this way. Let the memory
(# 4000 - # 5800) is the first
picture. After the arrival of the pulse
interrupts the beam begins to draw
image, starting from the top
edge of the screen, draws the border and in
eventually draws the most
upper row of the small screen.
\
border
television
small screen display
/
It was then that we begin to throw out the second picture
buffer in video memory, in strict
the same manner as it is portrayed on the screen (ie, along the
lines, from top to bottom). Since the beam forms an image faster
What we update the content of video memory, the display will
shows the first image.
The transfer of images continues until the ray Tracings
the entire screen. Calculate how much
It will take time: full screen -
320 lines, the upper part of the border - 80 rows, and another
line We especially missed. Because
while drawing a single line -
224 cycles, we get (320-81) * 224
= 53,536 cycles. During this time, of course, completely
refresh the video memory does not work, but it's still is not
necessary.
Once the beam Tracings entire screen, proceed as follows
pulse interrupt, and starts draw in the next frame.
While the beam draws the upper part of
border and the upper part of small
screen (ie, already the second picture), we are not wasting any
time, throws in a video memory the remainder of the second
picture. The transfer must be completed before such time as the
beam begins to draw the bottom line of the small screen, ie,
transfer procedure shall be packed in 53,536 + (80 +
192-1) * 224 = 114240 cycles. And that is abundantly sufficient
for even transferring pictures, along with the attributes (in
this case, the procedure must be forwarded to the queue 8 lines
of image and attributes for these 8 lines).
This calculation for "Pentagona128. Corporate Spectrum
differs from it by the following parameters: the upper part of
the border is 64 rows instead of 80 and
on the screen 312 rows instead of 320.
Procedure to transfer work on it, it should take no more than
(312-81) * 224 + (64 + 191) * 224 = 108864 cycles. But this
still lacking, even considering that the write / read memory
ULA slow processor. But if the processor, by contrast, will run
faster (Turbocharged Spectrum) transfer procedure may not give
the desired result. To make it
function properly in this case, you need to make it "fit into
the break, and accomplishes their work before it begins
drawn the bottom line of small screen).
And now - two programs that perform the same task:
every 1 / 25 second, they change
screen color from white to black and
vice versa. The first program uses LDIR, while the other works
on the algorithm considered above. Feel the difference!
Program 1:
140.
LD HL, # 8000; 1-I picture
LD (HL), 0
LD DE, # 8001
LD BC, # 17FF
LDIR
LD HL, # 9800, 2 nd picture
LD (HL), # FF
LD DE, # 9801
LD BC, # 17FF
LDIR
L1 HALT
LD HL, # 8000
LD DE, # 4000
LD BC, # 1800
LDIR
HALT
LD HL, # 9800
LD DE, # 4000
LD BC, # 1800
LDIR
XOR A
IN A, (254)
CPL
AND 31
JR Z, L1
RET
Program 2:
PIC1 EQU # 8000; 1-I picture
PIC2 EQU # 9800; 2-I picture
LD HL, PIC1
LD (HL), 0
LD DE, PIC1 +1
LD BC, # 17FF
LDIR
LD HL, PIC2
LD (HL), # FF
LD DE, PIC2 +1
LD BC, # 17FF
LDIR
; Building tables with addresses transfer:
LD BC, PIC1-# 4000
LD HL, TABL1
LD DE, # 4000
CALL MAKE_T
LD BC, PIC2-# 4000
LD HL, TABL2
LD DE, # 4000
CALL MAKE_T
; Main program loop:
LOOP1 LD HL, TABL1
LD DE, BUFER +100
LD BC, 192 * 4
LDIR
CALL MOVER
LD HL, TABL2
LD DE, BUFER +100
LD BC, 192 * 4
LDIR
CALL MOVER
XOR A
IN A, (254)
CPL
AND 31
JR Z, LOOP1
;--------------------------------------; Procedure directly
MOVER ; Forwards:
MOVER HALT
; To avoid delays in processing
; Interrupt can be put here DI
, (Then at the exit from this procedure
; You need to put EI)
LD (QUIT +1), SP
LD SP, BUFER +100
; Delay until Tracings Line 1
LD HL, 0
LD DE, 0
LD BC, # 330
LDIR
LD BC, # 1800
; We take from the stack the new values of HL and DE,
, Pointing to the next line:
MMMM POP DE
POP HL
TO_LDI LDI: LDI: LDI: LDI: LDI: LDI: LDI: LDI
LDI: LDI: LDI: LDI: LDI: LDI: LDI: LDI
LDI: LDI: LDI: LDI: LDI: LDI: LDI: LDI
LDI: LDI: LDI: LDI: LDI: LDI: LDI: LDI
JP PE, MMMM; continue ...
QUIT LD SP, 0
RET
;--------------------------------------; MAKE_T procedure
builds a plate:
MAKE_T LD A, D
CP # 58
RET Z
LD (HL), E
INC HL
LD (HL), D
INC HL
EX DE, HL
ADD HL, BC
EX DE, HL
LD (HL), E
INC HL
LD (HL), D
INC HL
EX DE, HL
AND A
SBC HL, BC
EX DE, HL
INC D
LD A, D
AND 7
JR NZ, MAKE_T
LD A, E
SUB # E0
LD E, A
JR NC, MAKE_T
LD A, D
SUB 8
LD D, A
JR MAKE_T
;--------------------------------------
TABL1 DS 192 * 4
TABL2 DS 192 * 4
; Stack for procedure
; Interrupt (if during
; Of percent. MOVER interrupt
; Banned, it is not needed):
BUFER DS 100
, "Disposable" address label lines
, (Broken handling procedures
; Interrupt needs to be updated):
DS 192 * 4
*