Difference between revisions of "ACU March 1985 - Type-ins"

From CPCWiki - THE Amstrad CPC encyclopedia!
Jump to: navigation, search
(Screen Dump (DMP1))
(Screen Dump (Epson))
Line 277: Line 277:
 
The Z80 assembler code for the Epson Screen Dump program.
 
The Z80 assembler code for the Epson Screen Dump program.
 
<pre>
 
<pre>
 +
ORG &8000
 +
 +
.entry EQU $
 +
LD HL,&E9E1 ; Start RELOCATOR
 +
LD (&30),HL
 +
RST &30
 +
 +
.this EX DE,HL
 +
LD HL,rel_table-this
 +
ADD HL,DE ; HL has absolute address of rel_table
 +
 +
.loop LD C,(HL)
 +
INC HL
 +
LD B,(HL) ; BC has first entry in table
 +
LD A,C
 +
OR B
 +
JR Z,done ; entry was 0000 so exit loop
 +
PUSH HL ; stack current table pointer
 +
LD H,B
 +
LD L,C
 +
ADD HL,DE ; make table entry absolute
 +
PUSH HL ; and stack this value
 +
LD C,(HL)
 +
INC HL
 +
LD B,(HL) ; get contents pointed to by entry
 +
LD H,B
 +
LD L,C
 +
ADD HL,DE ; make this absolute
 +
LD B,H
 +
LD C,L
 +
POP HL ; retrieve absolute entry value
 +
LD (HL),C
 +
INC HL
 +
LD (HL),B ; store absolute value at this address
 +
POP HL ; get address of previous table entry
 +
INC HL ; make HL point at next
 +
JR loop
 +
 +
.done EQU $ ; end of RELOCATOR
 +
 +
KL_NEW_FRAME_FLY EQU &BCD7
 +
KM_TEST_KEY EQU &BB1E
 +
COPY_key EQU 9
 +
CTRL_key EQU 23
 +
SHIFT_key EQU 21
 +
 +
.r01 LD HL,tick_block-this ; set-up EVENT
 +
LD B,%10000001
 +
LD C,0
 +
 +
.r02 LD DE,int_routine-this
 +
CALL KL_NEW_FRAME_FLY
 +
RET
 +
 +
.int_routine EQU $ ; this is the interrupt routine
 +
PUSH BC
 +
PUSH DE
 +
PUSH HL
 +
PUSH AF
 +
LD A,COPY_key
 +
CALL KM_TEST_KEY
 +
JR Z,return
 +
LD A,CTRL_key
 +
CALL KM_TEST_KEY
 +
JR Z,return
 +
 +
.r03 CALL scrndump-this
 +
 +
.return POP AF
 +
POP HL
 +
POP DE
 +
POP BC
 +
RET
 +
 +
.tick_block DEFS 9
 +
 +
.FRED DEFS 7
 +
 +
.scrndump EQU $
 +
 +
GRA_TEST_ABSOLUTE EQU &BBF0
 +
MC_PRINT_CHAR EQU &BD2B
 +
MC_BUSY_PRINTER EQU &BD2E
 +
; EPSONDUMP
 +
.r04 LD IX,FRED-this
 +
LD (IX+1),0 ; x coord = 0
 +
LD (IX+2),0
 +
LD (IX+3),&90 ; y coord = 400
 +
LD (IX+4),&01
 +
LD (IX+5),0 ; line count = 0
 +
LD (IX+0),0 ; byte out = 0
 +
 +
LD A,&1B
 +
CALL MC_PRINT_CHAR
 +
LD A,&41
 +
CALL MC_PRINT_CHAR
 +
LD A,&06
 +
CALL MC_PRINT_CHAR
 +
 +
.MAIN CALL MC_BUSY_PRINTER
 +
JR C,MAIN
 +
LD A,&1B
 +
CALL MC_PRINT_CHAR ; ESC
 +
LD A,&4B
 +
CALL MC_PRINT_CHAR ; "K"
 +
LD A,&40
 +
CALL MC_PRINT_CHAR
 +
LD A,&02
 +
CALL MC_PRINT_CHAR ; &240
 +
 +
.LINE EQU $
 +
