home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
BEEHIVE
/
UTILITYS
/
SCSLIB.ARC
/
LIBRARY.Z80
< prev
Wrap
Text File
|
1989-09-27
|
15KB
|
934 lines
.COMMENT *
This library was created by M.L.C and M.A.S of Superior Computer
Software... Feel free to use and distribute it! If you would like to send
a donation or an enquiry about our many high quality microbee games then
send a letter to:
MARK COCQUIO
c/ Superior Computer Software
9 Aston St
Gladesville NSW 2111
Look for other S.C.S public domain releases like OPEN, FIGHTER,
NANOC the DESTROYER and FORTRIS.
This library is designed for M80. Modifications may be needed for
other assembler like Z8E (or whatever its called) and MAC. If you have
EDASM (c/ Microbee Systems!) then THROW IT OUT!!!
Stay tuned (in) for more S.C.S releases... M.L.C 8-) 26/01/91 *
; THIS FILE CONTAINS A LIBRARY OF THE SUBROUTINES THAT I USE THE MOST...
; NOTE THAT MANY OF THESE ROUTINES RELY ON OTHER ROUTINES (INCLUDED HERE)
; TO WORK PROPERLY... EG: CHKCOL: SHOULD BE CALLED AT THE START OF EVERY
; PROGRAMME USING THESE ROUTINES; PUTCRT MUST BE CALLED BEFORE CALLING PCGLAY:
; FINALLY, NEARLY *ALL* OF THESE ROUTINES USE MACROS. THE MACROS ARE INCLUDED
; AFTER THESE COMMENTS
; USE THESE AS MUCH AS YOU WANT!
; USEAGE OF SOME ROUTINES:
; GRLOAD - loads a file (filename pointed to by HL). A=0, normal load,
; A=1, pixel fadeout screen first, A=2, pixel fade-in new screen, A=3 fadeout
; old screen and then fade-in new screen. When returned, A=255 means file not
; found, A=0 means all went as planned. P.S. - When calling, if bit 7 of a is
; set then the screen will be loaded as 32-line. (32 LINES CAN'T BE FADED IN!)
; PIXOUT - Fades out both pcgs and text. Needs no parms
; PIXIN - Fades in text then pcgs. Needs (DESTIN), where destin is the spot
; where the screen was loaded (it calculates destin+128+1024 to get PCG loc).
; PRINTS - Load hl,source and de,destination (in memory). String format is:
; first_byte,'Stringtoprint$',colour_number. First byte=1 for pcg string.
; LOADM - HL points to destination. It calls FNF if the file is not found.
; SAVEM - Start save at HL and save for BC sectors (1 sector = 128 bytes)
; MOREHE - Call this BEFORE calling INKEY. It determines the keyboard type and
; directs a call to INKEY to the XBIOS-C driver if the machine is a TC.
; INKEY - Load A with the value of the key to test. Z if pressed.
; PUTCRT - Load A with 32 for 64*32 mode. Any other value places the screen in
; 64*16 mode.
;
; TO USE A ROUTINE:
; YOUR PROGRAMME MUST HAVE THE COMMAND:
; .REQUEST LIBRARY
; FOLLOWED BY THE COMMAND:
; EXTERN <name>, [<name>,...]
; WHERE NAME(S) ARE THOSE OF THE ROUTINES WITH :: AFTER THE LABEL.
;
; YOU CAN THEN CALL THE ROUTINES AT WILL IN THE REST OF YOUR PROGRAMME,
; PROVIDED THAT YOU HAVE A COPY OF LIBRARY.REL (THE ASSEMBLED VERSION OF
; THIS FILE) ON THE SAME DRIVE.
.Z80 ; Z80 MNEMONICS
CSEG ; RELOCATABLE CODE SEGMENT (NOT ASEG!)
.RADIX 10D ; DEFAULT RADIX IS BASE 10 (DECIMAL)
; START OF MACROS
CLS MACRO AMOUNT ; WRITES <AMOUNT> SPACES TO THE SCREEN RAM
LD HL,61440
LD DE,61441
LD BC,AMOUNT
LD (HL),32
LDIR
ENDM
PUSHALL MACRO ; PUSHES ALL REGISTERS
PUSH AF
PUSH BC
PUSH DE
PUSH HL
PUSH IX
PUSH IY
ENDM
POPALL MACRO ; POPS ALL REGISTERS
POP IY
POP IX
POP HL
POP DE
POP BC
POP AF
ENDM
BIOS MACRO NUMBER ; PERFORMS BIOS CALL NUMBERED <NUMBER>
LD HL,(1)
PUSH DE
LD DE,3*NUMBER
ADD HL,DE
POP DE
LD IX,$+7
PUSH IX
JP (HL)
ENDM
; START OF ROUTINES!
PUTCRT:: CP 32
JP Z,L323
LD HL,CTREND ; PLACE THE SCREEN IN 64*16 MODE
RL323: LD B,16
HYDE: LD A,B
DEC A
OUT (12),A
LD A,(HL)
OUT (13),A
DEC HL
DJNZ HYDE
RET
DB 6BH
DB 40H
DB 51H
DB 37H
DB 12H
DB 09H
DB 12H
DB 12H
DB 48H
DB 0FH
DB 2FH
DB 0FH
DB 0
DB 0
DB 0
CTREND: DB 0
DB 6BH
DB 40H
DB 51H
DB 37H
DB 25H
DB 09H
DB 20H
DB 23H
DB 48H
DB 07H
DB 20H
DB 0FH
DB 20H
DB 0
DB 0
L32END: DB 0
L323: LD HL,L32END
JP RL323
MORHE:: LD HL,(1) ; CALL HERE TO DETERMINE KEYBOARD
LD DE,30H ; TYPE
ADD HL,DE
LD A,(HL)
LD D,0
CP 2
JP C,TEST2
CP 6
JP NC,TEST2
JP KXBIOS
TEST2: CP 7
JP C,TEST3
CP 17H
JP NC,TEST3
JP KXBIOS
TEST3: CP 1EH
JP C,TEST4
CP 2FH
JP NC,TEST4
JP KXBIOS
TEST4: CP 44H
JP C,K6545
CP 0BFH
JP NC,K6545
KXBIOS: LD D,0FFH
K6545: LD A,D
CP 255
JP Z,TCC
JP DONE
JOYKEY:: LD A,255 ; CALL HERE TO INPUT JOYSTICK
OUT (1),A ; AUTOMATICALLY DETECTS LACK OF
LD A,191 ; JOYSTICK (IE PRINTER)
OUT (1),A
LD A,64
OUT (0),A
IN A,(0)
PUSH AF
BIT 0,A
JP Z,WANSET
POP AF
RET
WANSET: BIT 1,A
JP Z,NOJOY
POP AF
RET
NOJOY: POP AF
LD A,255
RET
INKEY:: PUSH BC ; AFTER CALLING MOREHE: CALL HERE
LD C,A ; TO SCAN KEY IN "A" Z=PRESSED
LD B,A
LD A,12H
OUT (0CH),A
LD A,B
RRCA
RRCA
RRCA
RRCA
AND 3
OUT (0DH),A
LD A,13H
OUT (0CH),A
LD A,B
RLCA
RLCA
RLCA
RLCA
OUT (0DH),A
LD A,1
OUT (0BH),A
LD A,10H
OUT (0CH),A
IN A,(0DH)
LD A,1FH
OUT (0CH),A
OUT (0DH),A
FA: IN A,(0CH)
BIT 7,A
JR Z,FA
IN A,(0CH)
CPL
BIT 6,A
LD A,0 ; DO NOT CHANGE TO XOR A!
OUT (0BH),A
LD A,C
POP BC
RET
TCC: LD DE,INKEY ; CALLED BY MOREHE: IF TC
LD HL,COMM
LD BC,3
LDIR
JP DONE
COMM: JP XBIOS
XBIOS: LD C,A ; CALLED BY INKEY: IF TC
LD A,15
RST 28H
DONE: RET
SAVEM:: XOR A ; SAVE MEMORY STARTING AT HL
LD (7CH),A ; - SAVE FOR BC SECTORS (128 BYTE)
PUSH HL ; (FILENAME IS AT 5CH)
PUSH BC
LD HL,5CH+12
LD DE,5CH+13
LD BC,5
LD (HL),0
LDIR
POP BC
POP HL
PUSH HL
PUSH BC
LD C,19
LD DE,5CH
CALL BDOS
LD C,22
LD DE,5CH
CALL BDOS
LD C,15
LD DE,5CH
POP BC
POP HL
NONG: LD DE,128
PUSH BC
PUSH HL
PUSH DE
LD C,26
EX DE,HL
CALL BDOS
LD DE,5CH
LD C,21
CALL BDOS
POP DE
POP HL
POP BC
ADD HL,DE
DEC BC
LD A,B
OR C
JP NZ,NONG
LD C,16
LD DE,5CH
CALL BDOS
RET
FNF1: LD A,255
RET
LOADM:: LD (DESTIN),HL
XOR A ; LOAD FILE (AT 5CH) INTO MEMORY AT
LD (7CH),A ; LOCATION HL
LD HL,68H
LD DE,69H
LD BC,5
LD (HL),0
LDIR
LD DE,5CH
LD C,15
CALL BDOS
CP 0FFH
JP Z,FNF1
LD HL,(DESTIN)
LD DE,80H
HYDE1: EX DE,HL
PUSH HL
PUSH DE
LD C,26
CALL BDOS
POP DE
POP HL
EX DE,HL
ADD HL,DE
PUSH HL
PUSH DE
LD DE,5CH
LD C,20
CALL BDOS
POP DE
POP HL
OR A
JP Z,HYDE1
LD DE,5CH
LD C,16
CALL BDOS
RET
DESTIN:: DS 2
CHKCOL:: LD A,103 ; (COLFLG)=255 IF COLOUR FITTED
LD (63488),A
LD A,64
OUT (8),A
LD A,(63488)
CP 103
JP Z,NOCOL
XOR A
OUT (8),A
LD A,255
LD (COLFLG),A
JP CHKATT
NOCOL: XOR A
LD (COLFLG),A
JP CHKATT
COLFLG:: DS 1
ATTFLG:: DS 1
CHKATT: LD A,128
OUT (28),A
LD A,103 ; ROUTINE TO CHECK IF MACH IS PREMIUM
LD (63488),A ; (CALLED BY CHKCOL:)
LD A,129
OUT (28),A
LD A,(63488)
CP 103
JP Z,NOATT
LD A,128
OUT (28),A
LD A,255
LD (ATTFLG),A
RET
NOATT: XOR A
LD (ATTFLG),A
RET
PRTSTR:: LD A,(HL) ; PRINT A STRING ENDING IN "$" TO THE PRINTER
CP '$' ; HL=STRING START
RET Z
CALL OUTCHR
INC HL
JP PRTSTR
OUTCHR: PUSHALL
LD E,A
LD C,5
CALL BDOS ; SEND CHAR IN "A" TO PRINTER
POPALL
RET
PCGLAY:: CLS 2048
LD A,(COLFLG)
CP 255
JP NZ,COLNON
LD A,64
OUT (8),A
LD HL,63488
LD DE,63489
LD BC,2047
LD (HL),2
LDIR
XOR A
OUT (8),A
COLNON: LD BC,128
LD HL,0
XOR A
PCGLP: PUSH HL
LD DE,61440
ADD HL,DE
LD (HL),A
INC HL
SET 7,A
LD (HL),A
RES 7,A
DEC HL
POP HL
INC HL
INC HL
INC HL
INC HL
INC A
DEC BC
PUSH AF
LD A,B
OR C
JP Z,OUTLP
POP AF
JP PCGLP
OUTLP: POP AF
LD HL,61440+512+128
LD A,128
LD B,128
LOUP3: LD (HL),A
INC HL
INC A
DJNZ LOUP3
; LD HL,5CH ; CAN BE ENABLED TO DISPLAY
; LD DE,61440+14*64 ; A FILENAME
; LD BC,12
; LDIR
RET
INVERT:: LD A,(ATTFLG) ; WILL INVERT BANK(S) ACCORDING TO
CP 255 ; MACINE TYPE (DEFINED BY ATTFLG)
JP NZ,ONEB
LD A,128
ILP2: OUT (28),A ;INVERT ALL 8 BANKS
PUSH AF
LD HL,63488
LD BC,2048
ILP1: LD A,255
SUB (HL)
LD (HL),A
INC HL
DEC BC
LD A,B
OR C
JP NZ,ILP1
POP AF
INC A
CP 136
JP NZ,ILP2
RET
ONEB: LD HL,63488 ; INVERT ONE BANK
LD BC,2048
ILP3: LD A,255
SUB (HL)
LD (HL),A
INC HL
DEC BC
LD A,B
OR C
JP NZ,ILP3
RET
FADE:: LD BC,2048 ; NUMBER OF LOCS TO BLANK
LD DE,0500H ; SPECIAL MASK
LD HL,1
LOUP1: PUSH BC ; ROUTINE TO PICK "RANDOM" NUMBERS ONCE ONLY
LD B,255
CRAP: DEC B
JR NZ,CRAP
POP BC
SRL H
RR L
JP NC,OBER
LD A,H
XOR D
LD H,A
LD A,L
XOR E
LD L,A
OBER: PUSH DE
PUSH HL
LD DE,61440-1
ADD HL,DE
PUSH AF
LD A,(TOBL)
LD (HL),A
PUSH HL
PUSH DE
LD A,(COLFLG)
CP 255
JP NZ,DONOT
LD A,64
OUT (8),A
LD DE,2048
ADD HL,DE
LD (HL),15
XOR A
OUT (8),A
DONOT: POP DE
POP HL
POP AF
POP HL
POP DE
DEC BC
LD A,B
OR C
JP NZ,LOUP1
LD HL,61440
LD (HL),64
LD A,(COLFLG)
CP 255
RET NZ
LD A,64
OUT (8),A
LD HL,63488
LD DE,63489
LD BC,2048 ; ALSO CLEARS COLOUR
LD (HL),7
LDIR
XOR A
OUT (8),A
RET
TOBL: DB 32 ; CHANGE THIS BYTE FOR DIFFERENT FILLS
PRINTS:: PUSHALL ; MISC PRINTING ROUTINE; USAGE:
LD A,(HL) ; PCG=1,'STRINGENDINGIN$',COLOUR
LD (PRINT0),A ; THEN LD HL,STRING AND LD DE,DESTINATION
INC HL
PUSH HL
PUSH DE
PRLP: LD A,(HL)
CP '$'
JP Z,NEXT
EX AF,AF'
LD A,(PRINT0)
CP 1
JP NZ,CONT
EX AF,AF'
ADD A,128
EX AF,AF'
CONT: EX AF,AF'
LD (DE),A
INC HL
INC DE
JP PRLP
NEXT: INC HL
PUSH HL
POP BC
POP DE
POP HL
LD A,(COLFLG)
CP 255
JR NZ,COLNT
LD A,64
OUT (8),A
LD A,(BC)
LD BC,2048
PUSH HL
PUSH DE
POP HL
ADD HL,BC
PUSH HL
POP DE
POP HL
CLP: PUSH AF
LD A,(HL)
CP '$'
JP Z,PREND
INC HL
POP AF
LD (DE),A
INC DE
JP CLP
PREND: POP AF
XOR A
OUT (8),A
COLNT: POPALL
RET
PRINT0: DS 1 ; FLAG USED INTERNALLY
FNF: POP AF
LD A,255 ; A=255=FILE NOT FOUND
RET
GRLOAD:: PUSH AF
PUSH HL
BIT 1,A
CALL NZ,PIXOUT
POP HL
LD DE,5CH
LD BC,12
LDIR
LD HL,30000 ; GRLOAD NEEDS A SCRATCH AREA AT LEAST
CALL LOADM ; 5120 BYTES IN SIZE. CHANGE HL TO A
CP 255 ; SUITABLE AREA AS REQUIRED
JR Z,FNF
POP AF
LD HL,63488
LD DE,63489
LD BC,2048
LD (HL),0
LDIR
PUSH AF
LD A,(COLFLG)
CP 255
JP NZ,SKCOL ; SKIP COLOUR IF NO COLOUR RAM
LD A,64
OUT (8),A
POP AF
BIT 7,A
PUSH AF
JP NZ,L321
LD HL,30000+128 ; AREA CONTAINING COLOUR RAM DATA
LD DE,63488
LD BC,1024
LDIR
RL321: XOR A
OUT (8),A
SKCOL: POP AF
BIT 0,A
JP NZ,PIX1
BIT 7,A
JP NZ,L322
LD HL,30000+128+1024
LD DE,63488
LD BC,2048
LDIR
LD HL,30000+128+1024+2048 ; AREA CONTAINING SCREEN RAM DATA
LD DE,61440
LD BC,1024
LDIR
RL322: XOR A
RET
PIX1: CALL PIXIN
XOR A
RET
L321: LD HL,30000+128
LD DE,63488
LD BC,2048
LDIR
JP RL321
L322: LD HL,30000+128+2048
LD DE,63488
LD BC,2048
LDIR
LD HL,30000+128+2048+2048
LD DE,61440
LD BC,2048
LDIR
JP RL322
PIXOUT:: PUSHALL
CALL PCGOUT ; CALL PIXOUT AND HAVE A PIXEL-BY-PIXEL
LD HL,61440 ; FADEOUT OF PCG AND THEN TEXT ONSCREEN
LD BC,1024
LOOPFF: LD A,(HL)
BIT 7,A
CALL NZ,CLEAR
DEC BC
INC HL
LD A,B
OR C
JP NZ,LOOPFF
LD A,1
OUT (11),A
LD HL,61440
LD DE,63488
LD BC,2048
LDIR
XOR A
OUT (11),A
LD HL,61440
LD BC,1024
LOOPFE: SET 7,(HL)
INC HL
DEC BC
LD A,B
OR C
JP NZ,LOOPFE
CALL PCGOUT
POPALL
RET
PCGOUT:: LD HL,FODATA
LD B,128
LOOP: LD IY,63488
LD C,128
LOOP2: PUSH IY
LD A,(HL)
LD E,A
LD D,0
ADD IY,DE
INC HL
LD A,(HL)
PUSH HL
CALL BITTY
POP HL
DEC HL
POP IY
LD DE,16
ADD IY,DE
DEC C
JP NZ,LOOP2
INC HL
INC HL
DJNZ LOOP
RET
BITTY: PUSH IY
POP HL
CP 0
JP Z,ZERO
CP 1
JP Z,ONE
CP 2
JP Z,TWO
CP 3
JP Z,THREE
CP 4
JP Z,FOUR
CP 5
JP Z,FIVE
CP 6
JP Z,SIX
RES 7,(HL)
RET
ZERO: RES 0,(HL)
RET
ONE: RES 1,(HL)
RET
TWO: RES 2,(HL)
RET
THREE: RES 3,(HL)
RET
FOUR: RES 4,(HL)
RET
FIVE: RES 5,(HL)
RET
SIX: RES 6,(HL)
RET
SPOT:: DS 2
PIXIN:: PUSHALL
LD HL,63488 ; CALL HERE TO HAVE A PIXEL
LD DE,63489 ; FADE-IN
LD BC,2047
LD (HL),0
LDIR
LD HL,(DESTIN)
LD DE,128+1024+2048
ADD HL,DE
LD DE,61440
LD BC,1024
ANGAG: LD A,(HL)
BIT 7,A
JP NZ,HMMAA
SET 7,A
LD (DE),A
HMMAA: INC DE
INC HL
DEC BC
LD A,B
OR C
JP NZ,ANGAG
LD HL,61440
LD (SPOT),HL
LD A,1
OUT (11),A ; SWITCH IN CHARACTER ROM
CALL INPCG
XOR A
OUT (11),A
LD HL,(DESTIN)
LD DE,1152
ADD HL,DE
LD (SPOT),HL
LD HL,(DESTIN)
LD DE,128+1024+2048
ADD HL,DE
LD DE,61440
LD BC,1024
LDIR
LD HL,63488
LD DE,63489
LD BC,2047
LD (HL),0
LDIR
CALL INPCG
POPALL
RET
INPCG:: LD HL,FODATA
LD B,128
LOUP: LD IY,(SPOT)
LD C,128
LOUP2: PUSH IY
LD A,(HL)
LD E,A
LD D,0
ADD IY,DE
INC HL
LD A,(HL)
PUSH HL
CALL BITTE
POP HL
DEC HL
POP IY
LD DE,16
ADD IY,DE
DEC C
JP NZ,LOUP2
INC HL
INC HL
DJNZ LOUP
RET
BITTE: PUSH IY
POP HL
CP 0
JP Z,ZERO1
CP 1
JP Z,ONE1
CP 2
JP Z,TWO1
CP 3
JP Z,THREE1
CP 4
JP Z,FOUR1
CP 5
JP Z,FIVE1
CP 6
JP Z,SIX1
BIT 7,(HL)
RET Z
CALL FIXHL
SET 7,(HL)
RET
ZERO1: BIT 0,(HL)
RET Z
CALL FIXHL
SET 0,(HL)
RET
ONE1: BIT 1,(HL)
RET Z
CALL FIXHL
SET 1,(HL)
RET
TWO1: BIT 2,(HL)
RET Z
CALL FIXHL
SET 2,(HL)
RET
THREE1: BIT 3,(HL)
RET Z
CALL FIXHL
SET 3,(HL)
RET
FOUR1: BIT 4,(HL)
RET Z
CALL FIXHL
SET 4,(HL)
RET
FIVE1: BIT 5,(HL)
RET Z
CALL FIXHL
SET 5,(HL)
RET
SIX1: BIT 6,(HL)
RET Z
CALL FIXHL
SET 6,(HL)
RET
FIXHL: PUSH DE
PUSH HL
LD DE,(SPOT)
LD HL,63488
XOR A
SBC HL,DE
PUSH HL
POP DE
POP HL
ADD HL,DE
POP DE
RET
CLEAR: LD A,32
LD (HL),A
RET
FODATA: DB 14,0,5,6,12,4,15,7,2,0,14,3,2,1,9,3 ; PIXEL FADEOUT DATA
DB 11,6,10,7,4,4,1,5,2,4,6,7,8,1,2,3
DB 9,4,13,2,11,3,5,7,14,6,0,5,15,4,3,6
DB 9,7,3,0,5,5,6,6,8,7,5,1,9,5,13,3
DB 2,6,14,4,4,2,6,0,13,6,0,2,1,4,15,6
DB 14,2,11,1,8,4,12,1,4,0,6,5,9,2,10,5
DB 10,6,5,2,1,6,15,2,3,7,10,1,5,0,11,7
DB 7,2,3,3,6,4,12,7,15,5,9,6,13,7,14,5
DB 8,3,8,2,0,7,7,1,12,3,10,4,12,6,0,4
DB 15,1,13,4,8,6,11,5,9,1,14,7,0,1,7,4
DB 11,4,1,2,3,1,9,0,4,7,1,7,7,6,1,0
DB 1,3,6,3,7,0,13,1,6,1,6,2,15,0,12,5
DB 3,4,0,6,3,2,5,4,13,5,0,3,4,5,4,6
DB 10,3,7,3,10,2,2,7,12,0,14,1,2,2,5,3
DB 0,0,2,5,12,2,13,0,4,3,7,5,10,0,11,2
DB 8,0,15,3,7,7,4,1,11,0,1,1,3,5,8,5
; COMMONLY USED EQUATES
ESC EQU 27
CR EQU 0DH
LF EQU 0AH
BDOS EQU 5
END ; OF ASSEMBLY