Utilities

SET.ASM

Loads text into the programmable function keys.

	org	100h
putpfk	equ	0f66fh	; Assign text @ HL to PF key
biton	equ	0fe55h	; B2: Printer Bit On Mode flag
parm	equ	0080h	; -> parameter field
cr	equ	0dh
ldir	equ	0b0edh
;
	lxi	h,f3 !call setup
	lxi	h,f4 !call setup
	lxi	h,f5 !lxi b,4 !call putpfk
	lxi	h,f6 !call setup
	lxi	h,f7 !call setup
	lxi	h,f8 !call setup
	lxi	h,f9 !call setup
	lxi	h,f0 !call setup
	lxi	h,biton !dw 0d6cbh ; SET 2,(HL)
	ret
setup	mov	a,m !inx h !sta key		; key number
	xra	a !mov b,a !lxi d,text+1 !call move
	push	h !lxi h,parm !mov c,m !inx h !dcr c !mov m,c ; trick
	call	move !pop h !call move
	lxi	h,text !mov m,a 		; = total length
	lda	key !mov c,a !jmp putpfk
;
move	mov	c,m !inx h !add c !dw ldir
	ret
;
f3	db	2,7,'PIP F:=',5,'.ASM',cr
f4	db	3,9,'PIP A:=F:',3,'.*',cr
f5	db	 13,'DDT GO.COM',cr,'G',cr
f6	db	5,7,'PIP F:=',5,'.OVL',cr
f7	db	6,4,'ASM ',1,cr
f8	db	7,4,'LAY ',1,cr
f9	db	8,5,'LOAD ',1,cr
f0	db	9,5,'TYPE ',5,'.PRN',cr
;
key	ds	1
text	ds	17
	end	100h

LAY.ASM

Converts the .HEX assembler output file to .OVL. The CP/M LOAD command (LOAD.COM) converted the .HEX assembler output file into an executable .COM file, but this would only work if the code origin was 0100h which was not the case with overlays.

; Convert .HEX file into .OVL
boot	equ	0000h
bdos	equ	0005h
fcb	equ	005ch
;
; ASCII codes--
nul	equ	00h
cr	equ	0dh
lf	equ	0ah
;
	org	0100h
	lxi	h,hex !call clear !mvi c,15 !call bdos !inr a !jz nofile
; Fetch HEX file--
	lxi	d,origin
f1	lxi	h,128 !dad d !push h !mvi c,26 !call bdos ; set DMA addr
	lxi	d,fcb !mvi c,20 !call bdos !pop d !ora a !jz f1 ; next sector
	lxi	h,origin !lxi d,origin
; Convert next record--
line	inx	h !call pack !jz save !lxi b,6 !dad b !mov b,a ; B=bytes
l1	call	pack !stax d !inx d !dcr b !jnz l1
	lxi	b,4 !dad b !jmp line
; Pad last sector with nul & count sectors--
save	push	d !mov h,d !mov l,e !mvi m,0 !inx d !lxi b,126 !call ldir
	pop	d !lxi h,-origin !dad d !dcx h	; HL=bytes-1
	mov	a,l !ral !mov a,h !ral !inr a !sta count
; Delete HEX file & any previous OVL file, then open OVL file--
	lxi	h,hex !call clear !mvi c,19 !call bdos
	lxi	h,ovl !call clear !mvi c,19 !call bdos
	lxi	d,fcb !mvi c,22 !call bdos
; Write OVL file--
	lxi	d,origin
w1	lxi	h,count !dcr m !jm done
	lxi	h,128 !dad d !push h !mvi c,26 !call bdos ; set DMA addr
	lxi	d,fcb !mvi c,21 !call bdos !pop d !jmp w1
done	lxi	d,fcb !mvi c,16 !call bdos !jmp boot ; close file
;
nofile	lxi	d,msg1 !mvi c,9 !call bdos !jmp boot
;
char	mov	a,m !ora a !jnz $+6 !mvi a,' ' !ret
	inx	h !cpi ' ' !jz char !cpi 'a' !rc !sui 20h !ret
;
clear	lxi	d,fcb+9 !lxi b,3 !call ldir
	mov	h,d !mov l,e !mvi m,0 !inx d !lxi b,20 !call ldir ; zeroise
	lxi	d,fcb !ret
;
pack	call	digit !rlc !rlc !rlc !rlc !mov c,a
	call	digit !ora c !ret
digit	mov	a,m !inx h !cpi 'A' !jc $+5 !sui 7 !ani 0fh !ret
;
ldir	mov	a,m !stax d !inx h !inx d !dcr c !jnz ldir !ret
;
hex	db	'HEX'
ovl	db	'OVL'
msg1	db	cr,lf,'HEX file not found$'
count	ds	1	; number of sectors
origin	db	':00'	; preset with empty record
	end	0100h

TIME.ASM

Sets the QX10 clock.

; **** SET QX10 TIME OF DAY CLOCK ****
	org	100h
addr	equ	03dh	; Clock RAM Address Register
data	equ	03ch	; Clock RAM Data Register
;
time	mvi	a,10 !out addr !in data !ora a !jm time ; update in progress
	mvi	a,11 !out addr !mvi a,8ah !out data	; stop clock
	lxi	h,0081h ; -> parameter string
	mvi	a,4 !out addr !call pack !out data	; hour
	mvi	a,2 !out addr !call pack !out data	; minute
	mvi	a,0 !out addr !call pack !out data	; second
	mvi	a,11 !out addr !mvi a,0ah !out data	; start clock
	ret
;
pack	call	char !rlc !rlc !rlc !rlc !mov e,a
	call	char !ora e !ret
;
char	mov	a,m !ora a !rz !inx h
	cpi	'0' !jm char !cpi '9'+1 !jp char	; discard non-numeric
	ani	0fh !ret
	end	100h

ALARM.ASM

Sets the QX10 alarm.

; **** SET QX10 ALARM TIME ****
	org	100h
addr	equ	03dh	; Clock RAM Address Register
data	equ	03ch	; Clock RAM Data Register
;
	lxi	h,0081h ; -> parameter string
	mvi	a,5 !out addr !call pack !out data	; hour
	mvi	a,3 !out addr !call pack !out data	; minute
	mvi	a,1 !out addr !call pack !out data	; second
	ret
;
pack	call	char !rlc !rlc !rlc !rlc !mov e,a
	call	char !ora e !ret
;
char	mov	a,m !ora a !rz !inx h
	cpi	'0' !jm char !cpi '9'+1 !jp char	; discard non-numeric
	ani	0fh !ret
	end	100h

 

The QX10 Archive