home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / PROGRAMS / SPELL / DICCRE20.MAC < prev    next >
Text File  |  2000-06-30  |  16KB  |  789 lines

  1. ;
  2. ;    DICCRE    V2.0            March 21, 1983
  3. ;
  4. ;        written by Michael C. Adler
  5. ;
  6. ;    Creates a dictionary file DICT.DIC and a pointer file SPELL0.MAC
  7. ; from dictionary source files.  Flags are converted into bit values and
  8. ; characters are stored in 5-bit.
  9. ;
  10. ; Modification history:
  11. ;
  12. ;    V1.0 - August 16, 1982:  Created.
  13. ;
  14. ;    V2.0 - March 21, 1983:
  15. ;        Added code to print double ' for words with apostrophes listed
  16. ;        in SPELL0.MAC.
  17. ;
  18.  
  19.     TITLE    DICCRE
  20.  
  21.     .Z80
  22. ;    JP    START
  23.  
  24.     DB    '(C) 1983 Michael C. Adler. '
  25.     DB    'This program has been released into the public domain '
  26.     DB    'by the author.  It may neither be sold for profit nor '
  27.     DB    'included in a sold software package without permission '
  28.     DB    'of the author.'
  29.  
  30. BOOT    EQU    0000H
  31. BDOS    EQU    0005H
  32. IFCB    EQU    005CH
  33. STROUT    EQU    9
  34. OPEN    EQU    15
  35. CLOSE    EQU    16
  36. DELETE    EQU    19
  37. READ    EQU    20
  38. WRITE    EQU    21
  39. MAKE    EQU    22
  40. RENAME    EQU    23
  41. SETDMA    EQU    26            ;SET DMA ADDRESS
  42. RANREA    EQU    33            ;READ RANDOM
  43.  
  44. LF    EQU    10
  45. CR    EQU    13
  46. EOF    EQU    01AH            ;END OF FILE CHARACTER
  47. QUOTE    EQU    027H            ;"'"
  48. ;
  49. ;    The following are bit flags for the dictionary
  50. ;
  51. ZFLAG    EQU    1
  52. YFLAG    EQU    2
  53. RFLAG    EQU    4
  54. GFLAG    EQU    8
  55. DFLAG    EQU    16
  56. MFLAG    EQU    32
  57. SFLAG    EQU    64
  58. HFLAG    EQU    256
  59. VFLAG    EQU    512
  60. JFLAG    EQU    1024
  61. XFLAG    EQU    2048
  62. TFLAG    EQU    4096
  63. NFLAG    EQU    8192
  64. PFLAG    EQU    16384
  65.  
  66.  
  67.  
  68. START:    LD    SP,STACK        ;CREATE A STACK
  69.     LD    DE,WELCOM        ;PRINT SIGNON MESSAGE
  70.     LD    C,STROUT
  71.     CALL    BDOS
  72.     JR    HIDONE
  73. WELCOM:    DB    'DICCRE V2.0 -- March 21, 1983',CR,LF
  74.     DB    '(C) 1983 Michael C. Adler',CR,LF,'$'
  75.  
  76. HIDONE:    LD    A,EOF            ;MARK EOF FOR BUFFERS
  77.     LD    (OBUFF+512),A
  78.     LD    (INBUF+512),A
  79.     LD    (INBUF+513),A
  80.     LD    A,(BOOT+06CH)        ;GET DRIVE FOR OUTPUT FILES
  81.     LD    (OFCB),A
  82.     LD    (DICFCB),A
  83.     LD    A,0C9H            ;RETURN INSTRUCTION
  84.     LD    (100H),A        ;THIS PROGRAM IS CAN NOT BE GOED
  85.     LD    DE,IFCB            ;OPEN INPUT FILE
  86.     LD    C,OPEN
  87.     CALL    BDOS
  88.     CP    0FFH            ;FILE FOUND?
  89.     JR    NZ,START0
  90.     LD    DE,NOTFOU        ;ERROR
  91.     LD    C,STROUT
  92.     CALL    BDOS
  93.     CALL    BOOT
  94. NOTFOU:    DB    'Input file not found',CR,LF,'$'
  95.  
  96. START0:    LD    DE,DICFCB
  97.     LD    C,OPEN
  98.     CALL    BDOS
  99.     CP    0FFH            ;DOES "DICT.DIC" ALREADY EXIST?
  100.     JR    Z,START1        ;IF NOT, CONTINUE
  101.     LD    DE,EXDIC        ;DELETE DICT.DIC MESSAGE
  102.     LD    C,STROUT
  103.     CALL    BDOS
  104.     CALL    YESNO            ;ASK WHETHER DELETE IT
  105.     CALL    NZ,BOOT            ;DON'T RUN IF DON'T DELETE
  106.     LD    DE,DICFCB
  107.     LD    C,DELETE
  108.     CALL    BDOS
  109. START1:    LD    DE,DICFCB
  110.     LD    C,MAKE
  111.     CALL    BDOS
  112.     LD    DE,OFCB
  113.     LD    C,OPEN            ;DOES "SPELL0.MAC" EXIST?
  114.     CALL    BDOS
  115.     CP    0FFH
  116.     JR    Z,START2        ;IF NOT, CONTINUE
  117.     LD    DE,EXSPEL        ;DELETE SPELL0.MAC MESSAGE
  118.     LD    C,STROUT
  119.     CALL    BDOS
  120.     CALL    YESNO            ;ASK WHETHER DELETE IT
  121.     CALL    NZ,BOOT            ;DON'T RUN IF SAVE FILE
  122.     LD    DE,OFCB
  123.     LD    C,DELETE
  124.     CALL    BDOS
  125. START2:    LD    DE,OFCB
  126.     LD    C,MAKE
  127.     CALL    BDOS
  128.  
  129.     CALL    CTRLZ            ;PUT ^Z IN OBUFF
  130.     LD    A,01AH            ;ALSO AT END OF IT
  131.     LD    (OBUFF+512),A
  132.     CALL    DICZER            ;ZERO DICTIONARY BUFFER
  133.     LD    HL,TABTOP        ;CHARACTER STRING FOR TABTOP::
  134.     LD    B,8            ;OUTPUT 10 CHARACTERS
  135. LOOP:    LD    A,(HL)
  136.     CALL    PUTCHR
  137.     INC    HL
  138.     DJNZ    LOOP
  139.     CALL    GETWRD            ;GET THE FIRST WORD
  140.     LD    A,0            ;END OF FILE?  UNLIKELY!
  141.     CP    C
  142.     CALL    Z,BOOT
  143.     LD    B,C
  144.     LD    C,0
  145.     CALL    MAKTBL            ;PUT WORD IN RECORD TABLE
  146.     JR    MAINSK
  147. MAIN:    CALL    GETWRD            ;GET A WORD
  148.     LD    A,0            ;IF 0 LENGTH WORD THEN END
  149.     CP    C
  150.     JP    Z,DONE
  151.     LD    B,C            ;PUT NUMBER OF CHARACTERS READ IN B
  152.     LD    C,0            ;ZERO COUNTER
  153. MAINSK:    LD    HL,SRCWRD
  154.     LD    DE,OLDWRD
  155. MAIN0:    LD    A,(DE)            ;COMPARE THIS WORD TO LAST (GET # OF
  156.                     ;SIMILAR CHARACTERS)
  157.     CP    (HL)
  158.     JR    NZ,MAIN1
  159.     INC    DE
  160.     INC    HL
  161.     INC    C
  162.     JR    MAIN0
  163. MAIN1:    LD    A,15            ;MAY COPY MAXIMUM OF 15 CHARACTERS
  164.     CP    C
  165.     JP    NC,MAIN2        ;JUMP IF LESS THAN 15
  166.     LD    C,15
  167.     LD    HL,SRCWRD+15        ;POINT TO 1ST CHARACTER TO USE
  168. MAIN2:    PUSH    BC            ;COMPUTE NUMBER OF BITS IN WORD
  169.     LD    A,B            ;COMPUTE NUMBER OF CHARACTERS IN WORD-
  170.                     ;NUMBER TO COPY
  171.     SUB    C
  172.     LD    B,A
  173.     LD    A,0
  174. MAIN3:    ADD    A,5            ;5 BITS PER LETTER
  175.     DJNZ    MAIN3
  176.     POP    BC
  177.     ADD    A,25            ;4 BITS FOR COPY AMOUNT
  178.                     ;14 BITS FOR STATUS FLAGS
  179.                     ;4 BITS FOR LENGTH OF STATUS FLAGS
  180.                     ;3 BITS FOR END OF WORD
  181.     PUSH    DE
  182.     PUSH    HL
  183.     LD    HL,(BITS)        ;NUMBER OF BITS LEFT IN 256 BYTE RECORD
  184.     LD    E,A            ;PUT BITS IN THIS WORD IN DE
  185.     LD    D,0
  186.     XOR    A            ;CLEAR CARRY
  187.     SBC    HL,DE            ;NUMBER OF BITS LEFT AFTER THIS
  188.     JP    NC,MAIN4        ;JUMP IF WORD WILL FIT
  189.     CALL    DWRITE            ;WRITE THIS RECORD
  190.     CALL    DICZER            ;ZERO DICTIONARY BUFFER
  191.     LD    C,0            ;BEGINNING OF RECORD.  COPY 0
  192.     CALL    MAKTBL            ;WRITE TO TABLE FILE
  193.     LD    HL,2048            ;NUMBER OF BITS IN 256 BYTES
  194.     LD    (BITS),HL        ;RESET COUNTER
  195.     POP    HL
  196.     POP    DE
  197.     LD    HL,SRCWRD
  198.     JP    MAIN2            ;RECALCULATE LENGTH OF WORD
  199. MAIN4:    LD    (BITS),HL
  200.     POP    HL
  201.     POP    DE
  202.     PUSH    BC
  203.     PUSH    HL
  204.     LD    C,B            ;NUMBER OF CHARACTERS IN SRCWRD TO BC
  205.     LD    B,0
  206.     LD    HL,SRCWRD        ;PUT SRCWRD IN OLDWRD
  207.     LD    DE,OLDWRD
  208.     LDIR
  209.     LD    A,1
  210.     LD    (DE),A            ;MARK END OF WORD
  211.     POP    HL
  212.     POP    BC
  213.     CALL    BUFWRD            ;BUFFER WORD IN RECORD
  214.     JP    MAIN            ;GET NEXT WORD
  215.  
  216. DONE:    LD    A,(IFCB)        ;IF INPUT FILE ON DIFFERENT DISK THAN
  217.                     ;OUTPUT FILE, ASK IF MORE
  218.     LD    HL,OFCB
  219.     CP    (HL)
  220.     JR    Z,ENDIT
  221.     LD    DE,MOREST        ;MORE QUESTION
  222.     LD    C,STROUT
  223.     CALL    BDOS
  224.     LD    HL,INBUF+512        ;GET PREPARED IN CASE MORE
  225.     LD    (INPTR),HL
  226.     CALL    YESNO
  227.     JR    NZ,NOMORE        ;END IF NO MORE
  228.     LD    HL,IFCB+0CH        ;CLEAR THE IFCB RECORD POINTERS
  229.     LD    B,23
  230.     LD    A,0
  231. DONF:    LD    (HL),A
  232.     INC    HL
  233.     DJNZ    DONF
  234.     LD    DE,IFCB            ;OPEN THE FILE
  235.     LD    C,OPEN
  236.     CALL    BDOS
  237.     CP    0FFH            ;FOUND?
  238.     JP    NZ,MAIN            ;GET NEXT WORD
  239.     LD    DE,NOTFOU        ;NOT FOUND MESSAGE
  240.     LD    C,STROUT
  241.     CALL    BDOS
  242. NOMORE:    LD    A,(IFCB)        ;IS IT ON DRIVE OTHER THAN A?
  243.     CP    2
  244.     JP    P,ENDIT            ;JUST BOOT IF SO
  245.     LD    DE,TYPECR        ;MESSAGE:  INSERT BOOTABLE DISK...
  246.     LD    C,STROUT
  247.     CALL    BDOS
  248.     LD    DE,BOOT+80H        ;WAIT FOR A LINE FROM TERMINAL
  249.     LD    C,0AH
  250.     CALL    BDOS
  251. ENDIT:    LD    HL,TBTSTR        ;"TABBOT::"
  252.     LD    B,24            ;12 CHARACTERS WITH CR,LF
  253. DONE0:    LD    A,(HL)            ;GET THE CHARACTER
  254.     INC    HL
  255.     CALL    PUTCHR
  256.     DJNZ    DONE0
  257.     LD    HL,OBUFF        ;WRITE OUT REMAINING DATA IN BUFFER
  258.     LD    DE,128
  259. DONE1:    LD    A,EOF            ;DONE?
  260.     CP    (HL)
  261.     JR    Z,DONE3
  262.     PUSH    DE
  263.     PUSH    HL
  264.     LD    D,H            ;SET UP DMA ADDRESS
  265.     LD    E,L
  266.     LD    C,SETDMA
  267.     CALL    BDOS
  268.     LD    DE,OFCB            ;WRITE 128 BYTES TO FILE
  269.     LD    C,WRITE
  270.     CALL    BDOS
  271.     POP    HL
  272.     POP    DE
  273.     CP    0            ;ERROR?
  274.     JR    NZ,DONE2        ;DISK FULL --> BRANCH
  275.     ADD    HL,DE            ;POINT TO NEXT RECORD
  276.     JR    DONE1
  277. DONE2:    LD    C,STROUT        ;DISK FULL
  278.     LD    DE,DSKFUL        ;DISK FULL MESSAGE (SEE PUTCHR)
  279.     CALL    BDOS
  280.     CALL    BOOT
  281.  
  282. DONE3:    LD    DE,OFCB            ;CLOSE OUTPUT FILE
  283.     LD    C,CLOSE
  284.     CALL    BDOS
  285.     LD    HL,(CURBYT)        ;SEE IF DATA LEFT IN DICTIONARY REC
  286.     LD    BC,DICBUF-1
  287.     XOR    A            ;CLEAR CARRY
  288.     SBC    HL,BC
  289.     JR    Z,DONE4            ;DON'T WRITE IF NO DATA
  290.     CALL    DWRITE            ;WRITE OUT CURRENT DICTIONARY RECORD
  291. DONE4:    LD    DE,DICFCB        ;CLOSE FILE
  292.     LD    C,CLOSE
  293.     CALL    BDOS
  294.     CALL    BOOT
  295.  
  296. BUFWRD:    RRC    C            ;OUTPUT NUMBER OF BYTES TO COPY
  297.     RRC    C
  298.     RRC    C    
  299.     RRC    C
  300.     LD    B,4            ;SEND 4 BITS
  301. BUFWR0:    LD    A,0
  302.     RLC    C            ;SET/CLEAR CARRY BASED ON BIT
  303.     ADC    A,0
  304.     CALL    PUTBIT
  305.     DJNZ    BUFWR0
  306. BUFWR1:    LD    A,(HL)            ;GET CHARACTER TO OUTPUT
  307.     INC    HL
  308.     CP    '%'            ;STOP IF END OF WORD
  309.     JR    Z,BUFWR3
  310.     CP    0
  311.     JR    Z,BUFWR3
  312.     LD    B,5            ;5 BITS
  313.     CP    027H            ;IS IT "'"?
  314.     JR    NZ,NORMAL
  315.     LD    A,'Z'+1            ;IF IT IS, ENCODE AS Z+1
  316. NORMAL:    SUB    'A'-1            ;MAKE IT BASED AT 1
  317.     LD    C,A
  318.     RLC    C            ;PUT BITS IN POSITION TO BE READ
  319.     RLC    C
  320.     RLC    C
  321. BUFWR2:    LD    A,0
  322.     RLC    C            ;SET/CLEAR CARRY BASED ON BIT
  323.     ADC    A,0
  324.     CALL    PUTBIT
  325.     DJNZ    BUFWR2
  326.     JR    BUFWR1            ;GET NEXT CHARACTER
  327. BUFWR3:    LD    A,1            ;MARK END OF WORD WITH 111B
  328.     CALL    PUTBIT
  329.     CALL    PUTBIT
  330.     CALL    PUTBIT
  331.     DEC    HL
  332.     LD    D,H            ;PUT POINTER TO SRCWRD IN DE
  333.     LD    E,L
  334. BUFWR4:    LD    A,(DE)
  335.     CP    0            ;ANY FLAGS?
  336.     JP    Z,BUFFLG        ;WRITE NULL FLAGS IF NOT
  337.     CP    '%'            ;ANOTHER FLAG?
  338.     INC    DE
  339.     JR    Z,BUFWR4
  340.     CP    ' '            ;ILLEGAL IF SPACE
  341.     JP    Z,BUFWR4
  342.     LD    HL,FLGDAT        ;TABLE OF FLAGS
  343.     LD    BC,29            ;14 WORD FLAGS.  IF REACHES END, ERROR.
  344.     CPIR                ;SEARCH THROUGH TABLE
  345.     JP    PO,BUFWR4        ;JUST SKIP IF ILLEGAL FLAG
  346.     LD    BC,FLGDA0-FLGDAT-1    ;OFFSET TO TABLE OF VALUES FOR FLAGS
  347.     ADD    HL,BC            ;POINT TO WORD WITH FLAG
  348.     LD    C,(HL)            ;PUT IT IN DE
  349.     INC    HL
  350.     LD    B,(HL)
  351.     LD    HL,(CURFLG)        ;GET CURRENT VALUE OF FLAG
  352.     LD    A,B            ;MAKE SURE FLAG NOT REPEATED
  353.     OR    H
  354.     LD    H,A
  355.     LD    A,C
  356.     OR    L
  357.     LD    L,A
  358.     LD    (CURFLG),HL
  359.     JP    BUFWR4            ;GET ANOTHER FLAG
  360. BUFFLG:    LD    HL,(CURFLG)        ;GET CURRENT FLAG
  361.     CALL    PUTFLG            ;OUTPUT THE FLAG
  362.     LD    HL,0
  363.     LD    (CURFLG),HL        ;CLEAR CURRENT FLAG VALUE
  364.     RET
  365.  
  366. PUTFLG:    LD    A,14            ;FIND FIRST USED BIT
  367.     PUSH    HL
  368. PUTFL0:    RRC    H
  369.     JP    C,PUTFL2        ;IF BIT SET, EXIT
  370.     DEC    A
  371.     CP    7
  372.     JR    NZ,PUTFL0        ;LOOP THROUGH WHOLE BYTE
  373. PUTFL1:    RRC    L
  374.     JP    C,PUTFL2
  375.     DEC    A
  376.     CP    0
  377.     JR    NZ,PUTFL1
  378. PUTFL2:    POP    HL
  379.     RRC    A            ;PUT A IN A POSITION FOR OUTPUT
  380.     RRC    A
  381.     RRC    A
  382.     RRC    A
  383.     LD    B,4            ;4 BITS
  384.     LD    C,A
  385. PUTFL4:    LD    A,0
  386.     RLC    C
  387.     ADC    A,0
  388.     CALL    PUTBIT
  389.     DJNZ    PUTFL4
  390.     LD    A,C
  391.     PUSH    PSW
  392.     PUSH    HL
  393.     LD    HL,(BITS)        ;UPDATE NUMBER OF BITS LEFT (GREATER?)
  394.     LD    C,A            ;COMPUTE NUMBER OF BITS SAVED
  395.     LD    A,14
  396.     SUB    C
  397.     LD    B,0            ;UPDATE BITS
  398.     LD    C,A
  399.     ADD    HL,BC
  400.     LD    (BITS),HL
  401.     POP    HL
  402.     POP    PSW
  403.     CP    0            ;ANY BITS TO COPY?
  404.     RET    Z
  405.     PUSH    PSW
  406.     CP    8            ;GREATER THAN 7?
  407.     JP    M,PUTFM4
  408.     LD    A,7            ;DO ALL 7 BITS
  409. PUTFM4:    LD    B,A            ;NUMBER OF BITS TO COPY
  410.     RLC    L            ;GET TO FIRST BIT
  411. PUTFL5:    LD    A,0
  412.     RLC    L
  413.     ADC    A,0
  414.     CALL    PUTBIT
  415.     DJNZ    PUTFL5
  416.     POP    PSW
  417.     SUB    7            ;NUMBER OF BITS TO COPY IN BYTE 2
  418.     RET    M            ;RETURN IF NONE
  419.     RET    Z
  420.     LD    B,A
  421.     RLC    H            ;GET TO FIRST BIT
  422. PUTFL6:    LD    A,0
  423.     RLC    H
  424.     ADC    A,0
  425.     CALL    PUTBIT
  426.     DJNZ    PUTFL6
  427.     RET
  428.  
  429.  
  430. PUTBIT:    PUSH    PSW
  431.     PUSH    DE
  432.     PUSH    HL
  433.     LD    HL,CURBIT        ;GET BIT INDEX
  434.     LD    E,(HL)
  435.     LD    HL,(CURBYT)        ;ADDRESS OF CURRENT BYTE FOR OUTPUT
  436.     PUSH    PSW
  437.     LD    A,0111B            ;MASK 1ST THREE BITS
  438.     AND    E
  439.     JR    NZ,PUTBI0        ;IF .NE. 0 THEN NOT TIME TO INC CURBYT
  440.     INC    HL
  441.     LD    (CURBYT),HL
  442. PUTBI0:    INC    E
  443.     POP    PSW
  444.     RLC    (HL)            ;MOVE BYTE SO NEXT BIT IN RIGHT PLACE
  445.     OR    (HL)            ;PUT DESIRED BIT IN OUTPUT BUFFER
  446.     LD    (HL),A
  447.     LD    HL,CURBIT        ;UPDATE MASK
  448.     LD    (HL),E
  449.     POP    HL
  450.     POP    DE
  451.     POP    PSW
  452.     RET
  453.  
  454. DWRITE:    PUSH    BC
  455.     PUSH    DE
  456.     PUSH    HL
  457.     LD    HL,(CURBYT)        ;GET CURRENT BYTE
  458.     LD    A,(CURBIT)        ;CURRENT BIT
  459.     LD    E,A
  460. DWRIT0:    LD    A,0111B            ;ROTATE LAST BYTE INTO PLACE
  461.     AND    E
  462.     JR    Z,DWRIT1
  463.     RLC    (HL)
  464.     INC    E
  465.     JR    DWRIT0
  466. DWRIT1:    LD    HL,DICBUF-1        ;RESET POINTERS
  467.     LD    (CURBYT),HL
  468.     LD    A,0
  469.     LD    (CURBIT),A
  470.     LD    DE,DICBUF        ;SET DMA FOR FIRST 128 BYTES
  471.     LD    C,SETDMA
  472.     CALL    BDOS
  473.     LD    DE,DICFCB        ;WRITE IT
  474.     LD    C,WRITE
  475.     CALL    BDOS
  476.     CP    0FFH            ;ERROR?
  477.     JR    Z,DWRERR
  478.     LD    DE,DICBUF+128        ;SET DMA FOR SECOND HALF
  479.     LD    C,SETDMA
  480.     CALL    BDOS
  481.     LD    DE,DICFCB        ;AND WRITE IT
  482.     LD    C,WRITE
  483.     CALL    BDOS
  484.     CP    0FFH            ;ERROR?
  485.     JR    Z,DWRERR
  486.     POP    HL
  487.     POP    DE
  488.     POP    BC
  489.     RET
  490. DWRERR:    LD    DE,DSKFUL        ;DISK FULL ERROR
  491.     LD    C,STROUT
  492.     CALL    BDOS
  493.     CALL    BOOT
  494. DSKFUL:    DB    'Disk full',CR,LF,'$'
  495.  
  496. MAKTBL:    PUSH    HL
  497.     PUSH    BC
  498.     LD    HL,DBSTR        ;STRING WITH CR,LF,"    DB    '"
  499.     LD    B,7            ;7 CHARACTERS
  500. MAKTB0:    LD    A,(HL)
  501.     INC    HL
  502.     CALL    PUTCHR
  503.     DJNZ    MAKTB0
  504.     LD    HL,SRCWRD        ;WORD
  505.     LD    B,4            ;AT MOST 4 CHARACTERS GO IN TABLE
  506.     LD    C,0            ;COUNTER
  507. MAKTB1:    LD    A,(HL)
  508.     INC    HL
  509.     CP    0            ;END OF WORD?
  510.     JR    Z,MAKTB2
  511.     CP    '%'
  512.     JR    Z,MAKTB2
  513.     PUSH    PSW
  514.     CALL    PUTCHR
  515.     POP    PSW
  516.     CP    QUOTE
  517.     JR    NZ,MAKTBP
  518.     CALL    PUTCHR            ;"'" MUST BE SENT TWICE
  519. MAKTBP:    INC    C
  520.     DJNZ    MAKTB1
  521.     LD    A,QUOTE            ;"'" CHARACTER
  522.     CALL    PUTCHR
  523.     JR    MAKRET
  524. MAKTB2:    LD    A,4            ;GET NUMBER OF CHARACTERS LEFT TO GO
  525.     SUB    C
  526.     LD    B,A
  527.     LD    A,QUOTE            ;"'" CHARACTER
  528.     CALL    PUTCHR
  529. MAKTB3:    LD    A,','            ;USE ,0 ISTEAD OF CHARACTER
  530.     CALL    PUTCHR
  531.     LD    A,'0'
  532.     CALL    PUTCHR
  533.     DJNZ    MAKTB3
  534. MAKRET:    POP    BC
  535.     POP    HL
  536.     RET
  537.  
  538.  
  539. GETWRD:    LD    A,0            ;ZERO LENGTH
  540.     LD    (LENGTH),A
  541.     LD    C,0            ;ZERO COUNTER
  542. GETWS0:    CALL    GETCHR            ;GET A CHARACTER
  543.     CP    EOF            ;END OF FILE?
  544.     RET    Z
  545.     CALL    LEGAL            ;TEST IF LEGAL
  546.     JR    Z,GETWR0        ;EXIT LOOP IF LEGAL
  547.     JR    GETWS0            ;LOOP UNTIL LEGAL
  548. GETWR0:    LD    C,1            ;UPDATE CHARACTER COUNTER
  549.     LD    HL,SRCWRD+1        ;INITIALIZE POINTER TO SRCWRD:
  550.     LD    (SRCWRD),A        ;STORE FIRST CHARACTER
  551. GETWR1:    CALL    GETCHR
  552.     CALL    LEGAL
  553.     JR    NZ,GETWR2        ;EXIT LOOP WHEN NOT WORD CHARACTER
  554.     LD    (HL),A
  555.     INC    HL
  556.     INC    C
  557.     JR    GETWR1
  558. GETWR2:    LD    (HL),0            ;MARK END OF WORD
  559.     LD    A,(LENGTH)        ;WAS % ALREADY REACHED?
  560.     CP    0
  561.     RET    Z            ;RETURN VALUE IN C IF NOT
  562.     LD    C,A
  563.     RET
  564.  
  565. LEGAL:    LD    B,A
  566.     AND    05FH            ;KILL PARITY AND LOWER CASE
  567.     CP    'A'            ;MUST BE GREATER THAN "A"
  568.     JP    C,LEGAL0
  569.     CP    'Z'+1            ;GREATER THAN "Z"
  570.     JP    NC,LEGAL0
  571.     LD    A,B
  572.     CP    A            ;SET ZERO FLAG
  573.     RET
  574. LEGAL0:    LD    A,B
  575.     AND    07FH            ;KILL ONLY PARITY
  576.     CP    27H            ;"'"
  577.     JR    Z,LEGAL1
  578.     CP    '%'            ;"%"
  579.     JR    NZ,LEGAL1
  580.     PUSH    PSW
  581.     LD    A,(LENGTH)        ;END ALREADY MARKED?
  582.     CP    0
  583.     JR    NZ,LEGRET
  584.     LD    A,C
  585.     LD    (LENGTH),A        ;MARK LENGTH OF WORD
  586. LEGRET:    POP    PSW
  587. LEGAL1:    LD    A,B
  588.     RET
  589.  
  590. GETCHR:    PUSH    BC
  591.     PUSH    DE
  592.     PUSH    HL
  593.     LD    HL,(INPTR)        ;POINTER FOR INPUT
  594.     LD    DE,INBUF+512        ;END OF INPUT BUFFER
  595.     XOR    A            ;CLEAR CARRY
  596.     PUSH    HL
  597.     SBC    HL,DE            ;AT END OF BUFFER?
  598.     POP    HL
  599.     JP    Z,GETCH0        ;REFILL BUFFER
  600.     LD    A,(HL)            ;GET THE CHARACTER
  601.     AND    07FH            ;KILL PARITY
  602.     INC    HL            ;INCREMENTED POINTER
  603.     LD    (INPTR),HL
  604. GETRET:    POP    HL
  605.     POP    DE
  606.     POP    BC
  607.     RET
  608. GETCH0:    LD    HL,INBUF
  609.     LD    DE,128
  610.     LD    C,4
  611. GETCH2:    PUSH    BC
  612.     PUSH    DE
  613.     PUSH    HL
  614.     LD    A,01AH            ;MARK START OF RECORD WITH EOF IN CASE
  615.                     ;EOF
  616.     LD    (HL),A
  617.     INC    HL
  618.     LD    (HL),A
  619.     DEC    HL
  620.     LD    D,H            ;SET UP DMA ADDRESS FOR READ
  621.     LD    E,L
  622.     LD    C,SETDMA
  623.     CALL    BDOS            ;SET DMA ADDRESS
  624.     LD    DE,IFCB
  625.     LD    C,READ            ;READ 128 BYTES OF INPUT FILE
  626.     CALL    BDOS
  627.     POP    HL
  628.     POP    DE
  629.     POP    BC
  630.     CP    0            ;SUCCESS?
  631.     JR    NZ,GETCH3        ;JUMP IF EOF
  632.     ADD    HL,DE            ;POINT TO NEXT RECORD ADDRESS
  633.     DEC    C
  634.     JP    NZ,GETCH2        ;LOOP FOR 4 RECORDS
  635. GETCH3:    LD    A,(INBUF)        ;GET FIRST CHARACTER
  636.     LD    (HL),EOF        ;PUT EOF AT BEGINNING OF FIRST UNUSED
  637.                     ;RECORD IN MEMORY
  638.     LD    HL,INBUF+1
  639.     LD    (INPTR),HL        ;SET UP POINTER TO RECORDS
  640.     JP    GETRET
  641.  
  642. DICZER:    PUSH    PSW
  643.     PUSH    BC
  644.     PUSH    HL
  645.     LD    B,0
  646.     LD    A,0
  647.     LD    HL,DICBUF
  648. DICZE0:    LD    (HL),A
  649.     INC    HL
  650.     DJNZ    DICZE0
  651.     POP    HL
  652.     POP    BC
  653.     POP    PSW
  654.     RET
  655.  
  656.  
  657.  
  658. PUTCHR:    PUSH    BC
  659.     PUSH    DE
  660.     PUSH    HL
  661.     LD    HL,(OPOSS)        ;GET CURRENT POSITION IN OBUFF
  662.     LD    (HL),A            ;PUT CHARACTER IN BUFFER
  663.     INC    HL
  664.     LD    (OPOSS),HL        ;UPDATE POINTER
  665.     LD    DE,OBUFF+512        ;AT END OF BUFFER?
  666.     XOR    A            ;CLEAR CARRY
  667.     SBC    HL,DE
  668.     JR    Z,PUTCH0        ;WRITE OUT DATA IF END OF BUFFER
  669. PUTRET:    POP    HL
  670.     POP    DE
  671.     POP    BC
  672.     RET
  673. PUTCH0:    LD    C,4            ;LOOP COUNTER
  674.     LD    HL,OBUFF        ;ADDRESS OF DATA
  675.     LD    DE,128            ;LENGTH OF EACH RECORD
  676. PUTCH1:    PUSH    BC
  677.     PUSH    DE
  678.     PUSH    HL
  679.     LD    D,H            ;SET UP DMA ADDRESS
  680.     LD    E,L
  681.     LD    C,SETDMA
  682.     CALL    BDOS
  683.     LD    DE,OFCB            ;WRITE RECORD TO OUTPUT FILE
  684.     LD    C,WRITE
  685.     CALL    BDOS
  686.     CP    0            ;SUCCESS?
  687.     JR    NZ,PUTCH2        ;JUMP IF DISK FULL
  688.     POP    HL
  689.     POP    DE
  690.     POP    BC
  691.     ADD    HL,DE            ;POINT TO NEXT RECORD
  692.     DEC    C
  693.     JP    NZ,PUTCH1        ;LOOP FOR 512 BYTE BUFFER
  694.     LD    HL,OBUFF        ;RESET POINTER
  695.     LD    (OPOSS),HL
  696.     CALL    CTRLZ            ;FILL BUFFER WITH EOF CHARACTER
  697.     JP    PUTRET            ;RETURN
  698. PUTCH2:    LD    C,STROUT        ;DISK FULL ERROR
  699.     LD    DE,DSKFUL
  700.     CALL    BDOS
  701.     CALL    BOOT            ;GIVE UP
  702.  
  703. CTRLZ:    LD    HL,OBUFF        ;BUFFER ADDRESS
  704.     LD    B,2            ;LOOP 256 BYTES 2 TIMES
  705.     LD    C,0
  706. CTRLZ0:    LD    (HL),EOF        ;PUT EOF IN BUFFER
  707.     INC    HL
  708.     DEC    C            ;FAST COUNTER
  709.     JR    NZ,CTRLZ0
  710.     DEC    B            ;SLOW COUNTER
  711.     JR    NZ,CTRLZ0
  712.     RET
  713.  
  714. YESNO:    LD    C,6            ;DIRECT CONSOLE I/O
  715.     LD    E,0FFH            ;INPUT
  716.     CALL    BDOS
  717.     AND    05FH            ;MAKE UPPER CASE
  718.     CP    0            ;NO CHARACTER YET?
  719.     JR    Z,YESNO
  720.     CP    'Y'            ;YES?
  721.     JR    Z,YESNO1
  722.     CP    'N'
  723.     JR    Z,YESNO2
  724.     LD    C,6            ;RING THE BELL (BAD INPUT)
  725.     LD    E,7
  726.     CALL    BDOS
  727.     JR    YESNO            ;TRY AGAIN
  728. YESNO1:    LD    DE,YESSTR        ;ECHO Y
  729.     LD    A,0            ;INDICATE YES
  730.     JR    YESNO3
  731. YESNO2:    LD    DE,NOSTR        ;ECHO N
  732.     LD    A,1            ;INDICATE NO
  733. YESNO3:    LD    C,STROUT
  734.     PUSH    PSW
  735.     CALL    BDOS
  736.     POP    PSW
  737.     AND    A
  738.     RET
  739.  
  740.  
  741.  
  742. INPTR:    DW    INBUF+512
  743. CURBYT:    DW    DICBUF-1
  744. CURBIT:    DB    0
  745. CURFLG:    DW    0
  746. BITS:    DW    256*8
  747. LENGTH:    DB    0
  748. OPOSS:    DW    OBUFF
  749.  
  750. EXDIC:    DB    'Delete current version of DICT.DIC? $'
  751. EXSPEL:    DB    'Delete current version of SPELL0.MAC? $'
  752. YESSTR:    DB    'Y',CR,LF,'$'
  753. NOSTR:    DB    'N',CR,LF,'$'
  754. TYPECR:    DB    'Insert a bootable disk in drive A and type CR$'
  755. MOREST:    DB    'More? (if Y, insert new disk in input drive) $'
  756.  
  757. DICFCB:    DB    0,'DICT    DIC'
  758.     DB    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  759. OFCB:    DB    0,'SPELL0  MAC'
  760.     DB    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  761.  
  762. TABTOP:    DB    'TABTOP::'
  763. TBTSTR:    DB    CR,LF,'    DB    ',QUOTE,'[[[[',QUOTE,CR,LF,'TABBOT::',CR,LF
  764. DBSTR:    DB    CR,LF,'    DB    ',QUOTE
  765. FLGDAT:    DB    'Z Y R G D M S H V J X T N P '
  766. FLGDA0:    DW    ZFLAG
  767.     DW    YFLAG
  768.     DW    RFLAG
  769.     DW    GFLAG
  770.     DW    DFLAG
  771.     DW    MFLAG
  772.     DW    SFLAG
  773.     DW    HFLAG
  774.     DW    VFLAG
  775.     DW    JFLAG
  776.     DW    XFLAG
  777.     DW    TFLAG
  778.     DW    NFLAG
  779.     DW    PFLAG
  780.  
  781. OLDWRD:    DB    0FFH
  782. STACK    EQU    $+50
  783. SRCWRD    EQU    STACK+80
  784. INBUF    EQU    SRCWRD+80
  785. OBUFF    EQU    INBUF+514
  786. DICBUF    EQU    OBUFF+513
  787. NEXT    EQU    DICBUF+256
  788.     END    START
  789.