PROGRAMMING
Vladimir Kuznetsov
Every beginner
programmer wants to
make the running
line. But why
start? Could it have
someone to "pull"?
The answer to the question is very simple:
appeal to those who have it
made myself! To me, many
been asked for help and
I decided to publish a few
specific examples. And so,
begin ...
ORG # 8000
FONT EQU # 3D00; address of the beginning
; Font
WBUF EQU # 7E00; address of the beginning
; Buffer
SCROL1: LD A, 1
RRCA
LD (SCROL1 +1), A
JR NC, SCROL5
Trying to calculate the location of the font of a new letter
...
SCROL3: LD HL, TEXT
LD A, (HL)
INC HL
SUB # 20
JR NC, SCROL2
End of the text - the code is less than # 20
LD HL, TEXT
XOR A
SCROL2: LD (SCROL3 +1), HL
LD DE, FONT
LD L, A
LD H, 0
ADD HL, HL
ADD HL, HL
ADD HL, HL
ADD HL, DE
Transfer the character to the work buffer
LD B, 8
LD DE, WBUF +32
SCROL4: PUSH BC
LDI
EX DE, HL
LD BC, 32
ADD HL, BC
EX DE, HL
POP BC
DJNZ SCROL4
Scroll the (shift) working
Buffer ...
SCROL5: LD HL, WBUF +263
LD B, 132
SCROL6: RL (HL)
DEC HL
RL (HL)
DEC HL
DJNZ SCROL6
If you use TASM3.2 and
you do not mind the memory (the procedure
increases in ob'eme 518
B), it can be written
as follows:
SCROL5: LD HL, WBUF +263
DEFS 264, # CB, # 16, # 2B
But the gain in time
amount to 1586 cycles! Increase
performance can be further to 264
tact:
SCROL5: LD HL, WBUF +263
DEFS 132, # CB, # 16, # 2B
DEFS # CB, # 16, # 2D
Next, we derive the buffer to the screen ...
This can be done the traditional
way:
LD HL, WBUF
LD DE, # 5000
LD B, 8
SCROL7: PUSH BC
PUSH DE
LD BC, 32
LDIR
POP DE
POP BC
INC HL
INC D
DJNZ SCROL7
RET
| GSkorost Hours: 5968 cycles.
But there are more cunning and
moreover, faster ways
output.
For example you can draw a conclusion
as follows:
LD HL, WBUF
LD DE, # 5000
LD B, 8
SCROL7: PUSH BC
PUSH DE
DEFS 32, # ED, # A0
POP DE
POP BC
INC HL
INC D
DJNZ SCROL7
RET
Speed: 4,688 cycles.
A "revealing" cycle, you increase
output speed up to 4424 cycles!
But personally I like more
the copying of the stack:
DI
EXX
PUSH HL
LD (SAVESP +1), SP
LD SP, WBUF
POP AF
POP HL
POP DE
POP BC
EX AF, AF '
EXX
POP AF
POP HL
POP DE
POP BC
LD SP, # 5010
PUSH BC
PUSH DE
PUSH HL
PUSH AF
EX AF, AF '
EXX
PUSH BC
PUSH DE
PUSH HL
PUSH AF
Then repeat this block, but
with the changes:
LD SP, WBUF +16
POP AF
.....
LD SP, # 5020
PUSH BC
.....
LD SP, WBUF +33
POP AF
.....
LD SP, # 5110
PUSH BC
.....
LD SP, WBUF +49
POP AF
.....
LD SP, # 5120
PUSH BC
.....
.....
.....
LD SP, # 5720
PUSH BC
.....
SAVESP: LD SP, 0
POP HL
EXX
EI
RET
Noticed an algorithm for computing?
If not, then use my
applets:
10 FOR I = 0 TO 7
20 PRINT I * 33, I * 33 16
30 NEXT I
The obtained numbers are shifts in the working buffer.
Screen addresses are calculated as follows:
10 FOR I = 0 TO 7
20 PRINT I * 256 +16, I * 256 32
30 NEXT I
Note: When working with a stack
interruption should be banned
(Command DI) and saved register pair HL '(alternative).
Operating speed: 3520 cycles!
*