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
/
ZSYS
/
SIMTEL20
/
SYSLIB
/
SLIB2.LBR
/
SINLINE.Z80
< prev
next >
Wrap
Text File
|
2000-06-30
|
6KB
|
278 lines
;
; SYSLIB Module Name: SINLINE
; Author: Richard Conn
; SYSLIB Version Number: 3.6
; Module Version Number: 1.1
public inline
;
; INLINE --
; INPUT LINE EDITOR
; INPUT A LINE FROM CON: INTO THE BUFFER POINTED TO BY H&L
; INPUT PARAMETERS:
; HL PTS TO BUFFER
; A = ECHO FLAG (A=0 MEANS NO ECHO)
; OUTPUT PARAMETERS:
; NO REGS AFFECTED
; INPUT LINE EDITING CHARACTERS ARE --
; <BS> -- DELETE PREVIOUS CHAR AND BACK UP CURSOR (SOFTCOPY)
; <DEL> -- DELETE PREVIOUS CHAR AND ECHO IT (HARDCOPY)
; <CR> -- INPUT COMPLETE
; <LF> -- SKIP DOWN TO NEXT LINE AND INSERT <CR> <LF>
; CTRL-X -- ERASE CURRENT LINE AND BACK UP CURSOR (SOFTCOPY)
; CTRL-U -- ERASE CURRENT LINE (HARDCOPY)
; CTRL-R -- RETYPE CURRENT LINE
; CTRL-E -- GO TO NEXT LINE
;
EXT CCOUT
EXT CIN
EXT COUT
EXT CRLF
PUTRG MACRO
PUSH BC ; SAVE BC, DE, HL
PUSH DE
PUSH HL
ENDM
GETRG MACRO
POP HL ; RESTORE HL, DE, BC
POP DE
POP BC
ENDM
;
; MAIN INLINE ENTRY POINT
;
INLINE:
PUTRG ; SAVE REGISTERS
PUSH AF ; SAVE PSW
LD (ECHO),A ; SAVE ECHO FLAG
LD (START),HL ; SAVE START OF STRING
; INLINE RESTART LOOP
INL0:
LD HL,(START) ; GET START OF STRING
LD C,0 ; SET CHAR COUNT
; MAIN LOOP
INL1:
CALL CIN ; GET INPUT CHAR
CP NULL ; DO NOT PERMIT <NULL>
JP Z,INL1
CP BS ; BACKSPACE?
JP Z,INBS
CP DEL ; DELETE?
JP Z,INDEL
CP TAB ; TABULATE?
JP Z,INTAB
CP CR ; CARRIAGE RETURN?
JP Z,INCR
CP LF ; LINE FEED?
JP Z,INLF
CP CTRLU ; CTRL-U?
JP Z,RESTRT
CP CTRLX ; CTRL-X?
JP Z,REXSTRT
CP CTRLR ; CTRL-R?
JP Z,RETYPE
CP CTRLE ; CTRL-E?
JP Z,NEWLINE
LD (HL),A ; STORE CHAR
INC HL ; PT TO NEXT
CALL CTRL ; PRINT CHAR
INC C ; INCR CHAR CNT
JP INL1
;
; ** INLINE MODULES **
; NEWLINE -- ECHO <CR> <LF> AND CONTINUE
NEWLINE:
CALL CRLF
JP INL1
; TAB -- TABULATE TO NEXT TAB STOP
INTAB:
LD (HL),A ; STORE <TAB>
INC HL ; PT TO NEXT CHAR POSITION
CALL INTAB0 ; TABULATE
JP INL1
; CTRL-R -- RETYPE CURRENT LINE
RETYPE:
LD (HL),0 ; STORE END OF STRING CHAR
LD C,0 ; RESET CHAR CNT
LD HL,(START) ; GET START ADDRESS
CALL HASH ; PRINT HASH CHAR
RETY1:
LD A,(HL) ; GET CHAR
OR A ; ZERO?
JP Z,INL1 ; CONTINUE
CALL CTRL ; PRINT IT
LD A,(HL) ; GET CHAR AGAIN
CP TAB ; DON'T COUNT IF <TAB>
JP Z,RETY2
CP BEL ; DON'T COUNT IF <BEL>
JP Z,RETY2
INC C ; INCR CHAR CNT
RETY2:
INC HL ; PT TO NEXT CHAR
JP RETY1
; CTRL-U -- ERASE LINE AND RESTART
RESTRT:
CALL HASH ; PRINT HASH CHAR
JP INL0 ; START UP AGAIN
; CTRL-X -- ERASE (AND BACKSPACE) LINE AND RESTART
REXSTRT:
LD A,C ; CHECK FOR EMPTY LINE
OR A ; 0 CHARS?
JP Z,INL0
CALL EXBS ; <BS>
JP REXSTRT
; LINE FEED -- INSERT <CR> <LF> AND ECHO <CR> <LF>
INLF:
LD (HL),CR ; STORE <CR>
INC HL ; PT TO NEXT
LD (HL),LF ; STORE <LF>
INC HL ; PT TO NEXT
LD C,0 ; RESET CHAR CNT
LD A,(ECHO) ; ECHO ON?
OR A ; 0=NO
CALL NZ,CRLF ; NEW LINE
JP INL1
; DELETE -- DELETE PREVIOUS CHAR AND ECHO DELETED CHAR
INDEL:
CALL BOL ; BEGINNING OF LINE?
JP Z,INL1 ; CONTINUE
DEC HL ; BACK UP
LD A,(HL) ; GET CHAR
CALL CTRL ; PRINT CHAR
CP BEL ; DON'T CHANGE COUNT IF <BEL>
JP Z,INL1
INC C ; INCR DISPLAY CHAR COUNT
JP INL1
; BACKSPACE -- DELETE PREVIOUS CHAR AND BACK UP CURSOR
INBS:
CALL EXBS ; EXECUTE <BS>
JP INL1
; BACKSPACE ROUTINE
EXBS:
CALL BOL ; BEGINNING OF LINE?
RET Z ; CONTINUE IF SO
DEC C ; DECR COUNT
DEC HL ; BACK UP
LD A,(ECHO) ; ECHO ON?
OR A ; 0=NO
RET Z
LD A,BS ; PRINT <BS>
CALL COUT
LD A,' ' ; <SP>
CALL COUT
LD A,BS ; <BS>
CALL COUT
RET
; CARRIAGE RETURN -- DONE; STORE ENDING ZERO
INCR:
LD (HL),0 ; STORE ENDING ZERO
LD A,(ECHO) ; ECHO ON?
OR A ; 0=NO
CALL NZ,CRLF ; NEW LINE
POP AF ; RESTORE PSW
GETRG ; RESTORE REGS
RET
;
; ** SUPPORT ROUTINES **
; BOL -- RETURNS W/ZERO FLAG SET IF USER AT BEGINNING OF LINE
BOL:
EX DE,HL ; DE=HL
LD HL,(START) ; GET START ADR
EX DE,HL ; HL RESTORED
LD A,D ; CHECK FOR MATCH
CP H ; MATCH?
RET NZ ; NO MATCH
LD A,E ; CHECK FOR COMPLETE MATCH
CP L
RET NZ ; NO MATCH
PUSH AF ; SAVE FLAGS
LD A,BEL ; BEEP
CALL COUT
POP AF
RET
; CTRL -- IF CHAR>=<SP>, PRINT IT; OTHERWISE, PRINT AS CTRL-CHAR
CTRL:
PUSH BC ; SAVE BC
LD B,A ; SAVE CHAR IN B
LD A,(ECHO) ; CHECK ECHO FLAG
OR A ; 0=NO ECHO
LD A,B ; RESTORE CHAR
POP BC ; RESTORE BC
RET Z ; NO OUTPUT IF NO ECHO
CP ' ' ; <SP>?
JP C,CTRL1
JP COUT ; PRINT IT NORMALLY
CTRL1:
CP TAB ; TRAP <TAB>
JP Z,INTAB0
JP CCOUT ; PRINT WITH CTRL-CHAR PROCESSING
; HASH -- PRINT HASH MARK FOLLOWED BY <CR> <LF>
HASH:
LD A,'#' ; PRINT HASH CHAR
CALL COUT
JP CRLF
; BUFFERS
START:
DS 2 ; TEMPORARY STORAGE FOR BUFFER START ADDRESS
ECHO:
DS 1 ; ECHO FLAG (0=NO ECHO)
; INTAB0 -- TABULATE ON SCREEN
INTAB0:
LD A,C ; GET CHAR CNT
AND 7 ; MASK FOR DIFFERENCE FROM 8
LD B,A ; STORE IN REG B TEMPORARILY
LD A,8 ; SUBTRACT FROM 8
SUB B
LD B,A ; <SP> COUNT IN B
ADD A,C ; ADD TO CHAR COUNT
LD C,A
LD A,(ECHO) ; ECHO ON?
OR A ; 0=NO
RET Z
LD A,' ' ; <SP> IN A
INTAB1:
CALL COUT ; PRINT <SP>
DEC B ; COUNT DOWN
JP NZ,INTAB1
RET
;
; ASCII SPECIAL CHARACTER EQUATES
;
NULL EQU 0 ; NULL
BEL EQU 7 ; BELL
BS EQU 8 ; BACKSPACE
TAB EQU 9 ; TAB
LF EQU 10 ; LINE FEED
CR EQU 13 ; CARRIAGE RETURN
CTRLE EQU 'E'-40H ; CTRL-E
CTRLR EQU 'R'-40H ; CTRL-R
CTRLU EQU 'U'-40H ; CTRL-U
CTRLX EQU 'X'-40H ; CTRL-X
DEL EQU 7FH ; DELETE CHAR
END