; ; ; release and version numbers ; .EQU FIGREL, 1 ; FIG RELEASE # .EQU FIGREV, 1 ; FIG REVISION # .EQU USRVER, 0x64; USER VERSION # ; ; This version for TC/TR STD bus CPU card. ; Software drivers for CPU and I/O CARD BY D.Jackson 5/88 ; ; ; ASCII CHAR USED ; .EQU ABL, 0x020 ; SPACE .EQU ACR, 0x00D ; carrage return .EQU ADOT, 0x02E ; Period .EQU BELL, 0x007 ; (^G) .EQU BSIN, 0x008 ; Input Backspace char = DEL or RUBOUT .EQU BSOUT, 0x008 ; Output Backspace (^h) .EQU DLE, 0x010 ; (^P) Data Link Esape... PRINTER toggle .EQU LF, 0x00A ; Line Feed .EQU FF, 0x00C ; Form Feed (^L) ; ;MEMORY ALLOCATION ; .EQU EM, 0x0D700 ; Top of memory +1 .EQU NSCR, 4 ; # of 1020 Byte Screens .EQU KBBUF, 128 ; Data Bytes per disk buffer .EQU US, 0x040 ; User Variables space .EQU RTS, 0x0A0 ; Return stack and Terminal buff space ; .EQU CO, KBBUF+4 ;Disk Buffer + 2 Header + 2 Tail .EQU NBUF, NSCR*0x400/KBBUF ;# of Buffers .EQU BUF1, EM-CO*NBUF ;Address of 1st Disk Buffer .EQU INITR0, BUF1-US ; (R0) .EQU INITS0, INITR0-RTS ; (S0) ; ; ; PORT DEFINITIONS ; .EQU SADATA, 0X0E0 .EQU SACTRL, 0X0E2 .EQU SBDATA, 0X0E1 .EQU SBCTRL, 0X0E3 ; .EQU SRXMSK, 0X001 .EQU STXMSK, 0X004 ; .EQU PIOCTRL, 0X0E7 .EQU PIOA, 0X0E4 .EQU PIOB, 0X0E5 .EQU PIOC, 0X0E6 ; .EQU BRG, 0X0EC ; .EQU RTC, 0X0E8 ; .ORG 0X8000 JR STRTUP NOP NOP .ORG 0X8080 STRTUP: LD HL,0X0000 LD DE,0X8000 COPY: LD A,(HL) LD (DE),A INC HL INC DE LD A,H CP 0X20 JR NZ,COPY JP CLD .ORG 0X8100 ; Reserve space for Interupt Vectors ORIG: NOP JP CLD ; Vector to Cold Start NOP JP WRM ; VECTOR TO WARM START .DB FIGREL ;FIG RELEASE# .DB FIGREV ;FIG REVISION # .DB USRVER ;USER VERSION # .DB 0x0E ;IMPLEMENTATION ATRIBUTES ; ; 0x0E = 0000 1 1 1 0 ; B+ORIGIN | | | | | ; | | | | | ; | | | | PROCESSOR ADDR {0 BYTE,1WORD} ; | | | HIGH BYTE AT {0 LOW ADR, 1 HI ADR} ; | | ADR MUST BE EVEN {0 YES 1 NO} ; | INTERPRETER IS {0 PRE 1 POST} ; | ; INCREMENTING {0 OBOVE SUFFICIENT} ; {1 OTHER DIFFENRENCES EXIST} .DRW TASK-7 ; TOPMOST WORD IN FORTH VOCAB .DRW BSIN ;BACKSPACE CHAR .DRW INITR0 ;INIT (UP) ; ; <<<<<<<<<<<< FOLLOWING USED BY COLD; ; MUST BE IN SAME ORDER AS USER VARIABLES ; .DRW INITS0 ;INIT (S0) .DRW INITR0 ;INIT (R0) .DRW INITS0 ;INIT (TIB) .DRW 0x1F ; INIT (WIDTH) .DRW 0 ; INIT (WARNING) ; 0=NO SCREEN 4 AVAIL AT STARTUP ; 1= FORTH SCREENS ARE AVAIL .DRW INITDP ;INIT (FENCE) .DRW INITDP ;INIT (DP) .DRW FORTH+8 ;INIT (VOC-LINK) ; ; <<<<<<<<<<<< END DATA USED BY COLD ; .DRW 0,0x0B250 ;Z80 CPU NAME (HW,LW) ; 32 BIT, BASE 36 INTEGER ; ;------------------------------------------------------------ ; ; FORTH REGISTERS ; ; FORTH Z80 FORTH PRESERVATION RULES ; ----- --- ------------------------ ; IP BC SHOULD BE PRESERVED ACROSS FORTH WORDS ; W DE SOMETIMES O/P FROM NEXT ; MAY BE ALTERED BEFORE JMPING TO NEXT ; INPUT ONLY WHEN DPUSH CALLED ; SP SP SHOULD BE USED ONLY AS DATA STACK ; ACROSS FORTH WORDS ; MAY BE USED WITHIN FORTH WORDS IF ; RESTORED BEFORE NEXT ; HL NEVER O/P FROM NEXT INPUT ONLY WHEN ; HPUSH CALLED ; UP: .DRW INITR0 ;USER AREA POINTER RPP: .DRW INITR0 ;RETURN STACK POINTER ; ;----------------------------------------------------------- ; ; COMMENT CONVENTIONS ; ; = MEANS "IS EQUAL TO" ; <- MEANS ASSIGNMENT ; ; NAME = ADDRESS OF NAME ; (NAME) = CONTENTS AT NAME ; ((NAME))= INDIRECT CONTENTS ; ; CFA = ADDRESS OF CODE FILED ; LFA = ADDRESS OF LINK FILED ; NFA = ADDR OF START OF NAME FIELD ; PFA = ADDR OF START OF PARAMETER FIELD ; ; S1 = ADDR OF 1ST WORD OF PARAMETER STACK ; S2 = ADDR OF 2ND WORD OF PARAMETER STACK ; R1 = ADDR OF 1ST WORD OF RETURN STACK ; R2 = ADDR OF 2ND WORD OF RETURN STACK ; (ABOVE STACK POSITIONS VALID BEFORE AND AFTER EXECUTION ; OF ANY WORD, NOT DURING. ) ; ; LSB = LEAST SIGNIFICANT BIT ; MSB = MOST SIGNIFICANT BIT ; LB = LO BYTE ; HB = HIGH BYTE ; LW = LOW WORD ; HW = HIGH WORD ; ( MAY BE USED AS SUFFIX TO NAMES) ; ; ;--------------------------------------------------- ; ; NEXT , THE FORTH ADDR INTERPRETER ; ( POST INCREMENTING VERSION ) ; DPUSH: PUSH DE HPUSH: PUSH HL NEXT: LD A,(BC) ;(W) <- ((IP)) INC BC ;(IP) <- (IP)+2 LD L,A NEXT3: LD A,(BC) ;LABEL ADDED BY DLW INC BC LD H,A ;(HL) <- CFA NEXT1: LD E,(HL) ;(PC) <- ((W)) INC HL LD D,(HL) EX DE,HL JP (HL) ;NOTE : (DE) = CFA +1 ;------- EXECUTE: ; MOVED HERE TO PUT WITHIN RANGE OF JR FROM RST POP HL ;(HL) <- (S1) = CFA JR NEXT1 ; ; FORTH DICTIONARY ; ; DICTIONARY FORMAT: ; ; ADDRESS NAME BYTE CONTENTS ; ------- ---- ------------- ; ( MSB =1 P=PRECEDENCE BIT, S=SMUDGE BIT ; ; NFA NAME FIELD 1PS < NAME LENGTH ; 0<1CHAR> MSB=0, NAME'S 1ST CHAR ; 0<2CHAR> ; ..... ; 1 MSB=1, NAME'S LAST CHAR ; LFA LINK FIELD = PREVIOUS WORD'S NFA ; ;LABEL: CFA CODE FIELD = ADDR CPU CODE ; ; PFA PARAMETER FIELD <1PARM> 1ST PARAMETER BYTE ; <2PARM> ; ...... ; DP0: .DB 0x83 ;LIT .DB "LI",'T'+0x80 .DRW 0 ;(LFA)=0 MARKS END OF DICT LIT: .DRW *+2 ;(S1) <- ((IP)) LD A,(BC) ;(HL) <- ((IP)) = LITERAL INC BC ;(IP) <- (IP) +2 LD L,A ;LB LD A,(BC) ;HB INC BC LD H,A JR HPUSH ;(S1) <- (HL) ; .DB 0x87 ;EXECUTE .DB "EXECUT",'E'+0x80 .DRW LIT-6 EXEC: .DRW EXECUTE ;MOVED BY DLW ; .DRW *+2 ; POP HL ; JR NEXT1 ; .DB 0x86 ; BRANCH .DB "BRANC",'H'+0x80 .DRW EXEC-0x0A BRAN: .DRW *+2 ;(IP) <- (IP) + ((IP)) BRAN1: LD H,B ;(HL) <- (IP) LD L,C LD E,(HL) ;(DE) <- ((IP)) = BRANCH OFFSET INC HL LD D,(HL) DEC HL ADD HL,DE ;(HL) <- (HL) +((IP)) LD C,L ;(IP) <- (HL) LD B,H JR NEXT ; .DB 0x87 ;0BRANCH .DB "0BRANC",'H'+0x80 .DRW BRAN-9 ZBRAN: .DRW *+2 POP HL LD A,L OR H JR Z,BRAN1 ;IF (S1)=0 THEN BRANCH INC BC ;ELSE SKIP BRANCH OFFSET INC BC JR NEXT ; .DB 0x86 ;(LOOP) .DB "(LOOP",')'+0x80 .DRW ZBRAN-0x0A XLOOP: .DRW *+2 LD DE,1 ;(DE) <- INCREMENT XLOO1: LD HL,(RPP) ;((HL)) = INDEX 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 ;((HL)) = LIMIT INC D DEC D LD D,A ;(DE) <- NEW INDEX JP M,XLOO2 ; IF INCR >0 LD A,E SUB (HL) ;THEN (A) <- INDEX - LIMIT LD A,D INC HL SBC A,(HL) JR XLOO3 XLOO2: LD A,(HL) ;ELSE (A) <- LIMIT-INDEX SUB E INC HL LD A,(HL) SBC A,D ; XLOO3: JP M,BRAN1 ;IF (A) < 0 THEN LOOP AGAIN INC HL ; ELSE DONE LD (RPP),HL ;DISCARD R1 &R2 INC BC ;SKIP BRANCH OFFSET INC BC JP NEXT ; .DB 0x87 ;(+LOOP) .DB "(+LOOP",')'+0x80 .DRW XLOOP-9 XPLOO: .DRW *+2 POP DE ;(DE) <- INCR JR XLOO1 ; .DB 0x84 ;(DO) .DB "(DO",')'+0x80 .DRW XPLOO-0x0A XDO: .DRW *+2 LD HL,(RPP) ;(RP) <-(RP)-4 DEC HL DEC HL DEC HL DEC HL LD (RPP),HL POP DE ;(R1)<- (S1)=INIT INDEX LD (HL),E INC HL LD (HL),D POP DE ;(R1)<-(S2) = LIMIT INC HL LD (HL),E INC HL LD (HL),D JP NEXT ; .DB 0x81 ;I .DB 'I'+0x80 .DRW XDO-7 IDO: .DRW *+2 ;(S1)<-(R1),(R1) UNCHANGED LD HL,(RPP) LD E,(HL) ;(DE) <-(R1) INC HL LD D,(HL) PUSH DE ;(S1) <- (DE) JP NEXT ; .DB 0x85 ;DIGIT .DB "DIGI",'T'+0x80 .DRW IDO-4 DIGIT: .DRW *+2 POP HL ;(L) <- (S1)LB = ASCII CHAR TO ; ;BE CONVERTED POP DE ;(DE) <- (S2) = BASE VALUE LD A,E SUB 0x30 ;IF CHAR > "0" JP M,DIGI2 CP 0x0A ;AND IF CHAR > "9" JP M,DIGI1 SUB 7 CP 0x0A ;AND IF CHR > = "A" JP M,DIGI2 ; ; THEN VALID NUMERIC OR ALPHA CHR DIGI1: CP L ;IF < BASE VALUE JP P,DIGI2 ; ; THEN VALID DIGIT CHR LD E,A ;(S2) <- (DE) = CONVERTED DIGIT LD HL,1 ;(S1) <- TRUE JP DPUSH ; ;ELSE INVALID DIGIT CHR DIGI2: LD L,H ;(HL) <- FALSE JP HPUSH ;(S1) <- FALSE ; .DB 0x86 ;(FIND) (2-1)FAILURE .DB "(FIND",')'+0X80 ; (2-3) SUCCESS .DRW DIGIT-8 PFIND: .DRW *+2 POP DE ;(DE) <- NFA PFIN1: POP HL ;(HL) <- STRING ADDR PUSH HL ;SAVE STRING ADDR FOR NEXT ITERATION LD A,(DE) XOR (HL) ;CHECK LENGTHS AND SMUDGE BIT AND 0x3F JR NZ,PFIN4 ;LENGTHS DIFFERENT ; ;LENGTHS MATCH, CHECK EACH CHAR PFIN2: INC HL ;(HL) <- ADDR NEXT CHR IN STRING INC DE ;(DE) <- ADDR NEXT CHR IN NF LD A,(DE) XOR (HL) ;IGNORE MSB ADD A,A JR NZ,PFIN3 ;NO MATCH JR NC,PFIN2 ;MATCH SO FAR, LOOP AGAIN LD HL,5 ;STRING MATCHES ADD HL,DE ;((SP)) <- PFA EX (SP),HL ; ;BACK UP TO LENGTH OF BYTE OF NF=NFA PFIN6: DEC DE LD A,(DE) OR A JP P,PFIN6 ;IF MSB=1 THEN (DE)=NFA LD E,A ;(DE) <-LENGTH BYTE LD D,0 LD HL,1 ;(HL) <-TRUE JP DPUSH ;RETURN, NF FOUND ; ; ABOVE NF NOT A MATCH, TRY ANOTHER PFIN3: JR C,PFIN5 ;IF NOT END OF NF PFIN4: INC DE ;THEN FIND END OF NF LD A,(DE) OR A JP P,PFIN4 PFIN5: INC DE ;(DE) <- LFA EX DE,HL LD E,(HL) ;(DE) <- (LFA) INC HL LD D,(HL) LD A,D OR E ;IF (LFA) <> 0 JR NZ,PFIN1 ;THEN TRY PREVIOUS DICT DEF. ; ; ELSE END OF DICTIONARY POP HL ;DISCARD STRING ADDR LD HL,0 ;(HL) <- FALSE JP HPUSH ;RETURN, NO MATCH FOUND ; .DB 0x87 ;ENCLOSE .DB "ENCLOS",'E'+0x80 .DRW PFIND-9 ENCL: .DRW *+2 POP DE ;(DE) <-(S1)= DELIMITER CHAR POP HL ;(HL)<- (S2) = ADDR TEXT TO SCAN PUSH HL ;(S4) <- ADDR LD A,E LD D,A ;(D) <- DELIM CHAR LD E,-1 ;IIT CHR OFFSET COUNTER DEC HL ;(HL) <-ADDR-1 ; SKIP OVER LEADING DELIMITER CHRS ENCL1: INC HL INC E CP (HL) ;IF TEXT CHR = DELIM CHR JR Z,ENCL1 ;THEN LOOP AGAIN ; ELSE NON-DELIM CHR FOUND LD D,0 ;(D3)<- (E) = OFFSET TO 1ST NON DELIM PUSH DE LD D,A ;(D) <- DELIM CHR LD A,(HL) ;IF 1ST NON-DELIM = NULL AND A JR NZ,ENCL2 ; LD D,0 ;THEN (S2)<-OFFSET TO BYTE INC E PUSH DE DEC E PUSH DE JP NEXT ; ELSE TEXT CONTAINS NON-DELIM ; & NON-NULL CHAR ENCL2: LD A,D ;(A) <- DELIM CHR INC HL ;(HL) <- ADDR NEXT CHR INC E ;(E) <- OFFSET TO NEXT CHR CP (HL) ;IF NEXT CHR <> DELIM CHR JR Z,ENCL4 LD A,(HL) ;AND IF NEXT CHR <> NULL AND A JR NZ,ENCL2 ;THEN CONINUE SCAN ; ELSE CHR=NULL ENCL3: LD D,0 ;(S2)<- OFFSET TO NULL PUSH DE PUSH DE ;(S1)<-OFFSET TO NULL JP NEXT ; ELSE CHR=DELIM CHR ENCL4: LD D,0 ;(D2) <-OFFSET TO BYTE ; FOLLWOING TEXT PUSH DE INC E ;(S1) <-OFFSET TO 2 BYTES AFTER ; END OF WORD PUSH DE JP NEXT ; .DB 0x84 ;EMIT .DB "EMI",'T'+0X80 .DRW ENCL-0x0A EMIT: .DRW DOCOL .DRW PEMIT .DRW ONE,OUTT .DRW PSTOR,SEMIS ; .DB 0x83 ;KEY .DB "KE",'Y'+0X80 .DRW EMIT-7 KEY: .DRW *+2 JP PKEY ; .DB 0x89 ;?TERMINAL .DB "?TERMINA",'L'+0X80 .DRW KEY-6 QTERM: .DRW *+2 LD HL,0 JP PQTER ; .DB 0x82 ;CR .DB "C",'R'+0X80 .DRW QTERM-0x0C CR: .DRW *+2 JP PCR ; .DB 0x85 ;CMOVE .DB "CMOV",'E'+0X80 .DRW CR-5 CMOVE: .DRW *+2 LD L,C ;(HL)<- (IP) LD H,B POP BC ;(BC) <-(S1)=#CHRS POP DE ;(DE)<- (S2)=DEST ADDR EX (SP),HL ;(HL)<-(S3)= SOURCE ADDR ; (S1)<-(IP) JR CMOV2 ;RETURN IF #CHRS=0 CMOV1: LD A,(HL) ;((DE)) <- ((HL)) INC HL ;INC SOURCE ADDR LD (DE),A INC DE ;INC DEST ADDR DEC BC ;DEC #CHRS CMOV2: LD A,B OR C JR NZ,CMOV1 ;REPEAT IF #CHR <>0 POP BC ;RESTORE (IP) FROM (S1) JP NEXT ; .DB 0x82 ;U* 16X16 UNSIGNED MULTIPLY .DB "U",'*'+0X80 ;AVERAGE EXECUTION TIME = 994 CYCLES (8080) .DRW CMOVE-8 USTAR: .DRW *+2 POP DE ;(DE)<- MPLIER POP HL ;(HL)<- MPCAND PUSH BC ;SAVE IP LD B,H LD A,L ;(BA)<- ,MPCAND CALL MPYX ;(AHL)1<- MPCAND.LB*MPLIER 1ST PARTIAL PROD PUSH HL ;SAVE (HL)1 LD H,A LD A,B LD B,H ;SAVE (A)1 CALL MPYX ;(AHL)2<-MPCAND.HB*MPLIER 2ND PARTIAL PROD POP DE ;(DE)<- (HL)1 LD C,D ;(BC)<- (AH)1 ;FORM SUM OF PARTIALS: (AHL)1 ; +(AHL)2 ; _____ ; (AHLE) ADD HL,BC ;(HL)<-(HL)2 + (AH)1 ADC A,0 ;(AHLE) <-(BA) *(DE) LD D,L LD L,H LD H,A ;(HLDE)<- MPLIER*MPCAND POP BC ;RESTORE IP PUSH DE ;(S2)<- PRODUCT.LW JP HPUSH ;(S1)<- PRODUCT.HW ; ;MULTIPLY PRIMITIVE ; (AHL)<- (A)*(DE) ;#BITS 24 8 16 MPYX: LD HL,0 ;(HL)<-0 PARTICAL PROD.LW LD C,8 ;LOOP COUNTER MPYX1: ADD HL,HL ;LEFT SHIFT (AHL) 24 BITS RLA JR NC,MPYX2 ;IF NEXT MPLIER BIT =1 ADD HL,DE ;THEN ADD MPCAND ADC A,0 MPYX2: DEC C ;IFNOT LAST MPLIER BIT JR NZ,MPYX1 ;THEN LOOP AGAIN RET ;ELSE DONE ; .DB 0x82 ;U/ .DB "U",'/'+0X80 .DRW USTAR-5 USLAS: .DRW *+2 LD HL,4 ADD HL,SP ;((HL))<-NUMERATOR.LW LD E,(HL) ;(DE)<- NUMER.LW LD (HL),C ;SAVE IP ON STACK INC HL LD D,(HL) LD (HL),B POP BC ;(BC)<- DENOMINATOR POP HL ;(HL)<-NUMER.HW LD A,L SUB C ;IF NUMER >=DEMON LD A,H SBC A,B JR C,USLA1 ; LD HL,0x0FFFF ;THEN OVERFLOW LD DE,0x0FFFF ;SET REM AND QUOT TO MAX JR USLA7 USLA1: LD A,16 ;LOOP COUNTER USLA2: ADD HL,HL ;LEFT SHIFT (HLDE) THRU CARRY RLA EX DE,HL ADD HL,HL JR NC,USLA3 INC DE AND A USLA3: EX DE,HL ;SHIFT DONE RRA ;RESTORE 1ST CARRY PUSH AF ;SAVE COUNTER JR NC,USLA4 ;IF CARRY=1 LD A,L ;THEN (HL)<-(HL)-(BC) SUB C LD L,A LD A,H SBC A,B LD H,A JR USLA5 USLA4: LD A,L ;ELSE TRY (HL)<-(HL)-(BC) SUB C LD L,A LD A,H SBC A,B ;(HL)<- PARTIAL REMAINDER LD H,A JR NC,USLA5 ADD HL,BC ;JUNDERFLOW,RESTORE DEC DE USLA5: INC DE ;INC QUOT USLA6: POP AF ;RESTORE COUNTER DEC A ;IF COUNTER > 0 JR NZ,USLA2 ;THEN LOOP AGAIN USLA7: POP BC ;ELSE DONE, RESOTRE IP PUSH HL ;(S2)<- REMAINDER PUSH DE ;(S1) <- QUOTIENT JP NEXT ; .DB 0x83 ;AND .DB "AN",'D'+0X80 .DRW USLAS-5 ANDD: .DRW *+2 ;(S1) <- (S1) AND (S2) POP DE POP HL LD A,E AND L LD L,A LD A,D AND H LD H,A JP HPUSH ; .DB 0x82 ;OR .DB "O",'R'+0X80 .DRW ANDD-6 ORR: .DRW *+2 ;(S1) <- (S1) OR (S2) POP DE POP HL LD A,E OR L LD L,A LD A,D OR H LD H,A JP HPUSH ; .DB 0x83 ;XOR .DB "XO",'R'+0X80 .DRW ORR-5 XORR: .DRW *+2 ;(S1) <- (S1) XOR (S2) POP DE POP HL LD A,E XOR L LD L,A LD A,D XOR H LD H,A JP HPUSH ; .DB 0x83 ;SP@ .DB "SP",'@'+0X80 .DRW XORR-6 SPAT: .DRW *+2 ;(S1) <- (SP) LD HL,0 ADD HL,SP ;(HL) <- (SP) JP HPUSH ;(S1) <- (HL) ; .DB 0x83 ;STACK POINTER STORE .DB "SP",'!'+0X80 .DRW SPAT-6 SPSTO: .DRW *+2 ;(SP) <- (S0) USER VARIABLE LD HL,(UP) ;(HL) <- USER VAR BASE ADDR LD DE,6 ADD HL,DE ;(HL) <- S0 LD E,(HL) ;(DE) <- (S0) INC HL LD D,(HL) EX DE,HL LD SP,HL ;(SP) <- (S0) JP NEXT ; .DB 0x83 ; RP@ .DB "RP",'@'+0X80 .DRW SPSTO-6 RPAT: .DRW *+2 ;(S1) <- (RP) LD HL,(RPP) JP HPUSH ; .DB 0x83 ;RETURN STACK POINTER STORE .DB "RP",'!'+0X80 .DRW RPAT-6 RPSTO: .DRW *+2 ;(RP) <- (R0) USER VARIABLE LD HL,(UP) ;(HL) <- USER VARIABLE BASE ADDR LD DE,8 ADD HL,DE ;(HL) <- R0 LD E,(HL) ;(DE) <- (R0) INC HL LD D,(HL) EX DE,HL LD (RPP),HL ;(RP) <- (R0) JP NEXT ; .DB 0x82 ;;S .DB ";",'S'+0X80 .DRW RPSTO-6 SEMIS: .DRW *+2 ;(IP) <- (R1) LD HL,(RPP) LD C,(HL) ;(BC) <- (R1) INC HL LD B,(HL) INC HL LD (RPP),HL ;(RP) <- (RP)+2 JP NEXT ; .DB 0x85 ;LEAVE .DB "LEAV",'E'+0X80 .DRW SEMIS-5 LEAVE: .DRW *+2 ;LIMIT <- INDEX LD HL,(RPP) LD E,(HL) ;(DE) <- (R1)= INDEX INC HL LD D,(HL) INC HL LD (HL),E ;(R2) <- (DE) = LIMIT INC HL LD (HL),D JP NEXT ; .DB 0x82 ; >R .DB ">",'R'+0X80 .DRW LEAVE-8 TOR: .DRW *+2 POP DE LD HL,(RPP) DEC HL DEC HL LD (RPP),HL LD (HL),E INC HL LD (HL),D JP NEXT ; .DB 0x82 ; R> .DB "R",'>'+0X80 .DRW TOR-5 FROMR: .DRW *+2 LD HL,(RPP) LD E,(HL) INC HL LD D,(HL) INC HL LD (RPP),HL PUSH DE JP NEXT ; .DB 0x81 ; R .DB 'R'+0X80 .DRW FROMR-5 FRR: .DRW IDO+2 ; .DB 0x82 ;0= .DB "0",'='+0X80 .DRW FRR-4 ZEQU: .DRW *+2 POP HL LD A,L OR H LD HL,0 JR NZ,ZEQU1 INC HL ZEQU1: JP HPUSH ; .DB 0x82 ; 0< .DB "0",'<'+0X80 .DRW ZEQU-5 ZLESS: .DRW *+2 POP HL ADD HL,HL LD HL,0 JR NC,ZLES1 INC HL ZLES1: JP HPUSH ; .DB 0x81 ; + .DB '+'+0X80 .DRW ZLESS-5 PLUS: .DRW *+2 POP DE POP HL ADD HL,DE JP HPUSH ; .DB 0x82 ; D+ (4-2) .DB "D",'+'+0X80 .DRW PLUS-4 DPLUS: .DRW *+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 ; .DB 0x85 ; MINUS .DB "MINU",'S'+0X80 .DRW DPLUS-5 MINUS: .DRW *+2 POP HL LD A,L CPL LD L,A LD A,H CPL LD H,A INC HL JP HPUSH ; .DB 0x86 ; DMINUS .DB "DMINU",'S'+0X80 .DRW MINUS-8 DMINU: .DRW *+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 ; .DB 0x84 ; OVER .DB "OVE",'R'+0X80 .DRW DMINU-9 OVER: .DRW *+2 POP DE POP HL PUSH HL JP DPUSH ; .DB 0x84 ;DROP .DB "DRO",'P'+0X80 .DRW OVER-7 DROP: .DRW *+2 POP HL JP NEXT ; .DB 0x84 ;SWAP .DB "SWA",'P'+0X80 .DRW DROP-7 SWAP: .DRW *+2 POP HL EX (SP),HL JP HPUSH ; .DB 0x83 ; DUP .DB "DU",'P'+0X80 .DRW SWAP-7 DUP: .DRW *+2 POP HL PUSH HL JP HPUSH ; .DB 0x84 ; 2DUP .DB "2DU",'P'+0X80 .DRW DUP-6 TDUP: .DRW *+2 POP HL POP DE PUSH DE PUSH HL JP DPUSH ; .DB 0x82 ; PLUS STORE .DB "+",'!'+0X80 .DRW TDUP-7 PSTOR: .DRW *+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 ; .DB 0x86 ;TOGGLE .DB "TOGGL",'E'+0X80 .DRW PSTOR-5 TOGGL: .DRW *+2 POP DE POP HL LD A,(HL) XOR E LD (HL),A JP NEXT ; .DB 0x81 ;@ .DB '@'+0X80 .DRW TOGGL-9 AT: .DRW *+2 POP HL LD E,(HL) INC HL LD D,(HL) PUSH DE JP NEXT ; .DB 0x82 ;C@ .DB "C",'@'+0X80 .DRW AT-4 CAT: .DRW *+2 POP HL LD L,(HL) LD H,0 JP HPUSH ; .DB 0x82 ;2@ .DB "2",'@'+0X80 .DRW CAT-5 TAT: .DRW *+2 POP HL LD DE,2 ADD HL,DE LD E,(HL) INC HL LD D,(HL) PUSH DE LD DE,-3 ADD HL,DE LD E,(HL) INC HL LD D,(HL) PUSH DE JP NEXT ; .DB 0x81 ;STORE .DB '!'+0X80 .DRW TAT-5 STORE: .DRW *+2 POP HL POP DE LD (HL),E INC HL LD (HL),D JP NEXT ; .DB 0x82 ;C STORE .DB "C",'!'+0X80 .DRW STORE-4 CSTOR: .DRW *+2 POP HL POP DE LD (HL),E JP NEXT ; .DB 0x82 ;2STORE .DB "2",'!'+0X80 .DRW CSTOR-5 TSTOR: .DRW *+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 ; .DB 0x0C1 ; : (COLON) .DB ':'+0X80 .DRW TSTOR-5 COLON: .DRW DOCOL .DRW QEXEC .DRW SCSP .DRW CURR .DRW AT .DRW CONT .DRW STORE .DRW CREAT .DRW RBRAC .DRW 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 ; .DB 0x0C1 ; ; (SEMICOLON) .DB ';'+0X80 .DRW COLON-4 SEMI: .DRW DOCOL .DRW QCSP .DRW COMP .DRW SEMIS .DRW SMUDG .DRW LBRAC .DRW SEMIS ; .DB 0x84 ; NOOP .DB "NOO",'P'+0X80 .DRW SEMI-4 NOOP: .DRW DOCOL .DRW SEMIS ; .DB 0x88 ; CONSTANT .DB "CONSTAN",'T'+0X80 .DRW NOOP-7 CON: .DRW DOCOL .DRW CREAT .DRW SMUDG .DRW COMMA .DRW PSCOD DOCON: INC DE EX DE,HL LD E,(HL) INC HL LD D,(HL) PUSH DE JP NEXT ; .DB 0x88 ; VARIABLE .DB "VARIABL",'E'+0X80 .DRW CON-0x0B VAR: .DRW DOCOL .DRW CON .DRW PSCOD DOVAR: INC DE PUSH DE JP NEXT ; .DB 0x84 ; USER .DB "USE",'R'+0X80 .DRW VAR-0x0B USER: .DRW DOCOL .DRW CON .DRW PSCOD DOUSE: INC DE EX DE,HL LD E,(HL) LD D,0 LD HL,(UP) ADD HL,DE JP HPUSH ; .DB 0x81 ; 0 .DB '0'+0X80 .DRW USER-7 ZERO: .DRW DOCON .DRW 0 ; .DB 0x81 ;1 .DB '1'+0X80 .DRW ZERO-4 ONE: .DRW DOCON .DRW 1 ; .DB 0x81 ;2 .DB '2'+0X80 .DRW ONE-4 TWO: .DRW DOCON .DRW 2 ; .DB 0x81 ;3 .DB '3'+0X80 .DRW TWO-4 THREE: .DRW DOCON .DRW 3 ; .DB 0x82 ; BL .DB "B",'L'+0X80 .DRW THREE-4 BL: .DRW DOCON .DRW 0x20 ; .DB 0x83 ;C/L CHARS/LINE .DB "C/",'L'+0X80 .DRW BL-5 CSLL: .DRW DOCON .DRW 64 ; .DB 0x85 ;FIRST .DB "FIRS",'T'+0X80 .DRW CSLL-6 FIRST: .DRW DOCON .DRW BUF1 ; .DB 0x85 ; LIMIT .DB "LIMI",'T'+0X80 .DRW FIRST-8 LIMIT: .DRW DOCON .DRW EM ; .DB 0x85 ; B/BUF (BYTES/BUFFER) .DB "B/BU",'F'+0X80 .DRW LIMIT-8 BBUF: .DRW DOCON .DRW KBBUF ; .DB 0x85 ; B/SCR (BUFFERS/SCREEN) .DB "B/SC",'R'+0X80 .DRW BBUF-8 BSCR: .DRW DOCON .DRW 0x400/KBBUF ; .DB 0x87 ; +ORGIN .DB "+ORIGI",'N'+0X80 .DRW BSCR-8 PORIG: .DRW DOCOL .DRW LIT .DRW ORIG .DRW PLUS .DRW SEMIS ; ; USER VARIABLES ; .DB 0x82 ; S0 .DB "S",'0'+0X80 .DRW PORIG-0x0A SZERO: .DRW DOUSE .DRW 6 ; .DB 0x82 ;R0 .DB "R",'0'+0X80 .DRW SZERO-5 RZERO: .DRW DOUSE .DRW 8 ; .DB 0x83 ;TIB .DB "TI",'B'+0X80 .DRW RZERO-5 TIB: .DRW DOUSE .DB 0x0A ; .DB 0x85 ;WIDTH .DB "WIDT",'H'+0X80 .DRW TIB-6 WIDTH: .DRW DOUSE .DB 0x0C ; .DB 0x87 ;WARNING .DB "WARNIN",'G'+0X80 .DRW WIDTH-8 WARN: .DRW DOUSE .DB 0x0E ; .DB 0x85 ;FENCE .DB "FENC",'E'+0X80 .DRW WARN-0x0A FENCE: .DRW DOUSE .DB 0x10 ; .DB 0x82 ;DP .DB "D",'P'+0X80 .DRW FENCE-8 DP: .DRW DOUSE .DB 0x12 ; .DB 0x88 ;VOC-LINK .DB "VOC-LIN",'K'+0X80 .DRW DP-5 VOCL: .DRW DOUSE .DRW 0x14 ; .DB 0x83 ;BLK .DB "BL",'K'+0X80 .DRW VOCL-0x0B BLK: .DRW DOUSE .DB 0x16 ; .DB 0x82 ;IN .DB "I",'N'+0X80 .DRW BLK-6 INN: .DRW DOUSE .DB 0x18 ; .DB 0x83 ;OUT .DB "OU",'T'+0X80 .DRW INN-5 OUTT: .DRW DOUSE .DB 0x1A ; .DB 0x83 ;SCR .DB "SC",'R'+0X80 .DRW OUTT-6 SCR: .DRW DOUSE .DB 0x1C ; .DB 0x86 ;OFFSET .DB "OFFSE",'T'+0X80 .DRW SCR-6 OFSET: .DRW DOUSE .DB 0x1E ; .DB 0x87 ;CONTEXT .DB "CONTEX",'T'+0X80 .DRW OFSET-9 CONT: .DRW DOUSE .DB 0x20 ; .DB 0x87 ;CURRENT .DB "CURREN",'T'+0X80 .DRW CONT-0x0A CURR: .DRW DOUSE .DB 0x22 ; .DB 0x85 ;STATE .DB "STAT",'E'+0X80 .DRW CURR-0x0A STATE: .DRW DOUSE .DB 0x24 ; .DB 0x84 ; BASE .DB "BAS",'E'+0X80 .DRW STATE-8 BASE: .DRW DOUSE .DB 0x26 ; .DB 0x83 ;DPL .DB "DP",'L'+0X80 .DRW BASE-7 DPL: .DRW DOUSE .DB 0x28 ; .DB 0x83 ;FLD .DB "FL",'D'+0X80 .DRW DPL-6 FLD: .DRW DOUSE .DB 0x2A ; .DB 0x83 ;CSP .DB "CS",'P'+0X80 .DRW FLD-6 CSPP: .DRW DOUSE .DB 0x2C ; .DB 0x82 ; R# .DB "R",'#'+0X80 .DRW CSPP-6 RNUM: .DRW DOUSE .DB 0x2E ; .DB 0x83 ;HLD .DB "HL",'D'+0X80 .DRW RNUM-5 HLD: .DRW DOUSE .DRW 0x30 ; ;END OF USER VARIABLES ; .DB 0x82 ;1+ .DB "1",'+'+0X80 .DRW HLD-6 ONEP: .DRW DOCOL .DRW ONE .DRW PLUS .DRW SEMIS ; .DB 0x82 ; 2+ .DB "2",'+'+0X80 .DRW ONEP-5 TWOP: .DRW DOCOL .DRW TWO .DRW PLUS .DRW SEMIS ; .DB 0x84 ;HERE .DB "HER",'E'+0X80 .DRW TWOP-5 HERE: .DRW DOCOL .DRW DP .DRW AT .DRW SEMIS ; .DB 0x85 ; ALLOT .DB "ALLO",'T'+0X80 .DRW HERE-7 ALLOT: .DRW DOCOL .DRW DP .DRW PSTOR .DRW SEMIS ; .DB 0x81 ;, (COMMA) .DB ','+0X80 .DRW ALLOT-8 COMMA: .DRW DOCOL .DRW HERE .DRW STORE .DRW TWO .DRW ALLOT .DRW SEMIS ; .DB 0x82 ;C, .DB "C",','+0X80 .DRW COMMA-4 CCOMM: .DRW DOCOL .DRW HERE .DRW CSTOR .DRW ONE .DRW ALLOT .DRW SEMIS ; ; SUBROUTINE USED BY - AND < ; SSUB: LD A,L SUB E LD L,A LD A,H SBC A,D LD H,A RET ; .DB 0x81 ; - (MINUS SIGN) .DB '-'+0X80 .DRW CCOMM-5 SUBB: .DRW *+2 POP DE POP HL CALL SSUB JP HPUSH ; .DB 0x81 ; = EQUAL SIGN .DB '='+0X80 .DRW SUBB-4 EQUAL: .DRW DOCOL .DRW SUBB .DRW ZEQU .DRW SEMIS ; .DB 0x81 ; < LESS THAN .DB '<'+0X80 .DRW EQUAL-4 LESS: .DRW *+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 ; .DB 0x82 ;u< UNSIGNED < .DB "U",'<'+0X80 .DRW LESS-4 ULESS: .DRW DOCOL,TDUP .DRW XORR,ZLESS .DRW ZBRAN,ULES1-*-2 ;IF .DRW DROP,ZLESS .DRW ZEQU .DRW BRAN,ULES2-*-2 ULES1: .DRW SUBB,ZLESS ;ELSE ULES2: .DRW SEMIS ; ENDIF ; .DB 0x81 ; > GREATER THAN .DB '>'+0X80 .DRW ULESS-5 GREAT: .DRW DOCOL .DRW SWAP .DRW LESS .DRW SEMIS ; .DB 0x83 ; ROT .DB "RO",'T'+0X80 .DRW GREAT-4 ROT: .DRW *+2 POP DE POP HL EX (SP),HL JP DPUSH ; .DB 0x85 ;SPACE .DB "SPAC",'E'+0X80 .DRW ROT-6 SPACE: .DRW DOCOL .DRW BL .DRW EMIT .DRW SEMIS ; .DB 0x84 ;-DUP .DB "-DU",'P'+0X80 .DRW SPACE-8 DDUP: .DRW DOCOL .DRW DUP .DRW ZBRAN ;IF .DRW DDUP1-* .DRW DUP ;ENDIF DDUP1: .DRW SEMIS ; .DB 0x88 ; TRAVERSE .DB "TRAVERS",'E'+0X80 .DRW DDUP-7 TRAV: .DRW DOCOL .DRW SWAP TRAV1: .DRW OVER ; BEGIN .DRW PLUS .DRW LIT .DRW 0x7F .DRW OVER .DRW CAT .DRW LESS .DRW ZBRAN ; UNTIL .DRW TRAV1-* .DRW SWAP .DRW DROP .DRW SEMIS ; .DB 0x86 ; LATEST .DB "LATES",'T'+0X80 .DRW TRAV-0x0B LATES: .DRW DOCOL .DRW CURR .DRW AT .DRW AT .DRW SEMIS ; .DB 0x83 ; LFA .DB "LF",'A'+0X80 .DRW LATES-9 LFA: .DRW DOCOL .DRW LIT .DRW 4 .DRW SUBB .DRW SEMIS ; .DB 0x83 ; CFA .DB "CF",'A'+0X80 .DRW LFA-6 CFA: .DRW DOCOL .DRW TWO .DRW SUBB .DRW SEMIS ; .DB 0x83 ;NFA .DB "NF",'A'+0X80 .DRW CFA-6 NFA: .DRW DOCOL .DRW LIT .DRW 5 .DRW SUBB .DRW LIT .DRW -1 .DRW TRAV .DRW SEMIS ; .DB 0x83 ;PFA .DB "PF",'A'+0X80 .DRW NFA-6 PFA: .DRW DOCOL .DRW ONE .DRW TRAV .DRW LIT .DRW 5 .DRW PLUS .DRW SEMIS ; .DB 0x84 ;STORE CSP .DB "!CS",'P'+0X80 .DRW PFA-6 SCSP: .DRW DOCOL .DRW SPAT .DRW CSPP .DRW STORE .DRW SEMIS ; .DB 0x86 ; ?ERROR .DB "?ERRO",'R'+0X80 .DRW SCSP-7 QERR: .DRW DOCOL .DRW SWAP .DRW ZBRAN ;IF .DRW QERR1-* .DRW ERROR .DRW BRAN ; ELSE .DRW QERR2-* QERR1: .DRW DROP ; ENDIF QERR2: .DRW SEMIS ; .DB 0x85 ; ?COMP .DB "?COM",'P'+0X80 .DRW QERR-9 QCOMP: .DRW DOCOL .DRW STATE .DRW AT .DRW ZEQU .DRW LIT .DRW 0x11 .DRW QERR .DRW SEMIS ; .DB 0x85 ;?EXEC .DB "?EXE",'C'+0X80 .DRW QCOMP-8 QEXEC: .DRW DOCOL .DRW STATE .DRW AT .DRW LIT .DRW 0x12 .DRW QERR .DRW SEMIS ; .DB 0x86 ;?PAIRS .DB "?PAIR",'S'+0X80 .DRW QEXEC-8 QPAIR: .DRW DOCOL .DRW SUBB .DRW LIT .DRW 0x13 .DRW QERR .DRW SEMIS ; .DB 0x84 ;?CSP .DB "?CS",'P'+0X80 .DRW QPAIR-9 QCSP: .DRW DOCOL .DRW SPAT .DRW CSPP .DRW AT .DRW SUBB .DRW LIT .DRW 0x14 .DRW QERR .DRW SEMIS ; .DB 0x88 ; ?LOADING .DB "?LOADIN",'G'+0X80 .DRW QCSP-7 QLOAD: .DRW DOCOL .DRW BLK .DRW AT .DRW ZEQU .DRW LIT .DRW 0x16 .DRW QERR .DRW SEMIS ; .DB 0x87 ; COMPILE .DB "COMPIL",'E'+0X80 .DRW QLOAD-0x0B COMP: .DRW DOCOL .DRW QCOMP .DRW FROMR .DRW DUP .DRW TWOP .DRW TOR .DRW AT .DRW COMMA .DRW SEMIS ; .DB 0x0C1 ; [ LEFT BRACKET .DB '['+0X80 .DRW COMP-0x0A LBRAC: .DRW DOCOL .DRW ZERO .DRW STATE .DRW STORE .DRW SEMIS ; .DB 0x81 ; ] RIGHT BRACKET .DB ']'+0X80 .DRW LBRAC-4 RBRAC: .DRW DOCOL .DRW LIT,0x0C0 .DRW STATE,STORE .DRW SEMIS ; .DB 0x86 ;SMUDGE .DB "SMUDG",'E'+0X80 .DRW RBRAC-4 SMUDG: .DRW DOCOL .DRW LATES .DRW LIT .DRW 0x20 .DRW TOGGL .DRW SEMIS ; .DB 0x83 ; HEX .DB "HE",'X'+0X80 .DRW SMUDG-9 HEX: .DRW DOCOL .DRW LIT .DRW 0x10 .DRW BASE .DRW STORE .DRW SEMIS ; .DB 0x87 ;DECIMAL .DB "DECIMA",'L'+0X80 .DRW HEX-6 DECCX: .DRW DOCOL .DRW LIT .DRW 0x0A .DRW BASE .DRW STORE .DRW SEMIS ; .DB 0x87 ; (;CODE) .DB "(;CODE",')'+0X80 .DRW DECCX-0x0A PSCOD: .DRW DOCOL .DRW FROMR .DRW LATES .DRW PFA .DRW CFA .DRW STORE .DRW SEMIS ; .DB 0x0C5 ; ;CODE .DB ";COD",'E'+0X80 .DRW PSCOD-0x0A SEMIC: .DRW DOCOL .DRW QCSP .DRW COMP .DRW PSCOD .DRW LBRAC SEMI1: .DRW NOOP ; (ASSEMBLER) .DRW SEMIS ; .DB 0x87 ; .DB "DOES",'>'+0X80 .DRW BUILD-0x0A DOES: .DRW DOCOL .DRW FROMR .DRW LATES .DRW PFA .DRW STORE .DRW 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 ; .DB 0x85 ; COUNT .DB "COUN",'T'+0X80 .DRW DOES-8 COUNT: .DRW DOCOL .DRW DUP .DRW ONEP .DRW SWAP .DRW CAT .DRW SEMIS ; .DB 0x84 ; TYPE .DB "TYP",'E'+0X80 .DRW COUNT-8 TYPE: .DRW DOCOL .DRW DDUP .DRW ZBRAN ;IF .DRW TYPE1-* .DRW OVER .DRW PLUS .DRW SWAP .DRW XDO ; DO TYPE2: .DRW IDO .DRW CAT .DRW EMIT .DRW XLOOP ; LOOP .DRW TYPE2-* .DRW BRAN ; ELSE .DRW TYPE3-* TYPE1: .DRW DROP ; ENDIF TYPE3: .DRW SEMIS ; .DB 0x89 ; -TRAILING .DB "-TRAILIN",'G'+0X80 .DRW TYPE-7 DTRAI: .DRW DOCOL .DRW DUP .DRW ZERO .DRW XDO ; DO DTRA1: .DRW OVER .DRW OVER .DRW PLUS .DRW ONE .DRW SUBB .DRW CAT .DRW BL .DRW SUBB .DRW ZBRAN ; IF .DRW DTRA2-* .DRW LEAVE .DRW BRAN ; ELSE .DRW DTRA3-* DTRA2: .DRW ONE .DRW SUBB ; ENDIF DTRA3: .DRW XLOOP ; LOOP .DRW DTRA1-* .DRW SEMIS ; .DB 0x84 ; (.") .DB 0x28,0x2E,0x22,0x0A9 ; (.") .DRW DTRAI-0x0C PDOTQ: .DRW DOCOL .DRW FRR .DRW COUNT .DRW DUP .DRW ONEP .DRW FROMR .DRW PLUS .DRW TOR .DRW TYPE .DRW SEMIS ; .DB 0x0C2 ; ." .DB 0x2E,0x0A2 .DRW PDOTQ-7 DOTQ: .DRW DOCOL .DRW LIT .DRW 0x22 .DRW STATE .DRW AT .DRW ZBRAN ;IF .DRW DOTQ1-* .DRW COMP .DRW PDOTQ .DRW WORD .DRW HERE .DRW CAT .DRW ONEP .DRW ALLOT .DRW BRAN ; ELSE .DRW DOTQ2-* DOTQ1: .DRW WORD .DRW HERE .DRW COUNT .DRW TYPE ;ENDIF DOTQ2: .DRW SEMIS ; .DB 0x86 ;EXPECT .DB "EXPEC",'T'+0X80 .DRW DOTQ-5 EXPEC: .DRW DOCOL .DRW OVER .DRW PLUS .DRW OVER .DRW XDO ;DO EXPE1: .DRW KEY .DRW DUP .DRW LIT .DRW 0x0E .DRW PORIG .DRW AT .DRW EQUAL .DRW ZBRAN ;IF .DRW EXPE2-* .DRW DROP .DRW DUP .DRW IDO .DRW EQUAL .DRW DUP .DRW FROMR .DRW TWO .DRW SUBB .DRW PLUS .DRW TOR .DRW ZBRAN ;IF .DRW EXPE6-* .DRW LIT .DRW BELL .DRW BRAN ; ELSE .DRW EXPE7-* EXPE6: .DRW LIT .DRW BSOUT ;================================== .DRW LIT .DRW 0X20 ; ADDED TO DO PROPER BACKSPACE .DRW LIT ; (DESTRUCTIVE) .DRW BSOUT ; FINAL EMIT PROVIDED BY EXPE3: .DRW EMIT .DRW EMIT ; ENDIF ;=================================== EXPE7: .DRW BRAN ;ELSE .DRW EXPE3-* EXPE2: .DRW DUP .DRW LIT .DRW 0x0D .DRW EQUAL .DRW ZBRAN ; IF .DRW EXPE4-* .DRW LEAVE .DRW DROP .DRW BL .DRW ZERO .DRW BRAN ; ELSE .DRW EXPE5-* EXPE4: .DRW DUP ; ENDIF EXPE5: .DRW IDO .DRW CSTOR .DRW ZERO .DRW IDO .DRW ONEP .DRW STORE ; ENDIF EXPE3: .DRW EMIT .DRW XLOOP ; LOOP .DRW EXPE1-* .DRW DROP .DRW SEMIS ; .DB 0x85 ;QUERY .DB "QUER",'Y'+0X80 .DRW EXPEC-9 QUERY: .DRW DOCOL .DRW TIB .DRW AT .DRW LIT .DRW 0x50 .DRW EXPEC .DRW ZERO .DRW INN .DRW STORE .DRW SEMIS ; .DB 0x0C1 ; 0 (NULL,BINARY ZERO, CNTL @) .DB 0x80 .DRW QUERY-8 NULL: .DRW DOCOL .DRW BLK .DRW AT .DRW ZBRAN ; IF .DRW NULL1-* .DRW ONE .DRW BLK .DRW PSTOR .DRW ZERO .DRW INN .DRW STORE .DRW BLK .DRW AT .DRW BSCR .DRW ONE .DRW SUBB .DRW ANDD .DRW ZEQU .DRW ZBRAN ;IF .DRW NULL2-* .DRW QEXEC .DRW FROMR .DRW DROP ; ENDIF NULL2: .DRW BRAN ;ELSE .DRW NULL3-* NULL1: .DRW FROMR .DRW DROP ;ENDIF NULL3: .DRW SEMIS ; .DB 0x84 ;FILL .DB "FIL",'L'+0X80 .DRW NULL-4 FILL: .DRW *+2 LD L,C LD H,B POP DE POP BC EX (SP),HL EX DE,HL FILL1: LD A,B ;BEGIN OR C JR Z,FILL2 ;WHILE LD A,L LD (DE),A INC DE DEC BC JR FILL1 ;REPEAT FILL2: POP BC JP NEXT ; .DB 0x85 ;ERASE .DB "ERAS",'E'+0X80 .DRW FILL-7 ERASEE: .DRW DOCOL .DRW ZERO .DRW FILL .DRW SEMIS ; .DB 0x86 ;BLANKS .DB "BLANK",'S'+0X80 .DRW ERASEE-8 BLANK: .DRW DOCOL .DRW BL .DRW FILL .DRW SEMIS ; .DB 0x84 ;HOLD .DB "HOL",'D'+0X80 .DRW BLANK-9 HOLD: .DRW DOCOL .DRW LIT .DRW -1 .DRW HLD .DRW PSTOR .DRW HLD .DRW AT .DRW CSTOR .DRW SEMIS ; .DB 0x83 ;PAD .DB "PA",'D'+0X80 .DRW HOLD-7 PAD: .DRW DOCOL .DRW HERE .DRW LIT .DRW 0x44 .DRW PLUS .DRW SEMIS ; .DB 0x84 ; WORD .DB "WOR",'D'+0X80 .DRW PAD-6 WORD: .DRW DOCOL .DRW BLK .DRW AT .DRW ZBRAN ;IF .DRW WORD1 -* .DRW BLK .DRW AT .DRW BLOCK .DRW BRAN ; ELSE .DRW WORD2-* WORD1: .DRW TIB .DRW AT ;ENDIF WORD2: .DRW INN .DRW AT .DRW PLUS .DRW SWAP .DRW ENCL .DRW HERE .DRW LIT .DRW 0x22 .DRW BLANK .DRW INN .DRW PSTOR .DRW OVER .DRW SUBB .DRW TOR .DRW FRR .DRW HERE .DRW CSTOR .DRW PLUS .DRW HERE .DRW ONEP .DRW FROMR .DRW CMOVE .DRW SEMIS ; .DB 0x88 ; (NUMBER) .DB "(NUMBER",')'+0X80 .DRW WORD-7 PNUMB: .DRW DOCOL PNUM1: .DRW ONEP ;BEGIN .DRW DUP .DRW TOR .DRW CAT .DRW BASE .DRW AT .DRW DIGIT .DRW ZBRAN ;WHILE .DRW PNUM2-* .DRW SWAP .DRW BASE .DRW AT .DRW USTAR .DRW DROP .DRW ROT .DRW BASE .DRW AT .DRW USTAR .DRW DPLUS .DRW DPL .DRW AT .DRW ONEP .DRW ZBRAN ; IF .DRW PNUM3-* .DRW ONE .DRW DPL .DRW PSTOR ; ENDIF PNUM3: .DRW FROMR .DRW BRAN ; REPEAT .DRW PNUM1-* PNUM2: .DRW FROMR .DRW SEMIS ; .DB 0x86 ;NUMBER .DB "NUMBE",'R'+0X80 .DRW PNUMB-0x0B NUMB: .DRW DOCOL .DRW ZERO .DRW ZERO .DRW ROT .DRW DUP .DRW ONEP .DRW CAT .DRW LIT .DRW 0x2D .DRW EQUAL .DRW DUP .DRW TOR .DRW PLUS .DRW LIT .DRW -1 NUMB1: .DRW DPL ; BEGIN .DRW STORE .DRW PNUMB .DRW DUP .DRW CAT .DRW BL .DRW SUBB .DRW ZBRAN ; WHILE .DRW NUMB2-* .DRW DUP .DRW CAT .DRW LIT .DRW 0x2E .DRW SUBB .DRW ZERO .DRW QERR .DRW ZERO .DRW BRAN ; REPEAT .DRW NUMB1-* NUMB2: .DRW DROP .DRW FROMR .DRW ZBRAN ;IF .DRW NUMB3-* .DRW DMINU ;ENDIF NUMB3: .DRW SEMIS ; .DB 0x85 ; -FIND (0-3) SUCCESS .DB "-FIN",'D'+0X80 ; (0-1) FAILURE .DRW NUMB-9 DFIND: .DRW DOCOL .DRW BL .DRW WORD .DRW HERE .DRW CONT .DRW AT .DRW AT .DRW PFIND .DRW DUP .DRW ZEQU .DRW ZBRAN ;IF .DRW DFIN1-* .DRW DROP .DRW HERE .DRW LATES .DRW PFIND ;ENDIF DFIN1: .DRW SEMIS ; .DB 0x87 ; (ABORT) .DB "(ABORT",')'+0X80 .DRW DFIND-8 PABOR: .DRW DOCOL .DRW ABORT .DRW SEMIS ; .DB 0x85 ; ERROR .DB "ERRO",'R'+0X80 .DRW PABOR-0x0A ERROR: .DRW DOCOL .DRW WARN .DRW AT .DRW ZLESS .DRW ZBRAN ;IF .DRW ERRO1-* .DRW PABOR ;ENDIF ERRO1: .DRW HERE .DRW COUNT .DRW TYPE .DRW PDOTQ .DB 2 .DB "? " .DRW MESS .DRW SPSTO ; CHANGE FROM FIG MODEL ; .DRW INN,AT,BLK,AT .DRW BLK,AT .DRW DDUP .DRW ZBRAN,ERRO2-*-2 ;IF .DRW INN,AT .DRW SWAP ; ENDIF ERRO2: .DRW QUIT ; .DB 0x83 ; ID. .DB "ID",'.'+0X80 .DRW ERROR-8 IDDOT: .DRW DOCOL .DRW PAD .DRW LIT .DRW 0x20 .DRW LIT .DRW 0x5F .DRW FILL .DRW DUP .DRW PFA .DRW LFA .DRW OVER .DRW SUBB .DRW PAD .DRW SWAP .DRW CMOVE .DRW PAD .DRW COUNT .DRW LIT .DRW 0x1F .DRW ANDD ;================================= .DRW DUP .DRW PAD .DRW PLUS .DRW DUP .DRW CAT .DRW LIT .DRW 0X7F .DRW ANDD .DRW SWAP .DRW CSTOR ;================================= .DRW TYPE .DRW SPACE .DRW SEMIS ; .DB 0x86 ; CREATE .DB "CREAT",'E'+0X80 .DRW IDDOT-6 CREAT: .DRW DOCOL .DRW DFIND .DRW ZBRAN ;IF .DRW CREA1-* .DRW DROP .DRW NFA .DRW IDDOT .DRW LIT .DRW 4 .DRW MESS .DRW SPACE ;ENDIF CREA1: .DRW HERE .DRW DUP .DRW CAT .DRW WIDTH .DRW AT .DRW MIN .DRW ONEP .DRW ALLOT .DRW DUP .DRW LIT .DRW 0x0A0 .DRW TOGGL .DRW HERE .DRW ONE .DRW SUBB .DRW LIT .DRW 0x80 .DRW TOGGL .DRW LATES .DRW COMMA .DRW CURR .DRW AT .DRW STORE .DRW HERE .DRW TWOP .DRW COMMA .DRW SEMIS ; .DB 0x0C9 ; [COMPILE] .DB "[COMPILE",']'+0X80 .DRW CREAT-9 BCOMP: .DRW DOCOL .DRW DFIND .DRW ZEQU .DRW ZERO .DRW QERR .DRW DROP .DRW CFA .DRW COMMA .DRW SEMIS ; .DB 0x0C7 ; LITERAL .DB "LITERA",'L'+0X80 .DRW BCOMP-0x0C LITER: .DRW DOCOL .DRW STATE .DRW AT .DRW ZBRAN ;IF .DRW LITE1-* .DRW COMP .DRW LIT .DRW COMMA ; ENDIF LITE1: .DRW SEMIS ; .DB 0x0C8 ; DLITERAL .DB "DLITERA",'L'+0X80 .DRW LITER-0x0A DLITE: .DRW DOCOL .DRW STATE .DRW AT .DRW ZBRAN ; IF .DRW DLIT1-* .DRW SWAP .DRW LITER .DRW LITER ; ENDIF DLIT1: .DRW SEMIS ; .DB 0x86 ; ?STACK .DB "?STAC",'K'+0X80 .DRW DLITE-0x0B QSTAC: .DRW DOCOL .DRW SPAT .DRW SZERO .DRW AT .DRW SWAP .DRW ULESS .DRW ONE .DRW QERR .DRW SPAT .DRW HERE .DRW LIT .DRW 0x80 .DRW PLUS .DRW ULESS .DRW LIT .DRW 7 .DRW QERR .DRW SEMIS ; .DB 0x89 ;INTERPRET .DB "INTERPRE",'T'+0X80 .DRW QSTAC-9 INTER: .DRW DOCOL INTE1: .DRW DFIND ; BEGIN .DRW ZBRAN ;IF .DRW INTE2-* .DRW STATE .DRW AT .DRW LESS .DRW ZBRAN ;IF .DRW INTE3-* .DRW CFA .DRW COMMA .DRW BRAN ;ELSE .DRW INTE4-* INTE3: .DRW CFA .DRW EXEC ;ENDIF INTE4: .DRW QSTAC .DRW BRAN ;ELSE .DRW INTE5-* INTE2: .DRW HERE .DRW NUMB .DRW DPL .DRW AT .DRW ONEP .DRW ZBRAN ;IF .DRW INTE6-* .DRW DLITE .DRW BRAN ;ELSE .DRW INTE7-* INTE6: .DRW DROP .DRW LITER ;ENDIF INTE7: .DRW QSTAC ;ENDIF INTE5: .DRW BRAN ;AGAIN .DRW INTE1-* ; .DB 0x89 ; IMMEDIATE .DB "IMMEDIAT",'E'+0X80 .DRW INTER-0x0C IMMED: .DRW DOCOL .DRW LATES .DRW LIT .DRW 0x40 .DRW TOGGL .DRW SEMIS ; .DB 0x8A ; VOCABULARY .DB "VOCABULAR",'Y'+0X80 .DRW IMMED-0x0C VOCAB: .DRW DOCOL .DRW BUILD .DRW LIT .DRW 0x0A081 .DRW COMMA .DRW CURR .DRW AT .DRW CFA .DRW COMMA .DRW HERE .DRW VOCL .DRW AT .DRW COMMA .DRW VOCL .DRW STORE .DRW DOES DOVOC: .DRW TWOP .DRW CONT .DRW STORE .DRW SEMIS ; .DB 0x0C5 ;FORTH .DB "FORT",'H'+0X80 .DRW VOCAB-0x0D FORTH: .DRW DODOE .DRW DOVOC .DRW 0x0A081 .DRW TASK-7 ; COLD START VALUE ONLY CHANGED 0xEAC TIME ; A DEF IS APPENDED TO THE FORTH VOCABULARY .DRW 0 ; END OF VOCABULARY LIST ; .DB 0x8B ; DEFINITIONS .DB "DEFINITION",'S'+0X80 .DRW FORTH-8 DEFIN: .DRW DOCOL .DRW CONT .DRW AT .DRW CURR .DRW STORE .DRW SEMIS ; .DB 0x0C1 ; ( .DB '('+0X80 .DRW DEFIN-0x0E PAREN: .DRW DOCOL .DRW LIT .DRW 0x29 .DRW WORD .DRW SEMIS ; .DB 0x84 ; QUIT .DB "QUI",'T'+0X80 .DRW PAREN-4 QUIT: .DRW DOCOL .DRW ZERO .DRW BLK .DRW STORE .DRW LBRAC QUIT1: .DRW RPSTO ; BEGIN .DRW CR .DRW QUERY .DRW INTER .DRW STATE .DRW AT .DRW ZEQU .DRW ZBRAN ; IF .DRW QUIT2-* .DRW PDOTQ .DB 2 .DB "ok" ; ENDIF QUIT2: .DRW BRAN ;AGAIN .DRW QUIT1-* ; .DB 0x85 ; ABORT .DB "ABOR",'T'+0X80 .DRW QUIT-7 ABORT: .DRW DOCOL .DRW SPSTO .DRW DECCX .DRW QSTAC .DRW CR .DRW DOTCPU .DRW PDOTQ .DB 0x0E .DB "FIG-FORTH " .DB FIGREL+0x30,ADOT,FIGREV+0x30,USRVER .DRW CR .DRW PDOTQ .DB 0X32 .DB "TC/TR STD Bus Forth card",0X0D,0X0A,"Implementation by VK1ZDJ" .DRW FORTH .DRW DEFIN .DRW QUIT ; WRM: LD BC,WRM1 JP NEXT WRM1: .DRW WARM ; .DB 0x84 ;WARM .DB "WAR",'M'+0X80 .DRW ABORT-8 WARM: .DRW DOCOL .DRW MTBUF .DRW ABORT ; BRGSET: .DB 0X0EE ; 9600 BAUD ; SATAB: .DB 0X018 .DB 0X014,0X046 ; 16X CLOCK, 1 STOP, NO PARITY .DB 0X003,0X0E1 ; RX, CTS, DCD ENABLE: 8 BITS RX CHAR .DB 0X015,0X06A ; TX, RTS ENABLE : 8 BITS TX CHAR : DTR DISABLE .DB 0X001,0X000 ; NO INTERUPTS .DB 0X030,0X010 ; CLEAR STATUS, INTERUPT FLAGS. ; .EQU SASIZE, 0X00A ; CLD: LD A,(BRGSET) OUT (BRG),A ; LD C,SACTRL LD B,SASIZE LD HL,SATAB OTIR LD BC,CLD1 LD HL,(ORIG+0X12) LD SP,HL JP NEXT CLD1: .DRW COLD ; .DB 0x84 ; COLD .DB "COL",'D'+0X80 .DRW WARM-7 COLD: .DRW DOCOL .DRW MTBUF .DRW ZERO,DENSTY .DRW STORE .DRW LIT,BUF1 .DRW USE,STORE .DRW LIT,BUF1 .DRW PREV,STORE .DRW DRZER .DRW LIT,0 .DRW LIT,EPRINT .DRW STORE ; .DRW LIT .DRW ORIG+0x12 .DRW LIT .DRW UP .DRW AT .DRW LIT .DRW 6 .DRW PLUS .DRW LIT .DRW 0x10 .DRW CMOVE .DRW LIT .DRW ORIG+0x0C .DRW AT .DRW LIT .DRW FORTH+6 .DRW STORE .DRW ABORT ; .DB 0x84 ; S-> D .DB "S->",'D'+0X80 .DRW COLD-7 STOD: .DRW *+2 POP DE LD HL,0 LD A,D AND 0x80 JR Z,STOD1 DEC HL STOD1: JP DPUSH ; .DB 0x82 ; +- .DB "+",'-'+0X80 .DRW STOD-7 PM: .DRW DOCOL .DRW ZLESS .DRW ZBRAN ;IF .DRW PM1-* .DRW MINUS ; ENDIF PM1: .DRW SEMIS ; .DB 0x83 ; D+- .DB "D+",'-'+0X80 .DRW PM-5 DPM: .DRW DOCOL .DRW ZLESS .DRW ZBRAN ;IF .DRW DPM1-* .DRW DMINU ; ENDIF DPM1: .DRW SEMIS ; .DB 0x83 ; ABS .DB "AB",'S'+0X80 .DRW DPM-6 ABS: .DRW DOCOL .DRW DUP .DRW PM .DRW SEMIS ; .DB 0x84 ; DABS .DB "DAB",'S'+0X80 .DRW ABS-6 DABS: .DRW DOCOL .DRW DUP .DRW DPM .DRW SEMIS ; .DB 0x83 ;MIN .DB "MI",'N'+0X80 .DRW DABS-7 MIN: .DRW DOCOL,TDUP .DRW GREAT .DRW ZBRAN ;IF .DRW MIN1-* .DRW SWAP ;ENDIF MIN1: .DRW DROP .DRW SEMIS ; .DB 0x83 ;MAX .DB "MA",'X'+0X80 .DRW MIN-6 MAX: .DRW DOCOL,TDUP .DRW LESS .DRW ZBRAN ; IF .DRW MAX1-* .DRW SWAP ;ENDIF MAX1: .DRW DROP .DRW SEMIS ; .DB 0x82 ; M* .DB "M",'*'+0X80 .DRW MAX-6 MSTAR: .DRW DOCOL,TDUP .DRW XORR .DRW TOR .DRW ABS .DRW SWAP .DRW ABS .DRW USTAR .DRW FROMR .DRW DPM .DRW SEMIS ; .DB 0x82 ; M/ .DB "M",'/'+0X80 .DRW MSTAR-5 MSLAS: .DRW DOCOL .DRW OVER .DRW TOR .DRW TOR .DRW DABS .DRW FRR .DRW ABS .DRW USLAS .DRW FROMR .DRW FRR .DRW XORR .DRW PM .DRW SWAP .DRW FROMR .DRW PM .DRW SWAP .DRW SEMIS ; .DB 0x81 ; * .DB '*'+0X80 .DRW MSLAS-5 STAR: .DRW DOCOL .DRW MSTAR .DRW DROP .DRW SEMIS ; .DB 0x84 ; /MOD .DB "/MO",'D'+0X80 .DRW STAR-4 SLMOD: .DRW DOCOL .DRW TOR .DRW STOD .DRW FROMR .DRW MSLAS .DRW SEMIS ; .DB 0x81 ;/ .DB '/'+0X80 .DRW SLMOD-7 SLASH: .DRW DOCOL .DRW SLMOD .DRW SWAP .DRW DROP .DRW SEMIS ; .DB 0x83 ;MOD .DB "MO",'D'+0X80 .DRW SLASH-4 MODD: .DRW DOCOL .DRW SLMOD .DRW DROP .DRW SEMIS ; .DB 0x85 ; */MOD .DB "*/MO",'D'+0X80 .DRW MODD-6 SSMOD: .DRW DOCOL .DRW TOR .DRW MSTAR .DRW FROMR .DRW MSLAS .DRW SEMIS ; .DB 0x82 ; */ .DB "*",'/'+0X80 .DRW SSMOD-8 SSLA: .DRW DOCOL .DRW SSMOD .DRW SWAP .DRW DROP .DRW SEMIS ; .DB 0x85 ; M/MOD .DB "M/MO",'D'+0X80 .DRW SSLA-5 MSMOD: .DRW DOCOL .DRW TOR .DRW ZERO .DRW FRR .DRW USLAS .DRW FROMR .DRW SWAP .DRW TOR .DRW USLAS .DRW FROMR .DRW SEMIS ; ; BLOCK MOVED DOWN 2 PAGES ; .DB 0x86 ; (LINE) .DB "(LINE",')'+0X80 .DRW MSMOD-8 PLINE: .DRW DOCOL .DRW TOR .DRW LIT .DRW 0x40 .DRW BBUF .DRW SSMOD .DRW FROMR .DRW BSCR .DRW STAR .DRW PLUS .DRW BLOCK .DRW PLUS .DRW LIT .DRW 0x40 .DRW SEMIS ; .DB 0x85 ; .LINE .DB ".LIN",'E'+0X80 .DRW PLINE-9 DLINE: .DRW DOCOL .DRW PLINE .DRW DTRAI .DRW TYPE .DRW SEMIS ; .DB 0x87 ; MESSAGE .DB "MESSAG",'E'+0X80 .DRW DLINE-8 MESS: .DRW DOCOL .DRW WARN .DRW AT .DRW ZBRAN ;IF .DRW MESS1-* .DRW DDUP .DRW ZBRAN ;IF .DRW MESS2-* .DRW LIT .DRW 4 ; SCREEN IN WHICH MESSAGES START .DRW OFSET .DRW AT .DRW BSCR .DRW SLASH .DRW SUBB .DRW DLINE .DRW SPACE ; ENDIF MESS2: .DRW BRAN ;ELSE .DRW MESS3-* MESS1: .DRW PDOTQ .DB 6 .DB "MSG # " .DRW DOT ; ENDIF MESS3: .DRW SEMIS ; ; Z80 VERSION ROMABLE ; .DB 0x82 ; P@ .DB "P",'@'+0X80 .DRW MESS-0x0A PTAT: .DRW *+2 EXX ;SAVE REGISTERS POP BC ; C CONTAINS PORT # IN L,(C) ; L RECEIVES DATA BYTE LD H,0 PUSH HL EXX ;RESTORE REGISTERS JP NEXT ; .DB 0x82 ; P! .DB "P",'!'+0X80 .DRW PTAT-5 PTSTO: .DRW *+2 EXX ; SAVE REGISTERS POP BC POP HL ;C=PORT # L=DATA BYTE OUT (C),L EXX ;RESTORE REGISTERS JP NEXT ; ;-------------------------------------------------- ; ; CP/M DISK INTERFACE ; ; CP/M BIOS CALLS USED ; ( NOTE EQU'S ARE 3 LOWER THAN DOCCUMENTED OFFSETS ; BECAUSE BASE ADDR IS BIOS+3 ) ; ; .EQU RITSEC,39 .EQU RDSEC,36 .EQU SETDMA,33 .EQU SETSEC,30 .EQU SETTRK,27 .EQU SETDSK,24 ; ; DOUBLE DENSITY 8" FLOPPY CAPACITIES .EQU SPT,52 ;SECTORS PER TRACK .EQU TRKS2,77 ;TRACKS PER SIDE .EQU SPDRV2,4000 ; SECTORE PER DRIVE, DROPS LAST 4. SEE SPDRV1 BELOW ; ; SINGLE DENSITY 8" FLOPPY CAPACITIES. .EQU SPT1,26 .EQU TRKS1,77 .EQU SPDRV1,2000 ; .EQU BPS,128 ;BYTES PER SECTOR .EQU MXDRV,2 ;MAX # OF DRIVES (0=1 , 1=2 DRIVES, 2=3DRIVES ; ; FORTH VARIABLES AND CONSTANTS USED IN DISK INTERFACE ; .DB 0x85 ; DRIVE ( CURRENT DRIVE # ) .DB "DRIV",'E'+0X80 .DRW PTSTO-5 DRIVE: .DRW DOVAR,0 ; .DB 0x83 ; SECTOR .DB "SE",'C'+0X80 .DRW DRIVE-8 SEC: .DRW DOVAR,0 ; .DB 0x85 ; TRACK .DB "TRAC",'K'+0X80 .DRW SEC-6 TRACK: .DRW DOVAR,0 ; .DB 0x83 ; USE .DB "US",'E'+0X80 .DRW TRACK-8 USE: .DRW DOVAR,BUF1 ; .DB 0x84 ; PREV .DB "PRE",'V'+0X80 .DRW USE-6 PREV: .DRW DOVAR,BUF1 ; .DB 0x87 ; SEC/BLK .DB "SEC/BL",'K'+0X80 .DRW PREV-7 SPBLK: .DRW DOCON .DRW KBBUF/BPS ; .DB 0x085 ; #BUFF .DB "#BUF",'F'+0X80 .DRW SPBLK-10 NOBUF: .DRW DOCON,NBUF ; .DB 0x087 ; DENSITY .DB "DENSIT",'Y'+0X80 .DRW NOBUF-8 DENSTY: .DRW DOVAR,0 ; .DB 0x08A ; DISK-ERROR .DB "DISK-ERRO",'R'+0X80 .DRW DENSTY-10 DSKERR: .DRW DOVAR,0 ; ; ; DISK INTERFACE HIGHER LEVEL ROUTINES... ; ; .DB 0x084 ; +BUF .DB "+BU",'F'+0X80 .DRW DSKERR-13 PBUF: .DRW DOCOL .DRW LIT,CO .DRW PLUS,DUP .DRW LIMIT,EQUAL .DRW ZBRAN,PBUF1-*-2 .DRW DROP,FIRST PBUF1: .DRW DUP,PREV .DRW AT,SUBB .DRW SEMIS ; .DB 0x086 ; UPDATE .DB "UPDAT",'E'+0X80 .DRW PBUF-7 UPDAT: .DRW DOCOL,PREV .DRW AT,AT .DRW LIT,0X8000 .DRW ORR .DRW PREV,AT .DRW STORE,SEMIS ; .DB 0x08D ; EMPTY-BUFFERS .DB "EMPTY-BUFFER",'S'+0X80 .DRW UPDAT-9 MTBUF: .DRW DOCOL,FIRST .DRW LIMIT,OVER .DRW SUBB,ERASEE .DRW SEMIS ; .DB 0x083 ; DR0 .DB "DR",'0'+0X80 .DRW MTBUF-16 DRZER: .DRW DOCOL,ZERO .DRW OFSET,STORE .DRW SEMIS ; .DB 0x083 ; DR1 .DB "DR",'1'+0X80 .DRW DRZER-6 DRONE: .DRW DOCOL .DRW DENSTY,AT .DRW ZBRAN,DRON1-*-2 .DRW LIT,SPDRV2 .DRW BRAN,DRON2-*-2 DRON1: .DRW LIT,SPDRV1 DRON2: .DRW OFSET,STORE .DRW SEMIS ; .DB 0x086 ; BUFFER .DB "BUFFE",'R'+0X80 .DRW DRONE-6 BUFFE: .DRW DOCOL,USE .DRW AT,DUP .DRW TOR BUFF1: .DRW PBUF .DRW ZBRAN,BUFF1-*-2 .DRW USE,STORE .DRW FRR,AT .DRW ZLESS .DRW ZBRAN,BUFF2-*-2 .DRW FRR,TWOP .DRW FRR,AT .DRW LIT,0X7FFF .DRW ANDD,ZERO .DRW RSLW BUFF2: .DRW FRR,STORE .DRW FRR,PREV .DRW STORE,FROMR .DRW TWOP,SEMIS ; .DB 0x085 ; BLOCK .DB "BLOC",'K'+0X80 .DRW BUFFE-9 BLOCK: .DRW DOCOL,OFSET .DRW AT,PLUS .DRW TOR,PREV .DRW AT,DUP .DRW AT,FRR .DRW SUBB .DRW DUP,PLUS .DRW ZBRAN,BLOC1-*-2 BLOC2: .DRW PBUF,ZEQU .DRW ZBRAN,BLOC3-*-2 .DRW DROP,FRR .DRW BUFFE,DUP .DRW FRR,ONE .DRW RSLW .DRW TWO,SUBB BLOC3: .DRW DUP,AT .DRW FRR,SUBB .DRW DUP,PLUS .DRW ZEQU .DRW ZBRAN,BLOC2-*-2 .DRW DUP,PREV .DRW STORE BLOC1: .DRW FROMR,DROP .DRW TWOP,SEMIS ; CP/M INTERFACE FUNCTIONS FOR DISK I/O ; ; SERVICE REQUEST ; IOS: LD HL,(1) ADD HL,DE JP (HL) ; RETURN FUNCTION PROVIDED BY CP/M ; .DB 0X86 ;SET-IO ; .DB "SET-I",'O'+0X80 ; .DRW BLOCK-8 ;SETIO: .DRW *+2 ; PUSH BC ; LD BC,(USE+2) ; LD DE,SETDMA ; CALL IOS ; ; ; LD BC,(SEC+2) ; LD DE,SETSEC ; CALL IOS ;; ; LD BC,(TRACK+2) ; LD DE,SETTRK ; CALL IOS ;; ; POP BC ; JP NEXT ;; ; .DB 0X89 ;SET-DRIVE ; .DB "SET-DRIV",'E'+0X80 ; .DRW SETIO-9 ;SETDRV: .DRW *+2 ; PUSH BC ; LD BC,(DRIVE+2) ; LD DE,SETDSK ; CALL IOS ; POP BC ; JP NEXT ;; ; ; .DB 0X87 ; .DB "T&SCAL",'C'+0X80 ; .DRW SETDRV-12 ;TSCALC: .DRW DOCOL,DENSTY ; .DRW AT ; .DRW ZBRAN,TSCALS-*-2 ;TSCALS: .DRW LIT,SPDRV1 ; .DRW SLMOD ; .DRW LIT,MXDRV ; .DRW MIN ; .DRW DUP,DRIVE ; .DRW AT,EQUAL ; .DRW ZBRAN,TSCAL3-*-2 ; .DRW DROP ; .DRW BRAN,TSCAL4-*-2 ;TSCAL3: .DRW DRIVE,STORE ; .DRW SETDRV ;TSCAL4: .DRW LIT,SPT1 ; .DRW SLMOD,TRACK ; .DRW STORE,ONEP ; .DRW SEC,STORE ; .DRW SEMIS ;; ; SEC-READ ; ; .DB 0X88 ; .DB "SEC-REA",'D'+0X80 ; .DRW TSCALC-10 ;SECRD: .DRW *+2 ; PUSH BC ; LD DE,RDSEC ; CALL IOS ; LD (DSKERR+2),A ; POP BC ; JP NEXT ;; ;; SEC-WRITE ;; ; .DB 0X89 ; .DB "SEC-WRIT",'E'+0X80 ; .DRW SECRD-11 ;SECWT: .DRW *+2 ; PUSH BC ; LD DE,RITSEC ; CALL IOS ; LD (DSKERR+2),A ; POP BC ; JP NEXT ;; ; ; .DB 0X83 ; .DB "R/",'W'+0X80 ; .DRW SECWT-12 ;RSLW: .DRW DOCOL ; .DRW USE,AT ; .DRW TOR ; .DRW SWAP,SPBLK ; .DRW STAR,ROT ; .DRW USE,STORE ; .DRW SPBLK,ZERO ; .DRW XDO ;RSLW1: .DRW OVER,OVER ; .DRW TSCALC,SETIO ; .DRW ZBRAN,RSLW2-*-2 ; .DRW SECRD ; .DRW BRAN,RSLW3-*-2 ;RSLW2: .DRW SECWT ;RSLW3: .DRW ONEP ; .DRW LIT,0X80 ; .DRW USE,PSTOR ; .DRW XLOOP,RSLW1-*-2 ; .DRW DROP,DROP ; .DRW FROMR,USE ; .DRW STORE,SEMIS ; ; ALTERNATIVE R/W FOR NO DISK INTERFACE ; ; .DB 0x083 ; R/W ; .DB "R/",'W'+0X80 ; .DRW BLOCK-8 ;RSLW: .DRW DOCOL,DROP,DROP,DROP,SEMIS ; ; ;===================================================== ; IT'S GOING TO BE A RAM DISK! :-) .DB 0X83 .DB "R/",'W'+0X80 .DRW BLOCK-8 RSLW: .DRW DOCOL .DRW TOR .DRW BBUF .DRW STAR .DRW LIT,0XFFF0 ; END OF MEM .DRW PLUS .DRW DUP .DRW LIT,0XD7F0 .DRW GREAT .DRW LIT,0X06 .DRW QERR .DRW FROMR .DRW ZBRAN .DRW RSLW1-* .DRW SWAP RSLW1: .DRW BBUF .DRW CMOVE .DRW SEMIS ; ;====================================================== ; .DB 0x085 ;FLUSH .DB "FLUS",'H'+0X80 .DRW RSLW-6 FLUSH: .DRW DOCOL .DRW NOBUF,ONEP .DRW ZERO,XDO FLUS1: .DRW ZERO,BUFFE .DRW DROP .DRW XLOOP,FLUS1-*-2 .DRW SEMIS ; .DB 0x84 ;LOAD .DB "LOA",'D'+0X80 .DRW FLUSH-8 LOAD: .DRW DOCOL,BLK .DRW AT,TOR .DRW INN,AT .DRW TOR,ZERO .DRW INN,STORE .DRW BSCR,STAR .DRW BLK,STORE ;BLK <- SCR*B/SCR .DRW INTER ;INTERPRET FROM OTHER SCREEN .DRW FROMR,INN .DRW STORE .DRW FROMR,BLK .DRW STORE .DRW SEMIS ; .DB 0x0C3 ; --> .DB "--",'>'+0X80 .DRW LOAD-7 ARROW: .DRW DOCOL .DRW QLOAD .DRW ZERO .DRW INN .DRW STORE .DRW BSCR .DRW BLK .DRW AT .DRW OVER .DRW MODD .DRW SUBB .DRW BLK .DRW PSTOR .DRW SEMIS ;------------------------------ ; END OF DISK INTERFACE ;------------------------------ ; ; ;======================================================== ; ; CONSOLE I/O ROUTINTES FOR TC/TR STD CPU CARD ; These routines use SIO port A as a console, ; and implement a Centronics style printer ; port, or use SIO Port B as a printer. EPRINT: .DRW 0X0000 CSTAT: IN A,(SACTRL) ;CONSOLE STATUS AND SRXMSK RET Z LD A,0x0FF RET ; IGNORES CHAR CIN: CALL CSTAT ; CONSOLE INPUT JR Z,CIN ; LOOP TILL WE GET A CHAR IN A,(SADATA) RET COTST: IN A,(SACTRL) ; CONSOLE TX STATUS AND STXMSK RET Z LD A,0x0FF RET COUT: CALL COTST ; CONSOLE OUTPUT JR Z,COUT LD A,C ; GET CHAR FROM C REG OUT (SADATA),A RET POUT: JR COUT CPOUT: JR COUT PQTER: CALL CSTAT ; IF CHR TYPED LD HL,0 OR A JP Z,PQTER1 INC L ;THEN (S1) <- TRUE PQTER1: JP HPUSH ; ELSE (S1) <- FALSE PKEY: CALL CIN ;READ CHR FROM CONSOLE CP DLE ;IF CHR=(^P) .. DATA LINK ESCAPE LD E,A JP NZ,PKEY1 LD HL,EPRINT ; THEN TOGGLE (EPRINT) LSB LD E,ABL ;CHR <- BLANK LD A,(HL) XOR 1 LD (HL),A PKEY1: LD L,E LD H,0 JP HPUSH ; (S1) LB <- CHR ; PEMIT: .DRW *+2 ;(EMIT) ORPHAN POP HL ;(L) <- (S1) LD=CHR PUSH BC ; SAVE (IP) LD C,L ; CALL CPOUT ;AND MAYBE TO PRINTER POP BC ; RESTORE (IP) JP NEXT ; PCR: PUSH BC ;SAVE(IP) LD C,ACR ;OUTPUT (CR) TO CONSOLE LD L,C CALL CPOUT ; AND MAYBE TO PRINTER LD C,LF ;OUTPUT (LF) TO CONSOLE LD L,C CALL CPOUT ; AND MAYBE TO PRINTER POP BC ;RESTORE (IP) JP NEXT ;***************************( END OF I/O ) ******************** ;**************************************************************; .DB 0x0C1 ; ' (tick) .DB 0x0A7 .DRW ARROW-6 TICK: .DRW DOCOL .DRW DFIND .DRW ZEQU .DRW ZERO .DRW QERR .DRW DROP .DRW LITER .DRW SEMIS ; .DB 0x86 ;FORGET .DB "FORGE",'T'+0X80 ; THIS IS NOT THE FORGIVING FORGET .DRW TICK-4 FORG: .DRW DOCOL .DRW CURR .DRW AT .DRW CONT .DRW AT .DRW SUBB .DRW LIT .DRW 0x18 .DRW QERR .DRW TICK .DRW DUP .DRW FENCE .DRW AT .DRW LESS .DRW LIT .DRW 0x15 .DRW QERR .DRW DUP .DRW NFA .DRW DP .DRW STORE .DRW LFA .DRW AT .DRW CONT .DRW AT .DRW STORE .DRW SEMIS ; .DB 0x84 ; BACK .DB "BAC",'K'+0X80 .DRW FORG-9 BACK: .DRW DOCOL .DRW HERE .DRW SUBB .DRW COMMA .DRW SEMIS ; .DB 0x0C5 ;BEGIN .DB "BEGI",'N'+0X80 .DRW BACK-7 BEGIN: .DRW DOCOL .DRW QCOMP .DRW HERE .DRW ONE .DRW SEMIS ; .DB 0x0C5 ; ENDIF .DB "ENDI",'F'+0X80 .DRW BEGIN-8 ENDIFF: .DRW QCOMP .DRW TWO .DRW QPAIR .DRW HERE .DRW OVER .DRW SUBB .DRW SWAP .DRW STORE .DRW SEMIS ; .DB 0x0C4 ;THEN .DB "THE",'N'+0X80 .DRW ENDIFF-8 THEN: .DRW DOCOL .DRW ENDIFF .DRW SEMIS ; .DB 0x0C2 ; DO .DB "D",'O'+0X80 .DRW THEN-7 DO: .DRW DOCOL .DRW COMP .DRW XDO .DRW HERE .DRW THREE .DRW SEMIS ; .DB 0x0C4 ;LOOP .DB "LOO",'P'+0X80 .DRW DO-5 LOOP: .DRW DOCOL .DRW THREE .DRW QPAIR .DRW COMP .DRW XLOOP .DRW BACK .DRW SEMIS ; .DB 0x0C5 ; +LOOP .DB "+LOO",'P'+0X80 .DRW LOOP-7 PLOOP: .DRW DOCOL .DRW THREE .DRW QPAIR .DRW COMP .DRW XPLOO .DRW BACK .DRW SEMIS ; .DB 0x0C5 ;UNTIL .DB "UNTI",'L'+0X80 .DRW PLOOP-8 UNTIL: .DRW DOCOL .DRW ONE .DRW QPAIR .DRW COMP .DRW ZBRAN .DRW BACK .DRW SEMIS ; .DB 0x0C3 ;END .DB "EN",'D'+0X80 .DRW UNTIL-8 ENDD: .DRW DOCOL .DRW UNTIL .DRW SEMIS ; .DB 0x0C5 ; AGAIN .DB "AGAI",'N'+0X80 .DRW ENDD-6 AGAIN: .DRW DOCOL .DRW ONE .DRW QPAIR .DRW COMP .DRW BRAN .DRW BACK .DRW SEMIS ; .DB 0x0C6 ; REPEAT .DB "REPEA",'T'+0X80 .DRW AGAIN-8 REPEA: .DRW DOCOL .DRW TOR .DRW TOR .DRW AGAIN .DRW FROMR .DRW FROMR .DRW TWO .DRW SUBB .DRW ENDIFF .DRW SEMIS ; .DB 0x0C2 ; IF .DB "I",'F'+0X80 .DRW REPEA-9 IFF: .DRW DOCOL .DRW COMP .DRW ZBRAN .DRW HERE .DRW ZERO .DRW COMMA .DRW TWO .DRW SEMIS ; .DB 0x0C4 ;ELSE .DB "ELS",'E'+0X80 .DRW IFF-5 ELSEE: .DRW DOCOL .DRW TWO .DRW QPAIR .DRW COMP .DRW BRAN .DRW HERE .DRW ZERO .DRW COMMA .DRW SWAP .DRW TWO .DRW ENDIFF .DRW TWO .DRW SEMIS ; .DB 0x0C5 ; WHILE .DB "WHIL",'E'+0X80 .DRW ELSEE-7 WHILE: .DRW DOCOL .DRW IFF .DRW TWOP .DRW SEMIS ; .DB 0x86 ;SPACES .DB "SPACE",'S'+0X80 .DRW WHILE-8 SPACS: .DRW DOCOL .DRW ZERO .DRW MAX .DRW DDUP .DRW ZBRAN ;IF .DRW SPAX1-* .DRW ZERO .DRW XDO ;DO SPAX2: .DRW SPACE .DRW XLOOP ;LOOP ENDIF .DRW SPAX2-* SPAX1: .DRW SEMIS ; .DB 0x82 ; <# .DB "<",'#'+0X80 .DRW SPACS-9 BDIGS: .DRW DOCOL .DRW PAD .DRW HLD .DRW STORE .DRW SEMIS ; .DB 0x82 ; #> .DB "#",'>'+0X80 .DRW BDIGS-5 EDIGS: .DRW DOCOL .DRW DROP .DRW DROP .DRW HLD .DRW AT .DRW PAD .DRW OVER .DRW SUBB .DRW SEMIS ; .DB 0x84 ;SIGN .DB "SIG",'N'+0X80 .DRW EDIGS-5 SIGN: .DRW DOCOL .DRW ROT .DRW ZLESS .DRW ZBRAN ;IF .DRW SIGN1-* .DRW LIT .DRW 0x2D ; .DRW HOLD ;ENDIF SIGN1: .DRW SEMIS ; .DB 0x81 ; # .DB '#'+0X80 .DRW SIGN-7 DIG: .DRW DOCOL .DRW BASE .DRW AT .DRW MSMOD .DRW ROT .DRW LIT .DRW 9 .DRW OVER .DRW LESS .DRW ZBRAN ;IF .DRW DIG1-* .DRW LIT .DRW 7 .DRW PLUS ;ENDIF DIG1: .DRW LIT .DRW 0x30 .DRW PLUS .DRW HOLD .DRW SEMIS ; .DB 0x82 ; #S .DB "#",'S'+0X80 .DRW DIG-4 DIGS: .DRW DOCOL DIGS1: .DRW DIG ; BEGIN .DRW OVER .DRW OVER .DRW ORR .DRW ZEQU .DRW ZBRAN ; UNTIL .DRW DIGS1-* .DRW SEMIS ; .DB 0x83 ; D.R .DB "D.",'R'+0X80 .DRW DIGS-5 DDOTR: .DRW DOCOL .DRW TOR .DRW SWAP .DRW OVER .DRW DABS .DRW BDIGS .DRW DIGS .DRW SIGN .DRW EDIGS .DRW FROMR .DRW OVER .DRW SUBB .DRW SPACS .DRW TYPE .DRW SEMIS ; .DB 0x82 ; .R .DB ".",'R'+0X80 .DRW DDOTR-6 DOTR: .DRW DOCOL .DRW TOR .DRW STOD .DRW FROMR .DRW DDOTR .DRW SEMIS ; .DB 0x82 ;D. .DB "D",'.'+0X80 .DRW DOTR-5 DDOT: .DRW DOCOL .DRW ZERO .DRW DDOTR .DRW SPACE .DRW SEMIS ; .DB 0x81 ; . .DB '.'+0X80 .DRW DDOT-5 DOT: .DRW DOCOL .DRW STOD .DRW DDOT .DRW SEMIS ; .DB 0x81 ; ? .DB '?'+0X80 .DRW DOT-4 QUES: .DRW DOCOL .DRW AT .DRW DOT .DRW SEMIS ; .DB 0x82 ; U. .DB "U",'.'+0X80 .DRW QUES-4 UDOT: .DRW DOCOL .DRW ZERO .DRW DDOT .DRW SEMIS ; .DB 0x85 ; VLIST .DB "VLIS",'T'+0X80 .DRW UDOT-5 VLIST: .DRW DOCOL .DRW LIT .DRW 0x80 .DRW OUTT .DRW STORE .DRW CONT .DRW AT .DRW AT VLIS1: .DRW OUTT ;BEGIN .DRW AT .DRW CSLL .DRW GREAT .DRW ZBRAN ;IF .DRW VLIS2-* .DRW CR .DRW ZERO .DRW OUTT .DRW STORE ;ENDIF VLIS2: .DRW DUP .DRW IDDOT .DRW SPACE .DRW SPACE .DRW PFA .DRW LFA .DRW AT .DRW DUP .DRW ZEQU .DRW QTERM .DRW ORR .DRW ZBRAN ;UNTIL .DRW VLIS1-* .DRW DROP .DRW SEMIS ; ;----------- ; EXIT TO CP/M ; .DB 0X83 .DB "BY",'E'+0X80 .DRW VLIST-8 BYE: .DRW *+2 JP 0 ; .DB 0x84 ; LIST .DB "LIS",'T'+0X80 .DRW BYE-6 LIST: .DRW DOCOL,DECCX .DRW CR,DUP .DRW SCR,STORE .DRW PDOTQ .DB 6 .DB "SCR # " .DRW DOT .DRW LIT,0x10 .DRW ZERO,XDO LIST1: .DRW CR,IDO .DRW LIT,3 .DRW DOTR,SPACE .DRW IDO,SCR .DRW AT,DLINE .DRW QTERM ; ?TERMINAL .DRW ZBRAN,LIST2-*-2 ; IF .DRW LEAVE ;LEAVE LIST2: .DRW XLOOP,LIST1-*-2 ;ENDIF .DRW CR,SEMIS ; .DB 0x85 ;INDEX .DB "INDE",'X'+0X80 .DRW LIST-7 INDEX0: .DRW DOCOL .DRW LIT,FF .DRW EMIT,CR .DRW ONEP,SWAP .DRW XDO INDE1: .DRW CR,IDO .DRW LIT,3 .DRW DOTR,SPACE .DRW ZERO,IDO .DRW DLINE,QTERM .DRW ZBRAN,INDE2-*-2 .DRW LEAVE INDE2: .DRW XLOOP,INDE1-*-2 .DRW SEMIS ; .DB 0x85 ;TRIAD .DB "TRIA",'D'+0X80 .DRW INDEX0-8 TRIAD: .DRW DOCOL .DRW LIT,FF .DRW EMIT .DRW LIT,3 .DRW SLASH .DRW LIT,3 .DRW STAR .DRW LIT,3 .DRW OVER,PLUS .DRW SWAP,XDO TRIA1: .DRW CR,IDO .DRW LIST .DRW QTERM ; ?TERMINAL .DRW ZBRAN,TRIA2-*-2 ; IF .DRW LEAVE ;LEAVE TRIA2: .DRW XLOOP,TRIA1-*-2 ;ENDIF .DRW CR .DRW LIT,15 .DRW MESS,CR .DRW SEMIS ; .DB 0x84 ;.CPU .DB ".CP",'U'+0X80 .DRW TRIAD-8 DOTCPU: .DRW DOCOL .DRW BASE,AT .DRW LIT,36 .DRW BASE,STORE .DRW LIT,0x22 .DRW PORIG,TAT .DRW DDOT .DRW BASE,STORE .DRW SEMIS ; ;========================= ; .S (DOT S) DISP STACK (NON DESTRUCTIVE!) ; .DB 0X84 ;PICK .DB "PIC",'K'+0X80 .DRW DOTCPU-7 PICK: .DRW *+2 EXX ; SAVE REGS POP DE ; GET REG # OFF STACK LD A,E RLA LD E,A ; SHIFT TO MUL BY 2 ; LD HL,2 ADD HL,SP ; (SP) --> (HL) ; ADD HL,DE ; MAKES HL = ACTUAL STACK ADDRESS FOR DATA DEC HL LD B,(HL) DEC HL LD C,(HL) PUSH BC EXX JP NEXT ;============================================== ; ; EDITOR FUNCTIONS ; ; .DB 0X84 .DB "TEX",'T'+0X80 .DRW PICK-7 TEXT: .DRW DOCOL .DRW HERE .DRW CSLL .DRW ONEP .DRW BLANK .DRW WORD .DRW HERE .DRW PAD .DRW CSLL .DRW ONEP .DRW CMOVE .DRW SEMIS ; .DB 0X84 ; LINE .DB "LIN",'E'+0X80 .DRW TEXT-7 LINE: .DRW DOCOL .DRW DUP .DRW LIT .DRW 0XFFF0 .DRW ANDD .DRW LIT .DRW 0X17 .DRW QERR .DRW SCR .DRW AT .DRW PLINE .DRW DROP .DRW SEMIS ; .DB 0X85 ; -MOVE .DB "-MOV",'E'+0X80 .DRW LINE-7 MMOVE: .DRW DOCOL .DRW LINE .DRW CSLL .DRW CMOVE .DRW UPDAT .DRW SEMIS ; .DB 0X81 ; P (PUT) .DB 'P'+0X80 .DRW MMOVE-8 PUT: .DRW DOCOL .DRW LIT .DRW 0X0001 .DRW TEXT .DRW PAD .DRW ONEP .DRW SWAP .DRW MMOVE .DRW SEMIS ; .DB 0X86 ; CLEAR ( CLEAR A SCREEN) .DB "FORMA",'T'+0X80 .DRW PUT-4 FORMAT: .DRW DOCOL .DRW LIT .DRW 0XD7F0 .DRW LIT .DRW 0X2800 .DRW LIT .DRW 0X20 .DRW FILL .DRW SEMIS ; .DB 0x84 ; TASK .DB "TAS",'K'+0X80 .DRW FORMAT-9 TASK: .DRW DOCOL .DRW SEMIS ; INITDP: NOP ; .END