LD (IX+0),0 ; byte out = 0
 +
LD (IX+6),0 ; 7-bit count = 0
 +
 +
.BYTE SLA (IX+0)
 +
LD E,(IX+1) ; FRED + 1 - 2 = x coord
 +
LD D,(IX+2)
 +
LD L,(IX+3) ; FRED + 3 - 4 = y coord
 +
LD H,(IX+4)
 +
CALL GRA_TEST_ABSOLUTE
 +
OR A
 +
JR Z,NOSET
 +
SET 0,(IX+0) ; +0 is byte being built
 +
 +
.NOSET INC (IX+6) ; increase bit count
 +
LD A,(IX+6) ; and get it
 +
CP 7
 +
JR Z,PRINT ; if got 7 bits the print
 +
LD L,(IX+3) ; get y coord
 +
LD H,(IX+4)
 +
DEC HL ; use HL for simple 16 bit maths
 +
DEC HL ; move down by 2 (1 pixel)
 +
LD (IX+3),L ; then put it back
 +
LD (IX+4),H
 +
JR BYTE
 +
 +
.MID_JMP JR MAIN ; to relative jump more than 128
 +
 +
.PRINT CALL MC_BUSY_PRINTER
 +
JR C,PRINT ; wait until it's free
 +
LD A,(IX+0) ; get byte output
 +
CALL MC_PRINT_CHAR ; and print it
 +
INC (IX+1)
 +
INC (IX+1) ; move x coord on by 2
 +
JR NZ,NOHIGH
 +
INC (IX+2) ; handle high byte if necessary
 +
 +
.NOHIGH LD A,(IX+1)
 +
SUB &82
 +
JR NZ,RESETY
 +
LD A,(IX+2)
 +
CP 2
 +
JR Z,ENDLIN ; x coord = &282
 +
 +
.RESETY LD L,(IX+3)
 +
LD H,(IX+4)
 +
LD DE,&000C
 +
ADD HL,DE
 +
LD (IX+3),L ; increase y coord by 12
 +
LD (IX+4),H
 +
JR LINE
 +
 +
.ENDLIN INC (IX+5) ; increment line count
 +
LD A,&0A ; Line Feed
 +
CALL MC_PRINT_CHAR
 +
LD A,&0D ; Carriage Return
 +
CALL MC_PRINT_CHAR
 +
LD A,SHIFT_key
 +
CALL KM_TEST_KEY ; check id SHIFT is pressed
 +
JR NZ,BYE
 +
LD (IX+1),0 ; set x coord to zero
 +
LD (IX+2),0
 +
LD A,(IX+5) ; get line count
 +
CP &22
 +
JR NZ,MID_JMP ; have we got 34 lines (7 high)
 +
 +
.BYE EQU $
 +
LD A,15
 +
CALL MC_PRINT_CHAR
 +
LD A,13
 +
CALL MC_PRINT_CHAR
 +
RET
 +
 +
.rel_table EQU $
 +
DEFW r01-this+1
 +
DEFW r02-this+1
 +
DEFW r03-this+1
 +
DEFW r04-this+2 ; address in IX operator is 3 and 4
 +
DEFW 0
 
</pre>
 
</pre>
  

Revision as of 01:21, 27 April 2009

Return to ACU Type-Ins

Downloads

Disk Image

Cover Image

Acu march 1985 cover.png

Electric Eddy

To run Electric Eddy, type:
RUN"EDDY"

Electric Fencing

To run Electric Fencing, type:
RUN"FENCING"

Flashman

To run Flashman, type:
RUN"FLASHMAN"

Jeremy Vine's music routine

To run Jeremy Vine's music routine, type:
RUN"MUSIC"

Machine code fill routine and demonstration

To run Machine code fill routine and demonstration, type:
RUN"MCFILL"

Number Sort routine

To run Number Sort routine, type:
RUN"SORT"

Prime Numbers (1)

To run Prime Numbers (1), type:
RUN"PASCAL3"

Prime Numbers (2)

To run Prime Numbers (2), type:
RUN"PASCAL4"

Screen Dump (DMP1)

The Z80 assembler code for the DMP1 Screen Dump program.

			ORG	&8000

