home *** CD-ROM | disk | FTP | other *** search
- ;Revised INKEY and LINA module for BASCOM
- ; (C) Copyright Trevor Marshall 1981
- EXT $TTYST,$TTYIN,$STP,$$TOUT,$$TCR,$TYPTX,$$PLNM,$$TRFL
- ENTRY $TRF,$TRN,$LINA
- ENTRY $INK,INK2
- ;
- NAME LINA
- $LINA:
- ;
- LD A,1 ;Non- zero
- LD (RAM0),A ;Indicate that this routine has been entered
- ;
- ; CALL $TTYST ;Do a control-c abort
- ; JP Z,NXT1
- ;If the keyboard is ready get and store the char for inkey
- ; CALL $TTYIN ;This uses a BIOS vector
- CALL BDOS.CHAR ;But we will use the BDOS call
- LD (CHAR),A ;A null if no char ready
- PUSH AF
- LD A,30 ;After 30 lines of code discard char
- LD (COUNT),A
- POP AF
- NXT1: CP 3
- JP Z,$STP
- ;Now check the line count to see if char is fresh
- LD A,(COUNT)
- OR A ;Is it already zero?
- JP Z,NXT2 ;Yes, dont decr
- DEC A
- LD (COUNT),A
- NXT2:
- LD A,($$TRFL)
- AND A
- RET Z
- EX (SP),HL
- PUSH BC
- PUSH DE
- PUSH HL
- LD A,($$TOUT)
- DEC A
- CALL NZ,$$TCR
- CALL $TYPTX
- LD D,H
- LD D,D
- LD B,C
- LD B,E
- PUSH BC
- CALL $$PLNM
- POP HL
- POP DE
- POP BC
- EX (SP),HL
- RET
- ;
- $TRN: LD A,1
- LD ($$TRFL),A
- RET
- $TRF: XOR A
- LD ($$TRFL),A
- RET
- ;
- COUNT: DB 0 ;Storage for count
- CHAR: DB 0 ;and char
- ;
- ; Trevor Marshall's attempt at in INKEY fn for BASCOM
- ;We see if /D routine has ever been entered and branch accordingly
- $INK:
- LD HL,RAM0
- LD A,(HL)
- OR A ;Is it still zero
- JR Z,INK2 ;Yes, execute INK2
- ;
- INC HL
- XOR A
- LD (HL),A ;put null length
- LD (RAM3),A ;Clear char
- LD A,(COUNT)
- OR A
- PUSH AF ;Even if count was not 0
- LD A,0 ;it is now (lockout further calls)
- LD (COUNT),A ;while repriming COUNT
- POP AF
- RET Z ;count is zero
- LD A,(CHAR) ;Get char
- OR A
- RET Z ;Null character
- LD (HL),1 ;Otherwise set length=1
- LD (RAM3),A ;store char
- RET
-
- INK2: INC HL
- ; XOR A
- LD (HL),A ;zero length
- ; CALL $TTYST
- ; JP Z,NXT11
- ;If the keyboard is ready get and store the char for inkey
- ; CALL $TTYIN
- CALL BDOS.CHAR
- NXT11: LD (CHAR),A
- OR A
- RET Z ;Null character
- LD (HL),1 ;Otherwise set length=1
- LD (RAM3),A ;store char
- RET
- ;
- BDOS.CHAR:
- PUSH HL ;Do a BDOS call in case char is caughtin O/P
- PUSH BC
- PUSH DE
- LD C,0BH
- CALL 5
- OR A
- JR Z,NXT9 ;No char ready yet
- LD E,0FFH ;else read it
- LD C,6
- CALL 5 ;Read no echo CP/M 2
- NXT9:
- POP DE ;returns a null for no char
- POP BC
- POP HL
- RET
- ;
- RAM0: DB 0 ;Changed to 1 by DEBUG code
- RAM1: DB 0 ;length of string
- RAM2: DW RAM3 ;Pointer at input char
- RAM3: DB 0 ;Where the char is kept
-
- END
-