home *** CD-ROM | disk | FTP | other *** search
- ;
- ;THIS PROGRAM APPEARS IN PEOPLE'S COMPUTERS MARCH-APRIL '78
- ;
- ;WRITTEN BY:TIM SCULLY
- ; 35267-136CH
- ; PO BOX 1000
- ; STEILACOOM, WA 98388
- ;
- ; ENTERED BY: DAVE JAFFE
- ; 6913 MADISON
- ; NILES, ILLINOIS 60648
- ;
- ; MAIN PROGRAM
- ;
- ORG 100H
- START MVI A,0CH
- CALL WH1 ;ERASE SCREEN
- CALL PATCH
- ENTERL SHLD CM ;SAVE CURRENT MESSAGE ADDRESS
- NOP
- REENTRY LXI H,MSG2-1
- CALL MESSAGE ;OFFER SPELLING
- JZ SPELL
- LXI H,MSG3-1
- CALL MESSAGE ;OFFER PUNCTUATION
- JZ PUNCT
- LXI H,BEGIN ;START OF VOCABULARY
- LXI D,0FEH ;SET FLAGS
- CALL MENU ;OFFER GROUPS
- LXI D,0FDH ;SET UP FLAGS
- LHLD CI ;FETCH CHOSEN ITEM'S ADDR
- CALL MENU ;OFFER SUBGROUPS
- LXI D,1FCH ;SET UP FLAGS
- LHLD CI ;FETCH CHOSEN ITEM'S ADDR
- CALL MENU ;OFFER WORDS
- LHLD CI ;FETCH CHOSEN ITEM'S ADDR
- XMIT MOV A,M ;FETCH CAHRACTER
- CALL WH1 ;PRINT IT
- INX H ;NEXT
- MOV A,M ;FETCH IT
- ANI 80H ;CHECK FOR START OF NEXT ITEM
- JZ XMIT ;IF NOT NEXT, KEEP PRINTING
- MVI A,' '
- CALL WH1 ;SPACE AFTER COMPLETED ITEM
- ELOP LHLD POS ;FETCH CURRENT MESSAGE ADDR
- JMP ENTERL ;GO BACK TO OFFER SPELLING
- ;
- ;THE FOLLOWING SUBROUTINE IS USED BY MENU TO SAVE THE FLAGS
- ;WHICH START OUT IN DE (THE FLAG IN D IS 0 UNLESS MENU IS
- ;ASKED TO DISPLAY WORDS OR INDIVIDUAL CHARACTERS, THE FLAG
- ;IN E IS THE INDICATOR TELLING MENU WHAT TO DISPLAY, EG.
- ;FEH=GROUPS, FDH=SUBGROUPS,ETC.), IT ALSO SAVES THE DATA
- ;IN HL AS ITS STARTING ADDRESS AND SAVES THE CURRENT VALUE
- ;OF POS IN THE 'CURRENT MESSAGE' STORAGE.
- ;
- ENTER XCHG
- SHLD FLAGS
- XCHG
- SENTER SHLD CS
- LHLD POS
- SHLD CM
- LHLD CS
- RET
- ;
- ;THE FOLLOWING SUBROUTINE ERASES THE TOP TWO LINES OF THE
- ;VIDEO DISPLAY WITHOUT DISTURBING THE MESSAGE DISPLAYED
- ;ON THE BOTTOM 14 LINES. IT ENDS WITH THE CURSOR AT HOME.
- ;
- NEW MVI A,0BH
- CALL WH1 ;SEND CURSOR HOME
- MVI A,18H
- CALL WH1 ;ERASE CURRENT LINE
- MVI A,0DH
- CALL WH1 ;GO TO NEXT LINE
- MVI A,18H
- CALL WH1 ;ERASE IT TOO
- MVI A,0BH
- CALL WH1 ;SEND CURSOR HOME
- RET
- ;
- ; MAJOR SUBROUTINES: SMENU AND MENU
- ;
- ;SMENU AND MENU, WHICH FOLLOW, ARE THE MAJOR SUBROUTINES
- ;FOR DISPLAYING ITEMS ON THE MENU (THE TOP LINE OF THE VIDEO
- ;DISPLAY). MENU IS ENTERED WITH FLAGS IN DE AND A STARTING
- ;ADDRESS IN HL. THE FLAGS TELL MENU TO DISPLAY GROUPS, SUB-
- ;GROUPS, WORDS OR INDIVIDUAL CHARACTERS. THE STARTING ADDR
- ;TELLS MENU WHERE TO FIND THE FIRST ITEM TO DISPLAY. AN
- ;EXIT FROM MENU IS ACCOMPLISHED WHEN AN ITEM IS SELECTED BY
- ;USE OF THE KNEE SWITCH. UPON EXIT FROM MENU, THE STARTING
- ;ADDRESS OF THE FIRST CHOSEN ITEM WILL BE IN CI.
- ;
- SMENU LXI D,1FBH ;SET FLAGS FOR SPELLING
- MENU CALL ENTER ;SAVE ADDR AND FLAGS
- ITEM CALL NEW ;ERASE MENU
- SHLD CI ;SAVE CURRENT ITEM ADDR
- DISPY MOV A,M ;FETCH CHAR FROM MEMORY
- CALL WH1 ;AND DISPLAY IT
- INX H ;NEXT
- MOV A,M
- ANI 80H ;CHECK FOR MSB=1
- JZ DISPY ;IF NOT KEEP PRINTING
- XRA A ;ARE WE FINISHED WITH GROUP
- CMP D ;PRINTING W/ WORDS OR LETTERS
- JNZ WORD ;YES, GO ON TO WORDS OR END
- INR D ;OTHERWISE SET FLAG
- MVI A,'-'
- CALL WH1 ;PRINT '-'
- DCX H
- SEARCH INX H ;LOOK FOR END OF GROUP OR
- MOV A,M ;SUBGROUP
- CMP E ;BY LOOKING FOR FLAG LIKE E
- JC SEARCH ;KEEP LOOKING
- BACKUP DCX H ;THEN BACKUP
- MOV A,M ;AND PRINT IT
- ANI 80H
- JZ BACKUP
- JMP DISPY
- ;
- ;THE NEXT FOUR LOCATIONS STORE THE TIMING CONSTANTS FOR THE
- ;TWO TIME DELAYS: T1 AND T2. T1 IS THE TIME EACH ITEM ON THE
- ;MENU IS DISPLAYED AND T2 IS THE MINIMUM TIME THE KNEE-
- ;SWITCH HAS TO BE CLOSED BEFORE IT IS CONSIDERED INTEN-
- ;TIONAL (SO ACCIDENTIAL TWITCHES WILL BE IGNORED).
- ;
- T1 DW 5050H ;T1 TIME CONSTANT
- T2 DW 5050H ;T2 TIME CONSTANT
- ;
- ; SUBROUTINE: SWITCH
- ;
- ;THE SUBROUTINE SWITCH LOOKS FOR A SWITCH CLOSURE FOR TIME T1
- ;AND THEN RETURNS WITH ZERO IN D IF THE SWITCH WAS NEVER
- ;CLOSED. IF THE SWITCH CLOSES, BUT NOT FOR AT LEAST T2, THE
- ;ROUTINE JUST STARTS OVER, EXTENDING T1. IF THE SWITCH
- ;CLOSES FOR AT LEAST T2, THEN AFTER THE SWITCH IS RELEASED
- ;IT RETURNS WITH ONE IN D.
- ;
- SWITCH MVI D,0 ;SET UP 'NEVER CLOSED FLAG'
- PUSH H
- LHLD T1 ;FETCH TIME CONSTANT
- PUSH H
- POP B ;PUT IN BC
- POP H
- INP IN 80H ;LOOK AT SWITCH
- ANI 80H ;ITS ONLY ONE BIT
- JZ CLOSED
- SHLD WASTE ;WASTE TIME
- LHLD WASTE ;TO MAKE TIMING LOOP LONGER
- SHLD WASTE
- LHLD WASTE
- DCR C
- JNZ INP ;CHECK SWITCH EVERY TIME
- DCR B
- JNZ INP ;KEEP TIMING
- RET ;TIME UP, NO CONTACT
- CLOSED PUSH H
- LHLD T2 ;FETCH TIME CONSTANT
- PUSH H
- POP B ;PUT IT IN BC
- POP H
- WAIT SHLD WASTE ;WASTE TIME
- LHLD WASTE
- DCR C
- JNZ WAIT ;KEEP TIMING
- DCR B
- JNZ WAIT ;TIME UP?
- IN 80H ;CHECK SWITCH
- ANI 80H ;CHECK MSB
- JNZ SWITCH ;START OVER, STILL NOT CLOSED
- INR D ;SET FLAG FOR CONTACT
- UP IN 80H ;CHECK SWITCH AGAIN
- ANI 80H
- RNZ ;WAIT UNTIL IT IS RELEASED
- JMP UP ;MEANWHILE LOOPING
- ;
- ; SUBROUTINE: MESSAGE
- ;
- ;THE SUBROUTINE MESSAGE IS USED TO DISPLAY A NUMBER OF SHORT
- ;MESSAGES ON THE MENU. MESSAGE IS ENTERED WITH AN ADDRESS
- ;IN HL EQUAL TO ONE LESS THAN THE STARTING ADDRESS OF THE
- ;MESSAGE TO BE DISPLAYED. IT WILL DISPLAY THE MESSAGE FOUND
- ;UP TO AND INCLUDING A TERMINATING '?'. UPON EXIT FROM
- ;MESSAGE, THE ZERO FLAG IN THE PSW WILL BE ONE IF THE
- ;OFFERED ITEM WAS CHOSEN AND ZERO IF IT WAS NOT CHOSEN.
- ;
- MESSAGE CALL NEW ;ERASE MENU
- INX H
- MOV A,M
- CALL WH1 ;PRINT
- CPI '?' ;CHECK FOR END OF MESSAGE
- JNZ MESSAGE+3
- LHLD CM
- SHLD POS ;RESTORE POS
- CALL SWITCH
- MVI A,1
- CMP D
- RET
- ;
- ; SUBROUTINE: COMP
- ;
- ;THE SUBROUTINE COMP IS USED BY MENU TO CHECK THE SWITCH.
- ;
- COMP CALL SWITCH
- MVI A,1
- CMP D
- JNZ NEXT ;IF NO CONTACT, NEXT CHOICE
- LHLD CM
- SHLD POS ;RESTORE MAIN TEXT POS
- RET
- ;
- ;
- ; MORE ROUTINES USED BY MENU
- ;
- ;THE FOLLOWING CHAIN OF ROUTINES ARE USED BY MENU TO FIND
- ;AND DISPLAY THE NEXT ITEM, CHECK FOR THE LAST ITEM ON THE
- ;LIST, OFFER ESCAPE?, AND RECYCLE TO THE BEGINNING OF THE LIST
- ;IF NOTHING IS CHOSEN. THE DETAILS OF THESE OPERATIONS VARY
- ;DEPENDING ON WHAT ITEMS ARE BEING OFFERED: GROUPS, SUBWORDS,
- ;OR CHARACTERS.
- ;
- NEXT XCHG ;SAVE CURRENT ADDRESS
- LHLD FLAGS ;WHILE RESTORING FLAGS
- XCHG
- MOV A,E
- CPI 0FDH ;DISPLAYING GROUPS OR SUBS?
- JNC CHECK ;IF SO CHECK FOR END
- LHLD CI
- FIN INX H ;SKIP CURRENT WORD OR LETTER
- MOV A,M
- ANI 80H ;KEEP SKIPPING UNTIL THE
- JZ FIN ;START OF THE NEXT, THEN CHECK
- CHECK INR E ;THE LAST ITEM WILL BE FOLLOWED
- MOV A,M ;BY A FLAG=TO E + 1
- CMP E
- JNC LAST
- DCR E ;RESTORE FLAG IN E
- CPI 0FBH ;IF NO CONTROL CODE FOUND,
- JC ITEM ;KEEP DISPLAYING
- MOV A,D
- CPI 0FDH
- JC LAST
- INX H ;SKIP CONTROL CODE
- JMP ITEM
- LAST CALL ESCAPE ;IF LAST ITEM WAS DISPLAYED
- LHLD FLAGS ;OFFER ESCAPE THEN LOOP BACK
- XCHG
- LHLD CS
- JMP ITEM ;AND START DISPLAYING AGAIN
- ;
- ;
- ; SUBROUTINE: WORD
- ;
- ;WORD, THE NEXT SUBROUTINE, IS USED BY MENU. IF GROUPS OR
- ;SUBGROUPS ARE BEING OFFERED, IT IS ENTERED ONLY AFTER THE
- ;COMPLETE OFFERING HAS BEEN PRINTED AND IT JUMPS TO COMP TO
- ;CHECK THE SWITCH. BUT IF INDIVIDUAL WORDS OR CHARACTERS ARE
- ;BEING OFFERED, WORD KEEPS PRINTING WORDS OR CHARACTERS ACROSS
- ;THE MENU SPACE, WITH TWO SPACES BETWEEN EACH, UNTIL THE END OF
- ;THE SUBGROUP OR UNTIL THE END OF THE LINE.
- ;
- WORD MOV A,E ;CHECK FLAG
- CPI 0FDH
- JNC COMP ;AND SPLIT IF GROUPS OR SUBS
- LDA POS ;CHECK POSITION IN MENU
- CPI 3CH ;NEAR END OF THE LINE
- JNC COMP ;STOP PRINTING AND
- MOV A,M ;SPLIT OR IF AT END
- CMP E ;OF THE SUBGROUP, SPLIT
- JNC COMP
- MVI A,' ' ;OTHERWISE,
- CALL WH1 ;PRINT TWO SPACES
- CALL WH1
- JMP DISPY ;AND ADD MORE TO MENU
- ;
- ; SUBROUTINE: ESCAPE
- ;
- ;THE SUBROUTINE ESCAPE OFFERS A RETURN TO THE SPELLING MODE
- ;AND IS USED OFTEN.
- ;
- ESCAPE PUSH B
- LXI H,MSG1-1 ;SET UP FOR MESSAGE
- CALL MSG1-1
- POP B
- RNZ ;RETURN IF NO ESCAPE
- POP H ;CLEAN UP STACK
- JMP REENTRY ;AND REENTER SPELLING?
- ;
- ;
- ; SUBROUTINES USED BY SPELLING MODE
- ;
- ;THE SPELLING MODE USES THIS CHAIN OF SUBROUTINES. THE FIRST
- ;ALPHABET OFFERED IS DIFFERENT FROM THE OTHER 26, AND THE
- ;ROUTINE DOESN'T
- ;BACKSPACE BEFORE PRINTING THE FIRST LETTER, SO THERE IS ONE
- ;ROUTINE FOR THE FIRST LETTER AND ANOTHER FOR ALL THE OTHERS.
- ;ESCAPE? IS OFFERED AFTER EACH LETTER IS PRINTED AND BEFORE A
- ;NEW ALPHABET IS OFFERED. A LOOK-UP TABLE IS USED TO PICK THE
- ;RIGHT ALPHABET TO OFFER AFTER THE FIRST LETTER HAS BEEN
- ;PRINTED.
- ;
- SPELL LXI H,ASTART ;ADDR OF 1ST ALPHABET
- CALL FIRST ;PRINT 1ST LETTER
- CALL SENTER ;TO RESTORE POS
- TALE CALL ESCAPE ;OFFER ESCAPE
- LXI H,STAB ;START OF LOOK-UP TABLE
- MOV A,B ;FETCH LAST CHAR PRINTED
- LOOK CMP M ;AND LOOK FOR IT IN TABLE
- JZ FOUND
- INX H ;EACH TABLE ENTRY
- INX H ;IS 3 BYTES
- INX H
- JMP LOOK ;KEEP LOOKING, YOU'LL FIND IT
- FOUND INX H ;WHEN FOUND,
- MOV E,M ;GET ADDR FROM TABLE
- INX H
- MOV D,M
- XCHG ;AND PUT IT IN HL
- CALL SECOND ;OFFER NEW ALPHABET
- CALL OOP ;PRINT THE CHOSEN LETTER
- JMP TALE ;AND LOOP BACK TO DO IT AGAIN
- FIRST CALL SMENU ;OFFER ALPHABET
- OOP LHLD CI ;FETCH CHOSEN ITEM'S ADDR
- MOV A,M
- CALL WH1 ;AND PRINT IT
- MOV B,A ;SAVE IT FOR LOOK-UP LATER
- MVI A,' '
- CALL WH1 ;AND PRINT A SPACE
- RET
- SECOND CALL SMENU ;OFFER ALPHABET
- SECONDS LHLD POS ;GET READY TO BACKSPACE
- DCX H ;AND
- SHLD POS ;DO IT
- RET
- ;
- ; SUBROUTINE: PUNCT
- ;
- ;THE SUBROUTINE PUNCT HANDLES OFFERING THE CONTROL CODES (BY
- ;CALLING ANOTHER SUBROUTINE) AND IT OFFERS THE PUNCTUATION
- ;SYMBOLS. IT USES ONE OF THE SPELLING SUBROUTINES TO HANDLE
- ;PUNCTUATION.
- ;
- PUNCT LXI H,MSG4-1
- CALL MESSAGE ;OFFER CONTROL?
- JZ CONTROL
- LXI H,MSGA-1 ;STARTING ADDR OF PUNCTUATION
- CALL SECOND ;OFFER THEM
- CALL OOP ;PRINT THE CHOSEN ONE
- JMP ELOP ;GO BACK TO OFFER SPELLING
- ;
- ; SUBROUTINE: CONTROL
- ;
- ;CONTROL OFFERS AND EXECUTES THE CONTROL COMMANDS.
- ;
- CONTROL LXI H,MSG5-1
- CALL MESSAGE ;OFFER BACKSPACE
- JNZ TWO
- CALL SECONDS ;BACKSPACE
- JMP ENTERL ;BACK TO OFFER SPELLING
- TWO LXI H,MSG6-1
- CALL MESSAGE
- JNZ THREE
- LHLD POS
- DCR L ;BACK UP
- MORE DCR L ;BACK UP
- MVI A,' '
- CMP M ;HAVE WE REACHED A SPACE?
- JNZ RUB
- INX H ;LEAVE THE SPACE
- JMP ENTERL ;AND GO OFFER SPELLING?
- THREE LXI H,MSG7-1
- CALL MESSAGE
- JNZ FOUR
- MVI A,' '
- DEND CALL WH1
- JMP ELOP ;BACK TO OFFER SPELLING?
- FOUR LXI H,MSG8-1
- CALL MESSAGE
- JNZ FIVE
- MVI A,0DH
- JMP DEND
- FIVE LXI H,MSG9-1
- CALL MESSAGE
- JZ START ;START ALL OVER
- CALL ESCAPE
- JMP CONTROL
- RUB MVI M,0A0H ;PUT BLANK ON SCREEN
- JMP MORE
- PATCH LXI H,TEXT ;INITIALIZE TEXT ADDR
- SHLD POS
- RET
- ;
- ; MESSAGES
- ;
- MSG1 DB 'ESCAPE?'
- MSG2 DB 'SPELLING?'
- MSG3 DB 'PUNCTUATION?'
- MSG4 DB 'CONTROL?'
- MSG5 DB 'BACKSPACE?'
- MSG6 DB 'ERASE LAST WORD?'
- MSG7 DB 'SPACE?'
- MSG8 DB 'NEXT LINE?'
- MSG9 DB 'ERASE SCREEN?'
- MSGA DB 2EH,2CH,3FH,3BH,3AH,21H
- DB '0123456789#$"%&()*+-'
- DB 0FBH ;END FLAG
- ;
- ; ALPHABET LOOK-UP TABLE
- ;
- ;HERE IS THE LOOK-UP TABLE FOR THE VARIOUS ALPHABETS, IN
- ;NON-STANDARD FORM.
- ;
- STAB DB 'A'
- DW ALA
- DB 'B'
- DW ALB
- DB 'C'
- DW ALC
- DB 'D'
- DW ALD
- DB 'E'
- DW ALE
- DB 'F'
- DW ALF
- DB 'G'
- DW ALG
- DB 'H'
- DW ALH
- DB 'I'
- DW ALI
- DB 'J'
- DW ALJ
- DB 'K'
- DW ALK
- DB 'L'
- DW ALL
- DB 'M'
- DW ALM
- DB 'N'
- DW ALN
- DB 'O'
- DW ALO
- DB 'P'
- DW ALP
- DB 'Q'
- DW ALQ
- DB 'R'
- DW ALR
- DB 'S'
- DW ALS
- DB 'T'
- DW ALT
- DB 'U'
- DW ALU
- DB 'V'
- DW ALW
- DB 'W'
- DW ALW
- DB 'X'
- DW ALX
- DB 'Y'
- DW ALY
- DB 'Z'
- DW ALZ
- ;
- ; THE ALPHABETS
- ;
- ;AND HERE ARE THE ALPHABETS.
- ;
- ASTART DB 'TAOSWIHCBFPMRELNDUGYJVQKZX',0FBH
- ALA DB 'NTSRLDCIGVMYPBKUFWOJXHZEQA',0FBH
- ALB DB 'EAOUYRISLJTVMBDWCGHNPFK',0FBH
- ALC DB 'OEHATKILURCYSONDZMW',0FBH
- ALD DB 'EIUARSOLMDGYNVJQWHEFTPKBZ',0FBH
- ALE DB 'RSNDALMCETVFPXIGYOWUHQKBJZ',0FBH
- ALF DB 'ORIFEAULTSYWBMGCHNJPD',0FBH
- ALG DB 'EHROAIGSLUTNYMFDBWZJKPC',0FBH
- ALH DB 'EIAOTURYLNWDSMBHQFPCGK',0FBH
- ALI DB 'NSTOCMLAREDVGPFBKXUZQIJLWY',0FBH
- ALJ DB 'AEOUIJ',0FBH
- ALK DB 'EISANLYOGFWTURDPMKBJCHV',0FBH
- ALL DB 'EIALYODTSUFRMVWKPCBGNHJZXQ',0FBH
- ALM DB 'EAOIPMUYSBLFNTHCDRWGJKVCZ',0FBH
- ALN DB 'DTEGSCIAOYNLFVUKMJRQPHWXBZ',0FBH
- ALO DB 'NFRUMPLTOWSDCVIBEYAKHJGXZQ',0FBH
- ALP DB 'ROAELTSPIHMUYWFGKBNDCJ',0FBH
- ALQ DB 'UIO',0FBH
- ALR DB 'EIOATSYDMNURCLVKGPWBFHXQJZ',0FBH
- ALS DB 'TEIOSHUCAPYKMWNLGQFBDRVJZ',0FBH
- ALT DB 'HEIOARSTUYLWCFMNBPDZGKVJQ',0FBH
- ALU DB 'TSNRLCGPAEMDIFBOYZXUVKQJH',0FBH
- ALV DB 'EIAOYUSRVZKGM',0FBH
- ALW DB 'EAHIONRSLTDYKUPFBCMZWG',0FBH
- ALX DB 'EPTICAHUYOQLNWFSVGBKMRD',0FBH
- ALY DB 'EOSAITPMBLNWCRGDZHUFVXIK',0FBH
- ALZ DB 'EAZOYIUKTVWHJB',0FBH
- ;
- ;END OF ALPHABETS
- ;
- ;
- ; BEGINNING OF VOCABULARY STORAGE
- ;
- BEGIN DB 'AABLEABOUT'
- DS 1976H
- ;
- ; TEXT AND EDITOR
- ;
- ;THE EDITOR AND TEXT PROGRAMS USE SEVERAL SUBROUTINES FROM
- ;THE POLY 4.0 MONITOR ROM. SEE THE POLY SYSTEM MANUAL VOLUME
- ;2, PAGES 58-65.
- ;
- TEXT CALL WHO ;KEYBOARD INPUT
- CPI 7FH ;IS IT A RUBOUT?
- JZ RUB1
- CPI 5FH ;IS IT A SHIFT 'O'
- JZ EDITOR
- CTL CPI 1CH ;IS IT A CONTROL CHAR?
- JC CONTRO1
- CPI 20H ;IS IT A CONTROL CODE?
- JNC PRINT ;IF NOT PRINT IT
- ADI 0DFH
- PRINT MOV M,A ;STORE IT IN MEMORY
- CALL LPRINT ;PUT IT ON TV
- INX H ;NEXT MEMORY LOCATION
- JMP TEXT ;DO IT ALL OVER AGAIN
- CONTRO1 ORI 0C0H ;MAKE 8TH BIT HIGH
- JMP PRINT ;FOR 'CAPITAL' LETTERS
- RUB1 CALL LPRINT ;RUBOUT ON TV
- DCX H ;BACK UP IN MEMORY
- JMP TEXT ;GO DO IT OVER
- RETEXT LHLD CS ;FETCH STARTING ADDR
- MVI A,0CH ;ERASE TV
- CALL WH1
- JMP TEXT
- EDITOR SHLD CS ;SAVE START OF CURRENT LINE
- MVI A,0DH
- CALL WH1 ;START A NEW LINE
- LHLD CS ;FETCH START OF CURRENT LINE
- XCHG
- CALL DEOUT ;PRINT ADDR IN HEX
- XCHG ;RESTORE ADDR
- MVI A,' '
- CALL WH1 ;PRINT SPACE
- LOOP MOV A,M ;FETCH CHAR FROM MEMORY
- CALL LPRINT ;PUT IT ON TV
- MOV A,M
- INX H
- CPI 0FBH ;WAS IT THE END OF A LINE?
- JC LOOP ;IF NOT, KEEP PRINTING
- KEY CALL WHO ;WAIT UNTIL KEY IS PRESSED
- CPI ' '
- JNZ M1 ;IF NOT KEEP CHECKING
- LHLD CS ;FETCH STARTING ADDR
- INX H ;SPACE SKIPS ONE CHAR
- JMP EDITOR ;AND REPRINTS LINE
- M1 CPI 7FH ;IS IT A RUBOUT?
- JNZ M2
- LHLD CS ;FETCH STARTING ADDR
- PUSH H ;COPY HL
- POP D ;INTO DE
- MVI A,0FFH ;END OF VOCABULARY FLAG
- LXI B,0 ;START COUNTING AT ZERO.
- DCX H
- M3 INX H
- DCX B ;COUNT ONE BYTE
- CMP M ;CHECK FOR END FLAG
- JNZ M3 ;KEEP COUNTING IF NOT END
- LHLD CS ;FETCH STARTING ADDR
- INX H ;MOVE ONE SPACE
- CALL MOVE
- JMP EDITOR ;DISPLAY EDITED LINE
- M2 CPI 0DH ;IS IT A CARRIAGE RETURN?
- JZ EDITOR ;THEN DISPLAY NEXT LINE
- CPI 0AH ;IS IT LINE FEED?
- JNZ M4
- LHLD CS ;FETCH STARTING ADDR
- DCX H ;BACK UP
- M5 DCX H ;KEEP BACKING UP
- MOV A,M
- CPI 0FBH ;LOOK FOR CONTROL FLAG
- JC M5 ;BACK UP UNTIL FOUND
- INX H ;SKIP THE FLAG
- JMP EDITOR ;AND DISPLAY PREVIOUS LINE
- M4 CPI 5FH ;IS IT SHIFT 'O' ?
- JZ RETEXT ;IF SO, GO TO TEXT
- CPI 1CH ;IS IT A CONTROL CHAR?
- JC M6 ;IF SO, IT'S UPPER CASE
- CPI 20H ;COULD IT BE CONTROL CODE?
- JNC INSERT ;IF NOT,INSERT AS IS
- CPI 1EH ;BE SURE IT'S NOT M OR L
- JNC M7 ;IF NOT, THEN CONTROL CODE OK
- ADI 0B0H ;MAKE INTO L OR M
- JMP INSERT ;AND INSERT IT
- M7 ADI 0DFH ;MAKE INTO CONTROL CODE
- JMP INSERT
- M6 ORI 0C0H ;MAKE INTO CAPITAL LETTER
- INSERT LHLD CS ;FETCH STARTING ADDR
- PUSH PSW ;SAVE CHAR ON STACK
- MVI A,0FFH ;END OF VOCABULARY FLAG
- LXI B,0 ;START COUNT AT ZERO
- DCX H
- M8 INX H
- DCX B
- CMP M
- JNZ M8
- M9 MOV D,H ;MOVE FORWARD
- MOV E,L
- INX D
- MOV A,M
- STAX D
- DCX D
- DCX H
- INR C ;COUNT ONE SPACE
- JNZ M9
- INR B
- JNZ M9
- POP PSW ;GET BACK CHAR
- STAX D ;AND INSERT IT
- INX H
- INX H
- JMP EDITOR
- LPRINT CPI 60H ;IS IT UPPER CASE ?
- JNC WH1 ;PRINT AS IS
- CPI 41H ;IS IT LOWER CASE ?
- JC WH1 ;IF NOT, PRINT AS IS
- ADI 20H ;MAKE IT LOWER CASE
- JMP WH1 ;AND PRINT IT
- ;
- ;
- ;
- ;THIS PROGRAM (ACTUALLY A SUBROUTINE) DRIVES A POLYMORPHICS
- ;VTI AND SCROLLS TEXT WHEN THE SCREEN FILLS. IT RECOGNIZES
- ;ALL IMPORTANT CONTROL CHARACTERS AND USES THE SCRHM,SCEND,
- ;AND POS LOCATIONS IN SYSTEM RAM TO DESCRIBE THE BEGINNING,
- ;END AND CURRENT CURSOR LOCATION. THE BEGINNING ADDR
- ;IS IN TURN STORED AT WH1.
- ;
- POS DS 2 ;CURSOR POINTER FOR DISPLAY
- SCRHM EQU 0CC00H ;SCREEN HOME
- SCEND EQU SCRHM+400H ;SCREEN END
- ;
- DSPLY PUSH PSW ;SAVE ALL REGISTERS
- PUSH B
- PUSH D
- PUSH H
- LHLD POS ;GET CURRENT CURSOR POSITION
- CPI 'X'-40H ;CONTROL 'X' CLEARS LINE
- JZ CLINE
- LXI D,SCRL ;ALL DSPLY CHAR HANDLING
- PUSH D ;SUBROUTINES EXCEPT CLINE
- ;RETURN TO SCRL TO CHECK
- ;SCREEN OVERFLOW AND SCROLL
- ;IF NECESSARY
- MVI M,' ' ;BLANK THE CURSOR
- CPI 7FH ;BACKSPACE AND DELETE CHAR IF
- ;IT'S A RUBOUT
- JZ RBR
- CPI 20H ;IF CHAR >20H, PRINT IT
- JNC NORM ;TEST FOR VALID CONTROL CHAR
- SUI 'M'-40H ;CR MOVES CURSOR DOWN ONE LINE
- ;AND ZEROS IT AT LEFT MARGIN
- JZ CRR
- INR A ;FORM FEED CLEARS SCREEN, HOMES
- ;CURSOR
- JZ FFR
- INR A ;VERTICAL TAB HOMES CURSOR
- JZ VTR
- INR A ;TAB MOVES CURSOR RIGHT TO NEXT
- INR A ;EVEN 8 POSITION
- RNZ ;IF NOT A TAB RETURN
- MOV A,L ;BACK-UP CURSOR TO EVEN 8
- ANI 0F8H
- MOV L,A
- LXI B,8 ;MOVE ALONG 8 POSITIONS
- DAD B
- RET
- NORM ORI 80H ;PRINTING CHAR? MAP INTO CHAR
- ;AREA OF VTI SPACE
- MOV M,A ;PUT IT ON SCREEN
- INX H ;MOVE ALONG ONE POSITION
- RET ;GO TO SCRL
- ;
- ;SCRL SCROLLS TEXT UP THE SCREEN IF NECESSARY THEN FALLS INTO
- ;CURP, WHICH RESTORES THE CURSOR AND RETURNS TO USER THRU IORET
- ;SUBROUTINE CHECKS FOR THE END OF THE SCREEN AND IF THERE, IT
- ;SETS UP THE REGISTERS FOR A BLOCK MOVE UP ONE LINE VIA MOVE.
- ;
- SCRL LDA SCEND
- CMP H
- JNZ CURP
- LHLD SCEND
- MOV A,H
- SUB L
- MOV D,H
- MVI L,40H
- MVI E,0
- MOV C,L
- MOV B,A
- CALL MOVE
- DCX H
- ;
- ;CLEAR THE CURRENT LINE
- ;
- CLINE MVI A,3FH
- MOV D,A
- ORA L
- MOV L,A
- WIPE MVI M,' '
- DCX H
- DCR D
- JNZ WIPE
- CURP MVI M,' '
- SHLD POS ;STORE CURSOR POINTER
- JMP IORET
- RBR DCX H ;RUBOUT ROUTINE
- RET
- CRR LXI B,64 ;CR ROUTINE
- MOV A,L
- ANI 0C0H
- MOV L,A
- DAD B
- RET
- FFR CALL VTR ;FORM FEED ROUTINE
- FF1 MVI M,' '
- INX H
- CMP H
- JNZ FF1
- VTR LHLD SCEND ;VERTICAL TAB ROUTINE
- MOV A,L
- MVI L,0
- RET
- ;
- ;MOVE MOVES BC BYTES FROM THE AREA STARTING AT (HL) TO THE
- ;AREA STARTING AT (DE)
- ;
- MOVE MOV A,M
- STAX D
- INX D
- INX H
- INR C
- JNZ MOVE
- INR B
- JNZ MOVE
- RET
- ;
- ;IORET - PUT BACK ALL REGISTERS.
- ;
- IORET POP H
- POP D
- POP B
- POP PSW
- RET
- ;
- ;DEOUT OUTPUTS DE TO THE SCREEN
- ;
- DEOUT MOV A,D
- CALL BYTE
- MOV A,E
- ;
- ;BYTE OUTPUTS THE ACC AS TWO HEX DIGITS TO THE SCREEN
- ;
- BYTE PUSH PSW
- RRC
- RRC
- RRC
- RRC
- CALL HEXO
- POP PSW
- ;
- ;HEXO OUTPUTS 1 HEX DIGIT TO THE SCREEN - THE UPPER HALF IS
- ;MASKED WITH ZEROS.
- ;
- HEXO ANI 15
- ADI 90H
- DAA
- ACI 40H
- DAA
- JMP DSPLY ;OUTPUT HEX DIGIT & USE RETURN
- ;
- ;KEYBOARD INPUT FOR EDITOR
- ;
- KBPORT EQU 0
- KBFLAG EQU 80H
- KB EQU 1
- ;
- WHO IN KBPORT
- ANI KBFLAG
- JNZ WHO
- IN KB
- RET
- ;
- ;SCREEN DISPLAY ENTRY POINT
- ;
- WH1 CALL DSPLY
- RET
- ;
- ;STORAGE AREAS
- ;
- CI DS 2 ;CHOSEN ITEM'S ADDR
- FLAGS DS 2 ;FLAG STORAGE
- CS DS 2 ;STARTING ADDR STORAGE
- WASTE DS 2 ;SPACE FOR WASTING TIME
- ;
- END
-