; INPAD.ASM ; ZX Spectrum Text input routine with padding - J.G.Harston ; --------------------------------------------------------- ; On entry HL=address to enter text. ; B=maximum line length, excluding . ; On exit HL=address of text, terminated with . ; B=length of text, excluding . ; Cy: clear=ok, set=BREAK. ; Alternate registers corrupted. ; Requires IY=>system variables, interupts on, IRQ routine at #38 running. ; Stand-alone routine, does not need external IORDCH. ; Size 131-170 bytes. ; Options: IOPADFG EQU 0 ; Colour of entered characters IOPADBG EQU 1 ; Colour of pad characters IOPADCH EQU "-" ; Pad character IOCLICK EQU 1 ; Key click, 0=no click IOBREAK EQU 1 ; Allow BREAK to stop input flags EQU 1 ; BIT 5,(IY+1)=key pressed LASTK EQU 23560 ; Last key pressed FLAGS2 EQU 23658 ; BIT 3,(FLAGS2)=CAPSLOCK IOINPUT PUSH HL ; Save start of text RES 5,(IY+1) ; Set 'no key pressed' IF IOPADFG<>IOPADBG LD A,16 RST 16 LD A,IOPADBG RST 16 ; Padding character ink ENDIF LD C,B ; C=maximum length IOPAD1 LD A,IOPADCH ; Show initial padding RST 16 DJNZ IOPAD1 LD B,C IOPAD2 LD A,8 ; Back to start RST 16 DJNZ IOPAD2 ; Initialise length to zero IORDLP IF IOPADFG<>IOPADBG LD A,16 RST 16 LD A,IOPADFG RST 16 ; Entered characters ink ENDIF IORDGET HALT ; Wait for interupt IF IOBREAK CALL &1F54 ; Test BREAK key CCF JR C,IORDBRK ENDIF BIT 5,(IY+flags) JR Z,IORDGET ; Loop until key pressed LD A,(LASTK) ; Get keypress RES 5,(IY+flags) ; Set 'no key pressed' CP 6 JR Z,IORDCAP ; CAPS pressed IF IOCLICK PUSH AF ; BEEPER corrupts all registers PUSH BC PUSH DE PUSH HL PUSH IX LD D,0 LD E,(IY-1) LD HL,&00C8 CALL &03B5 ; Keyclick POP IX POP HL POP DE POP BC POP AF ENDIF CP 12 JR Z,IORDDEL ; DELETE pressed CP 13 JR Z,IORDENT ; ENTER pressed, done CP 128 JR C,IORDCHR ; Character pressed SUB 194 JR NC,IORDSYM LD A,2 IORDSYM AND 15 ADD A,IORDCNV & 255 ; Index into conversion table PUSH HL LD L,A LD H,IORDCNV / 256 LD A,(HL) POP HL IORDCHR CP 32 JR C,IORDGET ; Not character, loop back LD (HL),A ; Store character LD A,B CP C JR NC,IORDGET ; Too long INC B ; Increment length LD A,(HL) RST 16 ; Print character INC HL ; Point to next location JR IORDGET ; Loop for next IORDCAP LD A,(FLAGS2) XOR 8 ; Toggle CAPSLOCK LD (FLAGS2),A JR IORDLP IORDDEL LD A,B AND A JR Z,IORDGET ; Nothing to delete LD A,8 ; Backspace RST 16 IF IOPADFG<>IOPADBG LD A,16 RST 16 LD A,IOPADBG RST 16 ; Cyan ink ENDIF LD A,IOPADCH RST 16 LD A,8 ; Backspace RST 16 DEC HL ; Decrement pointer IORDBAK DEC B ; Decrement length IF IORDBAK-IORDLP<126 JR IORDLP ; Loop for next ELSE JP IORDLP ; Loop for next ENDIF IORDENT LD (HL),A ; Insert terminating RST 16 ; Print NEWL, returns Carry=NC IORDBRK POP HL ; Get text pointer back RET ; Exit ; *NB* Table must not wrap over page boundary IORDCNV DEFB 126,124,127,93,91,0 ; ~ | (C) ] [ . DEFB 0,0,0,125,123,92 ; . . . } { \