;FF1 860218 0714 Part 1 of 1 ;TRS80 Model 100 fig-Forth Version 1.1D ; by Michael Weiblen CIS: 72506,2072 ; 4809 Calvert Rd, College Park MD 20740 ;Based on fig-Forth 8080 Release 1.1 ; available from the Forth Interest Group ; I have commented only my mods. See the fig source listing for more ; complete comments. FIGREL=1 FIGREV=1 USRVER=8 ; increment this please! ;ASCII CHARS USED ABL=32 ACR=13 ADOT=46 BELL=7 BSIN=8 BSOUT=8 CTLC=3 DLE=16 LF=10 FF=12 ;MEMORY ALLOCATION EM=$ECE8 ;LIMIT = Highest memory used US=64 ;User Var Space RTS=160 ;Ret Stack & Term Buffer INITR0=EM-US ;R0 INITS0=INITR0-RTS ;S0 .=40960 ; was ; .=$8000 ; base of ram in 32k machine ORIG NOP JP CLD NOP JP WRM ORIG_B_FIGREL=.-ORIG .BYTE FIGREL ORIG_B_FIGREV=.-ORIG .BYTE FIGREV ORIG_B_USRVER=.-ORIG .BYTE USRVER ORIG_B_IMPLEMENTATION=.-ORIG .BYTE $0E ;Implementation Attrib ORIG_W_TOP_WORD=.-ORIG .WORD TASK-7 ;Top word in vocab ORIG_W_BSIN=.-ORIG .WORD BSIN ORIG_W_UP=.-ORIG .WORD INITR0 ;UP ORIG_W_S0=.-ORIG .WORD INITS0 ;S0 ORIG_W_R0=.-ORIG .WORD INITR0 ;R0 ORIG_W_TIB=.-ORIG .WORD INITS0 ;TIB ORIG_W_WIDTH=.-ORIG .WORD $1F ;WIDTH ORIG_W_WARNING=.-ORIG .WORD 0 ;WARNING ORIG_W_FENCE=.-ORIG .WORD INITDP ;FENCE ORIG_W_DP=.-ORIG .WORD INITDP ;DP ORIG_W_VOCABULARY_LINK=.-ORIG .WORD FORTH+8 ;VOC-LINK ORIG_L_CPU_NAME=.-ORIG .WORD $5,$B320;CPU Name UP .WORD INITR0 ;User Area Pointer RPP .WORD INITR0 ;Ret Stack Pointer ;Inner Interpreter DPUSH PUSH DE HPUSH PUSH HL NEXT LD A,(BC) INC BC LD L,A LD A,(BC) INC BC LD H,A NEXT1 LD E,(HL) INC HL LD D,(HL) EX DE,HL JP (HL) ;FORTH DICTIONARY .BYTE $84 ; NOOP; the first thing it should know how to do .ASCII 'NOO' .BYTE $0D0 .WORD 0 NOOP .WORD DOCOL,SEMIS ;M100 INTERFACE FOR TERMINAL CHGET=$12CB ;Get a character from the keyboard BRKCHK=$729F ;Check if shift-break pressed LCD=$4B44 ;Display a character of the LCD screen LPT=$6D3F ;Send a character to the printer .BYTE $84 ;EMIT .ASCII 'EMI' .BYTE $0D4 .WORD NOOP-7 EMIT .WORD DOCOL .WORD PEMIT .WORD ONE,OUTT .WORD PSTOR,SEMIS PEMIT .WORD .+2 ; (EMIT) POP HL PUSH BC LD A,L CALL CPOUT POP BC JP NEXT CPOUT CALL LCD ;Display A on the LCD & send to LPT if EPRINT<>0 LD E,A LD A,(EPRINT) OR A RET Z LD A,E ;This checks for linefeeds. CP LF ;Most printers dont need them. RET Z ;Make this line a NOP if you do. JP LPT EPRINT .WORD 0 ;Printer echo on/off flag .BYTE $83 ;KEY .ASCII 'KE' .BYTE $0D9 .WORD EMIT-7 KEY .WORD .+2 PKEY CALL CHGET ;(KEY) CP CTLC ;If its a ^C, ignore it. (We detect break elsewhere) JP Z,PKEY CP DLE ;If its a ^P, toggle the printer echo flag. JP NZ,PKEY1 LD HL,EPRINT LD A,(HL) XOR 1 LD (HL),A JP PKEY PKEY1 LD L,A LD H,0 JP HPUSH .BYTE $89 ;?TERMINAL .ASCII '?TERMINA' .BYTE $0CC .WORD KEY-6 QTERM .WORD .+2 PQTER CALL BRKCHK ;(?TERMINAL) LD HL,0 ;HL=1 if shift-break is pressed JP NC,PQTE1 INC L PQTE1 JP HPUSH .BYTE $82 ;CR .ASCII 'C' .BYTE $0D2 .WORD QTERM-$0C CR .WORD .+2 PCR PUSH BC ;(CR) LD A,ACR CALL CPOUT LD A,LF CALL CPOUT POP BC JP NEXT DP0 .BYTE $83 ;LIT .ASCII 'LI' .BYTE $0D4 .WORD CR-5 LIT .WORD .+2 LD A,(BC) INC BC LD L,A LD A,(BC) INC BC LD H,A JP HPUSH .BYTE $87 ;EXECUTE .ASCII 'EXECUT' .BYTE $0C5 .WORD LIT-6 EXEC .WORD .+2 POP HL JP NEXT1 .BYTE $86 ;BRANCH .ASCII 'BRANC' .BYTE $0C8 .WORD EXEC-$0A BRAN .WORD .+2 BRAN1 LD H,B LD L,C LD E,(HL) INC HL LD D,(HL) DEC HL ADD HL,DE LD C,L LD B,H JP NEXT .BYTE $87 ;0BRANCH .ASCII '0BRANC' .BYTE $0C8 .WORD BRAN-9 ZBRAN .WORD .+2 POP HL LD A,L OR H JP Z,BRAN1 INC BC INC BC JP NEXT .BYTE $86 ;(LOOP) .ASCII '(LOOP' .BYTE $0A9 .WORD ZBRAN-$0A XLOOP .WORD .+2 LD DE,1 XLOO1 LD HL,(RPP) LD A,(HL) ADD A,E LD (HL),A LD E,A INC HL LD A,(HL) ADC A,D LD (HL),A INC HL INC D DEC D LD D,A JP M,XLOO2 LD A,E SUB (HL) LD A,D INC HL SBC A,(HL) JP XLOO3 XLOO2 LD A,(HL) SUB E INC HL LD A,(HL) SBC A,D XLOO3 JP M,BRAN1 INC HL LD (RPP),HL INC BC INC BC JP NEXT .BYTE $87 .ASCII '(+LOOP' .BYTE $0A9 .WORD XLOOP-9 XPLOO .WORD .+2 POP DE JP XLOO1 .BYTE $84 .ASCII '(DO' .BYTE $0A9 .WORD XPLOO-$0A XDO .WORD .+2 LD HL,(RPP) DEC HL DEC HL DEC HL DEC HL LD (RPP),HL POP DE LD (HL),E INC HL LD (HL),D POP DE INC HL LD (HL),E INC HL LD (HL),D JP NEXT .BYTE $81 ;I .BYTE $0C9 .WORD XDO-7 IDO .WORD .+2 LD HL,(RPP) LD E,(HL) INC HL LD D,(HL) PUSH DE JP NEXT .BYTE $85 ;DIGIT .ASCII 'DIGI' .BYTE $0D4 .WORD IDO-4 DIGIT .WORD .+2 POP HL POP DE LD A,E SUB $30 JP M,DIGI2 CP 10 JP M,DIGI1 SUB 7 CP 10 JP M,DIGI2 DIGI1 CP L JP P,DIGI2 LD E,A LD HL,1 JP DPUSH DIGI2 LD L,H JP HPUSH .BYTE $86 ;(FIND) ( text vocabulary -- cfa len true | false ) .ASCII '(FIND' .BYTE $0A9 .WORD DIGIT-8 PFIND .WORD .+2 POP DE ; vocabulary PFIN1 POP HL ; name of word to find (counted string) PUSH HL LD A,(DE) ; get size byte XOR (HL) ; turn off all the bits that are meant to be off AND $3F ; keep the size bits only JP NZ,PFIN4 ; different? jump to skip this work PFIN2 INC HL INC DE LD A,(DE) XOR (HL) ADD A,A JP NZ,PFIN3 ; didn't match JP NC,PFIN2 ; wasn't last character in name? LD HL,5 ; calculate cfa ADD HL,DE EX (SP),HL ; place cfa on stack PFIN6 DEC DE ; hunt backwards for start of word LD A,(DE) OR A JP P,PFIN6 ; loop until start of word LD E,A ; save length LD D,0 LD HL,1 ; true JP DPUSH PFIN3 JP C,PFIN5 PFIN4 INC DE ; scan word name bytes until terminator LD A,(DE) OR A JP P,PFIN4 PFIN5 INC DE EX DE,HL ; go to previous word in chain LD E,(HL) INC HL LD D,(HL) LD A,D OR E JP NZ,PFIN1 ; jump if there is a word POP HL LD HL,0 JP HPUSH ; word not found .BYTE $87 ;ENCLOSE (New Version) .ASCII 'ENCLOS' .BYTE $0C5 .WORD PFIND-9 ENCL .WORD .+2 POP DE POP HL PUSH HL LD A,E LD DE,$0FFFF DEC HL ENCL1 INC HL INC DE CP (HL) JP Z,ENCL1 PUSH DE PUSH AF LD A,(HL) AND A JP NZ,ENCL2 POP AF INC DE PUSH DE DEC DE PUSH DE JP NEXT ENCL2 POP AF INC HL INC DE CP (HL) JP Z,ENCL4 PUSH AF LD A,(HL) AND A JP NZ,ENCL2 ENCL3 POP AF PUSH DE PUSH DE JP NEXT ENCL4 PUSH DE INC DE PUSH DE JP NEXT .BYTE $85 ;CMOVE .ASCII 'CMOV' .BYTE $0C5 .WORD ENCL-10 CMOVE .WORD .+2 LD L,C LD H,B POP BC POP DE EX (SP),HL JP CMOV2 CMOV1 LD A,(HL) INC HL LD (DE),A INC DE DEC BC CMOV2 LD A,B OR C JP NZ,CMOV1 POP BC JP NEXT .BYTE $82 ;U* .ASCII 'U' .BYTE $0AA .WORD CMOVE-8 USTAR .WORD .+2 POP DE POP HL PUSH BC LD B,H LD A,L CALL MPYX PUSH HL LD H,A LD A,B LD B,H CALL MPYX POP DE LD C,D ADD HL,BC ADC A,0 LD D,L LD L,H LD H,A POP BC PUSH DE JP HPUSH MPYX LD HL,0 ;MULTIPLY PRIMITIVE LD C,8 MPYX1 ADD HL,HL RLA JP NC,MPYX2 ADD HL,DE ADC A,0 MPYX2 DEC C JP NZ,MPYX1 RET .BYTE $82 ;U/ .ASCII 'U' .BYTE $0AF .WORD USTAR-5 USLAS .WORD .+2 LD HL,4 ADD HL,SP LD E,(HL) LD (HL),C INC HL LD D,(HL) LD (HL),B POP BC POP HL LD A,L SUB C LD A,H SBC A,B JP C,USLA1 LD HL,$0FFFF LD DE,$0FFFF JP USLA7 USLA1 LD A,16 USLA2 ADD HL,HL RLA EX DE,HL ADD HL,HL JP NC,USLA3 INC DE AND A USLA3 EX DE,HL RRA PUSH AF JP NC,USLA4 LD A,L SUB C LD L,A LD A,H SBC A,B LD H,A JP USLA5 USLA4 LD A,L SUB C LD L,A LD A,H SBC A,B LD H,A JP NC,USLA5 ADD HL,BC DEC DE USLA5 INC DE USLA6 POP AF DEC A JP NZ,USLA2 USLA7 POP BC PUSH HL PUSH DE JP NEXT .BYTE $83 ;AND .ASCII 'AN' .BYTE $0C4 .WORD USLAS-5 ANDD .WORD .+2 POP DE POP HL LD A,E AND L LD L,A LD A,D AND H LD H,A JP HPUSH .BYTE $82 ;OR .ASCII 'O' .BYTE $0D2 .WORD ANDD-6 ORR .WORD .+2 POP DE POP HL LD A,E OR L LD L,A LD A,D OR H LD H,A JP HPUSH .BYTE $83 ;XOR .ASCII 'XO' .BYTE $0D2 .WORD ORR-5 XORR .WORD .+2 POP DE POP HL LD A,E XOR L LD L,A LD A,D XOR H LD H,A JP HPUSH .BYTE $83 ;SP@ .ASCII 'SP' .BYTE $0C0 .WORD XORR-6 SPAT .WORD .+2 LD HL,0 ADD HL,SP JP HPUSH .BYTE $83 ;SP! .ASCII 'SP' .BYTE $0A1 .WORD SPAT-6 SPSTO .WORD .+2 LD HL,(UP) LD DE,6 ADD HL,DE LD E,(HL) INC HL LD D,(HL) EX DE,HL LD SP,HL JP NEXT .BYTE $83 ;RP@ .ASCII 'RP' .BYTE $0C0 .WORD SPSTO-6 RPAT .WORD .+2 LD HL,(RPP) JP HPUSH .BYTE $83 ;RP! .ASCII 'RP' .BYTE $0A1 .WORD RPAT-6 RPSTO .WORD .+2 LD HL,(UP) LD DE,8 ADD HL,DE LD E,(HL) INC HL LD D,(HL) EX DE,HL LD (RPP),HL JP NEXT .BYTE $82 ; ;S .BYTE $03B .BYTE $0D3 .WORD RPSTO-6 SEMIS .WORD .+2 LD HL,(RPP) LD C,(HL) INC HL LD B,(HL) INC HL LD (RPP),HL JP NEXT .BYTE $85 ;LEAVE .ASCII 'LEAV' .BYTE $0C5 .WORD SEMIS-5 LEAVE .WORD .+2 LD HL,(RPP) LD E,(HL) INC HL LD D,(HL) INC HL LD (HL),E INC HL LD (HL),D JP NEXT .BYTE $82 .ASCII '>' .BYTE $0D2 .WORD LEAVE-8 TOR .WORD .+2 POP DE LD HL,(RPP) DEC HL DEC HL LD (RPP),HL LD (HL),E INC HL LD (HL),D JP NEXT .BYTE $82 ;R> .ASCII 'R' .BYTE $0BE .WORD TOR-5 FROMR .WORD .+2 LD HL,(RPP) LD E,(HL) INC HL LD D,(HL) INC HL LD (RPP),HL PUSH DE JP NEXT .BYTE $82 ; R@ .ASCII 'R' .BYTE '@+$80 .WORD FROMR-5 RR .WORD IDO+2 .BYTE $82 ;0= .ASCII '0' .BYTE $0BD .WORD RR-5 ZEQU .WORD .+2 POP HL LD A,L OR H LD HL,0 JP NZ,ZEQU1 INC HL ZEQU1 JP HPUSH .BYTE $82 ;0< .ASCII '0' .BYTE $0BC .WORD ZEQU-5 ZLESS .WORD .+2 POP HL ADD HL,HL LD HL,0 JP NC,ZLES1 INC HL ZLES1 JP HPUSH .BYTE $81 ;+ .BYTE $0AB .WORD ZLESS-5 PLUS .WORD .+2 POP DE POP HL ADD HL,DE JP HPUSH .BYTE $82 ;D+ .ASCII 'D' .BYTE $0AB .WORD PLUS-4 DPLUS .WORD .+2 LD HL,6 ADD HL,SP LD E,(HL) LD (HL),C INC HL LD D,(HL) LD (HL),B POP BC POP HL ADD HL,DE EX DE,HL POP HL LD A,L ADC A,C LD L,A LD A,H ADC A,B LD H,A POP BC PUSH DE JP HPUSH .BYTE $85 ;MINUS .ASCII 'MINU' .BYTE $0D3 .WORD DPLUS-5 MINUS .WORD .+2 POP HL LD A,L CPL LD L,A LD A,H CPL LD H,A INC HL JP HPUSH .BYTE $86 ;DMINUS .ASCII 'DMINU' .BYTE $0D3 .WORD MINUS-8 DMINU .WORD .+2 POP HL POP DE SUB A SUB E LD E,A LD A,0 SBC A,D LD D,A LD A,0 SBC A,L LD L,A LD A,0 SBC A,H LD H,A PUSH DE JP HPUSH .BYTE $84 ;OVER .ASCII 'OVE' .BYTE $0D2 .WORD DMINU-9 OVER .WORD .+2 POP DE POP HL PUSH HL JP DPUSH .BYTE $84 ;DROP .ASCII 'DRO' .BYTE $0D0 .WORD OVER-7 DROP .WORD .+2 POP HL JP NEXT .BYTE $84 ;SWAP .ASCII 'SWA' .BYTE $0D0 .WORD DROP-7 SWAP .WORD .+2 POP HL EX (SP),HL JP HPUSH .BYTE $83 ;DUP .ASCII 'DU' .BYTE $0D0 .WORD SWAP-7 DUP .WORD .+2 POP HL PUSH HL JP HPUSH .BYTE $84 ;2DUP .ASCII '2DU' .BYTE $0D0 .WORD DUP-6 TDUP .WORD .+2 POP HL POP DE PUSH DE PUSH HL JP DPUSH .BYTE $82 ; +! .ASCII '+' .BYTE $0A1 .WORD TDUP-7 PSTOR .WORD .+2 POP HL POP DE LD A,(HL) ADD A,E LD (HL),A INC HL LD A,(HL) ADC A,D LD (HL),A JP NEXT .BYTE $86 ;TOGGLE .ASCII 'TOGGL' .BYTE $0C5 .WORD PSTOR-5 TOGGL .WORD .+2 POP DE POP HL LD A,(HL) XOR E LD (HL),A JP NEXT .BYTE $81 ; @ .BYTE $0C0 .WORD TOGGL-9 AT .WORD .+2 POP HL LD E,(HL) INC HL LD D,(HL) PUSH DE JP NEXT .BYTE $82 ; C@ .ASCII 'C' .BYTE $0C0 .WORD AT-4 CAT .WORD .+2 POP HL LD L,(HL) LD H,0 JP HPUSH .BYTE $82 ; 2@ .ASCII '2' .BYTE $0C0 .WORD CAT-5 TAT .WORD .+2 POP HL LD DE,2 ADD HL,DE LD E,(HL) INC HL LD D,(HL) PUSH DE LD DE,$0FFFD ADD HL,DE LD E,(HL) INC HL LD D,(HL) PUSH DE JP NEXT .BYTE $81 ;! .BYTE $0A1 .WORD TAT-5 STORE .WORD .+2 POP HL POP DE LD (HL),E INC HL LD (HL),D JP NEXT .BYTE $82 ;C! .ASCII 'C' .BYTE $0A1 .WORD STORE-4 CSTOR .WORD .+2 POP HL POP DE LD (HL),E JP NEXT .BYTE $82 ;2! .ASCII '2' .BYTE $0A1 .WORD CSTOR-5 TSTOR .WORD .+2 POP HL POP DE LD (HL),E INC HL LD (HL),D INC HL POP DE LD (HL),E INC HL LD (HL),D JP NEXT .BYTE $0C1 ; : .BYTE $0BA .WORD TSTOR-5 COLON .WORD DOCOL .WORD QEXEC .WORD SCSP .WORD CURR .WORD AT .WORD CONT .WORD STORE .WORD CREAT .WORD RBRAC .WORD PSCOD DOCOL LD HL,(RPP) DEC HL LD (HL),B DEC HL LD (HL),C LD (RPP),HL INC DE LD C,E LD B,D JP NEXT .BYTE $0C1 ; ; .BYTE $0BB .WORD COLON-4 SEMI .WORD DOCOL .WORD QCSP .WORD COMP .WORD SEMIS .WORD SMUDG .WORD LBRAC .WORD SEMIS .BYTE $88 ; CONSTANT .ASCII 'CONSTAN' .BYTE $0D4 .WORD SEMI-4 CON .WORD DOCOL,CREAT,SMUDG,COMMA,PSCOD DOCON INC DE EX DE,HL LD E,(HL) INC HL LD D,(HL) PUSH DE JP NEXT .BYTE $88 ; VARIABLE .ASCII 'VARIABL' .BYTE $0C5 .WORD CON-11 VAR .WORD DOCOL,ZERO,CON,PSCOD DOVAR INC DE PUSH DE JP NEXT .BYTE $84 ; USER .ASCII 'USE' .BYTE $0D2 .WORD VAR-11 USER .WORD DOCOL,CON,PSCOD DOUSE INC DE EX DE,HL LD E,(HL) LD D,0 LD HL,(UP) ADD HL,DE JP HPUSH ; CONSTANTS .BYTE $81 ; 0 .BYTE $0B0 .WORD USER-7 ZERO .WORD DOCON,0 .BYTE $81 ; 1 .BYTE $0B1 .WORD ZERO-4 ONE .WORD DOCON,1 .BYTE $81 ; 2 .BYTE $0B2 .WORD ONE-4 TWO .WORD DOCON,2 .BYTE $81 ; 3 .BYTE $0B3 .WORD TWO-4 THREE .WORD DOCON,3 .BYTE $82 ;BL .ASCII 'B' .BYTE $0CC .WORD THREE-4 BL .WORD DOCON,ABL .BYTE $83 ; C/L .ASCII 'C/' .BYTE $0CC .WORD BL-5 CSLL .WORD DOCON,30 .BYTE $85 ; LIMIT .ASCII 'LIMI' .BYTE $0D4 .WORD CSLL-6 LIMIT .WORD DOCON,EM .BYTE $86 ; (NEXT) .ASCII '(NEXT' .BYTE ')+$80 .WORD LIMIT-8 NEXTC .WORD DOCON,NEXT .BYTE $85 ; (KEY) .ASCII '(KEY' .BYTE ')+$80 .WORD NEXTC-9 PKEYC .WORD DOCON,PKEY+1 .BYTE $86 ; (EMIT) .ASCII '(EMIT' .BYTE ')+$80 .WORD PKEYC-8 CPOUTT .WORD DOCON,CPOUT+1 .BYTE $87 ; +ORIGIN .ASCII '+ORIGI' .BYTE $0CE .WORD CPOUTT-9 PORIG .WORD DOCOL,LIT,ORIG,PLUS,SEMIS ; USER VARIABLES .BYTE $82 ; S0 .ASCII 'S' .BYTE $0B0 .WORD PORIG-10 SZERO .WORD DOUSE .BYTE 6 .BYTE $82 ; R0 .ASCII 'R' .BYTE $0B0 .WORD SZERO-5 RZERO .WORD DOUSE .BYTE 8 .BYTE $83 ; TIB .ASCII 'TI' .BYTE $0C2 .WORD RZERO-5 TIB .WORD DOUSE .BYTE 10 .BYTE $85 ; WIDTH .ASCII 'WIDT' .BYTE $0C8 .WORD TIB-6 WIDTH .WORD DOUSE .BYTE 12 .BYTE $87 ;WARNING .ASCII 'WARNIN' .BYTE $0C7 .WORD WIDTH-8 WARN .WORD DOUSE .BYTE 14 .BYTE $85 ;FENCE .ASCII 'FENC' .BYTE $0C5 .WORD WARN-10 FENCE .WORD DOUSE .BYTE 16 .BYTE $82 ;DP .ASCII 'D' .BYTE $0D0 .WORD FENCE-8 DP .WORD DOUSE .BYTE 18 .BYTE $88 ;VOC-LINK .ASCII 'VOC-LIN' .BYTE $0CB .WORD DP-5 VOCL .WORD DOUSE .BYTE 20 .BYTE $83 ;BLK .ASCII 'BL' .BYTE $0CB .WORD VOCL-11 BLK .WORD DOUSE .BYTE 22 .BYTE $83 ;>IN .ASCII '>I' .BYTE $0CE .WORD BLK-6 INN .WORD DOUSE .BYTE 24 .BYTE $83 ;OUT .ASCII 'OU' .BYTE $0D4 .WORD INN-6 OUTT .WORD DOUSE .BYTE 26 .BYTE $83 ;SCR .ASCII 'SC' .BYTE $0D2 .WORD OUTT-6 SCR .WORD DOUSE .BYTE 28 .BYTE $86 ;OFFSET .ASCII 'OFFSE' .BYTE $0D4 .WORD SCR-6 OFSET .WORD DOUSE .BYTE 30 .BYTE $87 ;CONTEXT .ASCII 'CONTEX' .BYTE $0D4 .WORD OFSET-9 CONT .WORD DOUSE .BYTE 32 .BYTE $87 ;CURRENT .ASCII 'CURREN' .BYTE $0D4 .WORD CONT-10 CURR .WORD DOUSE .BYTE 34 .BYTE $85 ;STATE .ASCII 'STAT' .BYTE $0C5 .WORD CURR-10 STATE .WORD DOUSE .BYTE 36 .BYTE $84 ;BASE .ASCII 'BAS' .BYTE $0C5 .WORD STATE-8 BASE .WORD DOUSE .BYTE 38 .BYTE $83 ;DPL .ASCII 'DP' .BYTE $0CC .WORD BASE-7 DPL .WORD DOUSE .BYTE 40 .BYTE $83 ;FLD .ASCII 'FL' .BYTE $0C4 .WORD DPL-6 FLD .WORD DOUSE .BYTE 42 .BYTE $83 ;CSP .ASCII 'CS' .BYTE $0D0 .WORD FLD-6 CSPP .WORD DOUSE .BYTE 44 .BYTE $82 ; R# .ASCII 'R' .BYTE $0A3 .WORD CSPP-6 RNUM .WORD DOUSE .BYTE 46 .BYTE $83 ;HLD .ASCII 'HL' .BYTE $0C4 .WORD RNUM-5 HLD .WORD DOUSE .BYTE 48 .BYTE $82 ; 1+ .ASCII '1' .BYTE $0AB .WORD HLD-6 ONEP .WORD DOCOL,ONE,PLUS,SEMIS .BYTE $82 ; 2+ .ASCII '2' .BYTE $0AB .WORD ONEP-5 TWOP .WORD DOCOL,TWO,PLUS,SEMIS .BYTE $84 ;HERE .ASCII 'HER' .BYTE $0C5 .WORD TWOP-5 HERE .WORD DOCOL,DP,AT,SEMIS .BYTE $85 ;ALLOT .ASCII 'ALLO' .BYTE $0D4 .WORD HERE-7 ALLOT .WORD DOCOL,DP,PSTOR,SEMIS .BYTE $81 ; , .BYTE $0AC .WORD ALLOT-8 COMMA .WORD DOCOL,HERE,STORE,TWO,ALLOT,SEMIS .BYTE $82 ; C, .ASCII 'C' .BYTE $0AC .WORD COMMA-4 CCOMM .WORD DOCOL,HERE,CSTOR,ONE,ALLOT,SEMIS SSUB LD A,L ;(HL)=(HL)-(DE) SUB E LD L,A LD A,H SBC A,D LD H,A RET .BYTE $81 ; - .BYTE $0AD .WORD CCOMM-5 SUBB .WORD .+2 POP DE POP HL CALL SSUB JP HPUSH .BYTE $81 ; = .BYTE $0BD .WORD SUBB-4 EQUAL .WORD DOCOL,SUBB,ZEQU,SEMIS .BYTE $81 ; < .BYTE $0BC .WORD EQUAL-4 LESS .WORD .+2 POP DE POP HL LD A,D XOR H JP M,LES1 CALL SSUB LES1 INC H DEC H JP M,LES2 LD HL,0 JP HPUSH LES2 LD HL,1 JP HPUSH .BYTE $82 ; U< .ASCII 'U' .BYTE $0BC .WORD LESS-4 ULESS .WORD DOCOL,TDUP .WORD XORR,ZLESS,ZBRAN,ULES1-. .WORD DROP,ZLESS,ZEQU .WORD BRAN,ULES2-. ULES1 .WORD SUBB,ZLESS ULES2 .WORD SEMIS .BYTE $81 ; > .BYTE $0BE .WORD ULESS-5 GREAT .WORD DOCOL,SWAP,LESS,SEMIS .BYTE $83 ;ROT .ASCII 'RO' .BYTE $0D4 .WORD GREAT-4 ROT .WORD .+2 POP DE POP HL EX (SP),HL JP DPUSH .BYTE $85 ;SPACE .ASCII 'SPAC' .BYTE $0C5 .WORD ROT-6 SPACE .WORD DOCOL,BL,EMIT,SEMIS .BYTE $84 ; -DUP .ASCII '-DU' .BYTE $0D0 .WORD SPACE-8 DDUP .WORD DOCOL,DUP .WORD ZBRAN,DDUP1-. .WORD DUP DDUP1 .WORD SEMIS .BYTE $88 ;TRAVERSE .ASCII 'TRAVERS' .BYTE $0C5 .WORD DDUP-7 TRAV .WORD DOCOL,SWAP TRAV1 .WORD OVER .WORD PLUS .WORD LIT,$7F .WORD OVER .WORD CAT .WORD LESS,ZBRAN,TRAV1-. .WORD SWAP,DROP,SEMIS .BYTE $86 ;LATEST .ASCII 'LATES' .BYTE $0D4 .WORD TRAV-11 LATES .WORD DOCOL,CURR,AT,AT,SEMIS .BYTE $83 ; LFA .ASCII 'LF' .BYTE $0C1 .WORD LATES-9 LFA .WORD DOCOL,LIT,4,SUBB,SEMIS .BYTE $83 ;CFA .ASCII 'CF' .BYTE $0C1 .WORD LFA-6 CFA .WORD DOCOL,TWO,SUBB,SEMIS .BYTE $83 ;NFA .ASCII 'NF' .BYTE $0C1 .WORD CFA-6 NFA .WORD DOCOL,LIT,5,SUBB .WORD LIT,$0FFFF,TRAV,SEMIS .BYTE $83 ;PFA .ASCII 'PF' .BYTE $0C1 .WORD NFA-6 PFA .WORD DOCOL,ONE,TRAV .WORD LIT,5,PLUS,SEMIS .BYTE $84 ; !CSP .ASCII '!CS' .BYTE $0D0 .WORD PFA-6 SCSP .WORD DOCOL,SPAT,CSPP,STORE,SEMIS .BYTE $86 ;?ERROR .ASCII '?ERRO' .BYTE $0D2 .WORD SCSP-7 QERR .WORD DOCOL .WORD SWAP,ZBRAN,QERR1-. .WORD ERROR,BRAN,QERR2-. QERR1 .WORD DROP QERR2 .WORD SEMIS .BYTE $85 ;?COMP .ASCII '?COM' .BYTE $0D0 .WORD QERR-9 QCOMP .WORD DOCOL .WORD STATE,AT,ZEQU .WORD LIT,17,QERR,SEMIS .BYTE $85 ;?EXEC .ASCII '?EXE' .BYTE $0C3 .WORD QCOMP-8 QEXEC .WORD DOCOL,STATE,AT .WORD LIT,18,QERR,SEMIS .BYTE $86 ;?PAIRS .ASCII '?PAIR' .BYTE $0D3 .WORD QEXEC-8 QPAIR .WORD DOCOL,SUBB .WORD LIT,19,QERR,SEMIS .BYTE $84 ; ?CSP .ASCII '?CS' .BYTE $0D0 .WORD QPAIR-9 QCSP .WORD DOCOL,SPAT .WORD CSPP,AT,SUBB .WORD LIT,20,QERR,SEMIS .BYTE $88 ; ?LOADING .ASCII '?LOADIN' .BYTE $0C7 .WORD QCSP-7 QLOAD .WORD DOCOL .WORD BLK,AT,ZEQU .WORD LIT,22,QERR,SEMIS .BYTE $87 ;COMPILE .ASCII 'COMPIL' .BYTE $0C5 .WORD QLOAD-11 COMP .WORD DOCOL,QCOMP .WORD FROMR,DUP,TWOP,TOR .WORD AT,COMMA,SEMIS .BYTE $0C1 ; [ .BYTE $0DB .WORD COMP-10 LBRAC .WORD DOCOL,ZERO,STATE,STORE,SEMIS .BYTE $81 ; ] .BYTE $0DD .WORD LBRAC-4 RBRAC .WORD DOCOL,LIT,$0C0,STATE,STORE,SEMIS .BYTE $86 ;SMUDGE .ASCII 'SMUDG' .BYTE $0C5 .WORD RBRAC-4 SMUDG .WORD DOCOL,LATES .WORD LIT,$20,TOGGL,SEMIS .BYTE $83 ;HEX .ASCII 'HE' .BYTE $0D8 .WORD SMUDG-9 HEX .WORD DOCOL,LIT,16,BASE,STORE,SEMIS .BYTE $87 ;DECIMAL .ASCII 'DECIMA' .BYTE $0CC .WORD HEX-6 DEC .WORD DOCOL,LIT,10,BASE,STORE,SEMIS .BYTE $87 ; (;CODE) .BYTE $28,$3B .ASCII 'CODE' .BYTE $0A9 .WORD DEC-10 PSCOD .WORD DOCOL,FROMR,LATES .WORD PFA,CFA,STORE,SEMIS .BYTE $0C5 ; ;CODE .BYTE $3B .ASCII 'COD' .BYTE $0C5 .WORD PSCOD-10 SEMIC .WORD DOCOL .WORD QCSP,COMP,PSCOD,LBRAC SEMI1 .WORD NOOP,SEMIS .BYTE $87 ; .ASCII 'DOES' .BYTE $0BE .WORD BUILD-10 DOES .WORD DOCOL,FROMR,LATES,PFA,STORE,PSCOD DODOE LD HL,(RPP) DEC HL LD (HL),B DEC HL LD (HL),C LD (RPP),HL INC DE EX DE,HL LD C,(HL) INC HL LD B,(HL) INC HL JP HPUSH .BYTE $85 ; COUNT .ASCII 'COUN' .BYTE $0D4 .WORD DOES-8 COUNT .WORD DOCOL,DUP,ONEP,SWAP,CAT,SEMIS .BYTE $84 ; TYPE .ASCII 'TYP' .BYTE $0C5 .WORD COUNT-8 TYPE .WORD DOCOL .WORD DDUP,ZBRAN,TYPE1-. .WORD OVER,PLUS,SWAP .WORD XDO TYPE2 .WORD IDO,CAT .WORD LIT,$7F,ANDD ;Here I AND the ascii with $7F to strip off the .WORD EMIT ;flags used to mark the end of the word. .WORD XLOOP,TYPE2-. ;(Keeps unwanted graphics characters away) .WORD BRAN,TYPE3-. TYPE1 .WORD DROP TYPE3 .WORD SEMIS .BYTE $89 ; -TRAILING .ASCII '-TRAILIN' .BYTE $0C7 .WORD TYPE-7 DTRAI .WORD DOCOL .WORD DUP,ZERO .WORD XDO DTRA1 .WORD OVER,OVER,PLUS,ONE,SUBB .WORD CAT,BL,SUBB .WORD ZBRAN,DTRA2-. .WORD LEAVE .WORD BRAN,DTRA3-. DTRA2 .WORD ONE,SUBB DTRA3 .WORD XLOOP,DTRA1-. .WORD SEMIS .BYTE $84 ; (.") .ASCII '(."' .BYTE $0A9 .WORD DTRAI-12 PDOTQ .WORD DOCOL,RR .WORD COUNT,DUP,ONEP .WORD FROMR,PLUS,TOR .WORD TYPE .WORD SEMIS .BYTE $0C2 ; ." .BYTE $02E .BYTE $0A2 .WORD PDOTQ-7 DOTQ .WORD DOCOL .WORD LIT,34 .WORD STATE,AT,ZBRAN,DOTQ1-. .WORD COMP .WORD PDOTQ .WORD WORD .WORD HERE,CAT,ONEP,ALLOT .WORD BRAN,DOTQ2-. DOTQ1 .WORD WORD,HERE,COUNT,TYPE DOTQ2 .WORD SEMIS .BYTE $86 ;EXPECT .ASCII 'EXPEC' .BYTE $0D4 .WORD DOTQ-5 EXPEC .WORD DOCOL .WORD OVER,PLUS,OVER .WORD XDO EXPE1 .WORD KEY,DUP .WORD LIT,ORIG_W_BSIN,PORIG,AT,EQUAL .WORD OVER,LIT,127,EQUAL,ORR .WORD ZBRAN,EXPE2-. .WORD DROP .WORD DUP .WORD IDO,EQUAL .WORD DUP .WORD FROMR,TWO,SUBB,PLUS,TOR .WORD ZBRAN,EXPE6-. .WORD LIT,BELL .WORD BRAN,EXPE7-. EXPE6 .WORD LIT,BSOUT EXPE7 .WORD BRAN,EXPE3-. EXPE2 .WORD DUP .WORD LIT,13,EQUAL,ZBRAN,EXPE4-. .WORD LEAVE .WORD DROP .WORD BL .WORD ZERO .WORD BRAN,EXPE5-. EXPE4 .WORD DUP EXPE5 .WORD IDO .WORD CSTOR .WORD ZERO .WORD IDO .WORD ONEP .WORD STORE EXPE3 .WORD EMIT .WORD XLOOP,EXPE1-. .WORD DROP,SEMIS .BYTE $85 ; QUERY .ASCII 'QUER' .BYTE $0D9 .WORD EXPEC-9 QUERY .WORD DOCOL .WORD TIB,AT,LIT,80,EXPEC .WORD ZERO,INN,STORE,SEMIS .BYTE $0C1 ; NULL .BYTE $80 .WORD QUERY-8 NULL .WORD DOCOL,FROMR,DROP,SEMIS .BYTE $84 ;FILL .ASCII 'FIL' .BYTE $0CC .WORD NULL-4 FILL .WORD .+2 LD L,C LD H,B POP DE POP BC EX (SP),HL EX DE,HL FILL1 LD A,B OR C JP Z,FILL2 LD A,L LD (DE),A INC DE DEC BC JP FILL1 FILL2 POP BC JP NEXT .BYTE $85 ;ERASE .ASCII 'ERAS' .BYTE $0C5 .WORD FILL-7 ERASEE .WORD DOCOL,ZERO,FILL,SEMIS .BYTE $086 ; BLANKS .ASCII 'BLANK' .BYTE $0D3 .WORD ERASEE-8 BLANK .WORD DOCOL,BL,FILL,SEMIS .BYTE $84 ; HOLD .ASCII 'HOL' .BYTE $0C4 .WORD BLANK-9 HOLD .WORD DOCOL .WORD LIT,$0FFFF .WORD HLD,PSTOR .WORD HLD,AT,CSTOR .WORD SEMIS .BYTE $83 ;PAD .ASCII 'PA' .BYTE $0C4 .WORD HOLD-7 PAD .WORD DOCOL,HERE,LIT,68,PLUS,SEMIS .BYTE $84 ; WORD .ASCII 'WOR' .BYTE $0C4 .WORD PAD-6 WORD .WORD DOCOL .WORD BLK,AT,ZBRAN,WORD1-. .WORD BLK,AT ; ,BLOCK .WORD BRAN,WORD2-. WORD1 .WORD TIB,AT WORD2 .WORD INN,AT,PLUS .WORD SWAP .WORD ENCL .WORD HERE,LIT,34,BLANK .WORD INN,PSTOR .WORD OVER,SUBB,TOR .WORD RR,HERE,CSTOR .WORD PLUS,HERE,ONEP,FROMR,CMOVE .WORD SEMIS .BYTE $88 ; (NUMBER) .ASCII '(NUMBER' .BYTE $0A9 .WORD WORD-7 PNUMB .WORD DOCOL PNUM1 .WORD ONEP .WORD DUP .WORD TOR .WORD CAT .WORD BASE,AT .WORD DIGIT .WORD ZBRAN,PNUM2-. .WORD SWAP .WORD BASE,AT,USTAR .WORD DROP .WORD ROT .WORD BASE,AT,USTAR .WORD DPLUS .WORD DPL,AT .WORD ONEP .WORD ZBRAN,PNUM3-. .WORD ONE .WORD DPL .WORD PSTOR PNUM3 .WORD FROMR,BRAN,PNUM1-. PNUM2 .WORD FROMR,SEMIS .BYTE $86 ; NUMBER .ASCII 'NUMBE' .BYTE $0D2 .WORD PNUMB-11 NUMB .WORD DOCOL .WORD ZERO,ZERO .WORD ROT .WORD DUP .WORD ONEP .WORD CAT .WORD LIT,45,EQUAL .WORD DUP .WORD TOR .WORD PLUS .WORD LIT,$0FFFF NUMB1 .WORD DPL,STORE .WORD PNUMB .WORD DUP .WORD CAT .WORD BL,SUBB .WORD ZBRAN,NUMB2-. .WORD DUP .WORD CAT .WORD LIT,46 .WORD SUBB .WORD ZERO,QERR .WORD ZERO,BRAN,NUMB1-. NUMB2 .WORD DROP .WORD FROMR .WORD ZBRAN,NUMB3-. .WORD DMINU NUMB3 .WORD SEMIS .BYTE $85 ; -FIND ( -- cfa len true | false ) .ASCII '-FIN' .BYTE $0C4 .WORD NUMB-9 DFIND .WORD DOCOL ; : -find .WORD BL,WORD ; bl word .WORD HERE ; here .WORD CONT,AT,AT ; context @ @ .WORD PFIND ; (find) .WORD DUP ; dup .WORD ZEQU,ZBRAN,DFIN1-. ; 0= if .WORD DROP,HERE,LATES,PFIND ; drop here latest (find) then DFIN1 .WORD SEMIS ; ; .BYTE $87 ; (ABORT) .ASCII '(ABORT' .BYTE $0A9 .WORD DFIND-8 PABOR .WORD DOCOL,ABORT,SEMIS .BYTE $85 ; ERROR .ASCII 'ERRO' .BYTE $0D2 .WORD PABOR-10 ERROR .WORD DOCOL .WORD WARN,AT,ZLESS,ZBRAN,ERRO1-. .WORD PABOR ERRO1 .WORD HERE,COUNT,TYPE .WORD PDOTQ .BYTE 2 .ASCII '? ' .WORD MESS .WORD SPSTO .WORD BLK,AT .WORD DDUP .WORD ZBRAN,ERRO2-. .WORD INN,AT,SWAP ERRO2 .WORD QUIT .BYTE $83 ; ID. .ASCII 'ID' .BYTE $0AE .WORD ERROR-8 IDDOT .WORD DOCOL .WORD PAD,LIT,32,LIT,$5F,FILL .WORD DUP .WORD PFA,LFA .WORD OVER .WORD SUBB .WORD PAD,SWAP,CMOVE .WORD PAD,COUNT .WORD LIT,$1F,ANDD .WORD TYPE,SPACE,SEMIS .BYTE $86 ; CREATE .ASCII 'CREAT' .BYTE $0C5 .WORD IDDOT-6 CREAT .WORD DOCOL .WORD DFIND,ZBRAN,CREA1-. .WORD DROP,NFA,IDDOT,LIT,4,MESS,SPACE CREA1 .WORD HERE,DUP,CAT .WORD WIDTH,AT,MIN,ONEP,ALLOT .WORD DUP .WORD LIT,$0A0,TOGGL .WORD HERE,ONE,SUBB .WORD LIT,$80,TOGGL .WORD LATES .WORD COMMA .WORD CURR,AT .WORD STORE .WORD HERE .WORD TWOP .WORD COMMA .WORD SEMIS .BYTE $0C9 ; [COMPILE] .ASCII '[COMPILE' .BYTE $0DD .WORD CREAT-9 BCOMP .WORD DOCOL .WORD DFIND,ZEQU,ZERO,QERR .WORD DROP,CFA,COMMA,SEMIS .BYTE $0C7 ; LITERAL .ASCII 'LITERA' .BYTE $0CC .WORD BCOMP-12 LITER .WORD DOCOL .WORD STATE,AT,ZBRAN,LITE1-. .WORD COMP,LIT,COMMA LITE1 .WORD SEMIS .BYTE $0C8 ; DLITERAL .ASCII 'DLITERA' .BYTE $0CC .WORD LITER-10 DLITE .WORD DOCOL .WORD STATE,AT,ZBRAN,DLIT1-. .WORD SWAP,LITER,LITER, DLIT1 .WORD SEMIS .BYTE $86 ; ?STACK .ASCII '?STAC' .BYTE $0CB .WORD DLITE-11 QSTAC .WORD DOCOL .WORD SPAT .WORD SZERO,AT .WORD SWAP .WORD ULESS,ONE,QERR .WORD SPAT .WORD HERE .WORD LIT,$80,PLUS .WORD ULESS,LIT,7,QERR .WORD SEMIS .BYTE $89 ; INTERPRET .ASCII 'INTERPRE' .BYTE $0D4 .WORD QSTAC-9 INTER .WORD DOCOL INTE1 .WORD DFIND,ZBRAN,INTE2-. .WORD STATE,AT .WORD LESS,ZBRAN,INTE3-. .WORD CFA .WORD COMMA .WORD BRAN,INTE4-. INTE3 .WORD CFA .WORD EXEC INTE4 .WORD QSTAC .WORD BRAN,INTE5-. INTE2 .WORD HERE .WORD NUMB .WORD DPL,AT .WORD ONEP .WORD ZBRAN,INTE6-. .WORD DLITE .WORD BRAN,INTE7-. INTE6 .WORD DROP,LITER INTE7 .WORD QSTAC INTE5 .WORD BRAN,INTE1-. .BYTE $89 ; IMMEDIATE .ASCII 'IMMEDIAT' .BYTE $0C5 .WORD INTER-$0C IMMED .WORD DOCOL,LATES,LIT,$40,TOGGL,SEMIS .BYTE $8A ; VOCABULARY .ASCII 'VOCABULAR' .BYTE $0D9 .WORD IMMED-$0C VOCAB .WORD DOCOL .WORD BUILD .WORD LIT,$0A081,COMMA ; ^^^^^^ ?? .WORD CURR,AT,CFA,COMMA .WORD HERE,VOCL,AT,COMMA .WORD VOCL,STORE .WORD DOES DOVOC .WORD TWOP,CONT,STORE,SEMIS .BYTE $0C5 ; FORTH .ASCII 'FORT' .BYTE $0C8 .WORD VOCAB-$0D FORTH .WORD DODOE,DOVOC,$0A081,TASK-7,0 ; ^^^^^^ ??? .BYTE $8B ;DEFINITIONS .ASCII 'DEFINITION' .BYTE $0D3 .WORD FORTH-8 DEFIN .WORD DOCOL,CONT,AT,CURR,STORE,SEMIS .BYTE $0C1 ; ( .BYTE $0A8 .WORD DEFIN-$0E PAREN .WORD DOCOL,LIT,41,WORD,SEMIS .BYTE $84 ;QUIT .ASCII 'QUI' .BYTE $0D4 .WORD PAREN-4 QUIT .WORD DOCOL .WORD ZERO,BLK,STORE .WORD LBRAC QUIT1 .WORD RPSTO .WORD CR .WORD QUERY .WORD INTER .WORD STATE,AT,ZEQU,ZBRAN,QUIT2-. .WORD PDOTQ .BYTE 2 .ASCII 'Ok' QUIT2 .WORD BRAN,QUIT1-. .BYTE $85 ; ABORT .ASCII 'ABOR' .BYTE $0D4 .WORD QUIT-7 ABORT .WORD DOCOL .WORD SPSTO .WORD DEC .WORD QSTAC .WORD CR,DOTCPU .WORD PDOTQ .BYTE 15 .ASCII 'fig-FORTH ' .BYTE FIGREL+48,ADOT,FIGREV+48,adot,USRVER+48 .WORD FORTH,DEFIN,QUIT WRM LD BC,WRM1 JP NEXT WRM1 .WORD WARM .BYTE $84 ;WARM .ASCII 'WAR' .BYTE $0CD .WORD ABORT-8 WARM .WORD DOCOL,ABORT CLD LD BC,CLD1 LD HL,(ORIG+$12) LD SP,HL JP NEXT CLD1 .WORD COLD .BYTE $84 ;COLD .ASCII 'COL' .BYTE $0C4 .WORD WARM-7 COLD .WORD DOCOL .WORD ZERO,LIT,EPRINT,STORE .WORD LIT,ORIG+$12 .WORD LIT,UP,AT .WORD LIT,6,PLUS .WORD LIT,16 .WORD CMOVE .WORD LIT,ORIG+$0C,AT .WORD LIT,FORTH+6,STORE .WORD ABORT .BYTE $84 ; S->D .ASCII 'S->' .BYTE $0C4 .WORD COLD-7 STOD .WORD .+2 POP DE LD HL,0 LD A,D AND $80 JP Z,STOD1 DEC HL STOD1 JP DPUSH .BYTE $82 ; +- .ASCII '+' .BYTE $0AD .WORD STOD-7 PM .WORD DOCOL .WORD ZLESS,ZBRAN,PM1-. .WORD MINUS PM1 .WORD SEMIS .BYTE $83 ; D+- .ASCII 'D+' .BYTE $0AD .WORD PM-5 DPM .WORD DOCOL .WORD ZLESS,ZBRAN,DPM1-. .WORD DMINU DPM1 .WORD SEMIS .BYTE $83 ; ABS .ASCII 'AB' .BYTE $0D3 .WORD DPM-6 ABS .WORD DOCOL,DUP,PM,SEMIS .BYTE $84 ; DABS .ASCII 'DAB' .BYTE $0D3 .WORD ABS-6 DABS .WORD DOCOL,DUP,DPM,SEMIS .BYTE $83 ; MIN .ASCII 'MI' .BYTE $0CE .WORD DABS-7 MIN .WORD DOCOL,TDUP .WORD GREAT,ZBRAN,MIN1-. .WORD SWAP MIN1 .WORD DROP,SEMIS .BYTE $83 ; MAX .ASCII 'MA' .BYTE $0D8 .WORD MIN-6 MAX .WORD DOCOL,TDUP .WORD LESS,ZBRAN,MAX1-. .WORD SWAP MAX1 .WORD DROP,SEMIS .BYTE $82 ; M* .ASCII 'M' .BYTE $0AA .WORD MAX-6 MSTAR .WORD DOCOL,TDUP,XORR .WORD TOR,ABS,SWAP,ABS,USTAR,FROMR .WORD DPM,SEMIS .BYTE $82 ; M/ .ASCII 'M' .BYTE $0AF .WORD MSTAR-5 MSLAS .WORD DOCOL,OVER .WORD TOR,TOR .WORD DABS .WORD RR .WORD ABS .WORD USLAS .WORD FROMR .WORD RR .WORD XORR .WORD PM .WORD SWAP .WORD FROMR .WORD PM .WORD SWAP .WORD SEMIS .BYTE $81 ; * .BYTE $0AA .WORD MSLAS-5 STAR .WORD DOCOL,MSTAR,DROP,SEMIS .BYTE $84 ; /MOD .ASCII '/MO' .BYTE $0C4 .WORD STAR-4 SLMOD .WORD DOCOL .WORD TOR,STOD,FROMR,MSLAS,SEMIS .BYTE $81 ; / .BYTE $0AF .WORD SLMOD-7 SLASH .WORD DOCOL,SLMOD,SWAP,DROP,SEMIS .BYTE $83 ; MOD .ASCII 'MO' .BYTE $0C4 .WORD SLASH-4 MODD .WORD DOCOL,SLMOD,DROP,SEMIS .BYTE $85 ; */MOD .ASCII '*/MO' .BYTE $0C4 .WORD MODD-6 SSMOD .WORD DOCOL,TOR,MSTAR,FROMR,MSLAS,SEMIS .BYTE $82 ; */ .ASCII '*' .BYTE $0AF .WORD SSMOD-8 SSLA .WORD DOCOL,SSMOD,SWAP,DROP,SEMIS .BYTE $85 ; M/MOD .ASCII 'M/MO' .BYTE $0C4 .WORD SSLA-5 MSMOD .WORD DOCOL .WORD TOR,ZERO,RR,USLAS,FROMR .WORD SWAP,TOR,USLAS,FROMR,SEMIS .BYTE $87 ; MESSAGE .ASCII 'MESSAG' .BYTE $0C5 .WORD MSMOD-8 MESS .WORD DOCOL .WORD WARN,AT,ZBRAN,MESS1-. .WORD DROP MESS2 .WORD BRAN,MESS3-. MESS1 .WORD PDOTQ .BYTE 5 .ASCII 'Msg #' .WORD DOT MESS3 .WORD SEMIS .BYTE $82 ; P@ .ASCII 'P' .BYTE $0C0 .WORD MESS-10 PTAT .WORD .+2 POP DE LD HL,PTAT1+1 LD (HL),E PTAT1 IN A,(0) LD L,A LD H,0 JP HPUSH .BYTE $82 ; P! .ASCII 'P' .BYTE $0A1 .WORD PTAT-5 PTSTO .WORD .+2 POP DE LD HL,PTSTO1+1 LD (HL),E POP HL LD A,L PTSTO1 OUT (0),A JP NEXT .BYTE $0C1 ; ' .BYTE $0A7 .WORD PTSTO-5 TICK .WORD DOCOL,DFIND,ZEQU,ZERO,QERR .WORD DROP,LITER,SEMIS .BYTE $86 ;FORGET .ASCII 'FORGE' .BYTE $0D4 .WORD TICK-4 FORG .WORD DOCOL,CURR,AT,CONT,AT .WORD SUBB,LIT,24,QERR .WORD TICK,DUP,FENCE,AT .WORD LESS,LIT,21,QERR .WORD DUP,NFA,DP,STORE .WORD LFA,AT,CONT,AT,STORE .WORD SEMIS .BYTE $84 ;BACK .ASCII 'BAC' .BYTE $0CB .WORD FORG-9 BACK .WORD DOCOL,HERE,SUBB,COMMA,SEMIS .BYTE $0C5 ;BEGIN .ASCII 'BEGI' .BYTE $0CE .WORD BACK-7 BEGIN .WORD DOCOL,QCOMP,HERE,ONE,SEMIS .BYTE $0C5 ;ENDIF .ASCII 'ENDI' .BYTE $0C6 .WORD BEGIN-8 ENDIFF .WORD DOCOL,QCOMP,TWO,QPAIR .WORD HERE,OVER,SUBB,SWAP,STORE .WORD SEMIS .BYTE $0C4 ;THEN .ASCII 'THE' .BYTE $0CE .WORD ENDIFF-8 THEN .WORD DOCOL,ENDIFF,SEMIS .BYTE $0C2 ;DO .ASCII 'D' .BYTE $0CF .WORD THEN-7 DO .WORD DOCOL,COMP,XDO,HERE,THREE,SEMIS .BYTE $0C4 ;LOOP .ASCII 'LOO' .BYTE $0D0 .WORD DO-5 LOOP .WORD DOCOL,THREE,QPAIR .WORD COMP,XLOOP,BACK,SEMIS .BYTE $0C5 ;+LOOP .ASCII '+LOO' .BYTE $0D0 .WORD LOOP-7 PLOOP .WORD DOCOL,THREE,QPAIR .WORD COMP,XPLOO,BACK,SEMIS .BYTE $0C5 ;UNTIL .ASCII 'UNTI' .BYTE $0CC .WORD PLOOP-8 UNTIL .WORD DOCOL,ONE,QPAIR .WORD COMP,ZBRAN,BACK,SEMIS .BYTE $0C3 ;END .ASCII 'EN' .BYTE $0C4 .WORD UNTIL-8 ENDD .WORD DOCOL,UNTIL,SEMIS .BYTE $0C5 ;AGAIN .ASCII 'AGAI' .BYTE $0CE .WORD ENDD-6 AGAIN .WORD DOCOL,ONE,QPAIR .WORD COMP,BRAN,BACK,SEMIS .BYTE $0C6 ;REPEAT .ASCII 'REPEA' .BYTE $0D4 .WORD AGAIN-8 REPEA .WORD DOCOL .WORD TOR,TOR,AGAIN,FROMR,FROMR .WORD TWO,SUBB,ENDIFF,SEMIS .BYTE $0C2 ;IF .ASCII 'I' .BYTE $0C6 .WORD REPEA-9 IFF .WORD DOCOL,COMP,ZBRAN,HERE .WORD ZERO,COMMA,TWO,SEMIS .BYTE $0C4 ;ELSE .ASCII 'ELS' .BYTE $0C5 .WORD IFF-5 ELSEE .WORD DOCOL,TWO,QPAIR .WORD COMP,BRAN,HERE,ZERO,COMMA .WORD SWAP,TWO,ENDIFF,TWO,SEMIS .BYTE $0C5 ;WHILE .ASCII 'WHIL' .BYTE $0C5 .WORD ELSEE-7 WHILE .WORD DOCOL,IFF,TWOP,SEMIS .BYTE $86 ;SPACES .ASCII 'SPACE' .BYTE $0D3 .WORD WHILE-8 SPACS .WORD DOCOL,ZERO,MAX,DDUP .WORD ZBRAN,SPAX1-. .WORD ZERO,XDO SPAX2 .WORD SPACE,XLOOP,SPAX2-. SPAX1 .WORD SEMIS .BYTE $82 ;<# .ASCII '<' .BYTE $0A3 .WORD SPACS-9 BDIGS .WORD DOCOL,PAD,HLD,STORE,SEMIS .BYTE $82 ; #> .ASCII '#' .BYTE $0BE .WORD BDIGS-5 EDIGS .WORD DOCOL,DROP,DROP,HLD,AT .WORD PAD,OVER,SUBB,SEMIS .BYTE $84 ;SIGN .ASCII 'SIG' .BYTE $0CE .WORD EDIGS-5 SIGN .WORD DOCOL,ROT,ZLESS,ZBRAN,SIGN1-. .WORD LIT,45,HOLD SIGN1 .WORD SEMIS .BYTE $81 ; # .BYTE $0A3 .WORD SIGN-7 DIG .WORD DOCOL,BASE,AT .WORD MSMOD,ROT,LIT,9,OVER .WORD LESS,ZBRAN,DIG1-. .WORD LIT,7,PLUS DIG1 .WORD LIT,$30,PLUS,HOLD,SEMIS .BYTE $82 ; #S .ASCII '#' .BYTE $0D3 .WORD DIG-4 DIGS .WORD DOCOL DIGS1 .WORD DIG,OVER,OVER,ORR .WORD ZEQU,ZBRAN,DIGS1-. .WORD SEMIS .BYTE $83 ; D.R .ASCII 'D.' .BYTE $0D2 .WORD DIGS-5 DDOTR .WORD DOCOL,TOR,SWAP,OVER,DABS .WORD BDIGS,DIGS,SIGN,EDIGS .WORD FROMR,OVER,SUBB,SPACS .WORD TYPE,SEMIS .BYTE $82 ; .R .ASCII '.' .BYTE $0D2 .WORD DDOTR-6 DOTR .WORD DOCOL,TOR,STOD,FROMR,DDOTR,SEMIS .BYTE $82 ; D. .ASCII 'D' .BYTE $0AE .WORD DOTR-5 DDOT .WORD DOCOL,ZERO,DDOTR,SPACE,SEMIS .BYTE $81 ; . .BYTE $0AE .WORD DDOT-5 DOT .WORD DOCOL,STOD,DDOT,SEMIS .BYTE $81 ; ? .BYTE $0BF .WORD DOT-4 QUES .WORD DOCOL,AT,DOT,SEMIS .BYTE $82 ; U. .ASCII 'U' .BYTE $0AE .WORD QUES-4 UDOT .WORD DOCOL,ZERO,DDOT,SEMIS .BYTE $85 ;WORDS .ASCII 'WORD' .BYTE $0D3 .WORD UDOT-5 WORDS .WORD DOCOL,LIT,$080,OUTT,STORE .WORD CONT,AT,AT WORDS1 .WORD OUTT,AT,CSLL .WORD GREAT,ZBRAN,WORDS2-. .WORD CR,ZERO,OUTT,STORE WORDS2 .WORD DUP,IDDOT .WORD PFA,LFA,AT,DUP,ZEQU .WORD QTERM,ORR,ZBRAN,WORDS1-. .WORD DROP,SEMIS .BYTE $83 ;BYE Jump to address 0 to return to the M100 menu. .ASCII 'BY' .BYTE $0C5 .WORD WORDS-8 BYE .WORD 0 .BYTE $84 ; .CPU .ASCII '.CP' .BYTE $0D5 .WORD BYE-6 DOTCPU .WORD DOCOL,BASE,AT .WORD LIT,36,BASE,STORE .WORD LIT,ORIG_L_CPU_NAME,PORIG,TAT,DDOT .WORD BASE,STORE,SEMIS .BYTE $84 ;CALL .ASCII 'CAL' ;This word makes it easy to use the M100 ROM routines .BYTE $0CC ;from Forth. .WORD DOTCPU-7 CALLL .WORD .+2 LD L,C LD H,B LD (CALLL2),HL POP HL LD (CALLL1+1),HL POP HL POP DE POP BC POP AF CALLL1 CALL 0 PUSH AF PUSH BC PUSH DE PUSH HL LD HL,(CALLL2) LD C,L LD B,H JP NEXT CALLL2 .WORD 0 .BYTE $84 ;TASK .ASCII 'TAS' .BYTE $0CB .WORD CALLL-7 TASK .WORD DOCOL,SEMIS INITDP .BYTE 0 .END ORIG