.entry			EQU	$
			LD	HL,&E9E1		; Start RELOCATOR
			LD	(&30),HL
			RST	&30

.this			EX	DE,HL
			LD	HL,rel_table-this
			ADD	HL,DE			; HL has absolute address of rel_table

.loop			LD	C,(HL)
			INC	HL
			LD	B,(HL)			; BC has first entry in table
			LD	A,C
			OR	B
			JR	Z,done			; entry was 0000 so exit loop
			PUSH	HL			; stack current table pointer
			LD	H,B
			LD	L,C
			ADD	HL,DE			; make table entry absolute
			PUSH	HL			; and stack this value
			LD	C,(HL)
			INC	HL
			LD	B,(HL)			; get contents pointed to by entry
			LD	H,B
			LD	L,C
			ADD	HL,DE			; make this absolute
			LD	B,H
			LD	C,L
			POP 	HL			; retrieve absolute entry value
			LD	(HL),C
			INC	HL
			LD	(HL),B			; store absolute value at this address
			POP	HL			; get address of previous table entry
			INC	HL			; make HL point at next
			JR	loop

.done			EQU	$			; end of RELOCATOR

KL_NEW_FRAME_FLY	EQU	&BCD7
KM_TEST_KEY		EQU	&BB1E
COPY_key		EQU	9
CTRL_key		EQU	23
SHIFT_key		EQU	21

.r01			LD	HL,tick_block-this	; set-up EVENT
			LD	B,%10000001
			LD	C,0

.r02			LD	DE,int_routine-this
			CALL	KL_NEW_FRAME_FLY
			RET

.int_routine		EQU	$			; this is the interrupt routine
			PUSH	BC
			PUSH	DE
			PUSH	HL
			PUSH	AF
			LD	A,COPY_key
			CALL	KM_TEST_KEY
			JR	Z,return
			LD	A,CTRL_key
			CALL	KM_TEST_KEY
			JR	Z,return

.r03			CALL	scrndump-this

.return			POP	AF
			POP	HL
			POP	DE
			POP	BC
			RET

.tick_block		DEFS	9

.FRED			DEFS	7

.scrndump		EQU	$

GRA_TEST_ABSOLUTE	EQU	&BBF0
MC_PRINT_CHAR		EQU	&BD2B
MC_BUSY_PRINTER		EQU	&BD2E
							; DMP1DUMP
.r04			LD	IX,FRED-this
			LD	(IX+1),0		; x coord = 0
			LD	(IX+2),0
			LD	(IX+3),&90		; y coord = 400
			LD	(IX+4),&01
			LD	(IX+5),0		; line count = 0
			LD	(IX+0),0		; byte out = 0

.MAIN			CALL	MC_BUSY_PRINTER
			JR	C,MAIN
			LD	A,&1B
			CALL	MC_PRINT_CHAR		; ESC
			LD	A,&4B
			CALL	MC_PRINT_CHAR		; "K"
			LD	A,&02
			CALL	MC_PRINT_CHAR
			LD	A,&40
			CALL	MC_PRINT_CHAR		; &240

.LINE			EQU	$
			LD	(IX+0),0		; byte out = 0
			LD	(IX+6),0		; 7-bit count = 0

.BYTE			SRA	(IX+0)
			LD	E,(IX+1)		; FRED + 1 - 2 = x coord
			LD 	D,(IX+2)
			LD	L,(IX+3)		; FRED + 3 - 4 = y coord
			LD	H,(IX+4)
			CALL	GRA_TEST_ABSOLUTE
			OR	A
			JR	Z,NOSET
			SET	6,(IX+0)		; +0 is byte being built

.NOSET			INC	(IX+6)			; increase bit count
			LD	A,(IX+6)		; and get it
			CP	7
			JR	Z,PRINT			; if got 7 bits the print
			LD	L,(IX+3)		; get y coord
			LD	H,(IX+4)
			DEC	HL			; use HL for simple 16 bit maths
			DEC	HL			; move down by 2 (1 pixel)
			LD	(IX+3),L		; then put it back
			LD	(IX+4),H
			JR	BYTE

.MID_JMP		JR	MAIN			; to relative jump more than 128

