Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
65
Task/Reverse-a-string/Z80-Assembly/reverse-a-string.z80
Normal file
65
Task/Reverse-a-string/Z80-Assembly/reverse-a-string.z80
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
PrintChar equ $BB5A ;Amstrad CPC bios call
|
||||
Terminator equ 0 ;null terminator for strings
|
||||
|
||||
|
||||
org $8000
|
||||
ld hl, StringA
|
||||
call ReverseString
|
||||
|
||||
ld hl, StringA
|
||||
call PrintString
|
||||
|
||||
ret ;return to basic
|
||||
|
||||
StringA:
|
||||
byte "12345678",0
|
||||
|
||||
;;;; SUBROUTINES
|
||||
GetStringLength:
|
||||
;HL = STRING. RETURNS LENGTH IN B. LENGTH IS ONE-INDEXED AND DOES NOT INCLUDE TERMINATOR.
|
||||
ld b,0 ;clear B
|
||||
loop_getStringLength:
|
||||
ld a,(hl) ;read the next char
|
||||
cp Terminator ;is it the terminator?
|
||||
ret z ;if so, exit
|
||||
inc hl ;point HL to next character
|
||||
inc b ;increase tally
|
||||
jr loop_getStringLength ;repeat
|
||||
|
||||
ReverseString:
|
||||
;reverse the order of letters in a text string.
|
||||
;e.g. "ABCD" -> "DCBA"
|
||||
;the terminator stays put.
|
||||
;INPUT: HL = SOURCE ADDRESS OF STRING
|
||||
push de
|
||||
push hl
|
||||
push hl
|
||||
call GetStringLength
|
||||
pop hl
|
||||
pop de ;LD DE,HL
|
||||
LD a,b ;LOAD B INTO A
|
||||
LD (SMC_ReverseString+1),a ;STORE IT LATER IN THE CODE SO WE CAN RETRIEVE IT.
|
||||
|
||||
; TO RECAP, BOTH HL AND DE POINT TO THE BEGINNING OF THE STRING WE WANT TO REVERSE. B EQUALS THE LENGTH OF THE STRING.
|
||||
; B HAS BEEN BACKED UP WITHOUT USING THE STACK BY STORING IT AS THE OPERAND OF A LATER INSTRUCTION THAT LOADS B WITH A NUMERIC VALUE.
|
||||
; PUSH BC WOULD NOT HAVE WORKED SINCE THE PROGRAM NEEDS TO PUSH EACH LETTER OF THE STRING DURING THE LOOP.
|
||||
|
||||
LOOP_REVERSESTRING_PUSH:
|
||||
;start at the beginning of the string and push each letter in it, except the terminator.
|
||||
ld a,(de)
|
||||
push af
|
||||
inc de
|
||||
djnz LOOP_REVERSESTRING_PUSH
|
||||
|
||||
SMC_ReverseString:
|
||||
ld b,$42 ;LETS US PRESERVE B WITHOUT PUSHING IT. THE $42 IS OVERWRITTEN WITH THE STRING'S LENGTH.
|
||||
|
||||
LOOP_REVERSESTRING_POP:
|
||||
;Starting at the beginning of the string, pop A off the stack and store it into the string. This puts the letters back in the reverse
|
||||
; order.
|
||||
pop af
|
||||
ld (hl),a
|
||||
inc hl
|
||||
djnz LOOP_REVERSESTRING_POP
|
||||
pop de
|
||||
ret
|
||||
Loading…
Add table
Add a link
Reference in a new issue