home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CBM Funet Archive
/
cbm-funet-archive-2003.iso
/
cpm
/
comm
/
zmodem
/
zmo-hp12.zz0
/
ZMO-HP12.Z80
Wrap
Text File
|
1989-04-26
|
14KB
|
640 lines
;-----------------------------------------------------------------------------
;
;oVERLAY FOR zmp FFOR hp12x
;
;nAMEZMO-HP.AZM
;
;SET UP FOR COMPILE WITH Z80MR
;
;wRITTEN BY -
; rON mURRAY, C/O z-nODE 62, 061-9-450-0200, pERTH, wESTERN aUSTRALIA.
;
; 89/04/12 - mODIFIED TO zmp V1.5- gEORGE cONOVER
;mODIFIED TO zmp V1.2 STANDARD RJM 15/9/88
;mODIFIED TO zmp V1.3 STANDARD RJM 11/10/88
;mODIFIED TO zmp V1.4 STANDARD RJM 20/11/88
; aDDED hp CODE mwr 2/8/89
; aTTEMP AT CORRECT CURSOR CONTRL 2/10/89
;
;-----------------------------------------------------------------------------
;
;
;sYSTEM-DEPENDENT CODE OVERLAY FOR zmodem
;
;
;
; iNSERT YOUR OWN CODE AS NECESSARY IN THIS FILE. cODE CONTAINED HEREIN
; HAS BEEN WRITTEN IN z80 CODE FOR USE WITH m80 OR slr. aSSEMBLE AS FOLLOWS:
;
;slr zmo-XX01/H
;mload zmp.com=zmodem.com,zmo-XX01.hex
; OR
;m80 =zmo-XX01.z80
;relhex zmo-XX01
;mload zmp.com=zmodem.com,zmo-XX01.hex
;
;
; (dON'T USE l80 WITHOUT CHANGING THE SOURCE FOR ASSEMBLY AS A
; CSEG FILE.)
;
;-----------------------------------------------------------------------------
;
;
; nOTES ON MODIFYING THIS FILE:
;
; c REQUIRES THAT FUNCTIONS DO NOT CHANGE EITHER INDEX REGISTER (ix OR iy).
; iF YOUR OVERLAY REQUIRES EITHER OF THESE TO BE CHANGED, ENSURE THEY ARE
; RESTORED TO THE ORIGINAL VALUES ON RETURN.
; sINCE COLLECTING PARAMETERS FROM c FUNCTIONS CAN BE TRICKY, ONLY CHANGE
; THE PARTS MARKED 'iNSERT YOUR OWN CODE HERE'. dO not MODIFY THE JUMP
; TABLE AT THE START. dO not MODIFY THE ENTRY/EXIT SECTIONS OF EACH
; FUNCTION. dO not PASS 'go'. dO not COLLECT $200.
; aPART FROM DEFINING MODEM FUNCTIONS, THIS FILE ALSO DEFINES TERMINAL
; CHARACTERISTICS. eXAMPLES PROVIDED ARE FOR adm-3a (WITH A FEW OF MY OWN
; ADDITIONS). mODIFY TO SUIT YOUR OWN TERMINAL. aN INLINE PRINT ROUTINE
; IS PROVIDED FOR PRINTING STRINGS IN THE USUAL WAY: USAGE IS
;
;CALLPRINT
;DB'REQUIRED STRING',0
;
;-----------------------------------------------------------------------------
;
;
; dON'T FORGET TO SET YOUR CLOCK SPEED AT THE CLKSPD VARIABLE.
;
;
; iF YOU FIND YOUR OVERLAY EXCEEDS THE MAXIMUM SIZE (CURRENTLY 0400H),
; YOU WILL HAVE TO CONTACT ME FOR ANOTHER VERSION. iF TOO MANY PEOPLE NEED
; TO DO IT, WE HAVEN'T ALLOWED ENOUGH ROOM.
;
; rON mURRAY 15/8/88
;
;
;
;---------------------------------------------------------------------------
FALSEEQU0
TRUEEQU1
;------------------------------------------------------------------------------
; uSER-SET VARIABLES:
CLKSPDEQU4; pROCESSOR CLOCK SPEED IN mhZ
DEBUGEQUFALSE; TO ALLOW DEBUGGING OF OVERLAY WITH z8e ETC.
;sET THE FOLLOWING TWO EQUATES TO THE DRIVE AND USER AREA WHICH WILL CONTAIN
; zmp'S .ovr FILES, .cfg FILE, .fon FILE AND .hlp FILE. sET BOTH TO ZERO
; (NULL) TO LOCATE THEM ON THE DRIVE FROM WHICH zmp WAS INVOKED.
OVERDRIVEEQU'b'; dRIVE TO FIND OVERLAY FILES ON ('a'-'p')
OVERUSEREQU0; uSER AREA TO FIND FILES
;------------------------------------------------------------------------------
; not USER-SET VARIABLES
USERDEFEQU0145H; ORIGIN OF THIS OVERLAY
; tHIS ADDRESS SHOULD NOT CHANGE WITH
; SUBSEQUENT REVISIONS.
MSPEEDEQU03CH; LOCATION OF CURRENT BAUD RATE.
OVSIZEEQU0400H; MAX SIZE OF THIS OVERLAY
ORGUSERDEF
ESCEQU1BH
CTRLQEQU11H
CREQU0DH
LFEQU0AH
BDOSEQU5
CODEBGNEQU$
;jUMP TABLE FOR THE OVERLAY: DO not CHANGE THIS
JUMP_TAB:
JPSCRNPR; SCREEN PRINT
JPMRD; MODEM READ WITH TIMEOUT
JPMCHIN; GET A CHARACTER FROM MODEM
JPMCHOUT; SEND A CHARACTER TO THE MODEM
JPMORDY; TEST FOR TX BUFFER EMPTY
JPMIRDY; TEST FOR CHARACTER RECEIVED
JPSNDBRK; SEND BREAK
JPCURSADD; CURSOR ADDRESSING
JPCLS; CLEAR SCREEN
JPINVON; INVERSE VIDEO ON
JPINVOFF; INVERSE VIDEO OFF
JPHIDE; HIDE CURSOR
JPSHOW; SHOW CURSOR
JPSAVECU; SAVE CURSOR POSITION
JPRESCU; RESTORE CURSOR POSITION
JPMINT; SERVICE MODEM INTERRUPT
JPINVEC; INITIALISE INTERRUPT VECTORS
JPDINVEC; DE-INITIALISE INTERRUPT VECTORS
JPMDMERR; TEST UART FLAGS FOR ERROR
JPDTRON; TURN dtr ON
JPDTROFF; TURN dtr off
JPINIT; INITIALISE UART
JPWAIT; WAIT SECONDS
JPMSWAIT; WAIT MILLISECONDS
JPUSERIN; USER-DEFINED ENTRY ROUTINE
JPUSEROUT; USER-DEFINED EXIT ROUTINE
JPGETVARS; GET SYSTEM VARIABLES
jpsetport; sET PORT (0 OR 1)
; sPARE JUMPS FOR COMPATIBILITY WITH FUTURE VERSIONS
JPSPARE; SPARE FOR LATER USE
JPSPARE; SPARE FOR LATER USE
JPSPARE; SPARE FOR LATER USE
JPSPARE; SPARE FOR LATER USE
JPSPARE; SPARE FOR LATER USE
JPSPARE; SPARE FOR LATER USE
;
; mAIN CODE STARTS HERE
;
;sCREEN PRINT FUNCTION
SCRNPR:
; <== iNSERT YOUR OWN CODE HERE
CALLPRINT
DB1BH,'0',0
; <== eND OF YOUR OWN CODE
SPARE:
RET
; uSER-DEFINED ENTRY ROUTINE: LEAVE EMPTY IF NOT NEEDED
USERIN:
LD BC,73FFH
CALL BDOS
; MAP READER AND PUNCH TO PORT1
CALL PRINT
DB 'vERSION FOR hp12x sERIES',CR,LF,0
CALL PRINT
DB 1BH,'&I0S25D4m',1BH,'&I10S16D4m',CR,LF,0
; TRY AND SET UP VECTORS FOR 8 BITS
LD BC,7EFFH
LD DE,JBUF
CALL BDOS
LD HL,(JUMP)
LD (REAL),HL
LD HL,INEIGHT
LD (JUMP),HL
LD A,1
LD (FLAG),A
LD BC,7EFFH
LD DE,JBUF
CALL BDOS
RET
; MORE HP STUFF FOR 8 BIT SETUP
INEIGHT:CALL READIN
LD A,B
RET
; END OF MORE HP STUFF FOR 8 BIT SETUP
; uSER-DEFINED EXIT ROUTINE: LEAVE EMPTY IF NOT NEEDED
USEROUT:
; BEGIN HP EXIT
CALL PRINT
DB 1BH,'e',0 ; COLD BOOT SYSTEM
RET
;gET A CHARACTER FROM THE MODEM: RETURN IN hl
MCHIN:
PUSHBC
;START OR hp125 CODE
PUSH DE
LD C,03H
CALL BDOS
POP DE
;END OF hp CODE
LDL,A; PUT IN hl
LDH,0
ORA; SET/CLEAR z
POPBC
RET
;sEND A CHARACTER TO THE MODEM
MCHOUT:
LDHL,2; GET THE CHARACTER
ADDHL,SP
LDA,(HL)
;START OF hp CODE
PUSH BC
PUSH DE
LD E,A
LD C,04H
CALL BDOS
POP DE
POP BC
;END OF hp CODE
RET; DONE
;tEST FOR OUTPUT READY: RETURN true (1) IN hl IF OK
MORDY:
;START OF hp CODE
LD H,0
LD L,1
;END OF HP CODE
LDA,L; SET/CLEAR z
ORA
RET
;tEST FOR CHARACTER AT MODEM: RETURN true (1) IN hl IF SO
MIRDY:
;START OF HP CODE
PUSH BC
PUSH DE
LD BC,70FFH
CALL BDOS
LD H,0
LD L,A
POP DE
POP BC
;END OG hp CODE
LDA,L; SET/CLEAR z
ORA
RET
;sEND A BREAK TO THE MODEM: LEAVE EMPTY IF YOUR SYSTEM CAN'T DO IT
SNDBRK:
; <== iNSERT YOUR OWN CODE HERE
LDHL,300; WAIT 300 Ms
CALLWAITHM
; <== eND OF YOUR OWN CODE
RET
;
;tEST uart FLAGS FOR ERROR: RETURN true (1) IN hl IF ERROR.
MDMERR:
; <== iNSERT YOUR OWN CODE HERE
; <== eND OF YOUR OWN CODE
LDA,L; SET/CLEAR z
ORA
RET
;tURN dtr on
DTRON:
; <== iNSERT YOUR OWN CODE HERE
; <== eND OF YOUR OWN CODE
RET
;tURN dtr off
DTROFF:
; <== iNSERT YOUR OWN CODE HERE
; <== eND OF YOUR OWN CODE
RET
;iNITIALISE THE UART
INIT:
LDHL,2; GET PARAMETERS
ADDHL,SP
EXDE,HL
CALLGETPARM; IN hl
LD(BRATE),HL; BAUD RATE
CALLGETPARM
LD(PARITY),HL; PARITY
CALLGETPARM
LD(DATA),HL; DATA BITS (binary 7 OR 8)
CALLGETPARM
LD(STOP),HL; STOP BITS (binary 1 OR 2)
; <== iNSERT YOUR OWN CODE HERE
; USING VALUES BELOW
LD(MSPEED),A; DON'T FORGET TO LOAD MSPEED WITH THE
; CURRENT BRATE VALUE IF THE NEW RATE IS
; VALID. sEE TABLE OF VALUES BELOW.
; <== eND OF YOUR OWN CODE
RET
;--------------------------------------------------------------------------
STOP:DW1; STOP BITS
PARITY:DW'n'; PARITY
DATA:DW8; DATA BITS
BRATE:DW7; BAUD RATE:
;--------------------------------------------------------------------------
;vALUES OF BRATE FOR EACH BAUD RATE
;
; BAUD RATE BRATE
;
; 110 0
; 300 1
; 450 2
; 600 3
; 710 4
; 1200 5
; 2400 6
; 4800 7
; 9600 8
; 19200 9
; 3840010
; 57600 11
; 76800 12
;
;
; sET THE PORT. zmp SUPPLIES EITHER 0 OR 1 AS A PARAMETER.
;
SETPORT:
LDHL,2; GET PORT NUMBER
ADDHL,SP
EXDE,HL
CALLGETPARM; IN hl (VALUES ARE 0 AND 1)
; <== iNSERT YOUR OWN CODE HERE
; <== eND OF YOUR OWN CODE
RET
;****************************************************************************
;vIDEO TERMINAL SEQUENCES: FOR THE hp125
;cURSOR ADDRESSING:
CURSADD:
LDHL,2; GET PARAMETERS
ADDHL,SP
EXDE,HL
CALLGETPARM; IN hl
LD(ROW),HL; ROW
CALLGETPARM
LD(COL),HL; COLUMN
; <== iNSERT YOUR OWN CODE HERE
; USING VALUES IN ROW AND COL
;START HP SEQUENCE
CALL PRINT
DB ESC,'&A',0
PUSH BC
PUSH DE
PUSH HL
LD HL,(ROW)
CALL CONV
LD A,(TENS)
CALL COUT
LD A,(DIGITS)
CALL COUT
LD A,'R'
CALL COUT
LD HL,(COL)
CALL CONV
LD A,(TENS)
CALL COUT
LD A,(DIGITS)
CALL COUT
LD A,'c'
CALL COUT
POP HL
POP DE
POP BC
RET
; <== END OF YOUR OWN CODE
;MORE HP CODE FOR CURSOR CONTROL
CONV: LD DE,0000H
LD BC,000AH
LOOP16: SBC HL,BC
JP M,DONE
INC E
JP LOOP16
DONE: ADD HL,BC
LD A,L
ADD A,48
LD (DIGITS),A
LD A,E
ADD A,48
LD (TENS),A
RET
DIGITS: DS 1
TENS: DS 1
; END OF HP ADDED CODE FOR CURSOR CONTROL
ROW:DS2; ROW
COL:DS2; COLUMN
;cLEAR SCREEN:
CLS:
CALLPRINT
DB1BH,'h',1BH,'j',0
RET
;iNVERSE VIDEO ON:
INVON:
CALLPRINT
DB1BH,'&Da',0
RET
;iNVERSE VIDEO OFF:
INVOFF:
CALLPRINT
DB1BH,'&D@',0
RET
;tURN OFF CURSOR:
HIDE:
RET
;tURN ON CURSOR:
SHOW:
RET
;sAVE CURSOR POSITION:
SAVECU:
RET
;rESTORE CURSOR POSITION:
RESCU:
RET
;****************************************************************************
;sERVICE MODEM INTERRUPT:
MINT:
RET; MY SYSTEM DOESN'T NEED THIS
;iNITIALISE INTERRUPT VECTORS:
INVEC:
RET; DITTO
;dE-INITIALISE INTERRUPT VECTORS:
DINVEC:
RET; DITTO
;****************** eND OF USER-DEFINED CODE ********************************
;dO NOT CHANGE ANYTHING BELOW HERE.
;mODEM CHARACTER TEST FOR 100 MS
MRD:
PUSHBC; SAVE BC
LDBC,100; SET LIMIT
MRD1:
CALLMIRDY; CHAR AT MODEM?
JRNZ,MRD2; YES, EXIT
LDHL,1; ELSE WAIT 1MS
CALLWAITHM
DECBC; LOOP TILL DONE
LDA,B
ORC
JRNZ,MRD1
LDHL,0; NONE THERE, RESULT=0
XORA
MRD2:
POPBC
RET
; iNLINE PRINT ROUTINE: DESTROYS a AND hl
PRINT:
EX(SP),HL; GET ADDRESS OF STRING
PLOOP:
LDA,(HL); GET NEXT
INCHL; BUMP POINTER
ORA; DONE IF ZERO
JRZ,PDONE
CALLCOUT; ELSE PRINT
JRPLOOP; AND LOOP
PDONE:
EX(SP),HL; RESTORE RETURN ADDRESS
RET; AND QUIT
;
;oUTPUT A CHARACTER IN a TO THE CONSOLE
;
COUT:
PUSHBC; SAVE REGS
PUSHDE
PUSHHL
LDE,A; CHARACTER TO e
LDC,2
CALLBDOS; PRINT IT
POPHL
POPDE
POPBC
RET
;wAIT(SECONDS)
WAIT:
LDHL,2
ADDHL,SP
EXDE,HL; GET DELAY SIZE
CALLGETPARM
; FALL THRU TO..
;wAIT SECONDS IN hl
WAITHLS:
PUSHBC; SAVE BC
PUSHDE; DE
PUSHIX; AND IX
LDIX,0; THEN POINT IX TO 0
; SO WE DON'T UPSET MEMORY-MAPPED I/O
;cALCULATE VALUES FOR LOOP CONSTANTS. nEED TO HAVE TWO LOOPS TO AVOID
; 16-BIT OVERFLOW WITH CLOCK SPEEDS ABOVE 9 mhZ.
OUTERVALEQU(CLKSPD/10)+1
INNERVALEQU(6667/OUTERVAL)*CLKSPD
WAIT10:
LDB,OUTERVAL
WAIT11:
LDDE,INNERVAL
WAIT12:
BIT0,(IX); TIME-WASTERS
BIT0,(IX)
BIT0,(IX); 20 t-STATES EACH
BIT0,(IX)
BIT0,(IX)
BIT0,(IX)
DECDE
LDA,E
LDA,D
ORE
JRNZ,WAIT12; 150 t-STATES PER INNER LOOP
DJNZWAIT11; DECREMENT OUTER LOOP
DECHL; OK, DECREMENT COUNT IN HL
LDA,H
ORL
JRNZ,WAIT10
POPIX; DONE -- RESTORE IX
POPDE; DE
POPBC; AND BC
RET
;wAIT MILLISECONDS
MSWAIT:
LDHL,2
ADDHL,SP
EXDE,HL; GET DELAY SIZE
CALLGETPARM
; FALL THRU TO..
;wAIT MILLISECONDS IN hl
WAITHM:
PUSHDE
W1MS0:
LDDE,39*CLKSPD
W1MS1:
DECDE
LDA,D
ORE
JRNZ,W1MS1
DECHL
LDA,H
ORL
JRNZ,W1MS0
POPDE
RET
;gET NEXT PARAMETER FROM (DE) INTO HL
GETPARM:
EXDE,HL; GET ADDRESS INTO HL
LDE,(HL); GET LO
INCHL
LDD,(HL); THEN HI
INCHL; BUMP FOR NEXT
EXDE,HL; RESULT IN HL, ADDRESS STILL IN DE
RET
;gET ADDRESS OF USER-DEFINED VARIABLES
GETVARS:
LDHL,USERVARS
RET
USERVARS:
DWOVERDRIVE; .ovr ETC. DRIVE/USER
DWOVERUSER
;ADD HP STUFF
READIN: DB 0C3H
REAL: DS 2
JVN: DB 7
FLAG: DB 0
OPCODE: DS 1
JUMP: DS 2
JBUF: EQU JVN
;END ADDED HP STUFF
END