; ;IMS PROGRAM ;WRITTEN IN AUGUST, 1983 ;UPDATED TO MAKE PROGRAM VERSION SENSITIVE OCT., 1983 ; TIB EQU 80H ;TERMINAL INPUT BUFFER WARMBT EQU 01H ;LOC. WHERE WARM BOOT ADDR IS OFSET EQU 46H ;OFFSET VALUE TO TABLE WHICH CONTAINS RAM AREA ADDR BDOS EQU 05H CR EQU 0DH LF EQU 0AH TAB EQU 09H CRWH EQU 8DH PRINT EQU 09H REVOFF EQU 03CH IMS EQU 040H ;IMS ACTIVE FLAG IMSBUF EQU 080H ;IMS BUFFER NOT EMPTY FLAG ; .Z80 CSEG JP MAIN ;JUMP TO THE START OF MAIN PROGRAM ; HEADER: DB CR,LF,' IN-MEMORY-SUBMIT PROGRAM',1AH ; MAIN: LD A,(TIB) ;GET THE LENGTH OF USER STRING CP 2 JP C,ERR1 ;IF LENGTH < 2, THEN PRINT ERROR DEC A LD C,A LD HL,TIB+2 LD A,(HL) LD E,A ;BYTE TO BE INTERPRETED AS CR INC HL LD A,(HL) LD D,A ;BYTE TO BE INTERPRETED AS CRWH INC HL ;START OF USER STRING LOOP: LD A,(HL) CP D ; CRWH BYTE ENTERED ? JR NZ,LOOP1 LD (HL),CRWH ;THEN REPLACE THAT WITH 8DHEX JP LOOP2 LOOP1: CP E ; CR BYTE ENTERED ? JR NZ,LOOP2 LD (HL),CR ;IF YES, REPLACE THAT WITH CR LOOP2: INC HL ;PICK UP NEXT CHAR DEC C ;DECREMENT COUNTER JR NZ,LOOP LD A,(WARMBT+1) ;PICK UP HOB OF WARM BOOT ADDR LD H,A LD L,OFSET LD A,(HL) INC HL LD H,(HL) LD L,A ;HL=ADDR OF RAM AREA LD A,0FFH CALL FIND ;FIND FREE SPACE LD A,(TIB) DEC A DEC A DEC A LD B,A ;GET THE LENGTH OF USER STRING LD C,A ;SAVE IT IN B AND C DEC A CP E ;DOES THE STRING FIT INTO FREE SPACE ? JR C,CONT ;YES,THEN CONTINUE ON LD A,D CP 1 JP C,ERR2 ;OTHERWISE ISSUE AN ERROR CONT: DEC DE DEC B ;SUBTRACT STRING LENGTH FROM FREE SPACE LENGTH JR NZ,CONT DEC HL LD (HL),E INC HL LD (HL),D ;STORE NEW LENGTH INC HL ADD HL,DE ;ADJUST POINTERS FOR FREE SPACE AND IMS BUFFER BLOCKS LD A,0FDH LD (HL),A ;PLUG IMS BUFFER MARKER INC HL LD (HL),C INC HL LD (HL),00H ;PLUG THE LENGTH OF STRING INC HL LD E,L ;IMS BUFFER ADDR IN DE LD D,H LD HL,TIB+4 ;ADDR OF TIB LD B,0 ;BC=LENGTH OF STRING LDIR ;TRANSFER USER STRING TO IMS BUFFER LD HL,(WARMBT) LD DE,REVOFF ADD HL,DE LD A,(HL) ;GET REVISION NO. OF BIOS CP 80H ;CHECK FOR NON-IMS SYSTEM JP NC,ERR3 JP Z,ERR3 CP 40H ;CHECK FOR MD11 SYSTEM JP NC,WRTFLAG JP Z,WRTFLAG LD A,0BH LD (DFLAG),A ;DISK FLAG OFFSET FOR MD3 CONT1: LD A,(WARMBT+1) LD H,A LD L,42H ;RAMDATY POINTER STORED AT BIOS+42H LD A,(HL) INC HL LD H,(HL) LD L,A ;HL=RAMDATY ADDRESS LD A,(DFLAG) LD C,A LD B,0 ADD HL,BC LD A,(HL) ;GET DISK FLAG OR IMS+IMSBUF ;SET UP IMS FLAG (IMS ACTIVE & IMS BUFFER NOT EMPTY) LD (HL),A ;STORE THE FLAG RET ;EXIT TO CCP ; FIND: CP (HL) ;SEE IF HEADER CODE MATCHES INC HL ;INCREMENT POINTER LD E,(HL) ;GET OFFSET TO NEXT BLOCK INC HL LD D,(HL) RET Z ;RETURN IF BLOCK FOUND INC HL ;SET POINTER TO NEXT BLOCK ADD HL,DE JR FIND ;KEEP LOOKING ; WRTFLAG:LD A,12H LD (DFLAG),A ;DISK FLAG OFFSET FOR MD11 JP CONT1 ; ERR1: LD C,PRINT LD DE,MSG1 CALL BDOS RET ERR2: LD C,PRINT LD DE,MSG2 CALL BDOS RET ; ERR3: LD C,PRINT LD DE,MSG3 CALL BDOS RET ; ;**** BUFFER AREA ***** DFLAG: DS 1 ; MSG1: DB CR,LF,TAB,'IMS:ERROR, ILLEGAL INPUT -NO STRING SPECIFIED$' MSG2: DB CR,LF,TAB,'IMS:ERROR, INPUT STRING TOO LONG FOR IMS BUFFER$' MSG3: DB CR,LF,TAB,'IMS:ERROR, IMS LOGIC NOT IMPLEMENTED ON THIS SYSTEM$' ; END MAIN