.PRINT			CALL	MC_BUSY_PRINTER
			JR	C,PRINT			; wait until it's free
			LD	A,(IX+0)		; get byte output
			CALL	MC_PRINT_CHAR		; and print it
			INC	(IX+1)
			INC	(IX+1)			; move x coord on by 2
			JR	NZ,NOHIGH
			INC	(IX+2)			; handle high byte if necessary

.NOHIGH			LD	A,(IX+1)
			SUB	&82
			JR	NZ,RESETY
			LD	A,(IX+2)
			CP	2
			JR	Z,ENDLIN		; x coord = &282

.RESETY			LD	L,(IX+3)
			LD	H,(IX+4)
			LD	DE,&000C
			ADD	HL,DE
			LD	(IX+3),L		; increase y coord by 12
			LD	(IX+4),H
			JR	LINE

.ENDLIN			INC	(IX+5)			; increment line count
			LD	A,&0A			; Line Feed
			CALL	MC_PRINT_CHAR
			LD	A,&0D			; Carriage Return
			CALL	MC_PRINT_CHAR
			LD	A,SHIFT_key
			CALL	KM_TEST_KEY		; check id SHIFT is pressed
			JR	NZ,BYE
			LD	(IX+1),0		; set x coord to zero
			LD	(IX+2),0
			LD	A,(IX+5)		; get line count
			CP	&22
			JR	NZ,MID_JMP		; have we got 34 lines (7 high)

.BYE			EQU	$
			LD	A,15
			CALL	MC_PRINT_CHAR
			LD	A,13
			CALL	MC_PRINT_CHAR
			RET

.rel_table		EQU	$
			DEFW	r01-this+1
			DEFW	r02-this+1
			DEFW	r03-this+1
			DEFW	r04-this+2		; address in IX operator is 3 and 4
			DEFW 0

Screen Dump (Epson)

The Z80 assembler code for the Epson Screen Dump program.

			ORG	&8000

.entry			EQU	$
			LD	HL,&E9E1		; Start RELOCATOR
			LD	(&30),HL
			RST	&30

.this			EX	DE,HL
			LD	HL,rel_table-this
			ADD	HL,DE			; HL has absolute address of rel_table

.loop			LD	C,(HL)
			INC	HL
			LD	B,(HL)			; BC has first entry in table
			LD	A,C
			OR	B
			JR	Z,done			; entry was 0000 so exit loop
			PUSH	HL			; stack current table pointer
			LD	H,B
			LD	L,C
			ADD	HL,DE			; make table entry absolute
			PUSH	HL			; and stack this value
			LD	C,(HL)
			INC	HL
			LD	B,(HL)			; get contents pointed to by entry
			LD	H,B
			LD	L,C
			ADD	HL,DE			; make this absolute
			LD	B,H
			LD	C,L
			POP 	HL			; retrieve absolute entry value
			LD	(HL),C
			INC	HL
			LD	(HL),B			; store absolute value at this address
			POP	HL			; get address of previous table entry
			INC	HL			; make HL point at next
			JR	loop

.done			EQU	$			; end of RELOCATOR

KL_NEW_FRAME_FLY	EQU	&BCD7
KM_TEST_KEY		EQU	&BB1E
COPY_key		EQU	9
CTRL_key		EQU	23
SHIFT_key		EQU	21

.r01			LD	HL,tick_block-this	; set-up EVENT
			LD	B,%10000001
			LD	C,0

.r02			LD	DE,int_routine-this
			CALL	KL_NEW_FRAME_FLY
			RET

.int_routine		EQU	$			; this is the interrupt routine
			PUSH	BC
			PUSH	DE
			PUSH	HL
			PUSH	AF
			LD	A,COPY_key
			CALL	KM_TEST_KEY
			JR	Z,return
			LD	A,CTRL_key
			CALL	KM_TEST_KEY
			JR	Z,return

.r03			CALL	scrndump-this

.return			POP	AF
			POP	HL
			POP	DE
			POP	BC
			RET

.tick_block		DEFS	9

.FRED			DEFS	7

.scrndump		EQU	$

GRA_TEST_ABSOLUTE	EQU	&BBF0
MC_PRINT_CHAR		EQU	&BD2B
MC_BUSY_PRINTER		EQU	&BD2E
							; EPSONDUMP
