Arrow WITHOUT Switchman ...
Probably many, running X-REVERSY, or
FONT EDITOR, or the same ASPECT seen
the tool control of programming
product. And, certainly, attempts Scodie
arrow did not lead to desirable: for
move the arrow blinking, twitching, and
when trying to make her own, but through
interruption, the image is likely to
disappeared altogether.
I also had similar problems, but their
been overcome. First, we must
get rid of heaps of teams RRCA / RLCA, and
is very simple: instead of
moving image direction during
O, it is necessary to move him before the withdrawal, and
polozht in memory (of 8 images)
and no need to calculate the address output
screen with 8,880 procedures or her
like - fill in the table ...
And here is the code:
ORG 30000
CALL ZAPTAB; fill in the address table
CALL ZAPSTR; do 8 images
The arrows and masks for
The arrows
CALL OUTMAR; derive arrow
LD HL, INTERR; put his handler
; Interrupt
CALL IMON
MMMM EI; forward
HALT
LD A, (HOLDING +1); until you
AND A; FIRE button on KEMPSTONe or
JR NZ, MMMM; SINCLAIRe or SPACE for
RET; clave, oposlya then leave ...
, Procedure interrupt
INTERR DI; to any fireman
PUSH HL; ethno must be preserved ...
PUSH DE
PUSH BC
PUSH AF
EXX
PUSH HL
PUSH BC
PUSH DE
EX AF, AF '
PUSH AF
PUSH IX
PUSH IY; ... on memory
HOLDING LD A, 2, and whether it is necessary that the thread
AND A; displayed on the screen?
JR Z, UPR; no!
CALL ZATIR; overwrites the image arrow
DEC A; overwrite and no longer walk?
JP Z, FIRE1; yes!
XOR A; will drop box pressing
LD (FLG), A
CALL KBDJOY; check management
RRCA; if you need to move the arrow
PUSH AF
CALL C, RIGHT
POP AF
RRCA
PUSH AF
CALL C, LEFT
POP AF
RRCA
PUSH AF
CALL C, DOWN
POP AF
RRCA
PUSH AF
CALL C, UP
POP AF
RRCA
JR C, FIRE; flame - lit it go ..
LD A, (FLG); button is not pressed?
AND A
JR NZ, UPR1; sad but true
INC A; if pitch is equal to one
LD (RAZ), A
UPR1 CALL OUTMAR; derive arrow
UPR POP IY; restore everything
POP IX
POP AF
EX AF, AF '
POP DE
POP BC
POP HL
EXX
POP AF
POP BC
POP DE
POP HL
EI
RET; and go myself ...
; Light pressed, however,
FIRE LD A, 1; Hard to image and
FIRE1 LD (HOLDING +1), A; go to
JP UPR; idle
; Move right
RIGHT LD A, (POSX); coordinate of X
LD C, A
LD A, (RAZ); step arrows
ADD A, C
RET C; the screen (255 + n = n-1 CY = 1)
LD (POSX), A
MET LD A, 1 click!
LD (FLG), A
LD A, (RAZ); can not go faster?
CP 1913
RET NC; impossible!
INC A; accelerates
LD (RAZ), A
RET
; Move to the left
LEFT LD A, (POSX)
LD BC, (RAZ)
CP C; coordinate smaller steps?
RET C; hence can not be left
SUB C; move to the left
LD (POSX), A
JP MET
; Go up
UP LD A, (POSY)
LD BC, (RAZ)
CP C; above Y = 0 only ROM
RET C
SUB C
LD (POSY), A
JP MET
; Move down
DOWN LD A, (POSY)
LD BC, (RAZ)
ADD A, C
CP 191; Below Y = 191 we do not need
RET NC
LD (POSY), A
JP MET
; Installation procedure interrupt
; The entrance - HL address of the procedure
; Interrupt
; Spoils: HL, BC, DE, AF
IMON
DI
LD A, 24
LD (65535), A
LD A, 195
LD (65524), A
LD (65525), HL
LD HL, # FE00
LD DE, # FE01
LD BC, 256
LD A, H
LD (HL), # FF
LDIR
DI
LD I, A
IM 2
EI
RET
; Output arrows
; With addresses TABLE should be a table
; Address output
; To address BUFFER must be empty
; Space of not less than 32 bytes
; To address STR0 have found data
, For the arrow that is 8 sprites arrows
, And a mask and in this form:
; Byte mask byte arrows
The length of the arrows 2 bytes (the length of the mask
, Also 2 bytes), height 16 pixels
, Ie with STR0 must be 512 bytes.
OUTMAR LD BC, (POSX); take the position output
LD (ZTPOSX), BC; put it in a procedure
; Mashing
LD E, B
LD D, 0
LD IX, TABLE; find the starting address
ADD IX, DE; output in the table
ADD IX, DE
LD (ZATIR +2), IX; put it in the procedure
LD IY, BUFFER; mashing, in IY - buffer
, Which will be kept of
; Screen hit by an arrow
LD A, C; calculate the sprite to display
AND 7
LD B, A
OUTMX LD HL, STR0
AND A
JR Z, OUTM2
LD DE, 64
OUTM1 ADD HL, DE
DJNZ OUTM1
OUTM2 LD B, # 10
SRL C; in C - Column
SRL C
SRL C
LD A, C
INC A
AND # 1F; at the end of the screen
JR Z, OUTM7; yes!
OUTM4 EX DE, HL
LD A, (IX)
CP # FF; below the screen - does not derive
RET Z; ...
ADD A, C; address display
LD L, A
LD H, (IX +1)
INC IX
INC IX
PUSH BC
EX DE, HL
LD B, (HL); take the mask
INC HL
LD C, (HL); take the data
INC HL
LD A, (DE)
LD (IY), A
INC IY
AND B; impose
OR C
LD (DE), A; deduce
INC DE
LD A, (DE)
LD (IY), A
LD B, (HL)
INC HL
LD C, (HL)
AND B
OR C
LD (DE), A
INC IY
OUTM6 INC HL
POP BC
DJNZ OUTM4
RET
OUTM7 EX DE, HL; the same thing, only
LD A, (IX); displayed one byte instead of
CP # FF; two
RET Z
ADD A, C
LD L, A
LD H, (IX +1)
INC IX
INC IX
PUSH BC
EX DE, HL
LD B, (HL)
INC HL
LD C, (HL)
INC HL
INC HL
INC HL
LD A, (DE)
LD (IY), A
INC IY
AND B
OR C
LD (DE), A
POP BC
DJNZ OUTM7
RET
; Procedure, the reconstructed image
; The arrow
ZATIR LD IX, # 4000; there will be another
LD HL, BUFFER
LD B, # 10
LD A, (ZTPOSX)
SRL A
SRL A
SRL A
LD C, A
LD A, C
INC A
AND # 1F
JR Z, ZATIR3
ZATIR1 LD A, (IX)
CP # FF
RET Z
ADD A, C
LD E, A
LD D, (IX +1)
LDI
LDI
INC BC
INC BC
INC IX
INC IX
DJNZ ZATIR1
RET
ZATIR3 LD A, (IX)
CP # FF
RET Z
ADD A, C
LD E, A
LD D, (IX +1)
LDI
INC BC
INC IX
INC IX
DJNZ ZATIR3
RET
; Response to the buttons and joystick
KBDJOY IN A, (31); Kempston with us?
LD E, A
AND 3
CP 3
JR NZ, KBDJ1; yes!
LD E, 0, no, walk out
KBDJ1 LD HL, DKEY; data about the keys
; Management
KBDJ2 LD C, (HL); take the port address
INC C
DEC C
LD A, E
RET Z; if 0 then this is the end ...
INC HL
LD B, (HL)
INC HL
IN A, (C); read data from the porch
CPL
AND (HL); select the desired bit
INC HL
JR Z, KBDJ3; such we have not clicked
LD A, (HL); clicked, take The figures in
OR E
LD E, A
KBDJ3 INC HL
JR KBDJ2
; Procedure produced eight sprites to
; Arrows on STR0 should be
; Sprite in the above format
ZAPSTR LD IX, STR0
ZAPSTRX PUSH IX
LD HL, STR0
LD DE, 64
LD C, 8
ADD HL, DE
PUSH HL
POP IY
ZAPST2 POP IX
PUSH IY
LD B, # 10
ZAPST1 CALL ZAPBYT
INC IX
INC IY
LD A, (IX)
AND A
CALL ZAPBY1
INC IX
INC IX
INC IX
INC IY
INC IY
INC IY
DJNZ ZAPST1
DEC C
JR NZ, ZAPST2
POP IX
RET
ZAPBYT LD A, (IX)
SCF
ZAPBY1 RRA
LD (IY), A
LD A, (IX +2)
RRA
LD (IY +2), A
RET
; Fills the address table with addresses
; TABLE
ZAPTAB LD IX, TABLE
LD HL, # 4000
CALL ZAPADR
LD HL, # 4800
CALL ZAPADR
LD HL, # 5000
CALL ZAPADR
LD (IX), # FF
LD (IX +1), # FF
LD (IX +2), # FF
RET
ZAPADR LD DE, # 20
LD C, 8
ZAPAD2 PUSH HL
LD B, 8
ZAPAD1 LD (IX), L
LD (IX +1), H
INC IX
INC IX
INC H
DJNZ ZAPAD1
POP HL
ADD HL, DE
DEC C
JR NZ, ZAPAD2
RET
; Data for the survey of the keyboard:
; Ml.bayt port, the port st.bayt, mask, weight
DKEY DEFB # FE, # FB, 1,8, # FE, # FD, 1,4, # FE, # DF
DEFB 2,2
DEFB # FE, # DF, 1,1, # FE, # 7F, 1,16
DEFB # FE, # EF, 16,2, # FE, # EF, 8,1, # FE, # EF, 4,4
DEFB # FE, # EF, 2,8, # FE, # EF, 1,16
DEFB 0
; Buffer for a piece of the screen
BUFFER DEFS 32
; Data for the arrows
STR0 DEFB 159,0,255,0,135,32,255,0,131,48
DEFB 255,0
DEFB 129,56,255,0,128,60,255,0,128,62,255
DEFB 0
DEFB 128,63,255,0,128,56,255,0,193,36,255
DEFB 0
DEFB 240,4,255,0,248,2,255,0,252,2,255,0
DEFB 252,0,255,0,255,0,255,0,255,0,255,0
DEFB 255,0,255,0
DEFS 480
; Variables arrows
ZTPOSX DEFB 0
ZTPOSY DEFB 0
FLG DEFB 0
RAZ DEFB 1
POSX DEFB 32
POSY DEFB 32
, Address table
TABLE
Now why I have a procedure
O arrow actually consists of two
procedures: the fact that faster
check once at the beginning, rather than 16-fold
during withdrawal. Incidentally, the fact that
the above example, the arrow was
implemented via interrupts is not
means that this is the way it should be: do
arrow through the interrupt sense
when displayed on the screen
dynamic image (such as labels
ASPECT). Well, so far, and all soon!
(C) Trusov Ilya