*********************************************** [ A ] *******************************************************************
;8B8R8PS.ASM
;8 Bytes,
;8 Registers
; and an
;8-Pointed Star
;ENTRY FOR THE #VCC2022
;By Leosoft (arnOLdE)
;size = 37 bytes
;Draw a simple triangle [(8,4),(-8,4),(0,-4)] full of *s, but mirror
;every * in all 4 directions
;registers use:
;A all purpose & calc, of course
;B counter for 4x swap_n_print
;C x-coord (relative)
;D starting x for current y
;E y-coord (relative)
;H x-coord (absolute)
;L y-coord (absolute)
;addresses of the two firmware functions used:
TXT_OUTPUT equ #bb5a ;A=ascii of character to print
SET_CURSOR equ #bb75 ;input H=x, L=y
org #B000 ;but can be loaded wherever
ld de,#0804 ;initial y=4, initial starting x=8
y_loop:
ld c,d ;load starting coord
x_loop:
ld b,4 ;four iterations/stars
swap_n_print:
xor a
sub e ;negate y
ld e,c ;y = x
ld c,a ;x = -y
add 17 ;convert to absolute coords with center in 17,17
ld h,a ;H=absolute x
sub c ;=17 again
add e ;+y
ld l,a ;L=absolute y
call SET_CURSOR
ld a,"*" ;this way, we print *s at
call TXT_OUTPUT ;(-y,x),(-x,-y),(y,-x),(x,y)
djnz swap_n_print ;after 4 iterations, C & E are back to original values)
dec c ;next x in row/column
ld a,d
cpl ;=0-D-1 (cpl is one byte less than neg and it
cp c ;provides us with the exact value we need!)
jr nz,x_loop
dec e ;next y (1 up)
dec d ;next x starts 1 left (and ends 1 right)
ret m ;done if D<0 done
jr y_loop
*********************************************** [ B ] *******************************************************************
ORG #A000 ; ETOILE DE NOEL RETROPOKE 12/2022 LG 73 OCTETS
CALL #BBFF ; REINITIALISER LE GESTIONNAIRE DE L'ECRAN
LD DE, #1109 ; 'D'=17 ETOILES PAR COLONNE ET PAR LIGNG
; 'E'=COMPTEUR DE 9 COL & 9 LIG
COL_LIG ; POSITIONNER ET AFFICHER HORIZONTAL
LD B, D ; 'B'=NB ETOILES
OPCODE_HOR ; AFFICHAGE HORIZONTAL
LD HL, #0B0A ; 'H'=COL & 'L'=LIG (AUTOMODIFIER)
INC H ;
INC L ;
LD (OPCODE_HOR + 1), HL ; SAUVEGARDE POUR PROCHAIN APPEL
CALL #BB75 ; EQU LOCATE 'H', 'L'
LARGEUR
LD A, 42 ; 'A'=CHR$(42) [*]
CALL #BB5A ; EQU PRINT 'A'
DJNZ, LARGEUR ; AFFICHER LA LIGNE D'ETOILE HORISONTALEMENT
LD B, D ; 'B'=NB ETOILES
OPCODE_VER ; AFFICHAGE VERTICAL
LD HL, #0F06 ; 'H'=COL & 'L'=LIG (AUTOMODIFIER)
INC L ;
INC H ;
LD (OPCODE_VER + 1), HL ; SAUVEGARDE POUR PROCHAIN APPEL
HAUTEUR
PUSH HL
CALL #BB75 ; EQU LOCATE 'H', 'L'
LD A, 42 ; 'A'=CHR$(42) [*]
CALL #BB5A ; EQU PRINT 'A'
POP HL
INC L ; PASSER A LA LIGNE DE DESSOUS
DJNZ, HAUTEUR ; ET FAIRE TOUTE LA COLONNE VERTICALEMENT
LD A, E ; REGARDER SI IL FAUT INVERSER LES SENS
CP A, 6 ; SI LE COMPTEUR EST < 6
JR NC, TOURNE ; NON
LD HL, #1414 ; OPCODE EQU 'INC D' * 2
LD (TOURNE), HL ; AUGMENTER LE NOMBRE D'ETOILE
LD A, #25 ; OPCODE EQU 'DEC H'
LD (OPCODE_HOR + 3), A ; INVERSER LE SENS HORIZONTAL
LD A, #2D ; OPCODE EQU 'DEC L'
LD (OPCODE_VER + 3), A ; INVERSER LE SENS VERTICAL
TOURNE
DEC D ; ENLEVER 2 ETOILES A CHAQUE FOIS
DEC D
DEC E ; ET NE FAIRE QUE 9 ITERATIONS
JR NZ, COL_LIG ;
RET ; TERMINER LE PROCESSUS
FIN
NOTICE TEXTE n° 2 (1.71 Ko)
*********************************************** [ C ] *******************************************************************
; Demoniak
org #A000
run $
write direct "xmas.bin"
LD DE,#050E
LD H,17 ; y=17
LoopY
LD B,17 ; x=17
LoopX
LD C,0
LD A,H
ADD A,B
CP E ; x+y<14 ?
JR NC,Test2
DEC C
Test2
CP 23 ; x+y<21?
JR NC,Test3
INC C
Test3
LD A,H
ADD A,4 ; A=y+4
CP B ; y+4<x ?
JR NC,Test4
DEC C
Test4
LD A,B
ADD A,D
LD L,A ; L=x+5
LD A,H
CP L ; y<x+5 ?
JR NC,Test5
INC C
Test5
LD A,H
CALL TstAbs
LD A,B
CALL TstAbs
LD A,' ' ; space
DEC C ; c = 1 ?
JR Z,PrintChar
LD A,'*' ; star
PrintChar
CALL #BB5A
DJNZ LoopX ; loop for 17 x
LD A,10 ; print CR
CALL #BB5A
LD A,13 ; print LF
CALL #BB5A
DEC H
JR NZ,LoopY
JP #BB18 ; At the end wait key
TstAbs:
CP D
RET C
CP E
RET NC
INC C
RET
_endcode
*********************************************** [ D ] *******************************************************************
;; Author: Gallegux
;; Category: Christmas Challenge or Wild
;; System: Amstrad CPC
;; Len code only: 77
INIC equ #4005
org INIC
ld hl, datos
ld bc, #320a
ld a, l
loop1
push bc
ld b, (hl) : inc hl
loop2
push hl
push bc
push af
call #bb5d
pop af
pop bc
pop hl
djnz loop2
pop bc
xor c
djnz loop1
;ret ; return to basic -> 76 bytes and basic loader
jr $ ; 77 bytes and no basic loader
datos
db 16,1,7,1,31,2,5,2,31,3,3,3,31,4,1,4,27,17
db 24,15,26,13,28,11,30,9,30,11,28,13,26,15
db 24,17,27,4,1,4,31,3,3,3,31,2,5,2,31,1,7,1
size equ $-INIC
print "SIZE: &size"