.r04			LD	IX,FRED-this
			LD	(IX+1),0		; x coord = 0
			LD	(IX+2),0
			LD	(IX+3),&90		; y coord = 400
			LD	(IX+4),&01
			LD	(IX+5),0		; line count = 0
			LD	(IX+0),0		; byte out = 0

			LD	A,&1B
			CALL	MC_PRINT_CHAR
			LD	A,&41
			CALL	MC_PRINT_CHAR
			LD	A,&06
			CALL	MC_PRINT_CHAR

.MAIN			CALL	MC_BUSY_PRINTER
			JR	C,MAIN
			LD	A,&1B
			CALL	MC_PRINT_CHAR		; ESC
			LD	A,&4B
			CALL	MC_PRINT_CHAR		; "K"
			LD	A,&40
			CALL	MC_PRINT_CHAR
			LD	A,&02
			CALL	MC_PRINT_CHAR		; &240

.LINE			EQU	$
			LD	(IX+0),0		; byte out = 0
			LD	(IX+6),0		; 7-bit count = 0

.BYTE			SLA	(IX+0)
			LD	E,(IX+1)		; FRED + 1 - 2 = x coord
			LD 	D,(IX+2)
			LD	L,(IX+3)		; FRED + 3 - 4 = y coord
			LD	H,(IX+4)
			CALL	GRA_TEST_ABSOLUTE
			OR	A
			JR	Z,NOSET
			SET	0,(IX+0)		; +0 is byte being built

.NOSET			INC	(IX+6)			; increase bit count
			LD	A,(IX+6)		; and get it
			CP	7
			JR	Z,PRINT			; if got 7 bits the print
			LD	L,(IX+3)		; get y coord
			LD	H,(IX+4)
			DEC	HL			; use HL for simple 16 bit maths
			DEC	HL			; move down by 2 (1 pixel)
			LD	(IX+3),L		; then put it back
			LD	(IX+4),H
			JR	BYTE

.MID_JMP		JR	MAIN			; to relative jump more than 128

.PRINT			CALL	MC_BUSY_PRINTER
			JR	C,PRINT			; wait until it's free
			LD	A,(IX+0)		; get byte output
			CALL	MC_PRINT_CHAR		; and print it
			INC	(IX+1)
			INC	(IX+1)			; move x coord on by 2
			JR	NZ,NOHIGH
			INC	(IX+2)			; handle high byte if necessary

.NOHIGH			LD	A,(IX+1)
			SUB	&82
			JR	NZ,RESETY
			LD	A,(IX+2)
			CP	2
			JR	Z,ENDLIN		; x coord = &282

.RESETY			LD	L,(IX+3)
			LD	H,(IX+4)
			LD	DE,&000C
			ADD	HL,DE
			LD	(IX+3),L		; increase y coord by 12
			LD	(IX+4),H
			JR	LINE

.ENDLIN			INC	(IX+5)			; increment line count
			LD	A,&0A			; Line Feed
			CALL	MC_PRINT_CHAR
			LD	A,&0D			; Carriage Return
			CALL	MC_PRINT_CHAR
			LD	A,SHIFT_key
			CALL	KM_TEST_KEY		; check id SHIFT is pressed
			JR	NZ,BYE
			LD	(IX+1),0		; set x coord to zero
			LD	(IX+2),0
			LD	A,(IX+5)		; get line count
			CP	&22
			JR	NZ,MID_JMP		; have we got 34 lines (7 high)

.BYE			EQU	$
			LD	A,15
			CALL	MC_PRINT_CHAR
			LD	A,13
			CALL	MC_PRINT_CHAR
			RET

.rel_table		EQU	$
			DEFW	r01-this+1
			DEFW	r02-this+1
			DEFW	r03-this+1
			DEFW	r04-this+2		; address in IX operator is 3 and 4
			DEFW 0

Sum Numbers

To run Sum Numbers, type:
RUN"PASCAL5"

Trench

To run Trench, type:
RUN"TRENCH"

Unerase

