home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / cpmug / cpmug029.ark / ROBIN.ASM < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  18.5 KB  |  804 lines

  1. ;
  2. ;THIS PROGRAM APPEARS IN PEOPLE'S COMPUTERS MARCH-APRIL '78
  3. ;
  4. ;WRITTEN BY:TIM SCULLY
  5. ;        35267-136CH
  6. ;        PO BOX 1000
  7. ;        STEILACOOM, WA 98388
  8. ;
  9. ;    ENTERED BY:    DAVE JAFFE
  10. ;            6913 MADISON
  11. ;            NILES, ILLINOIS 60648
  12. ;
  13. ;    MAIN PROGRAM
  14. ;
  15.     ORG    100H
  16. START    MVI    A,0CH
  17.     CALL    WH1        ;ERASE SCREEN
  18.     CALL    PATCH
  19. ENTERL    SHLD    CM        ;SAVE CURRENT MESSAGE ADDRESS
  20.     NOP
  21. REENTRY    LXI    H,MSG2-1
  22.     CALL    MESSAGE        ;OFFER SPELLING
  23.     JZ    SPELL
  24.     LXI    H,MSG3-1
  25.     CALL    MESSAGE        ;OFFER PUNCTUATION
  26.     JZ    PUNCT
  27.     LXI    H,BEGIN        ;START OF VOCABULARY
  28.     LXI    D,0FEH        ;SET FLAGS
  29.     CALL    MENU        ;OFFER GROUPS
  30.     LXI    D,0FDH        ;SET UP FLAGS
  31.     LHLD    CI        ;FETCH CHOSEN ITEM'S ADDR
  32.     CALL    MENU        ;OFFER SUBGROUPS
  33.     LXI    D,1FCH        ;SET UP FLAGS
  34.     LHLD    CI        ;FETCH CHOSEN ITEM'S ADDR
  35.     CALL    MENU        ;OFFER WORDS
  36.     LHLD    CI        ;FETCH CHOSEN ITEM'S ADDR
  37. XMIT    MOV    A,M        ;FETCH CAHRACTER
  38.     CALL    WH1        ;PRINT IT
  39.     INX    H        ;NEXT
  40.     MOV    A,M        ;FETCH IT
  41.     ANI    80H        ;CHECK FOR START OF NEXT ITEM
  42.     JZ    XMIT        ;IF NOT NEXT, KEEP PRINTING
  43.     MVI    A,' '
  44.     CALL    WH1        ;SPACE AFTER COMPLETED ITEM
  45. ELOP    LHLD    POS        ;FETCH CURRENT MESSAGE ADDR
  46.     JMP    ENTERL        ;GO BACK TO OFFER SPELLING
  47. ;
  48. ;THE FOLLOWING SUBROUTINE IS USED BY MENU TO SAVE THE FLAGS
  49. ;WHICH START OUT IN DE (THE FLAG IN D IS 0 UNLESS MENU IS
  50. ;ASKED TO DISPLAY WORDS OR INDIVIDUAL CHARACTERS, THE FLAG
  51. ;IN E IS THE INDICATOR TELLING MENU WHAT TO DISPLAY, EG.
  52. ;FEH=GROUPS, FDH=SUBGROUPS,ETC.), IT ALSO SAVES THE DATA
  53. ;IN HL AS ITS STARTING ADDRESS AND SAVES THE CURRENT VALUE
  54. ;OF POS IN THE 'CURRENT MESSAGE' STORAGE.
  55. ;
  56. ENTER    XCHG
  57.     SHLD    FLAGS
  58.     XCHG
  59. SENTER    SHLD    CS
  60.     LHLD    POS
  61.     SHLD    CM
  62.     LHLD    CS
  63.     RET
  64. ;
  65. ;THE FOLLOWING SUBROUTINE ERASES THE TOP TWO LINES OF THE
  66. ;VIDEO DISPLAY WITHOUT DISTURBING THE MESSAGE DISPLAYED
  67. ;ON THE BOTTOM 14 LINES. IT ENDS WITH THE CURSOR AT HOME.
  68. ;
  69. NEW    MVI    A,0BH
  70.     CALL    WH1        ;SEND CURSOR HOME
  71.     MVI    A,18H
  72.     CALL    WH1        ;ERASE CURRENT LINE
  73.     MVI    A,0DH
  74.     CALL    WH1        ;GO TO NEXT LINE
  75.     MVI    A,18H
  76.     CALL    WH1        ;ERASE IT TOO
  77.     MVI    A,0BH
  78.     CALL    WH1        ;SEND CURSOR HOME
  79.     RET
  80. ;
  81. ;    MAJOR SUBROUTINES: SMENU AND MENU
  82. ;
  83. ;SMENU AND MENU, WHICH FOLLOW, ARE THE MAJOR SUBROUTINES
  84. ;FOR DISPLAYING ITEMS ON THE MENU (THE TOP LINE OF THE VIDEO
  85. ;DISPLAY). MENU IS ENTERED WITH FLAGS IN DE AND A STARTING
  86. ;ADDRESS IN HL. THE FLAGS TELL MENU TO DISPLAY GROUPS, SUB-
  87. ;GROUPS, WORDS OR INDIVIDUAL CHARACTERS. THE STARTING ADDR
  88. ;TELLS MENU WHERE TO FIND THE FIRST ITEM TO DISPLAY. AN
  89. ;EXIT FROM MENU IS ACCOMPLISHED WHEN AN ITEM IS SELECTED BY
  90. ;USE OF THE KNEE SWITCH. UPON EXIT FROM MENU, THE STARTING
  91. ;ADDRESS OF THE FIRST CHOSEN ITEM WILL BE IN CI.
  92. ;
  93. SMENU    LXI    D,1FBH        ;SET FLAGS FOR SPELLING
  94. MENU    CALL    ENTER        ;SAVE ADDR AND FLAGS
  95. ITEM    CALL    NEW        ;ERASE MENU
  96.     SHLD    CI        ;SAVE CURRENT ITEM ADDR
  97. DISPY    MOV    A,M        ;FETCH CHAR FROM MEMORY
  98.     CALL    WH1        ;AND DISPLAY IT
  99.     INX    H        ;NEXT
  100.     MOV    A,M
  101.     ANI    80H        ;CHECK FOR MSB=1
  102.     JZ    DISPY        ;IF NOT KEEP PRINTING
  103.     XRA    A        ;ARE WE FINISHED WITH GROUP
  104.     CMP    D        ;PRINTING W/ WORDS OR LETTERS
  105.     JNZ    WORD        ;YES, GO ON TO WORDS OR END
  106.     INR    D        ;OTHERWISE SET FLAG
  107.     MVI    A,'-'
  108.     CALL    WH1        ;PRINT '-'
  109.     DCX    H
  110. SEARCH    INX    H        ;LOOK FOR END OF GROUP OR
  111.     MOV    A,M        ;SUBGROUP
  112.     CMP    E        ;BY LOOKING FOR FLAG LIKE E
  113.     JC    SEARCH        ;KEEP LOOKING
  114. BACKUP    DCX    H        ;THEN BACKUP
  115.     MOV    A,M        ;AND PRINT IT
  116.     ANI    80H
  117.     JZ    BACKUP
  118.     JMP    DISPY
  119. ;
  120. ;THE NEXT FOUR LOCATIONS STORE THE TIMING CONSTANTS FOR THE 
  121. ;TWO TIME DELAYS: T1 AND T2. T1 IS THE TIME EACH ITEM ON THE 
  122. ;MENU IS DISPLAYED AND T2 IS THE MINIMUM TIME THE KNEE-
  123. ;SWITCH HAS TO BE CLOSED BEFORE IT IS CONSIDERED INTEN-
  124. ;TIONAL (SO ACCIDENTIAL TWITCHES WILL BE IGNORED).
  125. ;
  126. T1    DW    5050H        ;T1 TIME CONSTANT
  127. T2    DW    5050H        ;T2 TIME CONSTANT
  128. ;
  129. ;    SUBROUTINE: SWITCH
  130. ;
  131. ;THE SUBROUTINE SWITCH LOOKS FOR A SWITCH CLOSURE FOR TIME T1
  132. ;AND THEN RETURNS WITH ZERO IN D IF THE SWITCH WAS NEVER
  133. ;CLOSED. IF THE SWITCH CLOSES, BUT NOT FOR AT LEAST T2, THE
  134. ;ROUTINE JUST STARTS OVER, EXTENDING T1. IF THE SWITCH
  135. ;CLOSES FOR AT LEAST T2, THEN AFTER THE SWITCH IS RELEASED
  136. ;IT RETURNS WITH ONE IN D.
  137. ;
  138. SWITCH    MVI    D,0        ;SET UP 'NEVER CLOSED FLAG'
  139.     PUSH    H
  140.     LHLD    T1        ;FETCH TIME CONSTANT
  141.     PUSH    H
  142.     POP    B        ;PUT IN BC
  143.     POP    H
  144. INP    IN    80H        ;LOOK AT SWITCH
  145.     ANI    80H        ;ITS ONLY ONE BIT
  146.     JZ    CLOSED
  147.     SHLD    WASTE        ;WASTE TIME
  148.     LHLD    WASTE        ;TO MAKE TIMING LOOP LONGER
  149.     SHLD    WASTE
  150.     LHLD    WASTE
  151.     DCR    C
  152.     JNZ    INP        ;CHECK SWITCH EVERY TIME
  153.     DCR     B
  154.     JNZ    INP        ;KEEP TIMING
  155.     RET            ;TIME UP, NO CONTACT
  156. CLOSED    PUSH    H
  157.     LHLD    T2        ;FETCH TIME CONSTANT
  158.     PUSH    H
  159.     POP    B        ;PUT IT IN BC
  160.     POP    H
  161. WAIT    SHLD    WASTE        ;WASTE TIME
  162.     LHLD    WASTE
  163.     DCR    C
  164.     JNZ    WAIT        ;KEEP TIMING
  165.     DCR    B
  166.     JNZ    WAIT        ;TIME UP?
  167.     IN    80H        ;CHECK SWITCH
  168.     ANI    80H        ;CHECK MSB
  169.     JNZ    SWITCH        ;START OVER, STILL NOT CLOSED
  170.     INR    D        ;SET FLAG FOR CONTACT
  171. UP    IN    80H        ;CHECK SWITCH AGAIN
  172.     ANI    80H
  173.     RNZ            ;WAIT UNTIL IT IS RELEASED
  174.     JMP    UP        ;MEANWHILE LOOPING
  175. ;
  176. ;    SUBROUTINE: MESSAGE
  177. ;
  178. ;THE SUBROUTINE MESSAGE IS USED TO DISPLAY A NUMBER OF SHORT
  179. ;MESSAGES ON THE MENU. MESSAGE IS ENTERED WITH AN ADDRESS
  180. ;IN HL EQUAL TO ONE LESS THAN THE STARTING ADDRESS OF THE
  181. ;MESSAGE TO BE DISPLAYED. IT WILL DISPLAY THE MESSAGE FOUND
  182. ;UP TO AND INCLUDING A TERMINATING '?'. UPON EXIT FROM
  183. ;MESSAGE, THE ZERO FLAG IN THE PSW WILL BE ONE IF THE
  184. ;OFFERED ITEM WAS CHOSEN AND ZERO IF IT WAS NOT CHOSEN.
  185. ;
  186. MESSAGE    CALL    NEW        ;ERASE MENU
  187.     INX    H
  188.     MOV    A,M
  189.     CALL    WH1        ;PRINT
  190.     CPI    '?'        ;CHECK FOR END OF MESSAGE
  191.     JNZ    MESSAGE+3
  192.     LHLD    CM
  193.     SHLD    POS        ;RESTORE POS
  194.     CALL    SWITCH
  195.     MVI    A,1
  196.     CMP    D
  197.     RET
  198. ;
  199. ;    SUBROUTINE: COMP
  200. ;
  201. ;THE SUBROUTINE COMP IS USED BY MENU TO CHECK THE SWITCH.
  202. ;
  203. COMP    CALL    SWITCH
  204.     MVI    A,1
  205.     CMP    D
  206.     JNZ    NEXT        ;IF NO CONTACT, NEXT CHOICE
  207.     LHLD    CM
  208.     SHLD    POS        ;RESTORE MAIN TEXT POS
  209.     RET
  210. ;
  211. ;
  212. ;    MORE ROUTINES USED BY MENU
  213. ;
  214. ;THE FOLLOWING CHAIN OF ROUTINES ARE USED BY MENU TO FIND
  215. ;AND DISPLAY THE NEXT ITEM, CHECK FOR THE LAST ITEM ON THE
  216. ;LIST, OFFER ESCAPE?, AND RECYCLE TO THE BEGINNING OF THE LIST
  217. ;IF NOTHING IS CHOSEN. THE DETAILS OF THESE OPERATIONS VARY
  218. ;DEPENDING ON WHAT ITEMS ARE BEING OFFERED: GROUPS, SUBWORDS,
  219. ;OR CHARACTERS.
  220. ;
  221. NEXT    XCHG            ;SAVE CURRENT ADDRESS
  222.     LHLD    FLAGS        ;WHILE RESTORING FLAGS
  223.     XCHG
  224.     MOV    A,E
  225.     CPI    0FDH        ;DISPLAYING GROUPS OR SUBS?
  226.     JNC    CHECK        ;IF SO CHECK FOR END
  227.     LHLD    CI
  228. FIN    INX    H        ;SKIP CURRENT WORD OR LETTER
  229.     MOV    A,M
  230.     ANI    80H        ;KEEP SKIPPING UNTIL THE
  231.     JZ    FIN        ;START OF THE NEXT, THEN CHECK
  232. CHECK    INR    E        ;THE LAST ITEM WILL BE FOLLOWED
  233.     MOV    A,M        ;BY A FLAG=TO E + 1
  234.     CMP    E
  235.     JNC    LAST
  236.     DCR    E        ;RESTORE FLAG IN E
  237.     CPI    0FBH        ;IF NO CONTROL CODE FOUND,
  238.     JC    ITEM        ;KEEP DISPLAYING
  239.     MOV    A,D
  240.     CPI    0FDH
  241.     JC    LAST
  242.     INX    H        ;SKIP CONTROL CODE
  243.     JMP    ITEM
  244. LAST    CALL    ESCAPE        ;IF LAST ITEM WAS DISPLAYED
  245.     LHLD    FLAGS        ;OFFER ESCAPE THEN LOOP BACK
  246.     XCHG
  247.     LHLD    CS
  248.     JMP    ITEM        ;AND START DISPLAYING AGAIN
  249. ;
  250. ;
  251. ;    SUBROUTINE: WORD
  252. ;
  253. ;WORD, THE NEXT SUBROUTINE, IS USED BY MENU. IF GROUPS OR
  254. ;SUBGROUPS ARE BEING OFFERED, IT IS ENTERED ONLY AFTER THE
  255. ;COMPLETE OFFERING HAS BEEN PRINTED AND IT JUMPS TO COMP TO
  256. ;CHECK THE SWITCH. BUT IF INDIVIDUAL WORDS OR CHARACTERS ARE
  257. ;BEING OFFERED, WORD KEEPS PRINTING WORDS OR CHARACTERS ACROSS
  258. ;THE MENU SPACE, WITH TWO SPACES BETWEEN EACH, UNTIL THE END OF
  259. ;THE SUBGROUP OR UNTIL THE END OF THE LINE.
  260. ;
  261. WORD    MOV    A,E        ;CHECK FLAG
  262.     CPI    0FDH
  263.     JNC    COMP        ;AND SPLIT IF GROUPS OR SUBS
  264.     LDA    POS        ;CHECK POSITION IN MENU
  265.     CPI    3CH        ;NEAR END OF THE LINE
  266.     JNC    COMP        ;STOP PRINTING AND
  267.     MOV    A,M        ;SPLIT OR IF AT END
  268.     CMP    E        ;OF THE SUBGROUP, SPLIT
  269.     JNC    COMP
  270.     MVI    A,' '        ;OTHERWISE,
  271.     CALL    WH1        ;PRINT TWO SPACES
  272.     CALL    WH1
  273.     JMP    DISPY        ;AND ADD MORE TO MENU
  274. ;
  275. ;    SUBROUTINE: ESCAPE
  276. ;
  277. ;THE SUBROUTINE ESCAPE OFFERS A RETURN TO THE SPELLING MODE
  278. ;AND IS USED OFTEN.
  279. ;
  280. ESCAPE    PUSH    B
  281.     LXI    H,MSG1-1    ;SET UP FOR MESSAGE
  282.     CALL    MSG1-1
  283.     POP    B
  284.     RNZ            ;RETURN IF NO ESCAPE
  285.     POP    H        ;CLEAN UP STACK
  286.     JMP    REENTRY        ;AND REENTER SPELLING?
  287. ;
  288. ;
  289. ;    SUBROUTINES USED BY SPELLING MODE
  290. ;
  291. ;THE SPELLING MODE USES THIS CHAIN OF SUBROUTINES. THE FIRST
  292. ;ALPHABET OFFERED IS DIFFERENT FROM THE OTHER 26, AND THE
  293. ;ROUTINE DOESN'T
  294. ;BACKSPACE BEFORE PRINTING THE FIRST LETTER, SO THERE IS ONE
  295. ;ROUTINE FOR THE FIRST LETTER AND ANOTHER FOR ALL THE OTHERS.
  296. ;ESCAPE? IS OFFERED AFTER EACH LETTER IS PRINTED AND BEFORE A
  297. ;NEW ALPHABET IS OFFERED. A LOOK-UP TABLE IS USED TO PICK THE 
  298. ;RIGHT ALPHABET TO OFFER AFTER THE FIRST LETTER HAS BEEN
  299. ;PRINTED.
  300. ;
  301. SPELL    LXI    H,ASTART    ;ADDR OF 1ST ALPHABET
  302.     CALL    FIRST        ;PRINT 1ST LETTER
  303.     CALL    SENTER        ;TO RESTORE POS
  304. TALE    CALL    ESCAPE        ;OFFER ESCAPE
  305.     LXI    H,STAB        ;START OF LOOK-UP TABLE
  306.     MOV    A,B        ;FETCH LAST CHAR PRINTED
  307. LOOK    CMP    M        ;AND LOOK FOR IT IN TABLE
  308.     JZ    FOUND
  309.     INX    H        ;EACH TABLE ENTRY
  310.     INX    H        ;IS 3 BYTES
  311.     INX    H
  312.     JMP    LOOK        ;KEEP LOOKING, YOU'LL FIND IT
  313. FOUND    INX    H        ;WHEN FOUND,
  314.     MOV    E,M        ;GET ADDR FROM TABLE
  315.     INX    H
  316.     MOV    D,M
  317.     XCHG            ;AND PUT IT IN HL
  318.     CALL    SECOND        ;OFFER NEW ALPHABET
  319.     CALL    OOP        ;PRINT THE CHOSEN LETTER
  320.     JMP    TALE        ;AND LOOP BACK TO DO IT AGAIN
  321. FIRST    CALL    SMENU        ;OFFER ALPHABET
  322. OOP    LHLD    CI        ;FETCH CHOSEN ITEM'S ADDR
  323.     MOV    A,M
  324.     CALL    WH1        ;AND PRINT IT
  325.     MOV    B,A        ;SAVE IT FOR LOOK-UP LATER
  326.     MVI    A,' '
  327.     CALL    WH1        ;AND PRINT A SPACE
  328.     RET
  329. SECOND    CALL    SMENU        ;OFFER ALPHABET
  330. SECONDS    LHLD    POS        ;GET READY TO BACKSPACE
  331.     DCX    H        ;AND
  332.     SHLD    POS        ;DO IT
  333.     RET
  334. ;
  335. ;    SUBROUTINE: PUNCT
  336. ;
  337. ;THE SUBROUTINE PUNCT HANDLES OFFERING THE CONTROL CODES (BY
  338. ;CALLING ANOTHER SUBROUTINE) AND IT OFFERS THE PUNCTUATION
  339. ;SYMBOLS. IT USES ONE OF THE SPELLING SUBROUTINES TO HANDLE
  340. ;PUNCTUATION.
  341. ;
  342. PUNCT    LXI    H,MSG4-1
  343.     CALL    MESSAGE        ;OFFER CONTROL?
  344.     JZ    CONTROL
  345.     LXI    H,MSGA-1    ;STARTING ADDR OF PUNCTUATION
  346.     CALL    SECOND        ;OFFER THEM
  347.     CALL    OOP        ;PRINT THE CHOSEN ONE
  348.     JMP    ELOP        ;GO BACK TO OFFER SPELLING
  349. ;
  350. ;    SUBROUTINE: CONTROL
  351. ;
  352. ;CONTROL OFFERS AND EXECUTES THE CONTROL COMMANDS.
  353. ;
  354. CONTROL    LXI    H,MSG5-1
  355.     CALL    MESSAGE        ;OFFER BACKSPACE
  356.     JNZ    TWO
  357.     CALL    SECONDS        ;BACKSPACE
  358.     JMP    ENTERL        ;BACK TO OFFER SPELLING
  359. TWO    LXI    H,MSG6-1
  360.     CALL    MESSAGE
  361.     JNZ    THREE
  362.     LHLD    POS
  363.     DCR    L        ;BACK UP
  364. MORE    DCR    L        ;BACK UP
  365.     MVI    A,' '
  366.     CMP    M        ;HAVE WE REACHED A SPACE?
  367.     JNZ    RUB
  368.     INX    H        ;LEAVE THE SPACE
  369.     JMP    ENTERL        ;AND GO OFFER SPELLING?
  370. THREE    LXI    H,MSG7-1
  371.     CALL    MESSAGE
  372.     JNZ    FOUR
  373.     MVI    A,' '
  374. DEND    CALL    WH1
  375.     JMP    ELOP        ;BACK TO OFFER SPELLING?
  376. FOUR    LXI    H,MSG8-1
  377.     CALL    MESSAGE
  378.     JNZ    FIVE
  379.     MVI    A,0DH
  380.     JMP    DEND
  381. FIVE    LXI    H,MSG9-1
  382.     CALL    MESSAGE
  383.     JZ    START        ;START ALL OVER
  384.     CALL    ESCAPE
  385.     JMP    CONTROL
  386. RUB    MVI    M,0A0H        ;PUT BLANK ON SCREEN
  387.     JMP    MORE
  388. PATCH    LXI    H,TEXT        ;INITIALIZE TEXT ADDR
  389.     SHLD    POS
  390.     RET
  391. ;
  392. ;    MESSAGES
  393. ;
  394. MSG1    DB    'ESCAPE?'
  395. MSG2    DB    'SPELLING?'
  396. MSG3    DB    'PUNCTUATION?'
  397. MSG4    DB    'CONTROL?'
  398. MSG5    DB    'BACKSPACE?'
  399. MSG6    DB    'ERASE LAST WORD?'
  400. MSG7    DB    'SPACE?'
  401. MSG8    DB    'NEXT LINE?'
  402. MSG9    DB    'ERASE SCREEN?'
  403. MSGA    DB    2EH,2CH,3FH,3BH,3AH,21H
  404.     DB    '0123456789#$"%&()*+-'
  405.     DB    0FBH        ;END FLAG
  406. ;
  407. ;    ALPHABET LOOK-UP TABLE
  408. ;
  409. ;HERE IS THE LOOK-UP TABLE FOR THE VARIOUS ALPHABETS, IN 
  410. ;NON-STANDARD FORM.
  411. ;
  412. STAB    DB    'A'
  413.     DW    ALA
  414.     DB    'B'
  415.     DW    ALB
  416.     DB    'C'
  417.     DW    ALC
  418.     DB    'D'
  419.     DW    ALD
  420.     DB    'E'
  421.     DW    ALE
  422.     DB    'F'
  423.     DW    ALF
  424.     DB    'G'
  425.     DW    ALG
  426.     DB    'H'
  427.     DW    ALH
  428.     DB    'I'
  429.     DW    ALI
  430.     DB    'J'
  431.     DW    ALJ
  432.     DB    'K'
  433.     DW    ALK
  434.     DB    'L'
  435.     DW    ALL
  436.     DB    'M'
  437.     DW    ALM
  438.     DB    'N'
  439.     DW    ALN
  440.     DB    'O'
  441.     DW    ALO
  442.     DB    'P'
  443.     DW    ALP
  444.     DB    'Q'
  445.     DW    ALQ
  446.     DB    'R'
  447.     DW    ALR
  448.     DB    'S'
  449.     DW    ALS
  450.     DB    'T'
  451.     DW    ALT
  452.     DB    'U'
  453.     DW    ALU
  454.     DB    'V'
  455.     DW    ALW
  456.     DB    'W'
  457.     DW    ALW
  458.     DB    'X'
  459.     DW    ALX
  460.     DB    'Y'
  461.     DW    ALY
  462.     DB    'Z'
  463.     DW    ALZ
  464. ;
  465. ;    THE ALPHABETS
  466. ;
  467. ;AND HERE ARE THE ALPHABETS.
  468. ;
  469. ASTART    DB    'TAOSWIHCBFPMRELNDUGYJVQKZX',0FBH
  470. ALA    DB    'NTSRLDCIGVMYPBKUFWOJXHZEQA',0FBH
  471. ALB    DB    'EAOUYRISLJTVMBDWCGHNPFK',0FBH
  472. ALC    DB    'OEHATKILURCYSONDZMW',0FBH
  473. ALD    DB    'EIUARSOLMDGYNVJQWHEFTPKBZ',0FBH
  474. ALE    DB    'RSNDALMCETVFPXIGYOWUHQKBJZ',0FBH
  475. ALF    DB    'ORIFEAULTSYWBMGCHNJPD',0FBH
  476. ALG    DB    'EHROAIGSLUTNYMFDBWZJKPC',0FBH
  477. ALH    DB    'EIAOTURYLNWDSMBHQFPCGK',0FBH
  478. ALI    DB    'NSTOCMLAREDVGPFBKXUZQIJLWY',0FBH
  479. ALJ    DB    'AEOUIJ',0FBH
  480. ALK    DB    'EISANLYOGFWTURDPMKBJCHV',0FBH
  481. ALL    DB    'EIALYODTSUFRMVWKPCBGNHJZXQ',0FBH
  482. ALM    DB    'EAOIPMUYSBLFNTHCDRWGJKVCZ',0FBH
  483. ALN    DB    'DTEGSCIAOYNLFVUKMJRQPHWXBZ',0FBH
  484. ALO    DB    'NFRUMPLTOWSDCVIBEYAKHJGXZQ',0FBH
  485. ALP    DB    'ROAELTSPIHMUYWFGKBNDCJ',0FBH
  486. ALQ    DB    'UIO',0FBH
  487. ALR    DB    'EIOATSYDMNURCLVKGPWBFHXQJZ',0FBH
  488. ALS    DB    'TEIOSHUCAPYKMWNLGQFBDRVJZ',0FBH
  489. ALT    DB    'HEIOARSTUYLWCFMNBPDZGKVJQ',0FBH
  490. ALU    DB    'TSNRLCGPAEMDIFBOYZXUVKQJH',0FBH
  491. ALV    DB    'EIAOYUSRVZKGM',0FBH
  492. ALW    DB    'EAHIONRSLTDYKUPFBCMZWG',0FBH
  493. ALX    DB    'EPTICAHUYOQLNWFSVGBKMRD',0FBH
  494. ALY    DB    'EOSAITPMBLNWCRGDZHUFVXIK',0FBH
  495. ALZ    DB    'EAZOYIUKTVWHJB',0FBH
  496. ;
  497. ;END OF ALPHABETS
  498. ;
  499. ;
  500. ;    BEGINNING OF VOCABULARY STORAGE
  501. ;
  502. BEGIN    DB    'AABLEABOUT'
  503.     DS    1976H
  504. ;
  505. ;    TEXT AND EDITOR
  506. ;
  507. ;THE EDITOR AND TEXT PROGRAMS USE SEVERAL SUBROUTINES FROM
  508. ;THE POLY 4.0 MONITOR ROM. SEE THE POLY SYSTEM MANUAL VOLUME
  509. ;2, PAGES 58-65.
  510. ;
  511. TEXT    CALL    WHO        ;KEYBOARD INPUT
  512.     CPI    7FH        ;IS IT A RUBOUT?
  513.     JZ    RUB1
  514.     CPI    5FH        ;IS IT A SHIFT 'O'
  515.     JZ    EDITOR
  516. CTL    CPI    1CH        ;IS IT A CONTROL CHAR?
  517.     JC    CONTRO1
  518.     CPI    20H        ;IS IT A CONTROL CODE?
  519.     JNC    PRINT        ;IF NOT PRINT IT
  520.     ADI    0DFH
  521. PRINT    MOV    M,A        ;STORE IT IN MEMORY
  522.     CALL    LPRINT        ;PUT IT ON TV
  523.     INX    H        ;NEXT MEMORY LOCATION
  524.     JMP    TEXT        ;DO IT ALL OVER AGAIN
  525. CONTRO1    ORI    0C0H        ;MAKE 8TH BIT HIGH
  526.     JMP    PRINT        ;FOR 'CAPITAL' LETTERS
  527. RUB1    CALL    LPRINT        ;RUBOUT ON TV
  528.     DCX    H        ;BACK UP IN MEMORY
  529.     JMP    TEXT        ;GO DO IT OVER
  530. RETEXT    LHLD    CS        ;FETCH STARTING ADDR
  531.     MVI    A,0CH        ;ERASE TV
  532.     CALL    WH1
  533.     JMP    TEXT
  534. EDITOR    SHLD    CS        ;SAVE START OF CURRENT LINE
  535.     MVI    A,0DH
  536.     CALL    WH1        ;START A NEW LINE
  537.     LHLD    CS        ;FETCH START OF CURRENT LINE
  538.     XCHG
  539.     CALL    DEOUT        ;PRINT ADDR IN HEX
  540.     XCHG            ;RESTORE ADDR
  541.     MVI    A,' '
  542.     CALL    WH1        ;PRINT SPACE
  543. LOOP    MOV    A,M        ;FETCH CHAR FROM MEMORY
  544.     CALL    LPRINT        ;PUT IT ON TV
  545.     MOV    A,M
  546.     INX    H
  547.     CPI    0FBH        ;WAS IT THE END OF A LINE?
  548.     JC    LOOP        ;IF NOT, KEEP PRINTING
  549. KEY    CALL    WHO        ;WAIT UNTIL KEY IS PRESSED
  550.     CPI    ' '
  551.     JNZ    M1        ;IF NOT KEEP CHECKING
  552.     LHLD    CS        ;FETCH STARTING ADDR
  553.     INX    H        ;SPACE SKIPS ONE CHAR
  554.     JMP    EDITOR        ;AND REPRINTS LINE
  555. M1    CPI    7FH        ;IS IT A RUBOUT?
  556.     JNZ    M2
  557.     LHLD    CS        ;FETCH STARTING ADDR
  558.     PUSH    H        ;COPY HL
  559.     POP    D        ;INTO DE
  560.     MVI    A,0FFH        ;END OF VOCABULARY FLAG
  561.     LXI    B,0        ;START COUNTING AT ZERO.
  562.     DCX    H
  563. M3    INX    H
  564.     DCX    B        ;COUNT ONE BYTE
  565.     CMP    M        ;CHECK FOR END FLAG
  566.     JNZ    M3        ;KEEP COUNTING IF NOT END
  567.     LHLD    CS        ;FETCH STARTING ADDR
  568.     INX    H        ;MOVE ONE SPACE
  569.     CALL    MOVE
  570.     JMP    EDITOR        ;DISPLAY EDITED LINE
  571. M2    CPI    0DH        ;IS IT A CARRIAGE RETURN?
  572.     JZ    EDITOR        ;THEN DISPLAY NEXT LINE
  573.     CPI    0AH        ;IS IT LINE FEED?
  574.     JNZ    M4
  575.     LHLD    CS        ;FETCH STARTING ADDR
  576.     DCX    H        ;BACK UP
  577. M5    DCX    H        ;KEEP BACKING UP
  578.     MOV    A,M
  579.     CPI    0FBH        ;LOOK FOR CONTROL FLAG
  580.     JC    M5        ;BACK UP UNTIL FOUND
  581.     INX    H        ;SKIP THE FLAG
  582.     JMP    EDITOR        ;AND DISPLAY PREVIOUS LINE
  583. M4    CPI    5FH        ;IS IT SHIFT 'O' ?
  584.     JZ    RETEXT        ;IF SO, GO TO TEXT
  585.     CPI    1CH        ;IS IT A CONTROL CHAR?
  586.     JC    M6        ;IF SO, IT'S UPPER CASE
  587.     CPI    20H        ;COULD IT BE CONTROL CODE?
  588.     JNC    INSERT        ;IF NOT,INSERT AS IS
  589.     CPI    1EH        ;BE SURE IT'S NOT M OR L
  590.     JNC    M7        ;IF NOT, THEN CONTROL CODE OK
  591.     ADI    0B0H        ;MAKE INTO L OR M
  592.     JMP    INSERT        ;AND INSERT IT
  593. M7    ADI    0DFH        ;MAKE INTO CONTROL CODE
  594.     JMP    INSERT
  595. M6    ORI    0C0H        ;MAKE INTO CAPITAL LETTER
  596. INSERT    LHLD    CS        ;FETCH STARTING ADDR
  597.     PUSH    PSW        ;SAVE CHAR ON STACK
  598.     MVI    A,0FFH        ;END OF VOCABULARY FLAG
  599.     LXI    B,0        ;START COUNT AT ZERO
  600.     DCX    H
  601. M8    INX    H
  602.     DCX    B
  603.     CMP    M
  604.     JNZ    M8
  605. M9    MOV    D,H        ;MOVE FORWARD
  606.     MOV    E,L
  607.     INX    D
  608.     MOV    A,M
  609.     STAX    D
  610.     DCX    D
  611.     DCX    H
  612.     INR    C        ;COUNT ONE SPACE
  613.     JNZ    M9
  614.     INR    B
  615.     JNZ    M9
  616.     POP    PSW        ;GET BACK CHAR
  617.     STAX    D        ;AND INSERT IT
  618.     INX    H
  619.     INX    H
  620.     JMP    EDITOR
  621. LPRINT    CPI    60H        ;IS IT UPPER CASE ?
  622.     JNC    WH1        ;PRINT AS IS
  623.     CPI    41H        ;IS IT LOWER CASE ?
  624.     JC    WH1        ;IF NOT, PRINT AS IS
  625.     ADI    20H        ;MAKE IT LOWER CASE
  626.     JMP    WH1        ;AND PRINT IT
  627. ;
  628. ;
  629. ;
  630. ;THIS PROGRAM (ACTUALLY A SUBROUTINE) DRIVES A POLYMORPHICS
  631. ;VTI AND SCROLLS TEXT WHEN THE SCREEN FILLS. IT RECOGNIZES
  632. ;ALL IMPORTANT CONTROL CHARACTERS AND USES THE SCRHM,SCEND,
  633. ;AND POS LOCATIONS IN SYSTEM RAM TO DESCRIBE THE BEGINNING,
  634. ;END AND CURRENT CURSOR LOCATION. THE BEGINNING ADDR
  635. ;IS IN TURN STORED AT WH1.
  636. ;
  637. POS    DS    2        ;CURSOR POINTER FOR DISPLAY
  638. SCRHM    EQU    0CC00H        ;SCREEN HOME
  639. SCEND    EQU    SCRHM+400H    ;SCREEN END
  640. ;
  641. DSPLY    PUSH    PSW        ;SAVE ALL REGISTERS
  642.     PUSH    B
  643.     PUSH    D
  644.     PUSH    H
  645.     LHLD    POS        ;GET CURRENT CURSOR POSITION
  646.     CPI    'X'-40H        ;CONTROL 'X' CLEARS LINE
  647.     JZ    CLINE
  648.     LXI    D,SCRL        ;ALL DSPLY CHAR HANDLING
  649.     PUSH    D        ;SUBROUTINES EXCEPT CLINE
  650.                 ;RETURN TO SCRL TO CHECK
  651.                 ;SCREEN OVERFLOW AND SCROLL
  652.                 ;IF NECESSARY
  653.     MVI    M,' '        ;BLANK THE CURSOR
  654.     CPI    7FH        ;BACKSPACE AND DELETE CHAR IF
  655.                 ;IT'S A RUBOUT
  656.     JZ    RBR
  657.     CPI    20H        ;IF CHAR >20H, PRINT IT
  658.     JNC    NORM        ;TEST FOR VALID CONTROL CHAR
  659.     SUI    'M'-40H        ;CR MOVES CURSOR DOWN ONE LINE
  660.                 ;AND ZEROS IT AT LEFT MARGIN
  661.     JZ    CRR
  662.     INR    A        ;FORM FEED CLEARS SCREEN, HOMES
  663.                 ;CURSOR
  664.     JZ    FFR
  665.     INR    A        ;VERTICAL TAB HOMES CURSOR
  666.     JZ    VTR
  667.     INR    A        ;TAB MOVES CURSOR RIGHT TO NEXT
  668.     INR    A        ;EVEN 8 POSITION
  669.     RNZ            ;IF NOT A TAB RETURN
  670.     MOV    A,L        ;BACK-UP CURSOR TO EVEN 8
  671.     ANI    0F8H
  672.     MOV    L,A
  673.     LXI    B,8        ;MOVE ALONG 8 POSITIONS
  674.     DAD    B
  675.     RET
  676. NORM    ORI    80H        ;PRINTING CHAR? MAP INTO CHAR
  677.                 ;AREA OF VTI SPACE
  678.     MOV    M,A        ;PUT IT ON SCREEN
  679.     INX    H        ;MOVE ALONG ONE POSITION
  680.     RET            ;GO TO SCRL
  681. ;
  682. ;SCRL SCROLLS TEXT UP THE SCREEN IF NECESSARY THEN FALLS INTO
  683. ;CURP, WHICH RESTORES THE CURSOR AND RETURNS TO USER THRU IORET
  684. ;SUBROUTINE CHECKS FOR THE END OF THE SCREEN AND IF THERE, IT
  685. ;SETS UP THE REGISTERS FOR A BLOCK MOVE UP ONE LINE VIA MOVE.
  686. ;
  687. SCRL    LDA    SCEND
  688.     CMP    H
  689.     JNZ    CURP
  690.     LHLD    SCEND
  691.     MOV    A,H
  692.     SUB    L
  693.     MOV    D,H
  694.     MVI    L,40H
  695.     MVI    E,0
  696.     MOV    C,L
  697.     MOV    B,A
  698.     CALL    MOVE
  699.     DCX    H
  700. ;
  701. ;CLEAR THE CURRENT LINE
  702. ;
  703. CLINE    MVI    A,3FH
  704.     MOV    D,A
  705.     ORA    L
  706.     MOV    L,A
  707. WIPE    MVI    M,' '
  708.     DCX    H
  709.     DCR    D
  710.     JNZ    WIPE
  711. CURP    MVI    M,' '
  712.     SHLD    POS        ;STORE CURSOR POINTER
  713.     JMP    IORET
  714. RBR    DCX    H        ;RUBOUT ROUTINE
  715.     RET
  716. CRR    LXI    B,64        ;CR ROUTINE
  717.     MOV    A,L
  718.     ANI    0C0H
  719.     MOV    L,A
  720.     DAD    B
  721.     RET
  722. FFR    CALL    VTR        ;FORM FEED ROUTINE
  723. FF1    MVI    M,' '
  724.     INX    H
  725.     CMP    H
  726.     JNZ    FF1
  727. VTR    LHLD    SCEND        ;VERTICAL TAB ROUTINE
  728.     MOV    A,L
  729.     MVI    L,0
  730.     RET
  731. ;
  732. ;MOVE MOVES BC BYTES FROM THE AREA STARTING AT (HL) TO THE
  733. ;AREA STARTING AT (DE)
  734. ;
  735. MOVE    MOV    A,M
  736.     STAX    D
  737.     INX    D
  738.     INX    H
  739.     INR    C
  740.     JNZ    MOVE
  741.     INR    B
  742.     JNZ    MOVE
  743.     RET
  744. ;
  745. ;IORET - PUT BACK ALL REGISTERS.
  746. ;
  747. IORET    POP    H
  748.     POP    D
  749.     POP    B
  750.     POP    PSW
  751.     RET
  752. ;
  753. ;DEOUT OUTPUTS DE TO THE SCREEN
  754. ;
  755. DEOUT    MOV    A,D
  756.     CALL    BYTE
  757.     MOV    A,E
  758. ;
  759. ;BYTE OUTPUTS THE ACC AS TWO HEX DIGITS TO THE SCREEN
  760. ;
  761. BYTE    PUSH    PSW
  762.     RRC
  763.     RRC
  764.     RRC
  765.     RRC
  766.     CALL    HEXO
  767.     POP    PSW
  768. ;
  769. ;HEXO OUTPUTS 1 HEX DIGIT TO THE SCREEN - THE UPPER HALF IS
  770. ;MASKED WITH ZEROS.
  771. ;
  772. HEXO    ANI    15
  773.     ADI    90H
  774.     DAA
  775.     ACI    40H
  776.     DAA
  777.     JMP    DSPLY        ;OUTPUT HEX DIGIT & USE RETURN
  778. ;
  779. ;KEYBOARD INPUT FOR EDITOR
  780. ;
  781. KBPORT    EQU    0
  782. KBFLAG    EQU    80H
  783. KB    EQU    1
  784. ;
  785. WHO    IN    KBPORT
  786.     ANI    KBFLAG
  787.     JNZ    WHO
  788.     IN    KB
  789.     RET
  790. ;
  791. ;SCREEN DISPLAY ENTRY POINT
  792. ;
  793. WH1    CALL    DSPLY
  794.     RET
  795. ;
  796. ;STORAGE AREAS
  797. ;
  798. CI    DS    2        ;CHOSEN ITEM'S ADDR
  799. FLAGS    DS    2        ;FLAG STORAGE
  800. CS    DS    2        ;STARTING ADDR STORAGE
  801. WASTE    DS    2        ;SPACE FOR WASTING TIME
  802. ;
  803.     END
  804.