home *** CD-ROM | disk | FTP | other *** search
- ;This module contains the installable routines for the program PTRDEF.
- ;Installed at present on Amstrad PCW/CPC/Spectrum +3
- ;
- ;To alter: Change values/graphic routines included.
- ;Then type:
- ; RMAC DDMENU
- ; LINK PTRDEF,DDMENU,PTRLIB[S]
- ;
- ; This can only be updated and run on CP/M 3 computers.
- ;
- CSEG
- ;
- ; Graphics:
- ;
- GTLC EQU 134 ; Top left corner
- GTRC EQU 140 ; Top right corner
- GBLC EQU 131 ; Bottom left corner
- GBRC EQU 137 ; Bottom right corner
- GTL EQU 138 ; Top line
- GBL EQU GTL ; Bottom line
- GLL EQU 133 ; Left side
- GRL EQU GLL ; Right side
- GLJ EQU 130 ; Left side /internal line junction
- GRJ EQU 136 ; Right side/internal line junction
- GIL EQU 154 ; Internal line
- DOT EQU 144 ; Graphic dot
- DOTCUR EQU 128 ; Graphic cursor
-
- ;If your terminal doesn't have graphics, suggested replacements are:
- ;GTLC,GTRC,GBLC,GBRC + sign
- ;GTL,GBL - sign
- ;GLL,GRL,GLJ,GRJ Exclamation mark or Vertical Bar
- ;GIL = sign
- ;DOT . full stop
- ;DOTCUR * or similar.
-
- ESC EQU 1BH ; Escape
- CR EQU 0DH ; Return
-
- LA EQU 1 ; Left Arrow
- RA EQU 6 ; Right Arrow
- UA EQU 31 ; Up Arrow
- DA EQU 30 ; Down Arrow
-
- FDOS EQU 0005H
-
- PUBLIC CON6,PRINT,STRING$,OPCHAR,OPCCB,UPCASEA,BLEEP,MENU,CLRMENU
- PUBLIC CURON,CUROFF,HIVON,HIVOFF,LOVON,LOVOFF,DRAWBOX,PLOTBYTE,SCRINI
- PUBLIC SCRUNI,DOTHL,CURHL,ARRTEST,PRINAT,FNTBOX,ANYCHAR
-
- UPCASEA:
- CPI 'a' ; PUBLIC - convert the character in A to
- RC ;upper case.
- CPI 'z'+1
- RNC
- ANI 0DFH
- RET
- ;
- BLEEP: PUSH D ; PUBLIC - Sound the bell.
- MVI E,7
- CALL OPCHAR
- POP D
- RET
- ;
- CON6: PUSH B ; PUBLIC. If there is no keypress A=0 else
- PUSH D ;A=Keypress.
- PUSH H
- MVI C,6
- MVI E,0FFH
- CALL FDOS
- POP H
- POP D
- POP B
- RET
- ;
- PRINT: PUSH PSW ; PUBLIC. Print an ASCII string, saving all 8080
- PUSH B ;registers.
- PUSH D
- PUSH H
- MVI C,9
- CALL FDOS
- POP H
- POP D
- POP B
- POP PSW
- RET
- ;
- STRING$:
- ; Print the character in E, B times.
- PUSH B
- STRI$1: CALL OPCHAR
- DCR B
- JNZ STRI$1
- POP B
- RET
- ;
- OPCCB: PUSH PSW ; Print a fixed length string, saving all 8080
- PUSH B ; registers.
- PUSH D
- PUSH H
- MVI C,111
- CALL FDOS
- POP H
- POP D
- POP B
- POP PSW
- RET
- ;
- ANYCHAR:
- PUSH PSW ; PUBLIC - Print any character from 0-255.
- MOV A,E ;If your terminal only supports nos 32-126,
- CPI 20H ;you may wish to alter this routine so that
- JC AC1 ;characters above 126 give a ? mark, by removing
- ; CPI 7FH ;the semicolons at the start of these lines.
- ; JNC AC1
- POP PSW
- JMP OPCHAR
- ;
- AC1: PUSH D
- MVI E,'?'
- CALL OPCHAR
- POP D
- POP PSW
- RET
- ;
- OPCHAR:
- PUSH PSW ; PUBLIC - print a character, saving all 8080
- PUSH B ;registers.
- PUSH D
- PUSH H
- MVI C,2
- CALL FDOS
- POP H
- POP D
- POP B
- POP PSW
- RET
- ;
- PRINAT:
- PUSH PSW ; PUBLIC. Move the cursor to a Y position
- PUSH D ; specified by D, and an X position specified
- LXI D,AT$ ; by E.
- CALL PRINT
- POP D
- MVI A,32
- ADD D
- PUSH D
- MOV E,A
- CALL OPCHAR
- MVI A,32
- POP D
- PUSH D
- ADD E
- MOV E,A
- CALL OPCHAR
- POP D
- POP PSW
- RET
- ;
- DSEG
- AT$: DB CR,ESC,'Y$'
- HV1$: DB ESC,'p$'
- HV0$: DB ESC,'q$'
- LV1$: DB ESC,'r$'
- LV0$: DB ESC,'u$'
- CUR0$: DB ESC,'f$'
- CUR1$: DB ESC,'e$'
- SCRINI:
- DB ESC,'y',ESC,'E',ESC,'x',ESC,'0',ESC,'H$'
- SCRUNI:
- DB ESC,'y',ESC,'E',ESC,'1',ESC,'H$'
- ;
- ;SCRINI and SCRUNI are public. They are, respectively, the screen initialisation
- ;and de-initialisation codes sent to the terminal. SCRINI is sent at the start
- ;of the program and should select a 24x80 screen, clear the screen and home the
- ;cursor. SCRUNI should return the terminal to whatever state you think it should
- ;be returned to.
- ;
- CSEG
- ;
- ;The next four routines are used for special effects:
- ;"High/Inverse video" is used for the information lines, the menus, "inked"
- ; dots on the character design grid, etc.
- ;"Low video" is used for character markers when marking a section of
- ; the font.
- ;"Normal video" is used in the menus, "blank" dots on the character grid
- ; etc. Normal video should be selected by the "Cancel High"
- ; and "Cancel low" routines.
- ;
- ;"High video" and "Low video" will not be used at the same time, but they have
- ;separate "cancel" routines for future expansion.
-
- HIVON: PUSH D ;PUBLIC - Select High/Inverse video.
- LXI D,HV1$
- CALL PRINT
- POP D
- RET
- ;
- HIVOFF: ;PUBLIC - Cancel High/Inverse video.
- PUSH D
- LXI D,HV0$
- CALL PRINT
- POP D
- RET
- ;
- LOVON: PUSH D ;PUBLIC - Select Low video (implemented as underlining)
- LXI D,LV1$
- CALL PRINT
- POP D
- RET
- ;
- LOVOFF: PUSH D ;PUBLIC - Cancel Low video/underlining.
- LXI D,LV0$
- CALL PRINT
- POP D
- RET
- ;
- CURON: PUSH D ;PUBLIC - turn the cursor on.
- LXI D,CUR1$
- CALL PRINT
- POP D
- RET
- ;
- CUROFF: ;PUBLIC - turn the cursor off.
- PUSH D
- LXI D,CUR0$
- CALL PRINT
- POP D
- RET
- ;
- ;COMTAB is a keyboard translation table for the control keys. It is used for editing
- ;options in the "line input" routine and are at present set up as for a PCW keyboard.
- ;To change it, set a DW to the new value. Allowed values are:
- ;
- ;INPUT3 - No special action; put the control character in the input buffer.
- ; It will display as a ? mark.
- ;MOVLT,MOVRT - cursor left or right
- ;LINEOL - cursor to start/end of line
- ;ABANDON - abandon input and quit menu
- ;RDEL - delete character under cursor
- ;DELETE - delete left
- ;FINISH - End input successfully
- ;DEL2EOL,DEL2BOL - delete to end/start of line
- ;OUT2MEN - Up and down cursor keys
- ;EXIT - Escape. Similar in effect to ABANDON.
-
- DSEG
- COMTAB: DW INPUT3 ; ^@ (^@ cannot be typed anyway).
- DW MOVLT ; ^A
- DW LINEOL ; ^B
- DW ABANDON ; ^C
- DW INPUT3 ; ^D
- DW INPUT3 ; ^E
- DW MOVRT ; ^F
- DW RDEL ; ^G
- DW DELETE ; ^H
- DW INPUT3 ; ^I
- DW FINISH ; ^J
- DW DEL2EOL ; ^K
- DW INPUT3 ; ^L
- DW FINISH ; ^M
- DW INPUT3 ; ^N
- DW INPUT3 ; ^O
- DW INPUT3 ; ^P
- DW INPUT3 ; ^Q
- DW INPUT3 ; ^R
- DW INPUT3 ; ^S
- DW INPUT3 ; ^T
- DW INPUT3 ; ^U
- DW INPUT3 ; ^V
- DW INPUT3 ; ^W
- DW DEL2BOL ; ^X
- DW INPUT3 ; ^Y
- DW INPUT3 ; ^Z
- DW EXIT ; ^[
- DW DEL2EOL ; ^\ ([-])
- DW INPUT3 ; ^]
- DW OUT2MEN ; ^^
- DW OUT2MEN ; ^_
- CSEG
- ;
- ;Beyond this point are routines which should not need altering. They are only in
- ;this file because they use the graphic characters or cursor keys defined above.
- ;_______________________________________________________________________________
- ;
- MENU:
- ;
- ;PUBLIC - Pull down Menu.
- ;
- ;On entry, HL points to menu buffer.
- ;A=Option number indicated at start (usually 1)
- ;
- ;On exit, A=Option number selected.
- ; B=0 => ENTER was pressed.
- ; B=2 => EXIT was pressed.
- ; B=3 => STOP was pressed.
- ; B=4 => Left or right arrow was pressed; and line input was made.
- ;
- ; DE points to the input made if B=4; Otherwise DE corrupt.
- ; Flags corrupt.
- ; All other registers preserved.
- ;
- ;FORMAT OF THE MENU BUFFER:
- ;
- ;+0: Y-coordinate of top of menu
- ; 1: X-coordinate of left side of menu
- ; 2: Width of a menu option
- ; 3: Number of menu options
- ; 4: Title
- ; 4+width: Option entries 1..N
- ;
- ;Each option entry is:
- ;
- ; Base: Name
- ; Base+width: Shortcut; if this byte is recieved at the keyboard, the menu
- ; cursor will jump to this entry. (unless input
- ; specified)
- ; Base+width+1: Status word.
- ; If bit 15 is set, input can be allowed at this entry.
- ; Bits 14-8 : Max. possible length of input buffer
- ; Bits 7 -0 : Offset for input buffer
- ; 0=LH edge of menu
- ;
- ;1. DRAW THE MENU
-
- SHLD HLSTORE
- MOV D,M
- INX H
- MOV E,M ; Y,X COORDINATES
- PUSH D
- CALL PRINAT ; PRINT @ Y,X
- CALL HIVON ; HI VIDEO ON.
- MVI E,GTLC
- CALL OPCHAR
- MVI E,GTL ; TOP LEFT CORNER; TOP LINE; TOP RIGHT CORNER
- INX H
- MOV B,M
- CALL STRING$
- MVI E,GTRC
- CALL OPCHAR
- POP D
- INR D
- PUSH D
- CALL PRINAT
- MVI E,GLL ; LH LINE; TITLE; RH LINE
- CALL OPCHAR
- PUSH PSW
- MOV A,B
- STA OPTLEN
- XRA A ; SAVE LENGTH OF OPTION/TITLE
- STA OPTLEN+1
- POP PSW
- INX H
- INX H ; HL=TITLE
- SHLD MENUCCB
- LXI D,MENUCCB
- CALL OPCCB
- MVI E,GRL
- CALL OPCHAR
- POP D
- INR D
- PUSH D
- CALL PRINAT
- MVI E,GLJ ; LH JUNCTION; INTERIOR LINE; RH JUNCTION
- CALL OPCHAR
- CALL GETLEN ; LENGTH OF INTERIOR LINE
- MVI E,GIL
- CALL STRING$
- MVI E,GRJ
- CALL OPCHAR
- DCX H
- MOV B,M ; B=NUMBER OF OPTIONS
- PUSH PSW
- MOV A,B
- STA NUMOPT
- POP PSW
- INX H
- CALL SKIPLEN ; MSTART = START OF 1ST OPTION
- SHLD MSTART
- MENULOOP:
- POP D
- INR D ; MOVE DOWN 1 LINE
- PUSH D
- CALL PRINAT
- MVI E,GLL ; LINE; OPTION; LINE
- CALL OPCHAR
- SHLD MENUCCB
- LXI D,MENUCCB
- CALL OPCCB
- CALL SKIPLEN3
- MVI E,GRL ; NEXT OPTION
- CALL OPCHAR
- DCR B
- JNZ MENULOOP
- POP D
- INR D
- CALL PRINAT
- MVI E,GBLC ; BOTTOM LEFT; BOTTOM LINE; BOTTOM RIGHT
- CALL OPCHAR
- MVI E,GBL
- CALL GETLEN
- CALL STRING$
- MVI E,GBRC
- CALL OPCHAR ; MENU DRAWN.
- ;
- ; FIND OUT IF THERE IS AN INITIAL POSITION.
- ;
- LXI H,NUMOPT
- MOV B,M ; B=MAX. VALUE OF A
- INR B
- CMP B ; A=REAL VALUE OF A
- JNC SETNO1
- ORA A ; A=0 UNACCEPTABLE.
- JZ SETNO1
- JMP SETNO2
- ;
- SETNO1: MVI A,1
- SETNO2: STA BARPOS
-
- ;2. PUT THE MENU BAR UP.
-
- MAINLOOP:
- CALL CUROFF ; CURSOR OFF
- LDA BARPOS
- CALL PRINTBAR
- CALL FINDOPT ; PRINT THE BAR; MOVE HL TO OPTIONS FOR THIS LINE
- CALL SKIPLEN
- INX H ; STATUS WORD BYTE 1
- MOV C,A
- MOV A,M ; BIT 7,M
- RAL
- MOV A,C
- JNC NOOPT ; NO SPECIAL EFFECTS
- INX H
- MOV C,M ; C=OFFSET FOR CURSOR: HORIZONTAL
- CALL BARPL ; DE=Y,X COORDINATES OF START OF BAR
- MOV A,C
- ADD E
- MOV E,A ; E=E+C
- CALL PRINAT
- CALL CURON ; POSITION CURSOR AT START OF INPUT.
- ;
- ;3. GET A CHARACTER AND ACT AS FOLLOWS:
- ; IF IT IS UP OR DOWN ARROW, MOVE MENU BAR ACCORDINGLY.
- ; IF IT IS ^M, FLAG CR AND RETURN
- ; IF IT IS <-DEL, FLAG DEL & RETURN
- ; IF IT IS ^C, FLAG ETX & RETURN
- ; IF IT IS ^[, FLAG ESC & RETURN
- ; IF BAR IS ON AN INPUT OPTION, ENTER SPECIAL INPUT ROUTINE.
- ; OTHERWISE, USE THE SHORTCUT KEY.
- ;
- NOOPT: CALL CON6
- ORA A
- JZ NOOPT
- CPI CR ; TEST FOR CARRIAGE RETURN
- JNZ NOCR
- MVI B,0
- EXMENU: LHLD HLSTORE
- CALL HIVOFF
- CALL CUROFF
- LDA BARPOS
- RET
- ;
- NOCR: CPI 1BH ; TEST FOR ESCAPE (EXIT)
- JNZ NOESC
- MVI B,2
- JMP EXMENU
- ;
- NOESC: CPI 03H ; TEST FOR ETX (STOP)
- JNZ NOSTOP
- MVI B,3
- JMP EXMENU
- ;
- NOSTOP: CPI UA
- JZ UP
- CPI DA ; DEAL WITH BAR UP/DOWN
- JZ DOWN
- MOV C,A ; SAVE CHARACTER FOR LATER USE.
- LDA BARPOS
- CALL FINDOPT ; DOES THIS OPTION ALLOW INPUT?
- CALL SKIPLEN
- INX H ; HL=FIRST OPTION BYTE
- MOV A,M
- RAL ; BIT 7,M
- JC INDATA
- MOV A,C
- ;
- ; Test the shortcuts.
- ;
- ; Convert to uppercase.
- ;
- CALL UPCASEA
- LXI H,NUMOPT
- MOV B,M ; B=NO. OF OPTIONS => NUMBER OF SHORTCUTS
- SCLOOP: MOV C,A ; C=KEYPRESS
- MOV A,B
- CALL FINDOPT
- CALL SKIPLEN ; HL POINTS TO SHORTCUTS.
- MOV A,C ; A=KEYPRESS
- CMP M ; DOES A=SHORTCUT?
- JZ MOVBAR
- DCR B
- JNZ SCLOOP
- CALL BLEEP
- ;
- ;4. GO TO 2.
- ;
- JMP MAINLOOP
- ;
- MOVBAR: LDA BARPOS ; MOVE BAR TO POSITION IN B.
- CALL DELBAR
- MOV A,B
- STA BARPOS
- JMP MAINLOOP
- ;
- UP: LDA BARPOS
- MOV B,A
- DCR B
- JZ MAINLOOP
- JMP MOVBAR
- ;
- DOWN: LXI H,NUMOPT ; (HL)=NO. OF OPTIONS
- LDA BARPOS
- CMP M
- JNC MAINLOOP
- MOV B,A
- INR B
- JMP MOVBAR
- ;
- PRINTBAR:
- ; PRINT THE MENU BAR
- PUSH D
- CALL BARPL ; LOCATE BAR
- CALL PRINAT ; PRINT POSITION AT START OF BAR
- CALL HIVOFF
- LXI D,MENUCCB
- CALL OPCCB ; PRINT MENU OPTION
- CALL HIVON
- POP D
- RET
- ;
- DELBAR: PUSH D ; REMOVE THE MENU BAR
- CALL BARPL
- CALL PRINAT
- CALL HIVON
- LXI D,MENUCCB
- CALL OPCCB
- POP D
- RET
- ;
- BARPL: PUSH PSW
- PUSH H
- CALL FINDOPT ; FIND Y,X FOR OPTION NUMBER A
- SHLD MENUCCB
- LHLD HLSTORE ; HL POINTS TO Y,X COORDINATES
- ADD M ; A=OPTION NUMBER+TOP LINE
- INR A
- INR A ; A=OPT.NO + OFFSET
- MOV D,A
- INX H
- MOV E,M ; E=X-COORDINATE OF MENU
- INR E
- POP H
- POP PSW
- RET ; RETURN Y,X IN D,E
-
- FINDOPT: ; FIND THE ADDRESS OF OPTION NO. A
- PUSH B ; AND RETURN IT IN HL.
- LHLD MSTART ; HL POINTS TO OPTIONS
- CPI 1
- JZ FOPT2 ; OPTION ALREADY FOUND
- MOV B,A
- DCR B
- FOPT1: CALL SKIPLEN3 ; SKIP AN ENTRY
- DCR B
- JNZ FOPT1
- FOPT2: POP B
- RET
- ;
- INDATA: LDA BARPOS
- CALL FINDOPT
- CALL SKIPLEN ; OPTION BYTES
- INX H
- MOV A,M
- ANI 7FH ; A=MAX. LENGTH OF INPUT
- STA MAXLEN
- INX H
- MOV A,M
- STA XOFF
- CALL HIVOFF ; NO INVERSE VIDEO.
- CALL INPUT1 ; WITH C=FIRST KEYPRESS.
- LXI D,MAXLEN
- MVI B,4
- JMP EXMENU
- ;
- DSEG
- MSTART: DW 0 ; START ADDR. OF OPTIONS
- MENUCCB:
- DW 0
- OPTLEN: DW 0
- MAXLEN: DB 0
- INPLEN: DB 0
- INPBUF: DS 136
- HLSTORE:
- DW 0
- BARPOS: DB 0
- NUMOPT: DB 0
- CSEG
-
- SKIPLEN:
- XCHG ; SKIP 1 ENTRY
- LHLD OPTLEN
- DAD D
- RET
- ;
- SKIPLEN3:
- CALL SKIPLEN
- INX H
- INX H ; MOVE PAST EXTRA DATA
- INX H
- RET
- ;
- GETLEN: ; GET LENGTH OF AN ENTRY IN B.
- PUSH PSW
- LDA OPTLEN
- MOV B,A
- POP PSW
- RET
- ;
- INPUT1: MOV A,C ; A=FIRST CHARACTER
- PUSH PSW
- LXI H,MAXLEN
- MOV A,M
- INX H ; FIRST LDIR PARAMETER
- MOV C,A
- MVI B,0 ; LDIR LENGTH
- LXI D,INPBUF
- XRA A
- MOV M,A
- LDIR1: MOV A,M ; CLEAR INPUT BUFFER
- STAX D
- INX D
- INX H ; 8080 LDIR
- DCX B
- MOV A,B
- ORA C
- JNZ LDIR1
- STA PTR ; ZERO CURSOR POINTER
- POP PSW
- JMP INPUT2
- ;
- DSEG
- PTR: DB 0
- XOFF: DB 0
-
-
- CSEG
- ;
- INPUT: CALL CON6
- ORA A
- JZ INPUT
- INPUT2: CALL MOVXY ; MOVE CURSOR TO RIGHT PLACE
- CPI 20H
- JNC INPUT3
- ;
- MOV L,A
- MVI H,0
- DAD H
- LXI D,COMTAB
- DAD D
- MOV D,M
- INX H
- MOV H,M
- MOV L,D
- PCHL
- ;
- FINISH: RET
- ;
- OUT2MEN:
- POP H
- JMP NOSTOP
- ;
- ABANDON:
- POP D
- LXI D,MAXLEN
- MVI B,3
- RET
- ;
- EXIT: POP D
- LXI D,MAXLEN
- MVI B,2
- RET
- ;
- ;
- DELETE: LDA PTR
- ORA A ; DEL LEFT/^H. AT THE LH END OF THE LINE?
- CZ BLEEP
- JZ INPUT
- ;
- LXI H,INPLEN
- CMP M ; LAST CHARACTER SPECIAL CASE
- JZ DELLAST
- ;
- CALL GETPPOS ; DE=NEXT CHARACTER
- MOV D,H
- MOV E,L
- DCX H ; HL=THIS CHARACTER
- DEL1: LDAX D
- MOV M,A
- ORA A
- INX H
- INX D
- JNZ DEL1
- LXI H,PTR
- DCR M
- LXI H,INPLEN
- DCR M
- CALL UPDLN ; UPDATE LINE
- CALL MOVXY
- JMP INPUT
- ;
- DELLAST:
- CALL GETLPOS
- MVI M,0
- LXI H,INPLEN
- DCR M
- LXI H,PTR
- DCR M
- CALL UPDLN
- CALL MOVXY
- JMP INPUT
- ;
- RDEL: LDA PTR
- LXI H,INPLEN
- CMP M
- CZ BLEEP
- JZ INPUT
- CALL GETPPOS
- MOV D,H
- MOV E,L
- INX D ; HL=THIS CHARACTER
- RDEL1: LDAX D
- MOV M,A
- ORA A
- INX H
- INX D
- JNZ RDEL1
- LXI H,INPLEN
- DCR M
- CALL UPDLN ; UPDATE LINE
- CALL MOVXY
- JMP INPUT
- ;
- DEL2EOL:
- CALL GETPPOS
- LDA PTR
- STA INPLEN
- DEL3E: MOV A,M
- MVI M,0
- INX H
- ORA A
- JNZ DEL3E
- CALL UPDLN
- CALL MOVXY
- JMP INPUT
- ;
- DEL2BOL:
- CALL GETPPOS
- LXI D,INPBUF
- MVI B,0
- DEL3B: MOV A,M
- STAX D
- INX H
- INX D
- INR B
- ORA A
- JNZ DEL3B
- DCR B
- MOV A,B
- STA INPLEN
- XRA A
- STA PTR
- CALL UPDLN
- CALL MOVXY
- JMP INPUT
- ;
- INPUT3: CPI 127 ; <-DEL?
- JZ DELETE
- CALL INSERT
- CALL UPDLN
- CALL MOVXY
- JMP INPUT
- ;
- DSEG
- CHAR: DB 0
- CSEG
- ;
- INSERT: STA CHAR ; INSERT A CHARACTER
- LDA INPLEN
- LXI H,MAXLEN
- CMP M ; IS LENGTH=MAXIMUM?
- CZ BLEEP ; IF YES, BLEEP; DISALLOW
- RZ
- ;
- LXI H,PTR
- CMP M ; IS THIS THE LAST CHARACTER?
- JNZ INSERT1 ; SPECIAL CASE IF JUST ADDING THE LAST CHARACTER
- CALL GETLPOS
- LDA CHAR
- MOV M,A
- INX H
- MVI M,0
- LDA INPLEN
- INR A
- STA INPLEN
- STA PTR
- RET
- ;
- INSERT1:
- CALL GETPPOS ; HL=CURRENT POSITION
- MOV C,M
- INSERT2:
- MOV A,M
- MOV M,C
- MOV C,A
- INX H
- ORA A
- ORA C
- JNZ INSERT2
- CALL GETPPOS
- LDA CHAR
- MOV M,A ; STORE NEW CHARACTER
- LXI H,PTR
- INR M
- LXI H,INPLEN
- INR M
- RET
- ;
- GETPPOS:
- PUSH D
- LXI D,INPBUF
- LHLD PTR
- MVI H,0
- DAD D ; HL=CURSOR POS.
- POP D
- RET
- ;
- MOVLT: LDA PTR
- ORA A
- JZ INPUT
- DCR A
- STA PTR
- CALL MOVXY
- JMP INPUT
- ;
- MOVRT: LDA PTR
- LXI H,INPLEN
- CMP M
- JZ INPUT
- INR A
- STA PTR
- CALL MOVXY
- JMP INPUT
- ;
- ;
- GETLPOS:
- PUSH D
- LXI D,INPBUF
- LHLD INPLEN
- MVI H,0
- DAD D
- POP D
- RET
- ;
- MOVXY: PUSH PSW
- PUSH B
- PUSH D
- PUSH H
- LDA BARPOS
- CALL BARPL ; DE=BAR CO-ORDS (E IS X)
- LDA XOFF
- MOV L,A ; ADD PERMANENT OFFSET
- LDA PTR
- ADD L ; ADD CURSOR OFFSET
- ADD E
- MOV E,A ; PRINT AT CURSOR POSITION FOR BAR.
- CALL PRINAT
- UPDLN2: POP H
- POP D
- POP B
- POP PSW
- RET
- ;
- UPDLN: PUSH PSW
- PUSH B
- PUSH D
- PUSH H
- LDA BARPOS
- CALL BARPL
- LDA XOFF
- ADD E ; PRINT AT START OF LINE
- MOV E,A
- CALL PRINAT
- LXI H,INPBUF
- LDA INPLEN
- ORA A
- JZ UPDLN3
- MOV B,A
- UPDLN1: MOV A,M
- ORA A ; PRINT THE STRING SO FAR.
- JZ UPDLN3
- MOV E,A
- INX H
- CALL ANYCHAR
- DCR B
- JNZ UPDLN1
- UPDLN3: LDA MAXLEN
- LXI H,INPLEN
- SUB M ; A=UNUSED CHARS
- ORA A
- JZ UPDLN2
- MOV B,A
- MVI E,' '
- UPDLN4: CALL OPCHAR
- DCR B
- JNZ UPDLN4
- JMP UPDLN2
- ;
- LINEOL: LDA PTR
- ORA A
- JZ EOL
- XRA A
- STA PTR
- CALL MOVXY
- JMP INPUT
- ;
- EOL: LDA INPLEN
- STA PTR
- CALL MOVXY
- JMP INPUT
- ;
- CLRMENU:
- ; PUBLIC. CLEAR THE MENU
- ; HL=MENU BUFFER
- PUSH PSW
- PUSH B
- PUSH D
- PUSH H
- MOV D,M
- INX H
- MOV E,M
- INX H
- MOV C,M
- INX H
- MOV B,M
- INR C
- INR C
- INR B
- INR B
- INR B
- INR B
- CLRLOOP:
- CALL PRINAT
- INR D
- PUSH D
- MVI E,' '
- PUSH B
- MOV B,C
- CALL STRING$
- POP B
- POP D
- DCR B
- JNZ CLRLOOP
- JMP UPDLN2
- ;
- DRAWBOX: ;PUBLIC. Draws a grid of graphic dots, 16 high by 8 wide
- CALL HIVOFF ;Surrounds this with a graphic border.
- LXI D,0423H
- CALL PRINAT
- MVI E,GTLC
- CALL OPCHAR
- MVI B,8
- MVI E,GTL
- CALL STRING$
- MVI E,GTRC
- CALL OPCHAR
- MVI C,16
- LXI D,0523H
- DB1: PUSH B
- CALL PRINAT
- INR D
- PUSH D
- MVI E,GLL
- CALL OPCHAR
- MVI E,DOT
- MVI B,8
- CALL STRING$
- MVI E,GRL
- CALL OPCHAR
- POP D
- POP B
- DCR C
- JNZ DB1
- CALL PRINAT
- MVI E,GBLC
- CALL OPCHAR
- MVI E,GBL
- MVI B,8
- CALL STRING$
- MVI E,GBRC
- CALL OPCHAR
- RET
- ;
- PLOTBYTE: ;PUBLIC. Converts a byte into a series of 8 graphic
- PUSH PSW ;dots, and displays them. 0 bits are shown in normal
- PUSH B ;video; 1 bits in high/inverse video.
- PUSH D
- PUSH H
- MVI B,8
- PLB1: RAL
- CC HIVON
- CNC HIVOFF
- MVI E,DOT
- CALL OPCHAR
- DCR B
- JNZ PLB1
- POP H
- POP D
- POP B
- POP PSW
- RET
- ;
- DOTHL: PUSH PSW ;PUBLIC. Plots the character you have defined as
- PUSH B ;graphic dot, at the grid origin + offsets in
- PUSH D ;H (Y offset) and L (X offset)
- PUSH H
- LXI D,0524H
- DAD D
- XCHG
- CALL PRINAT
- MVI E,DOT
- CALL OPCHAR
- POP H
- POP D
- POP B
- POP PSW
- RET
- ;
- CURHL: PUSH PSW ;PUBLIC. Plots the character you have defined as
- PUSH B ;graphic cursor, at the grid origin + offsets in
- PUSH D ;H (Y offset) and L (X offset)
- PUSH H
- LXI D,0524H
- DAD D
- XCHG
- CALL PRINAT
- MVI E,DOTCUR
- CALL OPCHAR
- POP H
- POP D
- POP B
- POP PSW
- RET
- ;
- ARRTEST: ;PUBLIC. Tests the four keys you have defined as
- MVI B,1 ;cursor keys. Answer returned in A: 1=UP, 2=DOWN
- CPI UA ;3=LEFT, 4=RIGHT, 0 otherwise.
- JZ ARRT1
- INR B
- CPI DA
- JZ ARRT1
- INR B
- CPI LA
- JZ ARRT1
- INR B
- CPI RA
- JZ ARRT1
- XRA A
- RET
- ;
- ARRT1: MOV A,B
- ORA A
- RET
- ;
- FNTBOX: LXI DE,1306h ;PUBLIC. Draw a box, size 5x66 (external) at
- CALL PRINAT ;19,6.
- MVI E,GTLC
- CALL OPCHAR
- MVI E,GTL
- MVI B,64
- CALL STRING$
- MVI E,GTRC
- CALL OPCHAR
- MVI C,3
- LXI D,1406H
- FNTB1: CALL PRINAT
- PUSH D
- MVI E,GLL
- CALL OPCHAR
- MVI E,' '
- MVI B,64
- CALL STRING$
- MVI E,GRL
- CALL OPCHAR
- POP D
- INR D
- DCR C
- JNZ FNTB1
- CALL PRINAT
- MVI E,GBLC
- CALL OPCHAR
- MVI E,GBL
- MVI B,64
- CALL STRING$
- MVI E,GBRC
- CALL OPCHAR
- RET
- ;
- MORPAT: DS 128 ;Possible area for further patching
- END