'********************************************** '* Spin code generated by cspin version 0.066 * '********************************************** { Lerner 0.08 Copyright (c) 2011, Dave Hein See end of file for terms of use } CON _clkmode = xinput _xinfreq = $4e495053 ' SPIN OBJ c : "clib" ser : "cserial" 'i2c : "Basic_I2C_Driver" spinix : "exit" ' Constants CON TYPE_NOUN = 1 TYPE_VERB = 2 TYPE_PRONOUN = 3 TYPE_ADJECT = 4 TYPE_OTHER = 5 TYPE_NAME = 6 TYPE_ARTICLE = 7 TYPE_QUERY = 8 TYPE_RELATED = 32 TYPE_EQUATE = 33 TYPE_RELATE2 = 34 TYPE_MASK = $3f DELETE_MASK = $40 MEMORY_MASK = 31 BUF_SIZE = 10000 ' Global variables DAT speak long 0 seed long 1 debugmode long 0 changeflag long 0 MemoryIndex long 0 datstr byte "noun", 0, "verb", 0, "pronoun", 0, "adjective", 0 byte "other", 0, "name", 0, "article", 0, "query", 0 types long @datstr + 16, @datstr + 21, @datstr + 26, @datstr + 34 long @datstr + 44, @datstr + 50, @datstr + 55, @datstr + 63 ' Basic vocabulary basicsize long 249 basicvocab byte byte $03,$49,$00,$00,$19,$02,$61,$6d,$00,$00,$6b,$07,$61,$00,$00,$00 byte $01,$68,$75,$6d,$61,$6e,$00,$00,$00,$20,$00,$05,$00,$10,$00,$00 byte $03,$79,$6f,$75,$00,$00,$38,$02,$61,$72,$65,$00,$00,$70,$06,$4c byte $65,$72,$6e,$65,$72,$00,$00,$50,$20,$00,$27,$00,$2e,$00,$61,$02 byte $69,$73,$00,$00,$75,$01,$70,$72,$6f,$67,$72,$61,$6d,$00,$00,$00 byte $20,$00,$3f,$00,$45,$00,$66,$02,$65,$71,$75,$61,$6c,$73,$00,$01 byte $17,$21,$00,$2e,$00,$00,$21,$00,$20,$00,$00,$21,$00,$27,$00,$7a byte $21,$00,$05,$01,$04,$21,$00,$05,$00,$7f,$21,$00,$3f,$00,$00,$21 byte $00,$27,$00,$00,$21,$00,$3f,$00,$00,$02,$65,$71,$75,$61,$6c,$00 byte $01,$12,$21,$00,$57,$00,$00,$21,$01,$09,$00,$00,$08,$77,$68,$6f byte $00,$01,$2b,$08,$77,$68,$61,$74,$00,$01,$30,$21,$01,$23,$00,$00 byte $21,$01,$1c,$00,$00,$01,$63,$6f,$6d,$70,$75,$74,$65,$72,$00,$01 byte $49,$02,$72,$75,$6e,$73,$00,$01,$74,$20,$01,$41,$00,$45,$00,$00 byte $02,$64,$6f,$65,$73,$00,$01,$6a,$02,$72,$75,$6e,$00,$01,$6f,$02 byte $64,$6f,$00,$01,$65,$21,$01,$50,$00,$00,$21,$01,$5f,$00,$00,$21 byte $01,$41,$00,$00,$21,$01,$58,$00,$00 ' **************************************************** ' Replace the following lines with the dumped output ' **************************************************** version long 2 size long 6923 vocab byte byte $03,$49,$00,$00,$14,$02,$61,$6d,$00,$00,$53,$01,$68,$75,$6d,$61 byte $6e,$00,$00,$6d,$20,$00,$05,$00,$0b,$00,$2e,$01,$70,$72,$6f,$67 byte $72,$61,$6d,$00,$01,$59,$01,$50,$72,$6f,$70,$00,$02,$0f,$20,$00 byte $1b,$00,$26,$00,$45,$02,$63,$61,$6e,$00,$00,$00,$06,$73,$6c,$65 byte $65,$70,$00,$03,$1d,$20,$00,$35,$00,$3c,$00,$00,$02,$61,$72,$65 byte $00,$03,$26,$21,$00,$4c,$00,$5e,$02,$69,$73,$00,$03,$30,$21,$00 byte $58,$00,$00,$01,$6d,$61,$6d,$6d,$61,$6c,$00,$03,$44,$20,$00,$58 byte $00,$63,$00,$7e,$04,$6c,$69,$76,$69,$6e,$67,$00,$03,$62,$20,$00 byte $58,$00,$74,$01,$05,$20,$00,$35,$00,$3c,$01,$15,$04,$74,$68,$69 byte $6e,$6b,$00,$04,$07,$20,$00,$35,$01,$0c,$01,$25,$01,$62,$65,$69 byte $6e,$67,$00,$31,$53,$22,$00,$58,$00,$74,$01,$1c,$01,$38,$01,$68 byte $75,$6d,$61,$6e,$73,$00,$35,$2f,$21,$01,$2e,$01,$46,$02,$6c,$65 byte $61,$72,$6e,$00,$2f,$4e,$20,$00,$35,$01,$3d,$00,$00,$06,$73,$6f byte $66,$74,$77,$61,$72,$65,$00,$04,$13,$20,$00,$58,$01,$4d,$01,$6f byte $01,$61,$70,$70,$6c,$69,$63,$61,$74,$69,$6f,$6e,$00,$04,$1a,$20 byte $00,$58,$01,$60,$02,$02,$01,$70,$72,$6f,$67,$72,$61,$6d,$73,$00 byte $14,$62,$21,$01,$76,$00,$00,$01,$70,$72,$6f,$70,$00,$04,$21,$21 byte $02,$07,$02,$21,$01,$70,$72,$6f,$70,$65,$6c,$6c,$65,$72,$00,$05 byte $7a,$21,$02,$14,$02,$33,$01,$50,$72,$6f,$70,$65,$6c,$6c,$65,$72 byte $00,$06,$6a,$21,$02,$26,$02,$40,$02,$72,$75,$6e,$73,$00,$07,$73 byte $20,$02,$38,$01,$4d,$02,$53,$06,$68,$61,$72,$64,$77,$61,$72,$65 byte $00,$08,$01,$20,$00,$58,$02,$47,$02,$6d,$02,$68,$61,$73,$00,$08 byte $33,$01,$63,$6f,$75,$6e,$74,$65,$72,$73,$00,$08,$45,$20,$02,$5a byte $02,$61,$02,$7c,$02,$75,$73,$65,$73,$00,$08,$63,$20,$02,$74,$02 byte $61,$03,$0b,$01,$63,$68,$69,$70,$00,$08,$73,$20,$00,$58,$03,$03 byte $00,$00,$04,$64,$6f,$72,$6d,$61,$6e,$74,$00,$35,$74,$22,$00,$58 byte $01,$1c,$03,$12,$00,$00,$21,$00,$05,$03,$2b,$21,$00,$58,$00,$00 byte $21,$00,$05,$03,$35,$21,$00,$4c,$00,$00,$01,$61,$6e,$69,$6d,$61 byte $6c,$00,$09,$39,$20,$00,$58,$03,$3a,$03,$4b,$20,$00,$58,$00,$74 byte $00,$00,$04,$6d,$65,$74,$61,$62,$6f,$6c,$69,$7a,$69,$6e,$67,$00 byte $2b,$5e,$20,$00,$58,$03,$52,$03,$76,$04,$62,$72,$65,$61,$74,$68 byte $69,$6e,$67,$00,$30,$2e,$20,$00,$58,$03,$69,$00,$00,$04,$72,$65 byte $61,$73,$6f,$6e,$00,$2b,$52,$20,$00,$58,$03,$7d,$04,$0e,$21,$03 byte $7d,$00,$00,$20,$00,$58,$00,$1b,$00,$00,$20,$00,$58,$00,$1b,$00 byte $00,$21,$02,$14,$04,$26,$21,$02,$26,$04,$2b,$21,$00,$26,$04,$37 byte $01,$68,$75,$62,$00,$09,$40,$20,$02,$5a,$04,$30,$04,$48,$06,$6d byte $65,$6d,$6f,$72,$79,$00,$09,$52,$20,$02,$5a,$04,$3e,$04,$62,$01 byte $6d,$69,$63,$72,$6f,$63,$6f,$6e,$74,$72,$6f,$6c,$6c,$65,$72,$00 byte $09,$79,$20,$00,$58,$04,$4f,$04,$71,$06,$50,$41,$53,$4d,$00,$0a byte $0c,$20,$02,$38,$04,$69,$05,$07,$01,$69,$6e,$74,$65,$72,$70,$72 byte $65,$74,$65,$72,$00,$0a,$57,$20,$02,$5a,$04,$78,$05,$15,$06,$49 byte $2f,$4f,$00,$0b,$1a,$20,$02,$5a,$05,$0e,$05,$1c,$20,$00,$35,$00 byte $3c,$05,$2b,$04,$66,$61,$73,$74,$00,$00,$00,$22,$00,$58,$05,$23 byte $03,$03,$05,$45,$04,$65,$69,$67,$68,$74,$00,$2e,$12,$01,$63,$6f byte $67,$73,$00,$0c,$53,$22,$02,$5a,$05,$34,$05,$3d,$05,$71,$02,$69 byte $6e,$74,$65,$72,$70,$72,$65,$74,$73,$00,$00,$00,$06,$53,$70,$69 byte $6e,$00,$0b,$21,$01,$62,$79,$74,$65,$63,$6f,$64,$65,$73,$00,$10 byte $53,$22,$05,$4e,$05,$5c,$05,$64,$00,$00,$21,$02,$07,$05,$7f,$21 byte $02,$26,$06,$04,$21,$00,$26,$06,$09,$20,$02,$38,$05,$23,$06,$10 byte $20,$02,$38,$05,$5c,$06,$17,$20,$02,$5a,$05,$3d,$06,$25,$06,$52 byte $41,$4d,$00,$0c,$58,$20,$02,$5a,$06,$1e,$06,$35,$01,$6c,$6f,$63 byte $6b,$73,$00,$0c,$67,$20,$02,$5a,$06,$2c,$06,$44,$01,$70,$69,$6e byte $73,$00,$0c,$7a,$20,$02,$5a,$06,$3c,$06,$52,$06,$52,$4f,$4d,$00 byte $0d,$1d,$20,$02,$5a,$06,$4b,$06,$61,$04,$67,$6f,$6f,$64,$00,$2c byte $0b,$22,$00,$58,$06,$59,$03,$03,$00,$00,$21,$02,$07,$06,$6f,$21 byte $02,$14,$06,$74,$21,$00,$26,$07,$05,$04,$70,$6f,$77,$65,$72,$66 byte $75,$6c,$00,$0d,$2e,$20,$00,$58,$06,$79,$07,$16,$01,$50,$38,$58 byte $33,$32,$41,$00,$0d,$3f,$20,$00,$58,$07,$0c,$07,$1d,$20,$00,$58 byte $05,$23,$07,$3a,$02,$67,$65,$6e,$65,$72,$61,$74,$65,$73,$00,$0d byte $50,$04,$76,$69,$64,$65,$6f,$00,$0d,$60,$20,$07,$24,$07,$31,$07 byte $4a,$04,$61,$75,$64,$69,$6f,$00,$0e,$03,$20,$07,$24,$07,$41,$07 byte $5e,$04,$76,$65,$72,$73,$61,$74,$69,$6c,$65,$00,$0e,$16,$20,$00 byte $58,$07,$51,$07,$65,$20,$05,$4e,$05,$5c,$00,$00,$02,$72,$75,$6e byte $00,$0e,$1d,$21,$07,$6c,$00,$00,$04,$73,$74,$75,$66,$66,$00,$0e byte $2f,$20,$00,$58,$07,$78,$08,$22,$04,$65,$6c,$65,$63,$74,$72,$69 byte $63,$61,$6c,$00,$00,$00,$01,$63,$69,$72,$63,$75,$69,$74,$73,$00 byte $00,$00,$22,$00,$58,$08,$08,$08,$16,$00,$00,$02,$68,$61,$76,$65 byte $00,$0e,$36,$21,$08,$2b,$00,$00,$01,$72,$65,$67,$69,$73,$74,$65 byte $72,$73,$00,$0e,$3b,$20,$00,$4c,$08,$38,$08,$57,$01,$63,$6f,$75 byte $6e,$74,$65,$72,$00,$2b,$65,$21,$08,$4c,$00,$00,$02,$75,$73,$65 byte $00,$0e,$42,$21,$08,$5c,$00,$00,$06,$73,$69,$6c,$69,$63,$6f,$6e byte $00,$0e,$52,$20,$00,$58,$08,$68,$09,$05,$01,$63,$69,$72,$63,$75 byte $69,$74,$00,$0f,$07,$20,$00,$58,$08,$7a,$09,$0c,$22,$00,$58,$08 byte $08,$08,$7a,$09,$23,$04,$69,$6e,$74,$65,$67,$72,$61,$74,$65,$64 byte $00,$31,$6d,$22,$00,$58,$09,$15,$08,$7a,$09,$32,$01,$49,$43,$00 byte $31,$74,$20,$00,$58,$09,$2c,$00,$00,$20,$00,$58,$00,$74,$00,$00 byte $20,$02,$5a,$06,$1e,$00,$00,$06,$73,$74,$6f,$72,$61,$67,$65,$00 byte $14,$56,$20,$00,$58,$09,$47,$09,$63,$02,$73,$74,$6f,$72,$65,$73 byte $00,$14,$5d,$20,$09,$59,$01,$76,$09,$72,$06,$64,$61,$74,$61,$00 byte $12,$13,$20,$09,$59,$09,$6a,$00,$00,$20,$00,$58,$03,$03,$00,$00 byte $06,$61,$73,$73,$65,$6d,$62,$6c,$79,$00,$14,$6e,$20,$00,$58,$0a byte $00,$0a,$1f,$01,$6c,$61,$6e,$67,$75,$61,$67,$65,$00,$10,$3d,$20 byte $00,$58,$0a,$13,$0a,$33,$04,$61,$73,$73,$65,$6d,$62,$6c,$65,$64 byte $00,$14,$75,$20,$00,$58,$0a,$26,$0a,$3a,$20,$00,$58,$05,$23,$0a byte $41,$22,$00,$58,$0a,$00,$0a,$13,$0a,$52,$06,$70,$61,$73,$6d,$00 byte $31,$5c,$21,$0a,$4a,$00,$00,$20,$00,$58,$00,$1b,$0a,$7a,$02,$65 byte $78,$65,$63,$75,$74,$65,$73,$00,$00,$00,$01,$69,$6e,$73,$74,$72 byte $75,$63,$74,$69,$6f,$6e,$73,$00,$14,$7c,$20,$0a,$5e,$0a,$6a,$0b byte $0c,$01,$6f,$70,$63,$6f,$64,$65,$73,$00,$15,$17,$20,$0a,$5e,$0b byte $01,$0b,$13,$20,$00,$58,$01,$4d,$00,$00,$20,$02,$74,$06,$3c,$00 byte $00,$20,$00,$58,$0a,$13,$0b,$33,$01,$6f,$62,$6a,$65,$63,$74,$73 byte $00,$00,$00,$20,$02,$5a,$0b,$28,$0b,$3a,$20,$02,$74,$05,$64,$0b byte $4d,$04,$63,$6f,$6d,$70,$69,$6c,$65,$64,$00,$11,$02,$20,$00,$58 byte $0b,$41,$0b,$5d,$01,$73,$74,$61,$63,$6b,$00,$11,$09,$20,$02,$74 byte $0b,$54,$0b,$6f,$04,$63,$6f,$6d,$70,$61,$63,$74,$00,$11,$2f,$20 byte $00,$58,$0b,$64,$0c,$01,$01,$6d,$65,$74,$68,$6f,$64,$73,$00,$11 byte $40,$20,$02,$74,$0b,$76,$0c,$08,$20,$02,$5a,$0b,$76,$0c,$1c,$01 byte $76,$61,$72,$69,$61,$62,$6c,$65,$73,$00,$11,$4e,$20,$02,$5a,$0c byte $0f,$0c,$23,$20,$02,$5a,$09,$6a,$0c,$32,$06,$73,$70,$69,$6e,$00 byte $12,$1a,$21,$0c,$2a,$0c,$43,$01,$63,$6f,$6d,$70,$75,$74,$65,$72 byte $00,$12,$55,$22,$00,$58,$0c,$37,$0a,$13,$00,$00,$01,$63,$6f,$67 byte $00,$15,$2b,$21,$0c,$4c,$00,$00,$20,$00,$58,$04,$3e,$00,$00,$01 byte $6c,$6f,$63,$6b,$00,$15,$4d,$21,$0c,$5f,$00,$00,$01,$63,$6f,$6e byte $6e,$65,$63,$74,$6f,$72,$73,$00,$00,$00,$20,$00,$4c,$0c,$6c,$0d byte $0a,$01,$70,$6c,$75,$67,$73,$00,$2c,$58,$20,$00,$4c,$0d,$01,$0d byte $18,$01,$70,$69,$6e,$00,$35,$5c,$21,$0d,$11,$00,$00,$20,$00,$58 byte $04,$3e,$00,$00,$04,$73,$74,$72,$6f,$6e,$67,$00,$00,$00,$20,$00 byte $58,$0d,$24,$00,$00,$01,$70,$38,$78,$33,$32,$61,$00,$10,$02,$21 byte $0d,$35,$00,$00,$02,$67,$65,$6e,$65,$72,$61,$74,$65,$00,$10,$0e byte $21,$0d,$44,$00,$00,$04,$76,$69,$73,$69,$62,$6c,$65,$00,$21,$51 byte $20,$00,$58,$0d,$55,$0d,$71,$01,$73,$69,$67,$6e,$61,$6c,$00,$00 byte $00,$22,$00,$58,$08,$08,$0d,$67,$00,$00,$06,$73,$6f,$75,$6e,$64 byte $00,$10,$13,$20,$00,$58,$0d,$7a,$00,$00,$04,$66,$6c,$65,$78,$69 byte $62,$6c,$65,$00,$10,$2c,$20,$00,$58,$0e,$0a,$00,$00,$21,$02,$38 byte $00,$00,$04,$73,$6f,$6d,$65,$74,$68,$69,$6e,$67,$00,$16,$5d,$20 byte $00,$58,$0e,$22,$00,$00,$21,$02,$5a,$00,$00,$20,$00,$4c,$04,$3e byte $00,$00,$21,$02,$74,$00,$00,$01,$6d,$69,$6e,$65,$72,$61,$6c,$00 byte $16,$71,$20,$00,$58,$0e,$47,$0e,$64,$01,$65,$6c,$65,$6d,$65,$6e byte $74,$00,$00,$00,$20,$00,$58,$0e,$59,$0e,$76,$06,$53,$69,$6c,$69 byte $63,$6f,$6e,$00,$2c,$06,$21,$0e,$6b,$00,$00,$04,$65,$6c,$65,$63 byte $74,$72,$69,$63,$00,$17,$42,$20,$00,$58,$0e,$7b,$00,$00,$07,$61 byte $00,$00,$00,$03,$79,$6f,$75,$00,$0f,$24,$06,$4c,$65,$72,$6e,$65 byte $72,$00,$0f,$30,$20,$00,$4c,$0f,$1a,$0f,$2b,$21,$0f,$1a,$00,$00 byte $20,$00,$58,$00,$1b,$0f,$37,$21,$0f,$13,$0f,$3c,$20,$00,$58,$01 byte $60,$0f,$43,$20,$00,$58,$02,$26,$0f,$4a,$20,$00,$58,$07,$0c,$0f byte $51,$22,$00,$58,$0c,$37,$00,$1b,$0f,$5a,$20,$00,$35,$01,$3d,$0f byte $79,$04,$61,$72,$74,$69,$66,$69,$63,$69,$61,$6c,$00,$00,$00,$01 byte $65,$6e,$74,$69,$74,$79,$00,$00,$00,$22,$00,$58,$0f,$61,$0f,$6f byte $00,$00,$20,$00,$58,$02,$14,$10,$09,$21,$07,$0c,$00,$00,$21,$07 byte $24,$00,$00,$20,$00,$58,$07,$41,$10,$25,$04,$61,$75,$64,$69,$62 byte $6c,$65,$00,$2c,$76,$20,$00,$58,$10,$1a,$00,$00,$20,$00,$58,$07 byte $51,$00,$00,$06,$73,$79,$6e,$74,$61,$78,$00,$16,$00,$20,$02,$5a byte $10,$33,$00,$00,$04,$69,$6e,$74,$65,$72,$70,$72,$65,$74,$65,$64 byte $00,$00,$00,$20,$00,$4c,$10,$44,$10,$5a,$20,$00,$4c,$0b,$64,$10 byte $69,$06,$63,$6f,$64,$65,$00,$16,$1b,$20,$00,$4c,$10,$61,$10,$79 byte $01,$63,$6f,$64,$65,$73,$00,$00,$00,$22,$00,$4c,$0b,$64,$10,$70 byte $00,$00,$20,$00,$58,$0a,$26,$00,$00,$20,$00,$58,$09,$47,$11,$10 byte $20,$00,$58,$04,$3e,$11,$1f,$01,$46,$49,$46,$4f,$00,$2b,$71,$20 byte $00,$58,$11,$17,$00,$00,$04,$73,$6d,$61,$6c,$6c,$00,$16,$2c,$20 byte $00,$58,$11,$26,$00,$00,$01,$6d,$65,$74,$68,$6f,$64,$00,$16,$3e byte $21,$11,$36,$00,$00,$02,$73,$74,$6f,$72,$65,$00,$16,$4a,$20,$11 byte $45,$09,$6a,$11,$6a,$04,$73,$79,$6d,$62,$6f,$6c,$69,$63,$00,$00 byte $00,$01,$6e,$61,$6d,$65,$73,$00,$31,$11,$22,$00,$4c,$11,$55,$11 byte $61,$11,$7f,$01,$76,$61,$72,$69,$61,$62,$6c,$65,$00,$35,$2a,$21 byte $11,$73,$00,$00,$06,$69,$6e,$66,$6f,$72,$6d,$61,$74,$69,$6f,$6e byte $00,$2c,$12,$20,$00,$58,$12,$04,$00,$00,$21,$05,$5c,$00,$00,$02 byte $65,$71,$75,$61,$6c,$73,$00,$12,$32,$02,$65,$71,$75,$61,$6c,$00 byte $12,$37,$21,$12,$29,$00,$00,$21,$12,$1f,$00,$00,$08,$77,$68,$6f byte $00,$12,$4b,$08,$77,$68,$61,$74,$00,$12,$50,$21,$12,$43,$00,$00 byte $21,$12,$3c,$00,$00,$20,$02,$38,$00,$1b,$12,$5c,$20,$00,$58,$02 byte $47,$12,$6d,$01,$64,$65,$76,$69,$63,$65,$00,$00,$00,$22,$00,$58 byte $08,$08,$12,$63,$12,$76,$20,$02,$38,$01,$76,$12,$7d,$20,$02,$38 byte $01,$4d,$00,$00,$02,$64,$6f,$65,$73,$00,$13,$12,$02,$64,$6f,$00 byte $13,$17,$21,$13,$0c,$00,$00,$21,$13,$04,$00,$00,$06,$50,$61,$72 byte $61,$6c,$6c,$61,$78,$00,$13,$33,$01,$63,$6f,$6d,$70,$61,$6e,$79 byte $00,$13,$66,$20,$00,$58,$13,$28,$13,$43,$02,$6d,$61,$6b,$65,$73 byte $00,$13,$75,$20,$13,$3a,$02,$07,$13,$53,$02,$73,$65,$6c,$6c,$73 byte $00,$14,$1f,$20,$13,$4a,$02,$26,$00,$00,$01,$62,$75,$73,$69,$6e byte $65,$73,$73,$00,$00,$00,$20,$00,$58,$13,$5a,$00,$00,$02,$6d,$61 byte $6b,$65,$00,$14,$24,$21,$13,$6d,$14,$03,$02,$62,$75,$69,$6c,$64 byte $00,$14,$33,$21,$13,$7a,$14,$12,$02,$62,$75,$69,$6c,$64,$73,$00 byte $14,$42,$21,$14,$08,$00,$00,$02,$73,$65,$6c,$6c,$00,$14,$51,$21 byte $14,$17,$00,$00,$21,$13,$3a,$14,$29,$21,$13,$7a,$14,$2e,$21,$14 byte $08,$00,$00,$21,$14,$08,$14,$38,$21,$13,$6d,$14,$3d,$21,$13,$3a byte $00,$00,$21,$13,$7a,$14,$47,$21,$13,$6d,$14,$4c,$21,$13,$3a,$00 byte $00,$21,$13,$4a,$00,$00,$20,$00,$58,$04,$3e,$00,$00,$21,$11,$45 byte $00,$00,$20,$00,$4c,$0a,$6a,$14,$69,$21,$00,$1b,$00,$00,$20,$00 byte $58,$0a,$13,$00,$00,$20,$00,$58,$0b,$41,$00,$00,$20,$00,$4c,$10 byte $61,$15,$12,$01,$69,$6e,$73,$74,$72,$75,$63,$74,$69,$6f,$6e,$00 byte $33,$1f,$21,$15,$03,$00,$00,$20,$00,$4c,$0a,$6a,$00,$00,$01,$70 byte $72,$6f,$63,$65,$73,$73,$6f,$72,$00,$16,$56,$20,$00,$58,$15,$1e byte $15,$3a,$01,$63,$6f,$72,$65,$00,$00,$00,$20,$00,$58,$15,$32,$15 byte $41,$20,$00,$35,$00,$3c,$15,$48,$21,$05,$3d,$00,$00,$21,$06,$2c byte $15,$5f,$01,$73,$65,$6d,$61,$70,$68,$6f,$72,$65,$00,$00,$00,$20 byte $00,$58,$15,$52,$15,$70,$04,$61,$74,$6f,$6d,$69,$63,$00,$00,$00 byte $20,$00,$58,$15,$66,$00,$00,$01,$72,$75,$6c,$65,$73,$00,$00,$00 byte $20,$02,$5a,$15,$77,$16,$14,$04,$73,$74,$72,$75,$63,$74,$75,$72 byte $65,$00,$17,$59,$20,$02,$5a,$16,$07,$00,$00,$20,$00,$58,$0a,$6a byte $00,$00,$04,$6c,$69,$74,$74,$6c,$65,$00,$2e,$0b,$20,$00,$58,$16 byte $22,$00,$00,$01,$72,$6f,$75,$74,$69,$6e,$65,$00,$17,$60,$20,$00 byte $58,$16,$33,$16,$45,$21,$0b,$76,$00,$00,$21,$09,$59,$00,$00,$01 byte $43,$50,$55,$00,$1a,$77,$20,$00,$58,$16,$4f,$00,$00,$20,$00,$58 byte $07,$78,$00,$00,$01,$73,$75,$62,$73,$74,$61,$6e,$63,$65,$00,$2c byte $34,$20,$00,$58,$16,$64,$17,$04,$01,$63,$68,$65,$6d,$69,$63,$61 byte $6c,$00,$2c,$3b,$20,$00,$58,$16,$78,$17,$14,$04,$73,$6f,$6c,$69 byte $64,$00,$2c,$42,$20,$00,$58,$17,$0b,$17,$1b,$22,$00,$58,$16,$78 byte $16,$64,$17,$24,$22,$00,$58,$17,$0b,$16,$64,$17,$2d,$22,$00,$58 byte $17,$0b,$16,$78,$00,$00,$04,$73,$68,$6f,$63,$6b,$69,$6e,$67,$00 byte $2b,$6a,$20,$00,$58,$17,$36,$00,$00,$04,$6f,$72,$67,$61,$6e,$69 byte $7a,$61,$74,$69,$6f,$6e,$00,$2c,$5f,$20,$00,$58,$17,$49,$00,$00 byte $20,$00,$58,$00,$1b,$17,$67,$22,$00,$58,$11,$26,$00,$1b,$00,$00 byte $06,$53,$75,$6e,$64,$61,$79,$00,$18,$01,$01,$64,$61,$79,$00,$18 byte $20,$20,$00,$58,$17,$7a,$00,$00,$04,$74,$77,$65,$6e,$74,$79,$2d byte $66,$6f,$75,$72,$00,$32,$5f,$01,$68,$6f,$75,$72,$73,$00,$00,$00 byte $22,$00,$58,$18,$08,$18,$17,$18,$31,$01,$64,$61,$79,$73,$00,$2d byte $3d,$21,$18,$29,$00,$00,$06,$4d,$6f,$6e,$64,$61,$79,$00,$18,$40 byte $20,$00,$58,$17,$7a,$00,$00,$06,$54,$75,$65,$73,$64,$61,$79,$00 byte $18,$52,$20,$00,$58,$17,$7a,$00,$00,$06,$57,$65,$64,$6e,$65,$73 byte $64,$61,$79,$00,$18,$66,$20,$00,$58,$17,$7a,$00,$00,$06,$54,$68 byte $75,$72,$73,$64,$61,$79,$00,$18,$79,$20,$00,$58,$17,$7a,$00,$00 byte $06,$46,$72,$69,$64,$61,$79,$00,$19,$0a,$20,$00,$58,$17,$7a,$00 byte $00,$06,$53,$61,$74,$75,$72,$64,$61,$79,$00,$19,$1d,$20,$00,$58 byte $17,$7a,$00,$00,$06,$4a,$61,$6e,$75,$61,$72,$79,$00,$19,$38,$01 byte $6d,$6f,$6e,$74,$68,$00,$19,$49,$20,$00,$58,$19,$2f,$00,$00,$01 byte $6d,$6f,$6e,$74,$68,$73,$00,$2e,$4f,$21,$19,$3f,$00,$00,$06,$4d byte $61,$72,$63,$68,$00,$19,$57,$20,$00,$58,$19,$2f,$00,$00,$06,$41 byte $70,$72,$69,$6c,$00,$19,$67,$20,$00,$58,$19,$2f,$00,$00,$06,$4d byte $61,$79,$00,$19,$75,$20,$00,$58,$19,$2f,$00,$00,$06,$4a,$75,$6e byte $65,$00,$1a,$04,$20,$00,$58,$19,$2f,$00,$00,$06,$4a,$75,$6c,$79 byte $00,$1a,$13,$20,$00,$58,$19,$2f,$00,$00,$06,$41,$75,$67,$75,$73 byte $74,$00,$1a,$24,$20,$00,$58,$19,$2f,$00,$00,$06,$53,$65,$70,$74 byte $65,$6d,$62,$65,$72,$00,$1a,$38,$20,$00,$58,$19,$2f,$00,$00,$06 byte $4f,$63,$74,$6f,$62,$65,$72,$00,$1a,$4a,$20,$00,$58,$19,$2f,$00 byte $00,$06,$4e,$6f,$76,$65,$6d,$62,$65,$72,$00,$1a,$5d,$20,$00,$58 byte $19,$2f,$00,$00,$06,$44,$65,$63,$65,$6d,$62,$65,$72,$00,$1a,$70 byte $20,$00,$58,$19,$2f,$00,$00,$20,$00,$58,$15,$1e,$00,$00,$06,$46 byte $65,$62,$72,$75,$61,$72,$79,$00,$1b,$0a,$20,$00,$58,$19,$2f,$00 byte $00,$06,$57,$69,$6e,$74,$65,$72,$00,$1b,$25,$01,$73,$65,$61,$73 byte $6f,$6e,$00,$1b,$56,$20,$00,$58,$1b,$1b,$1b,$34,$04,$63,$6f,$6c byte $64,$00,$1c,$0d,$20,$00,$58,$1b,$2c,$1b,$3b,$22,$00,$58,$1b,$2c byte $1b,$1b,$00,$00,$01,$74,$69,$6d,$65,$00,$00,$00,$01,$70,$65,$72 byte $69,$6f,$64,$00,$00,$00,$22,$00,$58,$1b,$44,$1b,$4c,$1b,$75,$04 byte $6f,$6e,$65,$2d,$66,$6f,$75,$72,$74,$68,$00,$33,$24,$01,$79,$65 byte $61,$72,$00,$2e,$23,$22,$00,$58,$1b,$5f,$1b,$6d,$00,$00,$01,$74 byte $65,$6d,$70,$65,$72,$61,$74,$75,$72,$65,$00,$00,$00,$20,$00,$58 byte $1b,$7e,$00,$00,$06,$53,$75,$6d,$6d,$65,$72,$00,$1c,$1e,$20,$00 byte $58,$1b,$1b,$1c,$2c,$04,$68,$6f,$74,$00,$1c,$3c,$20,$00,$58,$1c byte $25,$1c,$33,$22,$00,$58,$1c,$25,$1b,$1b,$00,$00,$20,$00,$58,$1b byte $7e,$00,$00,$06,$53,$70,$72,$69,$6e,$67,$00,$1c,$4d,$20,$00,$58 byte $1b,$1b,$1c,$5c,$04,$6e,$69,$63,$65,$00,$1c,$63,$20,$00,$58,$1c byte $54,$00,$00,$20,$00,$58,$06,$59,$1c,$76,$04,$70,$6c,$65,$61,$73 byte $69,$6e,$67,$00,$2c,$66,$20,$00,$58,$1c,$6a,$00,$00,$06,$41,$75 byte $74,$75,$6d,$6e,$00,$1d,$07,$20,$00,$58,$1b,$1b,$1d,$0e,$20,$00 byte $58,$1c,$54,$00,$00,$01,$63,$61,$74,$00,$1d,$1c,$20,$00,$58,$00 byte $63,$1d,$23,$20,$00,$58,$03,$3a,$1d,$3a,$02,$73,$61,$79,$73,$00 byte $00,$00,$04,$6d,$65,$6f,$77,$00,$1d,$5f,$20,$1d,$2a,$1d,$32,$1d byte $41,$20,$00,$35,$00,$3c,$1d,$48,$22,$00,$58,$11,$26,$00,$63,$1d byte $58,$01,$70,$65,$74,$00,$32,$26,$20,$00,$58,$1d,$51,$00,$00,$20 byte $00,$58,$0d,$7a,$00,$00,$07,$61,$6e,$00,$00,$00,$01,$64,$6f,$67 byte $00,$1d,$73,$20,$00,$58,$03,$3a,$1d,$7a,$20,$00,$58,$00,$63,$1e byte $09,$04,$77,$6f,$6f,$66,$00,$1e,$31,$20,$1d,$2a,$1e,$01,$1e,$10 byte $20,$00,$35,$00,$3c,$1e,$17,$20,$00,$58,$1d,$51,$1e,$28,$01,$74 byte $72,$69,$63,$6b,$73,$00,$00,$00,$22,$00,$35,$01,$3d,$1e,$1e,$00 byte $00,$20,$00,$58,$0d,$7a,$00,$00,$01,$70,$6c,$61,$6e,$74,$00,$1e byte $41,$20,$00,$58,$00,$74,$1e,$51,$04,$67,$72,$65,$65,$6e,$00,$1e byte $61,$20,$00,$58,$1e,$48,$00,$00,$01,$63,$6f,$6c,$6f,$72,$00,$1e byte $71,$20,$00,$58,$1e,$58,$00,$00,$04,$6c,$69,$67,$68,$74,$00,$21 byte $09,$20,$00,$58,$1e,$68,$1e,$78,$22,$00,$58,$0d,$55,$1e,$68,$00 byte $00,$01,$74,$72,$65,$65,$00,$1f,$09,$20,$00,$58,$1e,$38,$1f,$1a byte $01,$6c,$65,$61,$76,$65,$73,$00,$00,$00,$20,$02,$5a,$1f,$10,$1f byte $2a,$01,$72,$6f,$6f,$74,$73,$00,$00,$00,$20,$02,$5a,$1f,$21,$00 byte $00,$07,$74,$68,$65,$00,$00,$00,$01,$73,$6b,$79,$00,$1f,$47,$04 byte $62,$6c,$75,$65,$00,$1f,$5f,$20,$00,$58,$1f,$3f,$1f,$58,$04,$63 byte $6c,$6f,$75,$64,$73,$00,$1f,$6f,$20,$02,$5a,$1f,$4e,$00,$00,$20 byte $00,$58,$1e,$58,$00,$00,$04,$77,$68,$69,$74,$65,$00,$20,$47,$20 byte $00,$4c,$1f,$66,$1f,$7d,$04,$77,$65,$74,$00,$20,$7d,$20,$00,$4c byte $1f,$76,$20,$0d,$01,$63,$6c,$6f,$75,$64,$00,$21,$04,$21,$20,$04 byte $20,$26,$02,$63,$6f,$6e,$74,$61,$69,$6e,$00,$00,$00,$04,$77,$61 byte $74,$65,$72,$00,$25,$33,$20,$20,$12,$20,$1d,$20,$40,$02,$70,$72 byte $6f,$64,$75,$63,$65,$00,$00,$00,$06,$72,$61,$69,$6e,$00,$30,$03 byte $20,$20,$2d,$20,$38,$00,$00,$20,$00,$58,$1e,$58,$20,$6b,$02,$63 byte $6f,$6e,$74,$61,$69,$6e,$73,$00,$00,$00,$04,$61,$6c,$6c,$00,$00 byte $00,$01,$63,$6f,$6c,$6f,$72,$73,$00,$00,$00,$22,$20,$4e,$20,$5a byte $20,$61,$00,$00,$04,$6d,$6f,$69,$73,$74,$00,$2d,$04,$20,$00,$58 byte $20,$74,$00,$00,$21,$1f,$4e,$00,$00,$20,$00,$58,$0d,$55,$21,$1d byte $06,$72,$61,$64,$69,$61,$74,$69,$6f,$6e,$00,$00,$00,$20,$00,$58 byte $21,$10,$21,$24,$22,$00,$58,$0d,$55,$21,$10,$21,$40,$04,$65,$6c byte $65,$63,$74,$72,$6f,$6d,$61,$67,$6e,$65,$74,$69,$63,$00,$00,$00 byte $22,$00,$58,$21,$2d,$21,$10,$00,$00,$04,$73,$65,$65,$6e,$00,$2b byte $2b,$20,$00,$58,$21,$49,$00,$00,$01,$63,$6f,$77,$00,$21,$5f,$20 byte $00,$58,$00,$63,$21,$6d,$04,$6d,$6f,$6f,$00,$22,$41,$20,$1d,$2a byte $21,$66,$21,$74,$20,$00,$35,$00,$3c,$22,$0c,$02,$65,$61,$74,$73 byte $00,$22,$4f,$04,$67,$72,$61,$73,$73,$00,$22,$54,$20,$21,$7b,$22 byte $03,$22,$1a,$04,$62,$69,$67,$00,$27,$27,$22,$00,$58,$22,$13,$00 byte $63,$22,$2b,$01,$66,$61,$72,$6d,$00,$32,$3f,$22,$00,$58,$22,$23 byte $03,$3a,$22,$3c,$01,$63,$6f,$77,$73,$00,$33,$03,$21,$22,$34,$00 byte $00,$20,$00,$58,$0d,$7a,$00,$00,$02,$65,$61,$74,$00,$22,$6b,$21 byte $22,$48,$00,$00,$20,$00,$58,$1e,$48,$22,$5b,$20,$00,$58,$1e,$38 byte $22,$62,$22,$00,$58,$1e,$48,$1e,$38,$00,$00,$21,$21,$7b,$00,$00 byte $06,$4d,$65,$72,$63,$75,$72,$79,$00,$23,$05,$01,$70,$6c,$61,$6e byte $65,$74,$00,$23,$25,$20,$00,$58,$22,$7b,$23,$0c,$20,$00,$58,$1c byte $25,$23,$13,$22,$00,$58,$1c,$25,$22,$7b,$00,$00,$01,$77,$6f,$72 byte $6c,$64,$00,$23,$7c,$20,$00,$58,$23,$1c,$23,$36,$01,$73,$70,$68 byte $65,$72,$65,$00,$24,$0c,$20,$00,$58,$23,$2c,$23,$3d,$22,$00,$58 byte $22,$13,$23,$2c,$23,$5b,$04,$63,$65,$6c,$65,$73,$74,$69,$61,$6c byte $00,$00,$00,$01,$62,$6f,$64,$79,$00,$00,$00,$22,$00,$58,$23,$46 byte $23,$53,$23,$75,$02,$6f,$72,$62,$69,$74,$73,$00,$00,$00,$01,$73 byte $75,$6e,$00,$35,$39,$20,$23,$64,$23,$6e,$00,$00,$20,$00,$58,$22 byte $7b,$00,$00,$04,$72,$6f,$75,$6e,$64,$00,$24,$32,$20,$00,$58,$24 byte $03,$24,$1d,$01,$6f,$62,$6a,$65,$63,$74,$00,$29,$4e,$22,$00,$58 byte $24,$03,$24,$13,$00,$00,$04,$63,$69,$72,$63,$75,$6c,$61,$72,$00 byte $2b,$24,$20,$00,$58,$24,$26,$00,$00,$06,$4d,$61,$72,$73,$00,$24 byte $41,$20,$00,$58,$22,$7b,$24,$4f,$04,$72,$65,$64,$00,$24,$66,$20 byte $00,$58,$24,$48,$24,$56,$20,$00,$58,$1b,$2c,$24,$5d,$22,$00,$58 byte $24,$48,$22,$7b,$00,$00,$20,$00,$58,$1e,$58,$00,$00,$06,$45,$61 byte $72,$74,$68,$00,$24,$76,$20,$00,$58,$22,$7b,$24,$7d,$20,$02,$5a byte $20,$1d,$25,$0e,$01,$6f,$63,$65,$61,$6e,$73,$00,$26,$04,$20,$02 byte $5a,$25,$04,$25,$1d,$06,$6c,$61,$6e,$64,$00,$26,$21,$20,$02,$5a byte $25,$15,$25,$24,$20,$00,$58,$23,$1c,$00,$00,$04,$73,$6f,$66,$74 byte $00,$00,$00,$20,$00,$58,$25,$2b,$25,$3a,$20,$00,$58,$1f,$76,$25 byte $4b,$01,$6c,$69,$71,$75,$69,$64,$00,$2e,$04,$20,$00,$58,$25,$41 byte $25,$59,$06,$48,$32,$4f,$00,$30,$35,$20,$00,$58,$25,$52,$25,$6c byte $06,$68,$79,$64,$72,$6f,$67,$65,$6e,$00,$30,$3c,$20,$20,$4e,$25 byte $60,$25,$7d,$06,$6f,$78,$79,$67,$65,$6e,$00,$30,$43,$20,$20,$4e byte $25,$73,$00,$00,$20,$08,$2b,$20,$1d,$26,$14,$01,$6f,$63,$65,$61 byte $6e,$00,$26,$36,$21,$26,$0b,$00,$00,$04,$68,$61,$72,$64,$00,$26 byte $4b,$20,$00,$58,$26,$19,$26,$2f,$04,$64,$72,$79,$00,$00,$00,$20 byte $00,$58,$26,$28,$00,$00,$20,$00,$58,$1f,$76,$26,$3d,$21,$25,$04 byte $00,$00,$04,$72,$69,$67,$69,$64,$00,$26,$60,$20,$00,$58,$26,$42 byte $00,$00,$04,$69,$6e,$66,$6c,$65,$78,$69,$62,$6c,$65,$00,$2b,$32 byte $20,$00,$58,$26,$52,$00,$00,$06,$56,$65,$6e,$75,$73,$00,$26,$70 byte $20,$00,$58,$22,$7b,$26,$77,$20,$00,$58,$1c,$25,$00,$00,$06,$4a byte $75,$70,$69,$74,$65,$72,$00,$27,$09,$20,$00,$58,$22,$7b,$27,$10 byte $20,$00,$58,$1b,$2c,$27,$17,$20,$00,$58,$22,$13,$00,$00,$04,$6c byte $61,$72,$67,$65,$00,$27,$2e,$20,$00,$58,$27,$1e,$00,$00,$20,$00 byte $58,$22,$13,$00,$00,$06,$53,$61,$74,$75,$72,$6e,$00,$27,$3f,$20 byte $00,$58,$22,$7b,$27,$46,$20,$00,$58,$1b,$2c,$27,$63,$04,$62,$65 byte $61,$75,$74,$69,$66,$75,$6c,$00,$00,$00,$01,$72,$69,$6e,$67,$73 byte $00,$2f,$61,$22,$02,$5a,$27,$4d,$27,$5a,$00,$00,$06,$4e,$65,$70 byte $74,$75,$6e,$65,$00,$27,$77,$20,$00,$58,$22,$7b,$27,$7e,$20,$00 byte $58,$1b,$2c,$00,$00,$06,$55,$72,$61,$6e,$75,$73,$00,$28,$0f,$20 byte $00,$58,$22,$7b,$28,$16,$20,$00,$58,$1b,$2c,$00,$00,$06,$50,$6c byte $75,$74,$6f,$00,$28,$2d,$02,$77,$61,$73,$00,$00,$00,$20,$28,$26 byte $22,$7b,$28,$34,$20,$00,$58,$1b,$2c,$28,$44,$04,$64,$77,$61,$72 byte $66,$00,$00,$00,$22,$00,$58,$28,$3b,$22,$7b,$00,$00,$01,$69,$6e byte $74,$65,$72,$72,$75,$70,$74,$00,$28,$61,$04,$62,$61,$64,$00,$29 byte $47,$20,$00,$58,$28,$5a,$28,$77,$04,$69,$6e,$65,$66,$66,$69,$63 byte $69,$65,$6e,$74,$00,$00,$00,$20,$00,$58,$28,$68,$29,$09,$02,$64 byte $69,$73,$72,$75,$70,$74,$00,$00,$00,$20,$00,$35,$28,$7e,$29,$1e byte $04,$64,$69,$73,$72,$75,$70,$74,$69,$76,$65,$00,$00,$00,$20,$00 byte $58,$29,$10,$29,$34,$04,$63,$6f,$6d,$70,$6c,$69,$63,$61,$74,$65 byte $64,$00,$00,$00,$20,$00,$58,$29,$25,$00,$00,$04,$68,$6f,$72,$72 byte $69,$62,$6c,$65,$00,$2d,$0b,$20,$00,$58,$29,$3b,$00,$00,$20,$02 byte $5a,$0b,$76,$00,$00,$06,$45,$6e,$67,$6c,$69,$73,$68,$00,$29,$60 byte $20,$00,$58,$0a,$13,$29,$67,$22,$00,$58,$00,$0b,$0a,$13,$00,$00 byte $01,$6e,$6f,$75,$6e,$00,$00,$00,$02,$73,$61,$79,$00,$00,$00,$01 byte $53,$75,$6e,$00,$2a,$0e,$01,$73,$74,$61,$72,$00,$2a,$30,$20,$00 byte $58,$2a,$06,$2a,$15,$20,$00,$58,$1c,$25,$2a,$27,$04,$6e,$65,$61 byte $72,$65,$73,$74,$00,$30,$72,$22,$00,$58,$2a,$1c,$2a,$06,$00,$00 byte $20,$00,$58,$1c,$25,$2a,$41,$04,$62,$72,$69,$67,$68,$74,$00,$00 byte $00,$20,$00,$58,$2a,$37,$2a,$51,$02,$65,$6d,$69,$74,$73,$00,$00 byte $00,$20,$2a,$48,$1e,$68,$2a,$60,$04,$76,$65,$72,$79,$00,$00,$00 byte $22,$00,$58,$2a,$58,$1c,$25,$2a,$69,$22,$00,$58,$23,$46,$23,$53 byte $00,$00,$01,$73,$79,$6d,$62,$6f,$6c,$73,$00,$2b,$05,$01,$74,$61 byte $67,$73,$00,$2b,$16,$20,$00,$4c,$2a,$7d,$00,$00,$01,$6c,$61,$62 byte $65,$6c,$73,$00,$2b,$1d,$20,$00,$4c,$2b,$0c,$00,$00,$20,$00,$4c byte $2a,$7d,$00,$00,$20,$00,$58,$24,$03,$00,$00,$20,$00,$58,$0d,$55 byte $00,$00,$20,$00,$58,$26,$19,$00,$00,$02,$6c,$69,$6b,$65,$00,$00 byte $00,$02,$6d,$61,$64,$65,$00,$00,$00,$01,$61,$77,$61,$72,$65,$00 byte $00,$00,$20,$00,$58,$01,$0c,$2b,$59,$21,$01,$0c,$00,$00,$20,$00 byte $58,$00,$74,$00,$00,$21,$02,$61,$00,$00,$20,$00,$58,$08,$08,$00 byte $00,$20,$00,$58,$09,$47,$2b,$78,$20,$00,$58,$04,$3e,$2b,$7f,$20 byte $00,$58,$0b,$54,$00,$00,$21,$08,$68,$00,$00,$20,$00,$58,$1c,$54 byte $00,$00,$20,$00,$58,$09,$6a,$2c,$26,$06,$6b,$6e,$6f,$77,$6c,$65 byte $64,$67,$65,$00,$2c,$2d,$20,$00,$58,$2c,$19,$00,$00,$20,$00,$58 byte $12,$04,$00,$00,$20,$00,$58,$07,$78,$00,$00,$20,$00,$58,$16,$64 byte $00,$00,$20,$00,$58,$26,$42,$2c,$51,$04,$66,$69,$72,$6d,$00,$30 byte $4a,$20,$00,$58,$2c,$49,$00,$00,$20,$00,$4c,$0c,$6c,$00,$00,$20 byte $00,$58,$16,$07,$00,$00,$20,$00,$58,$1c,$54,$00,$00,$04,$68,$65 byte $61,$72,$64,$00,$2c,$7d,$20,$00,$58,$2c,$6d,$00,$00,$20,$00,$58 byte $10,$1a,$00,$00,$20,$00,$58,$1f,$76,$00,$00,$20,$00,$58,$28,$5a byte $00,$00,$04,$73,$65,$76,$65,$6e,$00,$2d,$25,$01,$6e,$75,$6d,$62 byte $65,$72,$00,$00,$00,$20,$00,$58,$2d,$1b,$00,$00,$01,$77,$65,$65 byte $6b,$00,$2d,$34,$22,$00,$58,$2d,$12,$18,$29,$00,$00,$21,$17,$7a byte $00,$00,$04,$6f,$6e,$65,$00,$2d,$49,$20,$00,$58,$2d,$1b,$2d,$62 byte $04,$73,$69,$6e,$67,$6c,$65,$00,$00,$00,$01,$69,$74,$65,$6d,$00 byte $2d,$74,$22,$00,$58,$2d,$50,$2d,$5a,$00,$00,$01,$74,$68,$69,$6e byte $67,$00,$00,$00,$20,$00,$58,$2d,$6b,$00,$00,$04,$66,$6c,$75,$69 byte $64,$00,$00,$00,$20,$00,$58,$2d,$7b,$00,$00,$20,$00,$58,$11,$26 byte $00,$00,$20,$00,$58,$2d,$1b,$00,$00,$04,$74,$77,$65,$6c,$76,$65 byte $00,$2e,$48,$22,$02,$5a,$2e,$19,$19,$3f,$2e,$3f,$04,$66,$6f,$75 byte $72,$00,$2e,$54,$01,$73,$65,$61,$73,$6f,$6e,$73,$00,$00,$00,$22 byte $02,$5a,$2e,$2c,$2e,$34,$00,$00,$20,$00,$58,$2d,$1b,$00,$00,$21 byte $19,$2f,$00,$00,$20,$00,$58,$2d,$1b,$00,$00,$04,$74,$77,$6f,$00 byte $2e,$62,$20,$00,$58,$2d,$1b,$00,$00,$04,$74,$68,$72,$65,$65,$00 byte $2e,$72,$20,$00,$58,$2d,$1b,$00,$00,$04,$66,$69,$76,$65,$00,$2f byte $01,$20,$00,$58,$2d,$1b,$00,$00,$04,$73,$69,$78,$00,$2f,$0f,$20 byte $00,$58,$2d,$1b,$00,$00,$04,$6e,$69,$6e,$65,$00,$2f,$1e,$20,$00 byte $58,$2d,$1b,$00,$00,$04,$74,$65,$6e,$00,$2f,$2c,$20,$00,$58,$2d byte $1b,$00,$00,$04,$65,$6c,$65,$76,$65,$6e,$00,$2f,$3d,$20,$00,$58 byte $2d,$1b,$00,$00,$02,$6c,$65,$61,$72,$6e,$73,$00,$35,$34,$21,$2f byte $44,$00,$00,$01,$73,$74,$72,$75,$63,$74,$75,$72,$65,$73,$00,$00 byte $00,$22,$00,$4c,$24,$26,$2f,$53,$00,$00,$06,$43,$00,$2f,$6f,$22 byte $00,$58,$0c,$37,$0a,$13,$00,$00,$04,$66,$61,$6c,$6c,$69,$6e,$67 byte $00,$30,$18,$22,$00,$58,$2f,$78,$20,$1d,$00,$00,$04,$64,$72,$6f byte $70,$70,$69,$6e,$67,$00,$30,$51,$20,$00,$58,$30,$0c,$00,$00,$04 byte $72,$65,$73,$70,$69,$72,$61,$74,$69,$6f,$6e,$00,$31,$00,$20,$00 byte $58,$30,$1f,$00,$00,$20,$00,$58,$20,$1d,$00,$00,$20,$00,$58,$0e byte $59,$00,$00,$20,$00,$58,$0e,$59,$00,$00,$20,$00,$58,$26,$42,$00 byte $00,$20,$00,$58,$2f,$78,$00,$00,$01,$72,$6f,$63,$6b,$00,$30,$60 byte $20,$00,$58,$0e,$47,$00,$00,$04,$63,$6c,$6f,$73,$65,$73,$74,$00 byte $30,$79,$20,$00,$58,$30,$67,$00,$00,$20,$00,$58,$2a,$1c,$00,$00 byte $20,$00,$58,$03,$69,$00,$00,$01,$74,$69,$74,$6c,$65,$73,$00,$36 byte $04,$20,$00,$4c,$31,$07,$00,$00,$01,$68,$6f,$75,$72,$00,$31,$34 byte $04,$73,$69,$78,$74,$79,$00,$31,$3d,$01,$6d,$69,$6e,$75,$74,$65 byte $73,$00,$31,$4e,$22,$00,$58,$31,$20,$31,$29,$00,$00,$20,$00,$58 byte $2d,$1b,$00,$00,$01,$6d,$69,$6e,$75,$74,$65,$00,$31,$7d,$21,$31 byte $44,$00,$00,$22,$00,$58,$00,$74,$0f,$6f,$00,$00,$21,$04,$69,$00 byte $00,$04,$63,$6f,$6d,$62,$69,$6e,$65,$64,$00,$35,$61,$20,$00,$58 byte $31,$61,$00,$00,$22,$00,$58,$09,$15,$08,$7a,$00,$00,$21,$31,$29 byte $32,$0d,$01,$73,$65,$63,$6f,$6e,$64,$73,$00,$00,$00,$22,$02,$5a byte $31,$20,$32,$02,$00,$00,$04,$64,$6f,$6d,$65,$73,$74,$69,$63,$61 byte $74,$65,$64,$00,$33,$11,$22,$00,$58,$32,$16,$03,$3a,$00,$00,$04 byte $61,$67,$72,$69,$63,$75,$6c,$74,$75,$72,$61,$6c,$00,$00,$00,$22 byte $00,$58,$32,$2f,$13,$5a,$32,$51,$01,$63,$72,$6f,$70,$73,$00,$00 byte $00,$20,$02,$5a,$32,$48,$32,$58,$20,$02,$5a,$22,$34,$00,$00,$20 byte $00,$58,$2d,$1b,$00,$00,$01,$61,$64,$6a,$65,$63,$74,$69,$76,$65 byte $00,$00,$00,$01,$6e,$61,$6d,$65,$00,$00,$00,$01,$76,$65,$72,$62 byte $00,$00,$00,$21,$21,$58,$00,$00,$04,$74,$61,$6d,$65,$64,$00,$33 byte $18,$20,$00,$58,$33,$08,$00,$00,$20,$00,$58,$32,$16,$00,$00,$21 byte $0a,$6a,$00,$00,$20,$00,$58,$2d,$1b,$00,$00,$01,$62,$79,$74,$65 byte $00,$33,$3b,$01,$62,$69,$74,$73,$00,$00,$00,$22,$00,$58,$05,$34 byte $33,$33,$33,$4d,$01,$62,$79,$74,$65,$73,$00,$34,$5c,$21,$33,$44 byte $00,$00,$01,$6e,$79,$62,$62,$6c,$65,$00,$33,$5c,$22,$00,$58,$2e byte $2c,$33,$33,$00,$00,$01,$77,$6f,$72,$64,$00,$33,$78,$04,$73,$69 byte $78,$74,$65,$65,$6e,$00,$34,$18,$22,$00,$58,$33,$6d,$33,$33,$34 byte $0a,$01,$77,$6f,$72,$64,$73,$00,$34,$57,$21,$34,$01,$34,$0f,$22 byte $00,$58,$2e,$5b,$33,$44,$00,$00,$20,$00,$58,$2d,$1b,$00,$00,$01 byte $6c,$6f,$6e,$67,$00,$34,$35,$04,$74,$68,$69,$72,$74,$79,$2d,$74 byte $77,$6f,$00,$34,$50,$22,$00,$58,$34,$27,$33,$33,$34,$3e,$22,$00 byte $58,$2e,$5b,$34,$01,$34,$47,$22,$00,$58,$2e,$2c,$33,$44,$00,$00 byte $20,$00,$58,$2d,$1b,$00,$00,$21,$33,$65,$00,$00,$21,$33,$2b,$00 byte $00,$01,$62,$69,$74,$00,$34,$7b,$04,$62,$69,$6e,$61,$72,$79,$00 byte $00,$00,$01,$64,$69,$67,$69,$74,$00,$35,$12,$22,$00,$58,$34,$68 byte $34,$72,$00,$00,$02,$72,$65,$70,$72,$65,$73,$65,$6e,$74,$73,$00 byte $00,$00,$20,$35,$04,$2d,$1b,$35,$23,$01,$73,$79,$6d,$62,$6f,$6c byte $00,$00,$00,$20,$00,$58,$35,$19,$00,$00,$21,$0c,$0f,$00,$00,$21 byte $00,$0b,$00,$00,$21,$01,$3d,$00,$00,$20,$00,$58,$2a,$06,$00,$00 byte $01,$6d,$6f,$6f,$6e,$00,$35,$48,$20,$23,$64,$22,$7b,$00,$00,$04 byte $69,$6e,$74,$65,$72,$70,$72,$65,$74,$00,$00,$00,$21,$06,$3c,$00 byte $00,$20,$00,$58,$09,$15,$00,$00,$04,$73,$6c,$65,$65,$70,$69,$6e byte $67,$00,$35,$7b,$20,$00,$58,$35,$68,$00,$00,$22,$00,$58,$01,$1c byte $03,$12,$00,$00,$20,$00,$4c,$11,$61,$00,$00 byte 0[3077] VAR long Memory[MEMORY_MASK + 1] PUB start(argc, argv) c.start main(argc, argv) spinix.exit(0) ' Generate a random number PUB rand return (?seed) & $7fffffff ' Check if a key has been pressed PUB kbhit return ser.kbhit ' Return the system tick count PUB GetTicks return cnt ' Convert ASCII character to upper case PUB toupper(val) if (val => "a" and val =< "z") val -= "a" - "A" return val ' Find the next character that does not match val PUB SkipChar(str, val) repeat while (byte[str]) if (byte[str] <> val) quit str++ return str ' Find the next character that matches val PUB FindChar(str, val) repeat while (byte[str]) if (byte[str] == val) quit str++ return str ' Convert the space-delimited string to a list of tokens PUB tokenize(str, tokens) | ptr, num, len, val num := 0 len := strsize(str) val := byte[str][len - 1] if (len == 0) return 0 if (val < "A" or(val > "Z" and val < "a") or val > "z") byte[str][len + 1] := 0 byte[str][len] := byte[str][len - 1] byte[str][len - 1] := " " repeat while (byte[str]) str := SkipChar(str, " ") if (byte[str] == 0) quit long[tokens][num++] := str ptr := FindChar(str, " ") if (byte[ptr]) byte[ptr++] := 0 str := ptr return num ' Find the word "str" in the vocab table PUB FindWord(str) | ptr ptr := @vocab repeat while (ptr < @vocab + size) if ((byte[ptr] & TYPE_MASK) == TYPE_RELATED) ptr += 7 elseif ((byte[ptr] & TYPE_MASK) == TYPE_RELATE2) ptr += 9 elseif ((byte[ptr] & TYPE_MASK) == TYPE_EQUATE) ptr += 5 else if ((byte[ptr] & DELETE_MASK) == 0) if (c.strcmp(str, ptr + 1) == 0) return ptr ptr += strsize(ptr) + 3 return 0 ' Reset the vocab table PUB ResetVocab | buf[25] c.printf0(string("< Ary you sure you want to forget everything?\n")) c.printf0(string("> ")) c.gets(@buf) if (toupper(byte[@buf][0]) == "Y") size := 0 changeflag := 1 c.printf0(string("< Memory erased\n")) else c.printf0(string("< Reset aborted\n")) ' Reset to a basic vocab table PUB ResetBasicVocab | buf[25] c.printf0(string("< Ary you sure you want to reset to a basic word list?\n")) c.printf0(string("> ")) c.gets(@buf) if (toupper(byte[@buf][0]) == "Y") size := basicsize c.memcpy(@vocab, @basicvocab, size) changeflag := 1 c.printf0(string("< Memory reset to basic words\n")) else c.printf0(string("< Reset aborted\n")) ' Dump out a Spin formatted version of the vocab table PUB DumpHexWords | i, ptr i := 0 ptr := @vocab c.printf1(string(" version long %d\n"), version) c.printf1(string(" size long %d\n"), size) c.printf0(string(" vocab byte\n")) c.printf0(string(" byte ")) repeat while (ptr < @vocab + size) c.printf1(string("$%2.2x"), byte[ptr++]) if (ptr == @vocab + size) c.printf0(string("\n")) elseif ((i++) // 16 == 15) c.printf0(string("\n byte ")) else c.printf0(string(",")) c.printf1(string(" byte 0[%d]\n"), BUF_SIZE - size) ' Dump an ASCII formatted version of the vocab table PUB DumpAsciiWords(name, num) | i, ptr1, index, index2, index3, ptr i := 0 ptr := @vocab if (num > 1) ptr := FindWord(name) if (not ptr) c.printf1(string("$ %s not found\n"), name) return repeat while (ptr < @vocab + size) if ((byte[ptr] & TYPE_MASK) == TYPE_RELATED) ptr += 7 elseif ((byte[ptr] & TYPE_MASK) == TYPE_RELATE2) ptr += 9 elseif ((byte[ptr] & TYPE_MASK) == TYPE_EQUATE) ptr += 5 else if ((byte[ptr] & DELETE_MASK) == 0) c.printf2(string("$ %s - %s"), ptr + 1, types[byte[ptr][0] - 1]) ptr1 := ptr + strsize(ptr) + 1 repeat while (ptr1 < @vocab + size and(byte[ptr1][0] or byte[ptr1][1])) index :=(byte[ptr1][0] << 7) | byte[ptr1][1] ptr1 := @vocab + index if ((byte[ptr1][0] & TYPE_MASK) == TYPE_RELATED) if ((byte[ptr1][0] & DELETE_MASK) == 0) index :=(byte[ptr1][1] << 7) | byte[ptr1][2] index2 :=(byte[ptr1][3] << 7) | byte[ptr1][4] c.printf2(string(" (%s %s)"), @vocab + index + 1, @vocab + index2 + 1) ptr1 += 5 elseif ((byte[ptr1][0] & TYPE_MASK) == TYPE_RELATE2) if ((byte[ptr1][0] & DELETE_MASK) == 0) index :=(byte[ptr1][1] << 7) | byte[ptr1][2] index2 :=(byte[ptr1][3] << 7) | byte[ptr1][4] index3 :=(byte[ptr1][5] << 7) | byte[ptr1][6] c.printf3(string(" (%s %s %s)"), @vocab + index + 1, @vocab + index2 + 1, @vocab + index3 + 1) ptr1 += 7 elseif ((byte[ptr1][0] & TYPE_MASK) == TYPE_EQUATE) if ((byte[ptr1][0] & DELETE_MASK) == 0) index :=(byte[ptr1][1] << 7) | byte[ptr1][2] c.printf1(string(" (=%s)"), @vocab + index + 1) ptr1 += 3 else c.printf1(string("$ Invalid type = %2.2x\n"), byte[ptr1][0]) c.printf0(string("\n")) if (num > 1) quit ptr += strsize(ptr) + 3 ' Add a word to the vocab table PUB AddWord(attrib, str) | ptr, ptr1 ptr := @vocab + size ptr1 := ptr if (size + strsize(str) + 4 > BUF_SIZE) c.printf0(string("$ Out of memory\n")) return if (debugmode) c.printf2(string("AddWord %s - %s\n"), str, types[attrib - 1]) byte[ptr++] := attrib c.strcpy(ptr, str) ptr += strsize(ptr) + 1 byte[ptr++] := 0 byte[ptr] := 0 size += strsize(str) + 4 changeflag := 1 ' Determine the attribute of an unknown word, and add it to the vocab table PUB UnknownWord(tokens, num, i) | str, buf[25], ptr, caseflag str := long[tokens][i] caseflag := 0 if (i == 0) if (byte[str][0] => "A" and byte[str][0] =< "Z") caseflag := 1 byte[str][0] += "a" - "A" if (FindWord(str)) return 0 byte[str][0] -= "a" - "A" AddWord(TYPE_NAME, str) return 0 else if (num > 2) if (c.strcmp(long[tokens][1], string("equal")) == 0 or c.strcmp(long[tokens][1], string("equals")) == 0) ptr := FindWord(long[tokens][2]) if (ptr) AddWord(byte[ptr], long[tokens][0]) return 0 else AddWord(TYPE_ADJECT, long[tokens][0]) return 0 else ptr := FindWord(long[tokens][i - 1]) if (ptr == 0) SomethingWrong(long[tokens][i - 1]) else if (byte[ptr][0] == TYPE_ARTICLE and(i == 1 or i == num - 1)) AddWord(TYPE_NOUN, str) return 0 elseif (i < 3 and(byte[ptr][0] == TYPE_NOUN or byte[ptr][0] == TYPE_NAME)) AddWord(TYPE_VERB, str) return 0 elseif ((i > 1 and byte[ptr][0] == TYPE_VERB) or i > 2) if (byte[str][0] => "A" and byte[str][0] =< "Z") AddWord(TYPE_NAME, str) return 0 elseif (i < num - 1 or byte[ptr][0] == TYPE_VERB) AddWord(TYPE_ADJECT, str) return 0 if (i == num - 1 and num => 4) ptr := FindWord(long[tokens][i - 2]) if (ptr and byte[ptr][0] == TYPE_ARTICLE) AddWord(TYPE_NOUN, str) return 0 else AddWord(TYPE_ADJECT, str) return 0 c.printf1(string("< I don't know %s\n"), str) repeat while (1) c.printf0(string("< Is it a noun, verb, pronoun, adjective, Name, Article, query or ignore?\n")) c.printf0(string("> ")) c.gets(@buf) if (caseflag and byte[@buf][0] <> "N" and c.strcmp(str, string("I"))) byte[str][0] += "a" - "A" if (byte[@buf][0] == "n") AddWord(TYPE_NOUN, str) quit elseif (byte[@buf][0] == "v") AddWord(TYPE_VERB, str) quit elseif (byte[@buf][0] == "a") AddWord(TYPE_ADJECT, str) quit elseif (byte[@buf][0] == "p") AddWord(TYPE_PRONOUN, str) quit elseif (byte[@buf][0] == "N") AddWord(TYPE_NAME, str) quit elseif (byte[@buf][0] == "A") AddWord(TYPE_ARTICLE, str) quit elseif (byte[@buf][0] == "q") AddWord(TYPE_QUERY, str) quit elseif (byte[@buf][0] == "i") return 1 c.printf0(string("I don't understand\n")) return 0 ' Delete a word and all references to it from the vocab table PUB DeleteWord(tokens, num) | ptr, buf[25], index, index2 if (num < 2) c.printf0(string("< I don't know what to forget\n")) return ptr := FindWord(long[tokens][1]) if (ptr == 0) c.printf1(string("< I don't know %s\n"), long[tokens][1]) return repeat while (1) c.printf1(string("< Do you want me to forget %s?\n"), long[tokens][1]) c.printf0(string("> ")) c.gets(@buf) if (byte[@buf][0] == "y") index := ptr - @vocab ' Delete the word byte[ptr] |= DELETE_MASK ' Delete the chain repeat while (ptr := GetNextItem(ptr)) byte[ptr] |= DELETE_MASK ' Delete any reference to this word ptr := @vocab repeat while (ptr < @vocab + size) if ((byte[ptr] & TYPE_MASK) == TYPE_EQUATE) if ((byte[ptr] & DELETE_MASK) == 0) index2 :=(byte[ptr][1] << 7) | byte[ptr][2] if (index == index2) byte[ptr] |= DELETE_MASK ptr += 5 elseif ((byte[ptr] & TYPE_MASK) == TYPE_RELATED) if ((byte[ptr] & DELETE_MASK) == 0) index2 :=(byte[ptr][1] << 7) | byte[ptr][2] if (index == index2) byte[ptr] |= DELETE_MASK index2 :=(byte[ptr][3] << 7) | byte[ptr][4] if (index == index2) byte[ptr] |= DELETE_MASK ptr += 7 elseif ((byte[ptr] & TYPE_MASK) == TYPE_RELATE2) if ((byte[ptr] & DELETE_MASK) == 0) index2 :=(byte[ptr][1] << 7) | byte[ptr][2] if (index == index2) byte[ptr] |= DELETE_MASK index2 :=(byte[ptr][3] << 7) | byte[ptr][4] if (index == index2) byte[ptr] |= DELETE_MASK index2 :=(byte[ptr][5] << 7) | byte[ptr][6] if (index == index2) byte[ptr] |= DELETE_MASK ptr += 9 else ptr += strsize(ptr) + 3 changeflag := 1 c.printf1(string("< %s forgotten\n"), long[tokens][1]) return elseif (byte[@buf][0] == "n") c.printf1(string("< %s is not forgotten\n"), long[tokens][1]) return else c.printf0(string("< I don't understand\n")) ' Could find a word that was expected. Print a message. PUB SomethingWrong(str) c.printf0(string("Something's wrong\n")) c.printf1(string("I couldn't find %s\n"), str) ' Equate the first word to the second word PUB AddEquate(ptr1, ptr2) | index, ptr3 ptr3 := ptr1 + strsize(ptr1) + 1 if (size + 5 > BUF_SIZE) c.printf0(string("< Out of memory\n")) return repeat while (ptr3 < @vocab + size and(byte[ptr3][0] or byte[ptr3][1])) index :=(byte[ptr3][0] << 7) | byte[ptr3][1] ptr3 := @vocab + index if ((byte[ptr3][0] & TYPE_MASK) == TYPE_EQUATE) if ((byte[ptr3][0] & DELETE_MASK) == 0) index :=(byte[ptr3][1] << 7) | byte[ptr3][2] if (ptr2 == @vocab + index) return ptr3 += 3 elseif ((byte[ptr3][0] & TYPE_MASK) == TYPE_RELATED) ptr3 += 5 elseif ((byte[ptr3][0] & TYPE_MASK) == TYPE_RELATE2) ptr3 += 7 else c.printf1(string("Unknown type = %2.2x\n"), byte[ptr3][0]) byte[ptr3][0] := size >> 7 byte[ptr3][1] := size & 127 ptr3 := @vocab + size byte[ptr3++] := TYPE_EQUATE index := ptr2 - @vocab byte[ptr3][0] := index >> 7 byte[ptr3][1] := index & 127 byte[ptr3][2] := 0 byte[ptr3][3] := 0 size += 5 changeflag := 1 ' Get the next item in a chain PUB GetNextItem(ptr) | index if (ptr == 0) return 0 repeat while (ptr < @vocab + size) if ((byte[ptr][0] & TYPE_MASK) == TYPE_EQUATE) ptr += 3 elseif ((byte[ptr][0] & TYPE_MASK) == TYPE_RELATED) ptr += 5 elseif ((byte[ptr][0] & TYPE_MASK) == TYPE_RELATE2) ptr += 7 else ptr += strsize(ptr) + 1 index :=(byte[ptr][0] << 7) | byte[ptr][1] if (index == 0) quit ptr := @vocab + index if ((byte[ptr] & DELETE_MASK) == 0) return ptr return 0 ' Get the next equate item in a chain PUB GetNextEquate(ptr) repeat while (ptr := GetNextItem(ptr)) if (byte[ptr] == TYPE_EQUATE) return ptr return 0 ' Match two word entries and their equates in the vocab table PUB Match(ptr1, ptr2) | index, ptr3, name1, name2 name1 := ptr1 + 1 repeat while (1) ptr3 := ptr2 name2 := ptr2 + 1 repeat while (1) if (c.strcmp(name1, name2) == 0) return 1 ptr3 := GetNextEquate(ptr3) if (not ptr3) quit index :=(byte[ptr3][1] << 7) | byte[ptr3][2] name2 := @vocab + index + 1 ptr1 := GetNextEquate(ptr1) if (not ptr1) quit index :=(byte[ptr1][1] << 7) | byte[ptr1][2] name1 := @vocab + index + 1 return 0 ' Remove articles from a token list PUB RemoveArticles(tokens, num) | i, j, ptr i := 0 repeat while (i < num) ptr := FindWord(long[tokens][i]) if (byte[ptr] == 0) c.printf1(string("RemoveArticles: Can't find %s\n"), long[tokens][i]) i++ next if (byte[ptr] == TYPE_ARTICLE) num-- j := i repeat while (j < num) long[tokens][j] := long[tokens][j + 1] j++ next i++ return num ' Locate exact matches of a word and a verb in a related field PUB FindWords(word1, word2) | ptr1, ptr2, index ptr1 := FindWord(word1) repeat while (ptr1) if (byte[ptr1][0] == TYPE_RELATED) index :=(byte[ptr1][1] << 7) | byte[ptr1][2] ptr2 := @vocab + index if (c.strcmp(ptr2 + 1, word2) == 0) return ptr1 ptr1 := GetNextItem(ptr1) return 0 ' Return true if val is a vowel PUB isvowel(val) val := toupper(val) if (val == "A" or val == "E" or val == "I" or val == "O" or val == "U") return 1 return 0 PUB AddToMemory(name, ptr1) | ptr0 ptr0 := FindWord(name) if (ptr0 == 0 and byte[name][0] => "A" and byte[name][0] =< "Z") byte[name][0] += "a" - "A" ptr0 := FindWord(name) byte[name][0] -= "a" - "A" if (ptr0 == 0) return Memory[MemoryIndex] := ptr0 Memory[MemoryIndex + 1] := ptr1 MemoryIndex :=(MemoryIndex + 2) & MEMORY_MASK PUB PrintMemory | ptr0, ptr1, index index := MemoryIndex repeat while (1) ptr0 := Memory[index] ptr1 := Memory[index + 1] if (ptr0 and ptr1) if ((byte[ptr0] & DELETE_MASK) == 0 and(byte[ptr1] & DELETE_MASK) == 0) PrintStatement(ptr0 + 1, ptr1, 0) index :=(index + 2) & MEMORY_MASK if (index == MemoryIndex) quit c.printf0(string("$\n")) PUB CheckMemory(ptr0, ptr1) | ptr0a, ptr1a, index index := MemoryIndex repeat while (1) ptr0a := Memory[index] ptr1a := Memory[index + 1] if (ptr0 == ptr0a and ptr1 == ptr1a) return 1 index :=(index + 2) & MEMORY_MASK if (index == MemoryIndex) quit return 0 ' Determine whether the word is plural, singular or something else PUB GetPlural(name) | len, ptr1 len := strsize(name) ptr1 := FindWord(name) 'printf("GetPlural %s\n", name); if (c.strcmp(name, string("I")) == 0) return - 1 if (len < 2) return 0 if (c.strcmp(name, string("you")) == 0 or c.strcmp(name, string("You")) == 0) return 1 if (ptr1 and byte[ptr1] <> TYPE_NOUN and byte[ptr1] <> TYPE_ADJECT) return 0 if (byte[name][len - 1] == "s" and byte[name][len - 2] <> "s") return 1 return 0 PUB GetVerb(plural, ptr1) | verbptr, isptr isptr := FindWord(string("is")) if (isptr and Match(isptr, ptr1)) if (plural == 1) verbptr := string("are") elseif (plural == - 1) verbptr := string("am") else verbptr := string("is") else verbptr := ptr1 + 1 'printf("GetVerb %d %s %s\n", plural, ptr1+1, verbptr); return verbptr ' Print a statement formed from the name and the field pointed to by ptr1 ' Substitue I for you, and You for I in the name PUB PrintStatement(name, ptr1, remember) | ptr, nullstr, Astr, index, index2, index3, namestr[25], astr_0, plural, verbptr byte[@nullstr] := 0 Astr := @byte[@nullstr] astr_0 := @byte[@nullstr] if (remember) if (c.strcmp(name, string("you")) == 0) name := string("I") elseif (c.strcmp(name, string("I")) == 0) name := string("you") c.strcpy(@namestr, name) plural := GetPlural(@namestr) ptr := FindWord(@namestr) if (ptr) if (byte[ptr][0] == TYPE_NOUN and plural == 0 and(byte[ptr1][0] == TYPE_RELATED or byte[ptr1][0] == TYPE_RELATE2)) if (isvowel(byte[@namestr][0])) Astr := string("An ") else Astr := string("A ") if (not byte[Astr][0] and byte[@namestr][0] => "a" and byte[@namestr][0] =< "z") byte[@namestr][0] -= "a" - "A" if (remember) c.printf0(string("< ")) else c.printf0(string("$ ")) if (byte[ptr1][0] == TYPE_RELATED) index :=(byte[ptr1][1] << 7) | byte[ptr1][2] index2 :=(byte[ptr1][3] << 7) | byte[ptr1][4] if (vocab[index2] == TYPE_NOUN and GetPlural(@vocab + index2 + 1) == 0) if (isvowel(vocab[index2 + 1])) astr_0 := string("an ") else astr_0 := string("a ") verbptr := GetVerb(plural, @vocab + index) c.printf5(string("%s%s %s %s%s\n"), Astr, @namestr, verbptr, astr_0, @vocab + index2 + 1) if speak c.fprintf5(speak, string("%s%s %s %s%s\n"), Astr, @namestr, verbptr, astr_0, @vocab + index2 + 1) elseif (byte[ptr1][0] == TYPE_RELATE2) index :=(byte[ptr1][1] << 7) | byte[ptr1][2] index2 :=(byte[ptr1][3] << 7) | byte[ptr1][4] index3 :=(byte[ptr1][5] << 7) | byte[ptr1][6] if (vocab[index3] == TYPE_NOUN and GetPlural(@vocab + index3 + 1) == 0) if (isvowel(vocab[index2 + 1])) astr_0 := string("an ") else astr_0 := string("a ") verbptr := GetVerb(plural, @vocab + index) c.printf6(string("%s%s %s %s%s %s\n"), Astr, @namestr, verbptr, astr_0, @vocab + index2 + 1, @vocab + index3 + 1) if speak c.fprintf6(speak, string("%s%s %s %s%s %s\n"), Astr, @namestr, verbptr, astr_0, @vocab + index2 + 1, @vocab + index3 + 1) elseif (byte[ptr1][0] == TYPE_EQUATE) index :=(byte[ptr1][1] << 7) | byte[ptr1][2] c.printf2(string("%s is %s\n"), @namestr, @vocab + index + 1) if speak c.fprintf2(speak, string("%s is %s\n"), @namestr, @vocab + index + 1) else c.printf2(string("%s is a %s\n"), @namestr, types[byte[ptr1][0] - 1]) if speak c.fprintf2(speak, string("%s is a %s\n"), @namestr, types[byte[ptr1][0] - 1]) if (remember) AddToMemory(@namestr, ptr1) PUB PrintQuestion(ptr1) | nullstr, Astr, isptr, plural, verbptr byte[@nullstr] := 0 Astr := @byte[@nullstr] isptr := FindWord(string("is")) plural := GetPlural(ptr1 + 1) verbptr := GetVerb(plural, isptr) if (byte[ptr1][0] == TYPE_NOUN and plural <> 1) if (isvowel(byte[ptr1][1])) Astr := string("an ") else Astr := string("a ") c.printf3(string("< What %s %s%s?\n"), verbptr, Astr, ptr1 + 1) if speak c.fprintf3(speak, string("What %s %s%s\n"), verbptr, Astr, ptr1 + 1) ' Process a list of tokens received from the user PUB Process(tokens, num, question) | i, index, index2, index3, ptr[4], ptr1, ptr0, ptrx, count, counta, ptry, ptrya, match_0, equalflag, tempflag match_0 := 0 equalflag := 0 tempflag := 0 ' Equate the two words if it's an equal statement if (num == 3) if (not question and(c.strcmp(long[tokens][1], string("equal")) == 0 or c.strcmp(long[tokens][1], string("equals")) == 0)) if (debugmode) c.printf0(string("equals mode\n")) equalflag := 1 ptr0 := FindWord(long[tokens][0]) ptr1 := FindWord(long[tokens][2]) if (not ptr0) SomethingWrong(long[tokens][0]) return if (not ptr1) SomethingWrong(long[tokens][2]) return AddEquate(ptr0, ptr1) AddEquate(ptr1, ptr0) return ' Check if the first word is do/does/did. ' If so, remove the first word and make it a question. if (ptr0 := FindWord(string("do"))) if (debugmode) c.printf0(string("does query\n")) ptr1 := FindWord(long[tokens][0]) if (not ptr1) SomethingWrong(long[tokens][0]) return if (Match(ptr0, ptr1)) question := 1 num-- i := 0 repeat while (i < num) long[tokens][i] := long[tokens][i + 1] i++ ' Remove the articles num := RemoveArticles(tokens, num) ' There must be three items in the list or it is too short or too long if (num < 3) c.printf0(string("I don't understand\n")) c.printf0(string("Use more words\n")) return if (num > 4) c.printf0(string("I don't understand\n")) c.printf0(string("Use less words\n")) return ' Locate the tokens in the vocab table i := 0 repeat while (i < num) ptr[i] := FindWord(long[tokens][i]) if (ptr[i] == 0) SomethingWrong(long[tokens][i]) return i++ ' Change the word type if commanded to do so if (num == 3 and c.strcmp(long[tokens][1], string("is")) == 0) if (c.strcmp(long[tokens][2], string("noun")) == 0) byte[ptr[0]][0] := TYPE_NOUN return elseif (c.strcmp(long[tokens][2], string("name")) == 0) byte[ptr[0]][0] := TYPE_NAME return elseif (c.strcmp(long[tokens][2], string("adjective")) == 0) byte[ptr[0]][0] := TYPE_ADJECT return elseif (c.strcmp(long[tokens][2], string("verb")) == 0) byte[ptr[0]][0] := TYPE_VERB return ' If the first word is a query, the second word must be is/am/are if (byte[ptr[0]][0] == TYPE_QUERY) if (debugmode) c.printf0(string("query mode\n")) question := 1 ptr1 := FindWord(string("is")) tempflag := 0 'if (num != 3 || !ptr1 || !Match(ptr1, ptr[1])) if (num == 3) if (ptr1) if (Match(ptr1, ptr[1])) tempflag := 1 if (not tempflag) c.printf0(string("I don't understand\n")) return ' Scan related entries and equate's related entries ptr1 := ptr[2] ptr0 := ptr1 ptrx := ptr1 ptry := ptr1 count := 0 ' variables for items not in short term memory ptrya := 0 counta := 0 if (debugmode) PrintStatement(long[tokens][2], ptr1, 0) repeat while (1) repeat while (1) ptr1 := GetNextItem(ptr1) if (not ptr1) quit if (byte[ptr1][0] <> TYPE_RELATED and byte[ptr1][0] <> TYPE_RELATE2) next 'index = (ptr1[1] << 7) | ptr1[2]; 'index2 = (ptr1[3] << 7) | ptr1[4]; if (debugmode) PrintStatement(long[tokens][2], ptr1, 0) if (CheckMemory(ptr[2], ptr1) == 0) counta++ if ((rand // counta) == 0) ptrya := ptr1 if (ptrya == 0) count++ if ((rand // count) == 0) ptry := ptr1 if (ptrya == 0) ptrya := ptry ptr0 := GetNextEquate(ptr0) if (not ptr0) quit index :=(byte[ptr0][1] << 7) | byte[ptr0][2] ptrx := @vocab + index ptr1 := ptrx if (ptrya) if (byte[ptrya][0] == TYPE_RELATED or byte[ptrya][0] == TYPE_RELATE2 or byte[ptrya][1] == TYPE_EQUATE) PrintStatement(long[tokens][2], ptrya, 1) else c.printf0(string("< I don't know\n")) return ' If not an equal statement or a question check if first word is a verb ' Is so, swap the first and second tokens if (not equalflag and not question and byte[ptr[0]][0] == TYPE_VERB) if (debugmode) c.printf0(string("Lead verb query\n")) question := 1 ptr1 := ptr[0] ptr[0] := ptr[1] ptr[1] := ptr1 ptr1 := long[tokens][0] long[tokens][0] := long[tokens][1] long[tokens][1] := ptr1 ' Look for a match to the three words. If it is a question and ' a match is found print "Yes" ptr1 := ptr[0] ptr0 := ptr1 ptrx := ptr1 repeat while (1) repeat while (1) ptr1 := GetNextItem(ptr1) if (not ptr1) quit if (byte[ptr1][0] <> TYPE_RELATED and byte[ptr1][0] <> TYPE_RELATE2) next index :=(byte[ptr1][1] << 7) | byte[ptr1][2] index2 :=(byte[ptr1][3] << 7) | byte[ptr1][4] tempflag := Match(ptr[1], @vocab + index) and Match(ptr[2], @vocab + index2) if (num == 4) index3 :=(byte[ptr1][5] << 7) | byte[ptr1][6] tempflag := tempflag and Match(ptr[3], @vocab + index3) if (debugmode) c.printf7(string("%s (%s,%s) (%s,%s) (%s,%s)\n"), ptrx + 1, ptr[1] + 1, @vocab + index + 1, ptr[2] + 1, @vocab + index2 + 1, ptr[3], @vocab + index3 + 1) else if (debugmode) c.printf5(string("%s (%s,%s) (%s,%s)\n"), ptrx + 1, ptr[1] + 1, @vocab + index + 1, ptr[2] + 1, @vocab + index2 + 1) if (tempflag) if (not question) c.printf0(string("< I know that\n")) else c.printf0(string("< Yes\n")) return ptr0 := GetNextEquate(ptr0) if (not ptr0) quit index :=(byte[ptr0][1] << 7) | byte[ptr0][2] ptrx := @vocab + index ptr1 := ptrx ' Print "No" if it was a question and no match found if (question) c.printf0(string("< No\n")) return ' Add relationship if there was no match and it's not a question if (not match_0) if (size + 1 +(num << 1) > BUF_SIZE) c.printf0(string("< Out of memory\n")) return ptr1 := ptr[0] repeat while (ptr0 := GetNextItem(ptr1)) ptr1 := ptr0 if (byte[ptr1][0] == TYPE_RELATED) ptr1 += 5 elseif (byte[ptr1][0] == TYPE_RELATE2) ptr1 += 7 elseif (byte[ptr1][0] == TYPE_EQUATE) ptr1 += 3 else ptr1 += strsize(ptr1) + 1 byte[ptr1][0] := size >> 7 byte[ptr1][1] := size & 127 ptr1 := @vocab + size if (num == 3) byte[ptr1][0] := TYPE_RELATED else byte[ptr1][0] := TYPE_RELATE2 index := ptr[1] - @vocab byte[ptr1][1] := index >> 7 byte[ptr1][2] := index & 127 index := ptr[2] - @vocab byte[ptr1][3] := index >> 7 byte[ptr1][4] := index & 127 if (num == 3) byte[ptr1][5] := 0 byte[ptr1][6] := 0 size += 7 else index := ptr[3] - @vocab byte[ptr1][5] := index >> 7 byte[ptr1][6] := index & 127 byte[ptr1][7] := 0 byte[ptr1][8] := 0 size += 9 changeflag := 1 ' Check if predicate is undefined index := 0 ptr1 := ptr[2] if (byte[ptr1][0] < 32) ptr0 := ptr1 + strsize(ptr1) + 1 index :=(byte[ptr0][0] << 7) | byte[ptr0][1] if (index == 0) PrintQuestion(ptr1) else c.printf0(string("< I will remember that\n")) ' Wait from 3 to 10 seconds for input. Print a random fact from ' the vocab table if no input received. PUB WaitForInput | waittime, starttime, ptr1, ptr2, ptr1a, ptr2a, index, count, FirstTime waittime :=((rand // 8) + 3) * clkfreq starttime := GetTicks c.printf0(string("> ")) repeat while (not kbhit) ' Scan all the entries in the vocab table if (GetTicks - starttime > waittime) count := 0 ptr1 := @vocab ptr1a := ptr2a := 0 repeat while (ptr1 < @vocab + size) if ((byte[ptr1][0] & TYPE_MASK) == TYPE_RELATED) ptr1 += 7 elseif ((byte[ptr1][0] & TYPE_MASK) == TYPE_RELATE2) ptr1 += 9 elseif ((byte[ptr1][0] & TYPE_MASK) == TYPE_EQUATE) ptr1 += 5 elseif (byte[ptr1][0] & DELETE_MASK) ptr1 += strsize(ptr1) + 3 else ptr2 := ptr1 FirstTime := 1 repeat while ((ptr2 := GetNextItem(ptr2)) or FirstTime) FirstTime := 0 if (ptr2 == 0 and byte[ptr1][0] <> TYPE_NAME and byte[ptr1][0] <> TYPE_NOUN and byte[ptr1][0] <> TYPE_ADJECT) quit if (ptr2 == 0 or byte[ptr2][0] == TYPE_RELATED) count++ if ((rand // count) == 0) if (count == 1 or CheckMemory(ptr1, ptr2) == 0) ptr1a := ptr1 ptr2a := ptr2 ptr1 += strsize(ptr1) + 3 ' Print the entry that was randomly selected if (ptr1a and ptr2a) if (byte[ptr2a][0] == TYPE_RELATED) c.putchar(8) c.putchar(8) PrintStatement(ptr1a + 1, ptr2a, 1) c.printf0(string("> ")) elseif (ptr1a) c.putchar(8) c.putchar(8) PrintQuestion(ptr1a) c.printf0(string("> ")) waittime :=((rand // 10) + 5) * clkfreq starttime := GetTicks ' Save the vocab table PUB SaveVocab | addr, i, val, val1 c.printf0(string("$ Save disabled\n")) { addr := @size i :=(size + 7) >> 2 repeat while (i > 0) val := long[addr] if (val <> i2c.ReadLong(28, $a0, addr)) i2c.WriteLong(28, $a0, addr, val) repeat while (i2c.WriteWait(28, $a0, addr)) addr += 4 i-- } PUB CheckCommand(tokens, num, buffer) | ptr1, retval, caseshift retval := 1 caseshift :=(byte[long[tokens][0]][0] => "A" and byte[long[tokens][0]][0] =< "Z") if (num > 2) return 0 if (caseshift) byte[long[tokens][0]][0] += "a" - "A" if (c.strcmp(long[tokens][0], string("help")) == 0) c.printf0(string("$ Type a sentence, or enter one of these commands\n")) c.printf0(string("$ vocab [word] - Print the words I know\n")) c.printf0(string("$ dump - Print the words as hex codes\n")) c.printf0(string("$ forget - Remove a word from memroy\n")) c.printf0(string("$ save - Save the words to EEPROM\n")) c.printf0(string("$ reset - Reset the word table\n")) c.printf0(string("$ basic - Reset the word table to a basic list\n")) c.printf0(string("$ history - Print the short term memory\n")) c.printf0(string("$ goodbye - Exit the program\n")) elseif (c.strcmp(long[tokens][0], string("goodbye")) == 0) if (changeflag := 0) repeat while (1) c.printf0(string("< Should I save?\n")) c.printf0(string("> ")) c.gets(buffer) ptr1 := SkipChar(buffer, " ") if (toupper(byte[ptr1][0]) == "Y") SaveVocab quit elseif (toupper(byte[ptr1][0]) == "N") quit c.printf0(string("< I don't undertand\n")) c.printf0(string("< Goodbye\n")) waitcnt(cnt+clkfreq/10) 'abort(0) spinix.exit(0) elseif (c.strcmp(long[tokens][0], string("vocab")) == 0) DumpAsciiWords(long[tokens][1], num) elseif (c.strcmp(long[tokens][0], string("dump")) == 0) DumpHexWords elseif (c.strcmp(long[tokens][0], string("forget")) == 0) DeleteWord(tokens, num) elseif (c.strcmp(long[tokens][0], string("save")) == 0) SaveVocab elseif (c.strcmp(long[tokens][0], string("reset")) == 0) ResetVocab elseif (c.strcmp(long[tokens][0], string("basic")) == 0) ResetBasicVocab elseif (c.strcmp(long[tokens][0], string("history")) == 0) PrintMemory elseif (c.strcmp(long[tokens][0], string("debug")) == 0) debugmode := not debugmode else retval := 0 ' Restore the case if needed if (caseshift) byte[long[tokens][0]][0] -= "a" - "A" return retval ' This routine set the linefeed enable flag based on the config word ' The config word is the first long after the last argument PUB config_linefeed(argc, argv) | ptr ptr := long[argv][argc-1] ptr += strsize(ptr) + 1 ptr := ((ptr + 3) >> 2) << 2 c.set_linefeed(long[ptr] & 1) PUB main(argc, argv) | i, num, ptr1, ignore, question, caseshift, buffer[25], tokens[50] 'speak := c.getstdout 'speak := c.openserial(16, 16, 0, 9600, 64, 64) config_linefeed(argc, argv) c.printf0(string("Lerner 0.08 -- Spinix version\n")) c.printf0(string("Save command disabled in this version\n\n")) 'i2c.Initialize(28) i := 0 repeat while (i =< MEMORY_MASK) Memory[i] := 0 i++ 'printf("< Hello\n"); ptr1 := FindWords(string("you"), string("are")) if (ptr1) PrintStatement(string("you"), ptr1, 1) ' Loop on each user input repeat while (1) WaitForInput c.gets(@buffer) num := tokenize(@buffer, @tokens) if (num == 0) next if (CheckCommand(@tokens, num, @buffer)) next ' Check for a question mark at the end if (c.strcmp(tokens[num - 1], string("?")) == 0) question := 1 num-- else question := 0 ' Check if all the words are in the vocab table ignore := 0 i := 0 repeat while (i < num) if (FindWord(tokens[i]) == 0) if (ignore := UnknownWord(@tokens, num, i)) quit i++ if (ignore) next ' Process the user input Process(@tokens, num, question) return 0 { +-----------------------------------------------------------------------------+ | TERMS OF USE: MIT License | +-----------------------------------------------------------------------------+ |Permission is hereby granted, free of charge, to any person obtaining a copy | |of this software and associated documentation files (the "Software"), to deal| |in the Software without restriction, including without limitation the rights | |to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |copies of the Software, and to permit persons to whom the Software is | |furnished to do so, subject to the following conditions: | | | |The above copyright notice and this permission notice shall be included in | |all copies or substantial portions of the Software. | | | |THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,| |OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE| |SOFTWARE. | +-----------------------------------------------------------------------------+ }