The Z80 assembler code for David Link's Unerase program.

						; Unerase a file in CP/M - 04/11/84
						; Copyright David Link 1984

						; A program to unerase a file that has been accidentally
						; erased. Should be used immediately after erasing the
						; file since if user later, some blocks may have been re-used.

						; Format is - UNERA filename

DEFCB		EQU	&5C

fnamelen	EQU	8
extlen		EQU	3
extent		EQU	12
dirlen		EQU	32

						; CP/M BDOS call numbers

OPEN		EQU	15
CLOSE		EQU	16
SEARCH		EQU	17
SRCH_AGAIN	EQU	18
MAKE		EQU	22
SETDMA		EQU	26

						; Default workspace for file reads

tbuff		EQU	128

						; Macro to call CP/M setting DE and C

DOS		MAC
		LD	DE,=0
		LD	C,=1
		CALL	Dos
		ENDM

						; Macro to call CP/M setting C.

SDOS		MAC
		LD	C,=0
		CALL	Dos
		ENDM

						; COM files begin at &100

		ORG	&100

		LD	SP,(6)			; set stack to top of TPA
		DOS	DEFCB,SEARCH		; Does file exist?
		INC	A
		JP	NZ,0			; File exists, return to CCP
		LD	HL,FCBSPACE		; Initialise pointer to current FCB
		LD	(FCBPTR),HL
		DOS	tbuff,SETDMA		; set disc I/O to tbuff
		DOS	DUMFCB,SEARCH		; and search for the first entry in directory

More_Search	INC	A
		JR	Z,End_of_Directory	; No more entries

						; Compare found filename with the required filename

Continue	DEC	A			; adjust because we INCed it
		ADD	A,A			; multiply by dirlen to get postion
		ADD	A,A			; of entry in catalogue
		ADD	A,A
		ADD	A,A
		ADD	A,A
		LD	D,0
		LD	E,A
		LD	HL,tbuff		; point to found file
		ADD	HL,DE

Again		PUSH	HL			; and compare it with required filename
		INC	HL
		LD	B,fnamelen+extlen	; both name and type (8, name : 3, type)
		LD 	DE,DEFCB+1		; filename starts at FCB + 1

Match		LD	A,(DE)
		LD	C,(HL)
		RES	7,C			; some CP/Ms set bits on filename
		CP	C			; so make sure top bit is reset for comparison
		INC	HL
		INC	DE
		JR	NZ,NoMatch		; not this one
		DJNZ	Match			; good so far... keep going

						; Match found

		POP	HL			; filename match, but...
		PUSH	HL
		LD	A,(HL)			; ... is it erased?
		CP	&E5			; e% in first byte of directory = erased
		JR	NZ,NoMatch		; not erased... so search some more
		LD	(HL),0			; it was erased, so unerase it
		LD	DE,(FCBPTR)		; and store the FCB information in
		LD 	BC,dirlen		; our temporary table
		LDIR
		LD	(FCBPTR),DE		; updating our table pointer afterwards

						; Search for another entry

NoMatch		POP	HL
		DOS	DUMFCB,SRCH_AGAIN	; search for next entry in directory
		JR	More_Search

						; we have now exhausted the directory search and built
						; up our table of directory entries for the required file

End_of_Dir	LD	DE,FCBSPACE		; start processing table of matched
						; directory entries
MAIN_LOOP	LD	HL,(FCBPTR)		; have we reached end of table?
		OR	A
		SBC	HL,DE
		JP	Z,0			; finished, so return
		PUSH	DE			; save table pointer
		LD	HL,extent		; address extent byte
		ADD	HL,DE
		LD	A,(HL)			; make an extent of new,
		LD	(DEFCB+extent),a	; unerased file...
		DOS	DEFCB,MAKE
		POP	DE			; recover pointer to FCB...
		SDOS	CLOSE			; and close it
		LD	HL,dirlen
		ADD	HL,DE			; have we reached end of table?
		EX	DE,HL
		JR	MAIN_LOOP

Dos		PUSH	HL
		PUSH	DE
		PUSH	BC
		CALL	5
		POP	BC
		POP	DE
		POP	HL
		RET

FCBPTR		DEFS	2

DUMFCB		DEFM	"????????????"
		DEFW	0,0
		DEFS	16
		DEFW	0,0

FCBSPACE	EQU	$