; ; ;EQUATE TABLE ; ;IN-OUT FOR SNOOPY DOS ;Jan. 30, 1982 ; PRGORG: EQU 0E000H ;PROGRAM ORIGIN ; RAM EQU 0DFFFH ; IMSAI EQU 1 ;1 Indicates active INTER EQU 0 ;0 Indicates not active TV.950 EQU 0 ;Televideo 950 monitor MX.100 EQU 0 ;Epson Mx 100 printer ; IF IMSAI ; ;Console output equates ; Sc.Stat EQU 50H ;Con. out status port SC.AND EQU 80H ;Bit Mask SC.OUT EQU 80H ;Value when ready C.Out EQU 51H ;Console output port ; ;Keyboard number 1 ; I.And1 EQU 8 ;Bit mask I.Cp.1 EQU 8 ;Value when ready I.In.1 EQU 1 ;Keyboard port number I.Sin1 EQU 3 ;Status port ; ;Keyboard number 2 ; I.And2 EQU 8 ;Bit mask I.Cp.2 EQU 8 ;Value when ready I.In.2 EQU 1 ;Keyboard port number I.Sin2 EQU 3 ;Status port number ; SW.Byte EQU 94H ;Switching mode char. ; ;Line printer 1 equates ; Omask1 EQU 0C0H ;Bit mask Cmask1 EQU 80H ;Value when ready Out.1 EQU 0 ;Output port Sport1 EQU 3 ;Status port ; ;Line pririnter 2 equates ; Omask2 EQU 0C0H ;Bit mask Cmask2 EQU 80H ;Value when ready Out.2 EQU 0 ;Output port Sport2 EQU 3 ;Status port ; ENDIF ; IF INTER ; ;Console output equates ; Sc.Stat EQU 50H ;Con Out status port SC.AND EQU 80H ;Bit mask SC.OUT EQU 80H ;Value when ready C.OUT EQU 51H ;Console output port ; ;Keyboard number 1 ; I.And1 EQU 40H ;Bit mask I.Cp.1 EQU 40H ;Value when ready I.In.1 EQU 51H ;Keyboard port number I.Sin1 EQU 50H ;Status port ; ;Keyboard number 2 ; I.And2 EQU 40H ;Bit mask I.Cp.2 EQU 40H ;Value when ready I.In.2 EQU 51H ;Keyboard port number I.Sin2 Equ 50H ;Status port ; SW.Byte EQU 1EH ;Character for switching ;Mode ; ;Line printer 1 equates ; Omask1 EQU 84H ;Bit mask Cmask1 EQU 80H ;Value when ready Out.1 EQU 21H ;Output port Sport1 EQU 20H ;Status port ; ;Line printer 2 equates ; Omask2 Equ 84H ;Bit mask Cmask2 EQU 80H ;Value when ready Out.2 EQU 21H ;Output port Sport2 EQU 20H ;Status port ; ENDIF ; STACK2: EQU RAM-0FH SAVESP: EQU STACK2 PGBUF: EQU RAM-0DH BRKMSG: EQU RAM-0AH SPEED: EQU RAM-05H InpBuf EQU RAM-04H IOBYT: EQU RAM-02H ; ;LINKAGES TO MAIN PROGRAM ; INIT1: EQU PRGORG+002H ; ORG PRGORG+1C00H ; ;BASIC IN OUT ROUTINES ; OUTLIN: JR OTLINE ;OUTPUT FROM LIST OUTPUT: JR OTPUT ;MAIN OUTPUT INPUT: JP IPUT ;JUP INPUT STATUS: JP STATU ;JUMP TO STATUS LSTAT: JP LSTAT0 ;LIST STATUS IOINI JP Io.Init ;Clear the screen ; ;OUTPUTING SWITCHING ROUTINES ; OUTVDM LD (SAVESP),SP;SAVE FOREIGN STACK LD SP,STACK2 PUSH HL LD L,0 ;SET FOR VDM JR OUTPT2 ; OTLINE: LD (SAVESP),SP LD SP,STACK2 PUSH HL LD L,5 JR OUTPT2 ; OTPUT: LD (SAVESP),SP;SAVE STACK LD SP,STACK2 PUSH HL LD HL,(IOBYT);GET OUT BYTE IN HL ; OUTPT2: PUSH BC LD B,A ;GET CHAR IN B REG PUSH DE PUSH AF BIT 0,L ;TEST FOR VDM PUSH HL ;SAVE FROM VDM TIMER CALL Z,VID POP HL ;RETRIEVE IOBYT BIT 2,L ;TEST FOR LIST CALL NZ,LIST ; ;Console end of line timer ; LD A,(SPEED) ;Get the speed facto OR A ;Test for a zero JR Z,L.End ;No delay ; ;End of a line timer ; LD B,A ;Save constant just ;in case of a Line feed POP AF ;Get outputed character PUSH AF ;Save it again CP 0AH ;Test for a line feed JR NZ,L.End ;No Delay ; ;Delay routine ; LD DE,0FFFFH ;Delay constant #1 ; Loop.1 LD HL,20FFH ;Delay constant #2 ; Loop.2 ADD HL,DE JR C,Loop.2 ; DJNZ Loop.1 ;Loop till B=0 ; L.END POP AF POP DE POP BC ; OUTPT3 POP HL LD SP,(SAVESP);GET COLLERS STACK RET ; ;Force upper case letters to lower case letters ; FORCE CP 61H ;Less than [ a ] RET C ;Yes CP 7BH ;Greater than [ z ] RET NC ;Yes SUB 20H ;Convert to Upper case RET ; ;MASTER SWITCHING ; MSTSWC: CALL SET LD A,00H ;Destroy switching Accum. OR A ;Set the zero flag RET ;No data ; SET CALL Ins ;Get the data ? JR Z,SET ;No data yeat LD A,B ;Move data to the Accum. LD HL,IOBYT ;Point to In-Out byte CALL FORCE ;Change Uppers to lowers CP 0EH ;Test for a screen clear JP Z,VID ;CLEAR SCREEN CP 1BH ;? ESCAPE JP Z,INIT1 CP 'A' JR Z,CTRL.A ;Reset In/Out byte CP 'B' JR Z,CTRL.B ;Setup list # 2 CP 'C' JR Z,CTRL.C ;Setup List # 1 CP 'D' JR Z,CTRL.D ;Transfer contro to ;List # 1 CP 'E' JR Z,CTRL.E ;Turn on the Skew CP 'F' JR Z,CTRL.F ;Turn off the Skew CP 'G' JR Z,CTRL.G ;TURN OFF PAGE MODE CP 'H' JR Z,CTRL.H ;TURN ONE PAGE MODE CP 'P' JR Z,CTRL.P ;Turn on the list CP 'Q' ;RESET PAGE LINE ;COUNTER? JP Z,Page CP 'V' JR Z,CTRL.V ;Turn the terminal on CP 'X' JR Z,CTRL.X ;Force uppers to lowers CP 'U' JR Z,CTRL.U ;No force of uppers ;to lower case letters ; CP 'M' ;Check for two form feeds JR Z,CTRL.M CP 'L' ;Check for a form feed JR Z,CTRL.L CP 'R' ;Check for compressed print ;off JR Z,CTRL.R CP 'S' ;Test to turn on compressed ;Print JR Z,CTRL.S CP 'Y' ;Test to disable paper ;Detect JR Z,CTRL.Y CP 'Z' ;Test to enable paper ;Detect JR Z,CTRL.Z ; ;Numbers 1-9 change speed of the display rate ;of the Terminal. ; CP 31H ;Test if too small RET C ;Was too small CP 3AH ;Test if too large RET NC ;Was too large SUB 31H ;Convert to delay factors LD (SPEED),A ;STORE RET ; ;Reset In/Out byte to initial value. The terminal ;is used to display the data and its key board ;is used to get the inputs ; CTRL.A LD (HL),0 RET ; ;List # 2 is active when there is a list command ; CTRL.B SET 3,(HL) ;Setup for List # 2 RET ; ;List # 1 is active when there is a list command ; CTRL.C RES 3,(HL) ;List #1 active on List RET ; ;Transfers control of the computer to list # 2. ;The terminal and it's key board are not active ; CTRL.D SET 0,(HL) ;Turn monitor video off SET 1,(HL) ;Switch key board inputs ;to List # 2 SET 3,(HL) ;List # 2 active on ;a list command SET 2,(HL) ;Turn on the list device RET ; ;Disks are read or written in Skewed mode ; CTRL.E RES 7,(HL) ;Skew is on RET ; ;Disks are read or written in unskewed mode ; CTRL.F SET 7,(HL) ;Setup for Unskew RET ; ;Turn off 16 line page mode ; CTRL.G SET 5,(HL) RET ; ;Turn on 16 line page mode CTRL.H RES 5,(HL) RET ; ;Turn current assigned list device on with ;terminal display active ; CTRL.P SET 2,(HL) ;Turn list device on RET ; ;Turn list off and display from the terminal ; CTRL.V RES 0,(HL) ;Display from the ;Terminal RES 1,(HL) ;Trun terminal key board ;on RES 2,(HL) ;Turn off the selected ;device RET ; ;Convert upper case letters to lower case letters ; CTRL.X SET 6,(HL) ;Force Upper to Lower RET ; ;Turn off the forcing of Upper case letters ;to Lower case letters ; CTRL.U RES 6,(HL) ;Turn off force RET ; CTRL.M LD B,0CH ;Token for a form feed CALL List.1 ;Output a form feed CTRL.L LD B,0CH ;Token for a from feed JP List.1 ;Output the form feed ; CTRL.R LD B,18 ;Token to turn off the ;compressed print Ctrl.$ JP List.2 ;Do it ; CTRL.S LD B,15 ;Token to turn the ;Compressed print JR Ctrl.$ ;Do it ; CTRL.Z LD B,1BH ;Escape Char. CALL List.2 LD B,'9' ;Token to turn paper ;detect on JR Ctrl.$ ; CTRL.Y LD B,1BH ;Escape char CALL List.2 LD B,'8' ;Token to turn off paper ;detect JR Ctrl.$ ; ;Setup paganation ; Page LD HL,0A38H ;56 lines per page LD (PGBUF),HL ;Store the value LD A,L ;Move lines per page LD (PGBUF+2),A ;Store the value RET ; ; ;VIDEO DISPLAY DRIVER ; VID LD A,B CP 0EH ;Check for CTRL n JR Z,CLEAR ;Clear the screen CP 07FH ;Test for delete JR Z,BACKUP CP 08H ;Test for backspace JR Z,BACKUP ; V.OUT IN A,Sc.Stat ;Get stats AND SC.AND ;Strip unwanted bits CP SC.Out ;Test if Ready JR NZ,V.Out ;Wait till ready ; LD A,B ;Get outputed Char. OUT C.Out,A ;Output the char. RET ; CLEAR PUSH BC LD B,1BH CALL V.OUT LD B,2AH CALL V.OUT POP BC RET ; BACKUP PUSH BC LD B,08H CALL V.OUT LD B,20H CALL V.OUT LD B,08H CALL V.OUT POP BC RET ; ;Main input routine. Inputs from buffer or from the ;the keyboard ; IPUT LD (SAVESP),SP ;Save callers stack ;pointer LD SP,STACK2 ;Get a new stack PUSH HL PUSH DE PUSH BC ; Iput.2 LD A,(InpBuf) ;Get byte in buffer OR A ;Test for data JR NZ,Iput.3 ;There was data CALL Input4 ;Get the byte JR Z,Iput.2 ;No Data yet LD A,(InpBuf) ;Move the input byte to ;The accumulator ; Iput.3 AND 7FH ;Strip of the 7 Bit LD HL,InpBuf ;Point to the buffer LD (HL),0 ;Zero the buffer JR Input3 ;Retreive callers stack ;and return to caller ; ;Main status and inputting routines ; STATU LD (SAVESP),SP ;Save callers stack ;pointer LD SP,STACK2 ;Get a new stack PUSH HL PUSH DE PUSH BC LD A,(InpBuf) ;Get Buffer in Accum. OR A ;Test if empty JR Z,Input2 ;Check for data LD A,0FFH ;Flag data exists Jr Input3 ;Exit the routine ; Input2 CALL Input4 ;Get the info ; Input3 POP BC POP DE POP HL LD SP,(SAVESP) ;Get callers stack ;pointer RET ;Return to caller ; Input4 CALL Ins ;Get Byte and flags RET Z ;Know keypress ; LD A,B ;Move the byte to Accum. BIT 7,A ;Test if 7 bit high JR Z,INPUT5 ;Not a 80H input ; IF IMSAI ; CP 88H ;TEST FOR KEY F1 JR NZ,X1 ;NOT F1 LD A,1AH ;MAKE CTRL Z ; X1 CP 0A8H ;TEST FOR KEK F2 JR NZ,X2 ;NOT F1 LD A,01h ;Make ^A ; X2 CP 8AH ;TEST FOR KEY F3 JR NZ,X3 ;NOT F3 LD A,13H ;Make ^S ; X3 CP 0AAH ;TEST FOR KEY F4 JR NZ,X4 ;NOT F4 LD A,04H ;MAKE ^D ; X4 CP 8CH ;TEST FOR KEY F5 JR NZ,X5 ;NOT F5 LD A,06H ;MAKE CTRL F ; X5 CP 0ACH ;TEST FOR KEY F6 JR NZ,X6 ;NOT F6 LD A,02H ;Make ^B ; X6 CP 8EH ;TEST FOR KEY F7 JR NZ,X7 ;NOT F7 LD A,14H ;Make ^T ; X7 CP 0AEH ;TEST FOR KEY 8 JR NZ,X8 LD A,07H ;Make ^G ; X8 CP 98H ;TEST FOR KEY ^ JR NZ,X9 ;NOT ^ LD A,05H ;Make ^E ; X9 CP 94H ;TEST FOR HOME KEY JR Z,INPUT5 ;Was the home key ; X10 CP 9CH ;TEST FOR DOWN ARROW JR NZ,X11 ;NOT DOWN ARROW LD A,18H ;Make ^X ; ENDIF ;End of IMSAI ; X11 AND 7FH ;STRIP OFF PARITY BIT ; INPUT5 CP SW.Byte ;Check if switching mode JP Z,MSTSWC ;Go to master switching LD HL,IOBYT ;Point to info on force BIT 5,(HL) ;Test if force is required CALL NZ,FORCE ;Make lower case OR A ;Test for a Null or ^@ JR NZ,INPUT6 ;Was not zero AND 80H ;Make a testable ; INPUT6 LD (InpBuf),A ;Store the input LD A,0FFH ;Flag with data OR A ;Clear the flags RET ; ;Main keyboard input routine ; Ins LD A,(IOBYT) BIT 1,A ;Which keyboard JR NZ,Ins.2 ;Was Keyboard 2 ; ;Keyboard number 1 ; LD D,I.And1 ;Bit Mask LD E,I.Cp.1 ;Value when ready LD H,I.In.1 ;Keyboard port number LD L,I.Sin1 ;Status port JR Ins.3 ; ;Keyboard number 2 ; Ins.2 LD D,I.And2 ;Bit Mask LD E,I.Cp.2 ;Value when ready LD H,I.In.2 ;Keyboard port number LD L,I.Sin2 ;Status port ; Ins.3 LD C,L ;Status port to C. Reg IN A,(C) ;Input status port AND D ;Strip unwanted bits CP E ;Test if ready JR NZ,Ins.4 ;Not ready ; LD C,H ;Input port number to ;C Reg. IN B,(C) ;Get the byte LD A,0FFH ;Flag as data OR A ;Set to Not Zero Ret ; Ins.4 XOR A ;Set the zero flag RET ; ;Lisst status routin for brake trace program ; LSTAT0 LD A,(IOBYT) ;Point to which list BIT 3,A ;Test JR NZ,LStat2 ;The second printer ; LStat1 IN A,Sport1 ;Get port info AND Omask1 ;Strip unwanted bits off CP Cmask1 ;Test if ready JR NZ,LStat1 ;Wait RET ; LStat2 IN A,Sport2 ;Get port info AND Omask2 ;Strip unwanted bits CP Cmask2 ;Test if ready JR NZ,LStat2 ;Wait till ready RET ; ;Main list device routines ; List.1 LD A,(IOBYT) ;Get the In/Out byte ; List.5 BIT 3,A ;Which list device JR NZ,List.3 ;Was list device # 2 ; List.2 DB 0,0,0 ;Space for a call to the ;routine which checks for ;paper out and printer of ;line LD D,Omask1 ;The output stand AND byte LD E,Cmask1 ;The value hex value of ;the printer being ready. LD H,Out.1 ;The data out port number LD L,Sport1 ;The status port number JR List.4 ; ;Port numbers and masks for list device # 2 ; List.3 DB 0,0,0 ;Routines testing if on ;line and if there is paper LD D,Omask2 LD E,Cmask2 LD H,Out.2 LD L,Sport2 ; List.4 LD C,L ;Status port to C Reg. IN A,(C) ;Get the status AND D ;Mask unwanted bits CP E ;Test if ready JR NZ,List.4 ;Not ready ; LD C,H ;Output port to C Reg OUT (C),B ;Output the char. RET ; ;LIST ROUTINES ; LIST CALL List.1 ;CALL LIST STATUS ;Output the byte LD A,B ;Get the outputed char. CP 0AH ;LF RET NZ ; ;PAGINATION ROUTINE ; LD HL,PGBUF ;LOOK AT BUF. DEC (HL) RET NZ INC HL ;Point to spaces between ;pages LD A,(HL) ;Get spaces between pages OR A ;Test if any RET Z ;None to be skiped ; ;Send a form feed and rest the line counter ; LD B,0CH ;ASCII form feed Call List.1 ;Output the form feed ; PGSET LD A,(PGBUF+2) ;INITAL COUNT LD (PGBUF),A ;RESET COUNTER LD A,1 LD (BRKMSG),A ;CONT BKTRAC MSG RET ; Io.Init ; IF INTER ; ;Initilize the Tu-Art in/out board. ; XOR A OUT 23H,A OUT 53H,A INC A OUT 52H,A OUT 22H,A LD A,08H OUT 20H,A LD A,20H ;Set Baud for 4800 BPS OUT 50H,A ; ENDIF ; IF TV.950 ; LD B,1BH ;Start escape sequence CALL VID LD B,'C' ;Conversation mode CALL VID ;Do it LD B,1BH CALL VID LD B,'d' ;Non inverted screen CALL VID ; ENDIF ; IF MX.100 ;MX 100 printer ; LD B,1BH ;Start escape sequence CALL List.2 ;Output the escape LD B,'O' ;Skip over preferations CALL List.2 LD B,1BH CALL List.2 LD B,'8' ;Enable data transfer when ;out of paper CALL List.2 ;Do it ; ENDIF ; XOR A ;Get a zero LD (InpBuf),A ;Set for no input JP CLEAR ; END LL List.2 ;Do it ; ENDIF ; XOR A ;Get a zero LD (InpBuf),A ;Set for no input JP CLEAR ;