TITL ALS-8 SOFTWARE SYSTEM * * * ALS-8 SOFTWARE SYSTEM * * * COPYRIGHT 1975-1981 * * PUL ___UL__AUL GREENFIELD * 2597 FLAGSTONE DRIVE * SAN JOSE, CA. 95132 * * ALL RIGHTS RESERVED * * SET UP PROGRAM AND DATA ORIGINS PORG EQU 0E000H DORG EQU 0D000H * * THIS ROUTINE INITIALIZES THE FILE AREA FOR SUBSEQUENT PROCESSING * ORG PORG NOP FILL BYTE FOR AUTO START UP ASTRT JMP INIDR INITIALIZE DRIVERS ONLY * * DELETE COMMAND * CDLT CALL CNTR1 JMP SYMD+3 * * * THIS ROUTINE FETCHES DIGITS FROM THE BUFFER ADDRESSED BY * REGISTERS B,C AND CONVERTS THE ASCII DECIMAL DIGITS INTO * BINARY. UP TO A 16 BIT VALUE CAN BE CONVERTED. THE SCAN * STOPS WHEN A BINARY ZERO IS FOUND IN THE BUFFER * ADEC LXI H,0 GET A 16 BIT ZERO ADE1 LDAX B FETCH ASCII DIGIT ORA A SET ZERO FLAG RZ RETURN IF FINISHED MOV D,H SAVE CURRENT VALUE MOV E,L SAVE CURRENT VALUE DAD H TIMES TWO DAD H TIMES TWO DAD D ADD IN ORIGINAL VALUE DAD H TIMES TWO SUI 48 ASCII BIAS CPI 10 CHECK FOR LEGAL VALUE CMC RC RETURN IF ERROR MOV E,A MVI D,0 DAD D ADD IN NEXT DIGIT INX B INCREMENT POINTER JMP ADE1 * INITA LXI H,FILE0 XRA A MOV C,A INIT2 MOV M,A DCR C INX H JNZ INIT2 STA SYSYM SYSTEM SYMBOL TERMINATOR STA SMODE SET MODE TO HEXADECIMAL STA CUCOM INITIALIZE CUSTOM COMMAND TABLE JMP 0E000H * INITIAL SYSTEM I/O DRIVERS INIDR MVI C,CRLF-IODATA LXI SP,AREA+18 LXI D,IODATA LXI H,SYSIO INIT3 LDAX D MOV M,A INX D INX H DCR C JNZ INIT3 LXI H,SYMT SHLD SYMADD INITIALIZE SYMBOL TABLE ADDRESS MVI A,IBUF81-IBUF1P STA TERMW XRA A STA SMODE STA CHRR EORMS LXI H,SYSIN CALL IODR+3 CALL CRLF LXI H,MESS0 CALL SCRN JMP EORST * * * THIS IS THE STARTING POINT OF THE SELF CONTAINED SYSTEM ONCE * THE SYSTEM HAS BEEN INITIALIZED. COMMANDS ARE READ FROM THE USER * EXECUTED AND CONTROL RETURNS BACK TO THIS POINT TO READ ANOTHER * USER COMMAND. * NEW LXI H,0 SHLD SWCH1 CROSS EM OUT SYS8 LXI SP,AREA+18 CALL READ READ INPUT LINE INX H MOV A,M FETCH FIRST CHARACTER CPI '9'+1 COMMAND OR LINE NUMBER JC LINE JUMP IF LINE FOR FILE CALL VALC MVI B,4 LXI D,CTAB COMMAND TABLE ADDRESS CALL COMS CHECK FIRST TWO COMMANDS PUSH H JZ SYS81 POP H INX D CALL COMS CHECK REMAINING COMMANDS JZ SYS80 LXI D,CUCOM CALL CCOMS JNZ WHAT SYS80 PUSH H CALL ABCON GET BINARY VALUES JC WHAT SYS81 LDA IOSWC GET IO SWITCH ORA A CNZ IODR GET CURRENT DRIVERS POP H CALL SYSGO EOR LDA SWCH1 GET OUTGOING SWITCH ORA A JNZ EORMS GIVE"M THE MESSAGE LDA SWCH2 GET IN SWITCH ORA A DRIVER HOLD REQ JNZ EORNS LXI H,SYSIN CALL IODR+3 BACK TO SYSIO EORST CALL CRLF JMP NEW EORNS CALL CRLF JMP SYS8 MESS0 DB 'R','E','A','D','Y',13 SYSGO PCHL * * * THIS ROUTINE IS USED FOR THE ALLOCATION OF I/O DRIVERS * IFILE MVI C,MAXFIL LXI H,IOFLE LDA FBUF ORA A FILE NAME JZ IODI1 XCHG CALL FSEA+3 CHECK FILE JNZ IOSTO * NO ENTRY FOUND, CHECK FOR PARAMETERS CALL VCHK * CHECK FOR ROOM IN TABLE LDA FEF ORA A JZ FMES2 TABLE FULL LHLD FREAD GET FREE SPACE * STORE ENTRY IN I/O TABLE IOSTO SHLD FREAD CALL FLSTO STORE ENTRY * CHECK FOR I/O TYPE LXI H,NMLEN DAD D POINT TO ADDRESSES LDA ABUF ANY PARAMETERS ORA A JNZ IODEF * MAKE THIS DRIVER CURRENT SHLD OPRD SAVE ADDRESS INR A STA IOSWC SET SWITCH FLAG JMP IODIS IODEF XCHG LHLD BBUF GET INPUT DRIVER ADDRESS MOV A,L ORA H LDA ABUF+7 GET 2ND PARAMETER JNZ IODE2 * CHECK FOR 2ND PARAMETER, 1ST PARAMETER IS ZERO ORA A JNZ IODE1 * DELETE ENTRY STAX D INX D STAX D BITBK RET BIT BUCKET ADDRESS IODE1 LHLD SYSIN GET SYSTEM DEVICE IODE2 XCHG MOV M,E SET INPUT DRIVER ADDRESS INX H MOV M,D INX H * CHECK IF 2ND PARAMETER PRESENT XCHG ORA A LXI H,BITBK RETURN IS BIT BUCKET JZ IODE3 LHLD BBUF+2 GET 2ND ADDRESS MOV A,L ORA H ZERO JNZ IODE3 LHLD SYSOT GET SYSTEM DRIVER IODE3 XCHG MOV M,E STORE OUTPUT DRIVER ADDRESS INX H MOV M,D * DISPLAY I/O DRIVER INFORMATION IODIS MVI C,1 LHLD FREAD IODI1 CALL FOUL+3 JMP EORNS * * THIS ROUTINES SETS THE CURRENT DRIVER ADDRESSES * IODR LHLD OPRD DRIVER ADDRESS CALL LODM LXI H,IN8 MVI M,0C3H JMP INSTRUCTION INX H MOV M,B INX H MOV M,C INX H MVI M,0C3H INX H MOV M,D INX H MOV M,E XRA A STA IOSWC CLEAR IO SWITCH RET * * * THIS ROUTINE READS IN A LINE FROM THE TTY AND PLACES IT IN AN * INPUT BUFFER * THE FOLLOWING ARE SPECIAL CHARACTERS * CR - TERMINATES READ ROUTINE * LF - NOT RECOGNIZED BY ROUTINE * CONTROL X DELETE CURRENT LINE * DEL - DELETE CHARACTER * ALL DISPLAYABLE CHARACTERS BETWEEN BLANK-Z AND THE ABOVE * ARE RECOGNIZED BY THE READ ROUTINE ALL OTHER ARE SKIPPED * OVER. THE ROUTINE WILL NOT ACCEPT MORE CHARACTERS THAN THE INPUT * BUFFER WILL HOLD * READ LXI H,IBUF SET INPUT BUFFER ADDRESS SHLD ADDS SAVE ADDRESS MVI E,2 INITIALIZE CHARACTER COUNT NEXT CALL IN8 READ A LINE CPI 24 CHECK FOR CONTROL X JNZ CR CALL CRLF OUTPUT A CRLF JMP READ CR CPI ASCR GET A ASCII CR JNZ DEL MOV A,L CPI IBUF-IBUFP CHECK FOR FIRST CHARACTER JZ READ MVI M,ASCR PLACE CR AT END OF LINE INX H MVI M,1 PLACE EOF INDICATOR IN LINE INX H LDA TERMW CALL CLER CLEAR REMAINING BUFFER LXI H,IBUF-1 MOV A,E GET LINE COUNT STA CCNT RET DEL CPI 127 CHECK FOR DELETE CHARACTER JNZ CHAR MVI A,IBUF-IBUFP CMP L IS THIS 1ST CHARACTER JZ NEXT DCX H DECREMENT POINTER DCR E DECREMENT COUNT BSPA MVI B,5FH CALL OUT8 JMP NEXT CHAR CALL OUT8 CPI ' ' JC NEXT MOV M,A LDA TERMW CMP L CHECK FOR END OF LINE JZ BSPA INX H INR E INCREMENT CHARACTER COUNT JMP NEXT * * * * THIS ROUTINE IS USED TO BLANK OUT A PORTION OF MEMORY * CLER CMP L RZ MVI M,' ' PLACE BLANK IN MEMORY INX H JMP CLER * * * THIS SUBROUTINE IS USED TO READ A BYTE OF DATA FROM THE UART * IODATA DB 'S','Y','S','I','O' DW INDR DW OUTDR INP8 CALL STAT GET STATUS JZ INDR IN UDAI READ DATA ANI 127 STRIP OFF PARITY MOV B,A RET * * STAT8 IN USTA GET UART STATUS ANI 40H RET * * * THIS ROUTINE OUTPUTS A BYTE OF DATA TO THE UART * OUTP8 CALL STAT JZ OUTDR+15 NO CHR RECEIVED IN 1 GET CHR ANI 127 CPI ESC IS IT AN ESC JZ EORMS WHOAAAAAA IN USTA READ UART STATUS ANI 80H JZ OUTDR+15 STILL FULL OK MOV A,B OUT UDAO TRANSMIT DATA RET * * * CALL ROUTINE TO ENTER DATA INTO MEMORY * AND CHECK FOR ERROR ON RETURN * * THIS ROUTINE IS USED TO ENTER DATA VALUES INTO MEMORY. * EACH VALUE IS ONE BYTE AND IS WRITTEN IN HEXADECIMAL * VALUES GREATER THAN 255 WILL CAUSE CARRY TO BE SET * AND RETURN MADE TO CALLING PROGRAM * ENTR CALL VCHK CHECDK FOR PARAMETERS CALL ENTS JC WHAT * * THIS ROUTINE WILL OUTPUT A CARRIAGE RETURN AND LINE FEED * FOLLOWED BY TWO DELETE CHARACTERS WHICH PROVIDE TIME FOR * A PRINT HEAD TO RETURN * CRLF MVI B,13 CR CALL OUT8 LF MVI B,10 LF CALL OUT8 MVI B,127 CALL OUT8 JMP OUT8 * * * * * * THIS ROUTINE CHECKS IF A BASE CHARACTER STRING IS EQUAL TO * ANY OF THE STRINGS CONTAINED IN A TABLE POINTED TO BY * D,E. THE LENGTH OF THE STRINGS ARE )256. ON RETURN IF THE * ZERO FLAG IS SET A MATCH WAS FOUND, IF THE ZERO FLAG IS CLEAR (0) * NO MATCH WAS FOUND. REGISTER B CONTAINS THE NUMBER OF * STRINGS TO COMPARE * THE TABLE CONSISTS OF ANY NUMBER OF CHAR. WITH 2 BYTES CONTAINING * VALUES ASSOCIATED WITH IT. IT CAN BE USED TO SEARCH THROUGH * A COMMAND TABLE OR SYMBOL TABLE. * ON RETURN D,E POINT TO THE LAST BYTE ASSOCIATED WITH THE * CHARACTER STRING IF A MATCH WAS FOUND. IF NO MATCH WAS * FOUND D,E POINT TO THE NEXT LOCATION AFTER THE END OF THE TABLE. * COMS LHLD ADDS FETCH COMPARE ADDRESS MOV C,B LDAX D ORA A JZ CONS1 CALL SEAR COMPARE STRINGS LDAX D FETCH VALUE MOV H,A INX D LDAX D FETCH VALUE MOV L,A RZ INX D SET TO NEXT STRING JMP COMS CONS1 INR A RET * CCOMS LHLD ADDS MOV C,B LDAX D ORA A JZ CONS1 CALL SEAR INX D LDAX D MOV H,A INX D LDAX D MOV L,A RZ INX D JMP CCOMS * * * THIS ROUTINE CHECKS IF TWO CHARACTER STRINGS CONTAINED IN MEMORY * ARE EQUAL. THE STRINGS ARE POINTED TO BY H,L AND D,E. * ON RETURN THE ZERO FLAG SET INDICATES A MATCH. REGISTER C * INDICATES THE LENGTH OF THE STRINGS. ON RETURN THE POINTERS * POINT TO THE NEXT ADDRESS AFTER THE CHARACTER STRINGS * SEAR LDAX D FETCH CHARACTER CMP M COMPARE CHARACTERS JNZ INCA INX H INX D DCR C DECREMENT CHARACTER COUNT JNZ SEAR RET INCA INX D DCR C JNZ INCA INR C CLEAR ZERO FLAG RET * * * THIS ROUTINE ZEROS OUT A BUFFER IN MEMORY WHICH IS THEN * USED BY OTHER SCANNING ROUTINES * ZBUF XRA A GET A ZERO LXI D,ABUF+16 BUFFER ADDRESS MVI B,16 ZBU1 DCX D DECREMENT ADDRESS STAX D ZERO BUFFER DCR B JNZ ZBU1 RET * * THIS ROUTINE JUMPS TO A LOCATION IN MEMORY GIVEN BY THE * INPUT COMMAND AND BEGINS EXECUTION OF PROGRAM THERE. * EXEC CALL VCHK CHECK FOR PARAMETER CALL CRLF LHLD BBUF FETCH ADDRESS PCHL JUMP TO PROGRAM * * * THIS ROUTINE EXTRACTS THE VALUES ASSOCIATED WITH A COMMAND * FROM THE INPUT STREAM AND PLACES THEM IN THE ASCII BUFFER (ABUF). * IT ALSO CALLS A ROUTINE TO CONVERT THE ASCII HEXADECIMAL TO BINARY * AND STORES THEM IN THE BINARY BUFFER (BBUF) * ON RETURN CARRY SET INDICATES AN ERROR IN INPUT PARAMETERS * ETRA LXI H,0 GET A ZERO SHLD BBUF+2 ZERO VALUE SHLD FBUF SET NO FILE NAME CALL ZBUF ZERO BUFFER LXI H,IBUF-1 INPUT BUFFER ADDRESS VAL1 INX H MOV A,M FETCH INPUT CHARACTER CPI ' ' LOOK FOR FIRST BLANK CMC RNC RETURN IF CARRY JNZ VAL1 JUMP IF NO BLANK SHLD PNTR SAVE POINTER CALL SBLK SCAN TO FIRST PARAMETER CMC RNC RETURN IF CR CPI '/' JNZ VAL5 NO FILE NAME LXI D,FBUF NAME FOLLOWS PUT IN FBUF MVI C,NMLEN VAL2 INX H MOV A,M CPI '/' JZ VAL3 DCR C JM WHAT STAX D STORE FILE NAME INX D JMP VAL2 VAL3 MVI A,' ' GET AN ASCII SPACE VAL4 DCR C JM DONE STAX D FILL IN WITH SPACES INX D JMP VAL4 DONE CALL SBL2 CMC RNC VAL5 LXI D,ABUF SET BUFFER ADDRESS CALL GETP GET PARAMETER RC CALL SBLK SCAN TO NEXT PARAMETER CMC RNC * GETP CALL ALPS PUT IN BUFFER MOV A,E SUB B FORM STARTING ADDRESS MOV L,A MOV A,D SBI 0 MOV H,A LDA SMODE GET SYSTEM MODE ADD A ADI 4 CMP B NUMBER TOO LARGE? COPY ALS82.1/1 COPY ALS83.1/1 COPY ALS84.1/1 COPY ALS85.1/1 COPY ALS86.1/1 COPY ALS87.1/1 COPY ALS88.1/1 COPY ALS89.1/1