;BIOS.MAC VERSION 2.05 REV 0 8/1/78 ; ; IMDOS BASIC INPUT-OUTPUT SYSTEM ; ; THIS MODULE CONTAINS DRIVERS FOR NON-DISK DEVICES, ; LOGICAL DEVICE ROUTINES, AND SOME SYSTEM INITIALIZATION ; CODE. ; ;CHANGES IN LATEST VERSION: ; MODIFY TO USE RELOCATIBLE ASSEMBLER ; ; ; COPYRIGHT (C) 1976, 1977 ; IMSAI MANUFACTURING CORP ; 14860 WICKS BLVD, SAN LEANDO, CA 94577 USA ; ; ENTRY ENSYS,BIOS ENTRY CONIF,CONRDY,CONOUT,PUNOUT,LSTOUT,READIN EXT ENCCP,BDOSRE,WBOOT,VIOF,IOBYTE,OPTIONS,COPYHL EXT HOME,SELDISK,SELTRK,SELSEC,BCMD,DEX ; ;INITIAL I/O ASSIGNMENTS EQUATE: ; ; MAY BE CHANGED BY USER TO PUT VALUE OTHER THAN ; 0 INTO LST:, RDR:, AND PUN: IOBYTE FIELDS AT ; COLD START. CON: BITS (0 AND 1) SHOULD BE LEFT ; 0 FOR CORRECT OPERATION OF "CONSOLE FINDER" IN ; INITIALIZATION CODE NEAR END OF BIOS. ; CHANGING INITIOBYTE IS NEVER ESSENTIAL, AS ; DEVICES CAN BE ASSIGNED WITH THE "STAT" ; COMMAND; THIS PROVIOSION FOR CHANGE IS ; INTENDED AS A WAY TO MAKE A MORE CONVENIENT ; SYSTEM ONLY. ;EXAMPLE: TO MAKE SYSTEM COME UP WITH LST:=LPT:, ; CHANGE INITIOBYTE TO 1000$0000B. ; INITIOBYTE EQU 0 ;INITIAL IOBYTE (LEAVE 0 FOR CON:) PAGE FALSE EQU 0 TRUE EQU NOT FALSE ; ; ; ; I/O PORT EQUATES ; SER40A EQU FALSE ;TRUE FOR PRINTER ON SIO PORTS 4 & 5 SER40B EQU FALSE ;TRUE FOR PRINTER ON SIO PORTS 22 & 23 SER40 EQU SER40A OR SER40B ; TTY EQU 02H TTYS EQU 03H CRT EQU 04H CRTS EQU 05H SIOC EQU 08H ; ; ; IMSAI PTR-300 LINE PRINTER ; IF NOT SER40 ;IF PRINTER USES LIF PRINTER EQU 0F6H ;OUTPUT PORT, AND STATUS IN PINIT EQU 80H ;INITIALIZE COMMAND ;ANY DATA WITH B7=0 IS TAKEN AS ASCII CHAR TO PRINT. ENDIF ; ; IF SER40A PTR EQU 4 PTRS EQU 5 ENDIF ; ; IF SER40B PTR EQU 22H PTRS EQU 23H ENDIF ; ; ; ; IMSAI VIO VIDEO DISPLAY BOARD VIOINIT EQU 0F800H ;CALL THIS ADDR TO INIT VIOADR EQU 0F803H ;CALL TO OUT CHAR (A) PAGE ; ; EQUATES FOR MPU-B TIMER INITAILIZATION ; IF SER40A ;ONLY SET TIMER ON MPU-B ;FOR PTR ON SIO PORT 4 & 5 MPUIN EQU 40H ;INSTALL MPU-B MPUOUT EQU 0C0H ;REMOVE FROM MEMORY SPACE MEMCTL EQU 0F3H ;PORT TO INSTALL/REMOVE MPU-B MPUAT EQU 0D000H ;ADDRESS OF MPU-B MPUTSA EQU MPUAT+800H ;ADDRESS OF SIGNATURE MPUTST EQU 3EH ;VALUE OF SIGNATURE MPUTMC EQU MPUAT+103H ;ADDRESS OF TIMER CONTROL PORT MPUTV1 EQU 36H ;WHAT TO PUT THERE MPUTIM EQU MPUAT+100H ;ADDRESS OF TIMER PORT MPUTV2 EQU 13 ;WHAT TO PUT THERE ENDIF ; ; ; EQUATES FOR ASCII CHARACTERS ; CTRLC EQU 3 CTRLT EQU 14H TAB EQU 9 LF EQU 0AH FF EQU 0CH CR EQU 0DH CTRLZ EQU 1AH UNDERLINE EQU 5FH RUBOUT EQU 7FH ; PAGE ; ;CODE BEGINS HERE ; ; ; ENTRY POINT TABLE ; ;DO NOT REARRANGE THE FOLLOWING, AS PROGRAMS HAVE ;THESE ADDRESSES BUILT IN TO THEM ; ;BOOT RETURNS HERE BIOS: JMP WBOOT ;COME HERE FOR REBOOT (VIA 0) ;LOGICAL DEVICE ENTRIES: THESE ROUTINES GO TO THE ;CURRENTLY ASSIGNED PHYSICAL DEVICE PER IOBYTE. JMP CONRDY ;CON: STATUS. NON-0 FOR CHR RDY JMP CONIF ;CONSOLE IN TO A JMP CONOUT ;CONSOLE OUT FROM C JMP LSTOUT ;LIST OUT FROM C JMP PUNOUT ;PUNCH OUT FROM C JMP READIN ;READER IN TO A ;DISK FUNCTION ENTRIES: THESE NOW ARE PERFORMED IN ;BDOS; ENTRIES ARE MAINTAINED HERE FOR PROGRAMS THAT ;NEED TO ACCESS DISK VIA TRACK AND SECTOR ADDRESSES ;RATHER THAN VIA FILE STRUCTURE (E.G. SYSMOV, FORMAT) JMP HOME ;RESTORE DRIVE JMP SELDISK ;SELECT DRIVE (C)+1 JMP SELTRK ;SELECT TRACK (C) JMP SELSEC ;SELECT SECTOR (C) JMP SELDMA ;SET BUFFER ADDRESS (BC) ;READ DISK SECTOR MVI A,20H ;ENTRY FOR DISK READ DB 01 ;CODE FOR LXI B, ;WRITE DISK SECTOR MVI A,10H ;ENTRY FOR DISK WRITE STA OPTIONS ;CLEAR ERROR CONTROL OPTIONS JMP DEX ;USE BDOS DISK I/O ;SIGNATURE DB 0,0,0FFH ;MAKE 2.02 UTILITIES INCOMPATIBLE ; ; SET DISK BUFFER ADDRESS IN BDOS ; SELDMA: PUSH B XTHL SHLD BCMD POP H RET PAGE ;********************************************** ; ; LOGICAL DEVICE ROUTINES ; ; THESE ROUTINES USE VARIOUS PHYSICAL DEVICES ; DEPENDING ON CONTENTS OF IOBYTE. ; ; AN APPLICATION PROGRAM USUALLY CALLS THESE ; ROUTINES VIA BDOS SYSTEM CALLS, BUT MAY CALL THE ; BIOS ENTRY POINTS DIRECTLY. ; ; ALL CLOBBER DE, SOME CLOBBER OTHER REGS. ; ; ; CONSOLE STATUS ; CONRDY: CALL CONS ;GETS STAT OF SPECIFIC DEVICE ORA A RZ ;IF NOT READY RETURN 0 IN A MVI A,0FFH ;ELSE RETURN FF RET ;Z FLAG SET CORRESPONDINGLY ; CONS: CALL DISPATCH ;GO TO ONE OF 4 ADDRESSES PER IOBYTE DB 1 ;..BITS 1-0 DW TTYSTAT ;00 - TTY: DW CRTSTAT ;01 - CRT: DW CRTSTAT ;10 - VK2: DW TTYSTAT ;11 - VK1: ; ; CONSOLE IN ; CONIF: CALL DISPATCH DB 1 ;USE IOBYTE BITS 1-0 DW TTYIN ;00 - TTY: DW CRTIN ;01 - CRT: DW CRTIN ;10 - VK2: DW TTYIN ;11 - VK1: ; ; CONSOLE OUT ; CONOUT: CALL DISPATCH ;GO TO ONE OF FOLLOWING ADDRS DB 1 ;USE BITS 1-0 OF IOBYTE DW TTYOUT ;BITS=00 - USE TTY AS CONSOLE DW CRTOUT ;01 - CRT: DW VIO$OUTPUT ;10 - VK2: DW VIO$OUTPUT ;11 - VK1: ; ; CAUTION: LOGICAL DEVICE ROUTINES FOR CONSOLE (ABOVE) ; AND CONSOLE FINDER (SEE LABEL 'FINCON') MUST ; CORRESPOND. ; PAGE ; ; LIST OUT ; LSTOUT: CALL DISPATCH ;GO TO 1 OF 4 ADDRESSES PER DB 3 ;IOBYTE BITS 7-6 DW TTYOUT ;00 - TTY: DW CRTOUT ;01 - CRT: DW LPTOUT ;10 - LINE PRINTER DW VIO$OUTPUT ;11 - VK2: (VIDEO OUTPUT) ; ; PUNCH OUT ; PUNOUT: CALL DISPATCH DB 5 ;USE IOBYTE BITS 5-4 DW TTYOUT ;00 - TTY: DW PUNO ;01 - HIGH SPEED PUNCH DW CRTOUT ;10 - UP1: USES CRT: DW VIO$OUTPUT ;11 - VK1: (VIDEO OUTPUT) ; ; READER IN ; READIN: CALL DISPATCH DB 7 ;USE IOBYTE BITS 3-2 DW TTYIN ;00 - TTY: DW RDRIN ;01 - HIGH SPEED READER DW CRTIN ;10 - UR1: USES CRT: IN DW TTYIN ;11 - VK1: ; ;SUBROUTINE TO DISPATCH TO ONE OF 4 FOLLOWING ADDRESSES ;DEPENDING ON CONTENTS OF TWO BITS OF IOBYTE. SPECIFIC ;BITS OF IOBYTE ARE SPECIFIED BY SHIFT COUNT FOLLOWING CALL. ;RETURNS TO SUBROUTINE CALL PRIOR TO CALL TO DISPATCH. ; DISPATCH: XTHL ;SAVE CALLER'S H, GET TABLE ADDR MOV D,M ;SHIFT COUNT INX H ;POINT TABLE LDA IOBYTE ;GET IO ASSIGNMENTS BYTE DSHFT: RLC DCR D JNZ DSHFT ;SHIFT TO POSITION BITS ANI 06H ;MASK BITS MOV E,A ;D ALREADY CLEAR DAD D ;INDEX INTO TABLE MOV A,M INX H ;TABLE WORD TO HL MOV H,M MOV L,A ;.. XTHL ;PUT ADDR OF ROUTINE, GET CALLER'S H RET ;GO TO ROUTINE PAGE ; ;***************************************************** ; ; PHYSICAL DEVICE ROUTINES ; ; ACCESSED VIA LOGICAL DEVICE ROUTINES ABOVE ; ; ; TELETYPE INPUT ; ; USED FOR TTY: AND VK1: (KEYBOARD ON PORT 2) ; MUST PRESERVE B, D, E, H, L FOR CONSOLE FINDER TTYIN: CALL TTYSTAT JZ TTYIN ;WAIT FOR A CHAR TO BE AVAILABLE IN TTY ;INPUT IT ANI 7FH ;REMOVE PARITY RET ; TTYSTAT: ;USED HERE AND IN CONSTAT ABOVE IN TTYS ;GET STATUS ANI 02H ;MASK BIT RET ;A IS NON-0 IF CHAR AVAILABLE ; ; TELETYPE OUTPUT ; ;CLOBBERS DE. BOOT DEPENDS ON PRESERVING HL ;MUST PRESERVE HL FOR NXM, BOOTSTRAP TTYOUT: IN TTYS ;STATUS RRC ;TEST BIT 0 JNC TTYOUT ;WAIT TILL READY TO ACCEPT CHAR MOV A,C OUT TTY ;OUTPUT THE CHARACTER ; ; IF YOUR TERMINAL NEEDS A DELAY FOR CARRIAGE TO RETURN, ; ALTER THE FOLLOWING INSTRUCTION TO MVI D,28H FOR A ; DELAY OF ABOUT 100 MSEC. MVI D,0 CPI CR TTYWT0: RNZ TTYWT1: DCX D ORA D ;DEPENDS ON A7=0 AT ENTRY JP TTYWT1 ;LOOP TAKES 9.5 USEC PER COUNT RET PAGE ; ; CRT INPUT ; ; USED FOR CRT: AND VK2: (KKEYBOARD ON PORT 4). ; MUST PRESERVE B, D, E, H, L FOR CONSOLE FINDER CRTIN: CALL CRTSTAT JZ CRTIN IN CRT ANI 7FH RET ; CRTSTAT: IN CRTS ANI 02H RET ; ; CRT OUTPUT ; ;MUST PRESERVE HL FOR BOOT, NXM ;CLOBBERS DE CRTOUT: IN CRTS RRC JNC CRTOUT MOV A,C OUT CRT ;DELAY AFTER LINE FEED. THIS IS SO ;(1) IF THERE ARE SEVERAL BLANK LINES, PRECEDING ;OUTPUT DOESN'T DISSAPPEAR OFF SCREEN BEFORE YOU ;HAVE TIME TO HIT CTL-S, AND (2) TO GIVE CERTAIN ;"INTELLIGENT" TERMINALS TIME TO "THINK" MVI D,14H ;DELAY: APPROX 50 MSEC CPI LF ;IF WAIT AFTER CR IS REQUIRED ;CHANGE INSTRUCTION TO "CPI CR" JMP TTYWT0 ;USE TTY: WAIT CODE ; ; ; ; VIDEO OUTPUT (IMSAI VIO BOARD) ; VIO$OUTPUT: LDA VIOF ;TEST FLAG THAT SAYS ORA A ;VIO IS PRESENT JNZ TTYOUT ;IF NOT THERE, USE TTY INSTEAD. MOV A,C ;CHARACTER JMP VIOADR ;DO IT PAGE ; LINE PRINTER OUT ; LPTOU2: PUSH B ; ERROR RETRY FOR LPTOUT LXI D,PRINTMSG ;"LPT NOT READY" LXI B,9 ;"PRINT" FUNCTION NUMBER CALL BDOSRE ;BDOS PRINT MVI C,1 ;FCN NUMBER TO INPUT CHAR & ECHO CALL BDOSRE ;CALL BDOS CPI CTRLC JZ WBOOT ;IF ^C TYPED, REBOOT POP B ;GET CHAR TO PRINT BACK ; LPTOUT: ;ENTRY POINT FOR PRINTER OUTPUT ; IF NOT SER40 MVI B,0 ;BUSY TIME-OUT COUNTER LPTOU0: IN PRINTER ;THIS GETS: FF, NO LPT INTERFACE, ;F4: READY, F0: BUSY, NO PAPER, COVER OPEN, &C. CPI 0FFH JZ LPTOU2 ;NO PRINTER, USE "HUNG" MSG DCR B ;ON TIME-OUT, JZ LPTOU2 ;PRINT MESSAGE AND AWAIT INPUT ANI 04H ;CHECK "READY" BIT JZ LPTOU0 ;IF NOT READY, TRY TILL TIME-OUT MOV A,C ;THE CHARACTER OUT PRINTER ;OUTPUT IT RET ENDIF ; ; ; IF SER40 LXI D,0 LPTOU0: DCX D ;CHECK TIMEOUT MOV A,D ORA E JZ LPTOU2 ;JIF TIMEOUT IN PTRS ;CHECK STATUS PORT CPI 0FFH JZ LPTOU2 ;JIF NOTHING THERE ANI 85H ;CHECK BOTH READY BITS CPI 85H JNZ LPTOU0 ;LOOP IF NOT READY MOV A,C OUT PTR ;OUTPUT THE BYTE RET ENDIF ; ; PRINTMSG: DB CR,LF,'LPT NOT RDY ',0 PAGE ; ; ; NULL DEVICE, FOR UNDEFINED DEVICES. ; ;FOR UNASSIGNED AND AND UNIMPLEMENTED INPUT DEVICES, ;HERE IS AN INFINITE SOURCE OF EOF'S: NULLI: MVI A,CTRLZ ORA A RET ; ;DON'T USE CRT FOR UNASS INPUT DEVICES CAUSE IF THERE ; IS NO CRT ON SYSTEM BUT INTERFACE BOARD IS PRESENT, ; SYSTEM WILL HANG. ; ;FOR UNUASS AND UNIMP OUTPUT DEVICES, USE CRT. ; IF NO CRT IS PRESENT, THIS IS AN INFINITE DATA SINK. NULLO EQU CRTOUT ; ; HERE IS A PLACE WHERE USER MAY ADD HIGH SPEED ; READER DRIVER ; RDRIN EQU NULLI ;MEANWHILE, USE NULL DEVICE ; ; HERE IS A PLACE WHERE USER MAY ADD HIGH SPEED ; PUNCH DRIVER ; PUNO EQU NULLO ;MEANWHILE, USE NULL DEVICE ; ; ; ; ; ; ****************************************************** ; ; END OF CODE USED WHILE SYSTEM IS RUNNING ; ; ALL CODE USED DURING SYSTEM EXECUTION ; MUST PRECEDE THIS POINT -- FOLLOWING ; CODE IS USED DURING SYSTEM INITIALIZATION ; ONLY AND IS OVERLAID WITH STORAGE THEREAFTER. ; MORE COMMENTS ON WHAT OVERLAYS INITIALIZATION ; CODE ARE ON THE LAST TWO PAGES OF THIS LISTING. ; PAGE ; ;************************************************* ; ; SYSTEM INITIALIZATION, BIOS PORTION ; ; INITIALIZATION STARTS IN BOOT, CONTINUES HERE. ; CODE HERE SETS SYSTEM VIO AND DIO FLAGS, ; INTITIALIZES VIO VIDEO INTERFACE IF PRESENT, ; INITIALIZES LINE PRINTER IF PRESENT, ; AND, IF COLD START, FINDS CONSOLE AND INTIALIZES ; IOBYTE. ; CONTROL IS THEN TRANSFERRED TO THE CCP, WHICH ; DOES ADDITIONAL INITIALIZATION INCLUDING TYPING ; THE SYSTEM SIGN-ON. ; ; ENSYS: ;ENTRY FROM BOOT ; ON ARRIVAL HERE ; IOBYTE = 0FFH IF IT NEEDS SETTING ; LXI SP,68H ;SET STACK ; ; ; INIT LINE PRINTER ; ; ; IF NOT SER40 IN PRINTER ;GET STATUS: FF NOT THERE, ;F4 OK, F0 NOT READY (MIGHT ;HANG US IF WE OUTPUT TO IT ANI 04H ;MASK THE TELLING BIT JZ NOPINIT ;BIT OFF, SKIP INIT MVI A,PINIT OUT PRINTER NOPINIT: ENDIF PAGE ; ; IF SIO ON PORT 4 & 5, INIT MPU-B TIMER ; IF SER40A LXI H,TEST ;FIRST MOVE CODE DOWN TO 80H LXI D,80H ; SINCE BIOS MIGHT BE IN MPU LAND MOV B,E ;NUMBER OF BYTES TO MOVE (80H IS ENOUGH) CALL COPYHL ;USE BDOS COPY ROUTINE CALL 80H ;INIT TIMER IF THERE ENDIF ; ; INIT BOTH CHANNELS OF SIO ; AND PRINTER IF ON SIO ; LXI H,INITST ;POINT INIT STRING SIOLUP: MOV A,M ;GET BYTE OUT TTYS ;CHANNEL 1 INX H ;MUST LEAVE TIME BETWEEN TWO NOP ;NEEDS MORE TIME BETWEEN OUT'S TO SIO IF NOT SER40A ;SER4A USES THIS PORT FOR PTR OUT CRTS ;CHANNEL 2 ENDIF IF SER40 MOV B,A ;CHANGE A 37H TO 33H ANI 1 ADD A ADD A XRA B OUT PTRS ;OUTPUT TO THE PTR CONTROL PORT ENDIF RAR ;ONLY LAST IS ODD JNC SIOLUP MOV A,M OUT SIOC ; ; ENTER CCP IF WARM START ; LDA IOBYTE ;TEST IOBYTE INR A JNZ ENCCP ;DONE IF WARM START: ; GO TO CCP PAGE ;SYSTEM INITIALIZATION, BIOS PORTION, COLD START ; ; INITIALIZE IOBYTE: LST:, RDR:, PUN: FIELDS TO ; 0 OR VALUE OF "INITIOBYTE" ASSEMBLY PARAMETER ; EQUATED ON PAGE 1; CONSOLE TO DEVICE "FOUND" BY ; FOLLOWING CODE ; ; CONSOLE FINDER: ; CONSOLE INPUT IS FROM PORT 2 OR PORT 4, ; WHICHEVER INPUTS A SPACE OR CONTROL-T ; CHARACTER FIRST, OR PORT 2 ON TIME-OUT. ; CONSOLE OUTPUT IS TO VIO IF PRESENT AND ; SPACE TYPED OR TIME-OUT; TO SAME PORT ; AS INPUT IF FORCED BY TYPING CONTROL-T ; OR IF VIO NOT PRESENT. ; THE ABOVE RULES DEFINE THE SELECTION OF ; ONE OF THE PHYSICAL DEVICES TTY:, CRT:, ; VK1:, OR VK2: FOR THE INITIAL CON:. ; PORT NUMBERS AND DEVICES ACCESSED WILL ; CHANGE APPROPRIATELY IF USER CHANGES ; PHYSICAL DEVICE ROUTINES ABOVE, SINCE ; CONSOLE FINDER DOES ITS IO THRU PHYSICAL ; DEVICE ROUTINES. ; ; CAUTION: IF YOU CHANGE THE CORRESPONDENCE BETWEEN ; IOBYTE VALUES AND PHYSICAL DEVICES, OR ACCESS A ; COMPLETELY DIFFERENT DDRIVER IN CON: LOGICAL ; DEVICE ROUTINES, FOLLOWING CODE MAY REQUIRE CHANGES. ; ; LXI D,6000H ;TIME-OUT COUNTER ;6000=ABOUT 3 SECS FINCON: ;LOOP BACK HERE TIL INPUT OR TIL TIMEOUT ;TRY CRT PORT CALL CRTSTAT CNZ CRTIN ;GET BYTE IF READY LXI B,201H ;2 FOR VIO, 1 FOR NO VIO CALL TESTIN ;RETURN IF NOT SPACE OR ^T ;TRY TTY/KEYBOARD PORT LIKEWISE CALL TTYSTAT CNZ TTYIN ;GET BYTE IF READY LXI B,300H ;3 FOR VIO, 0 FOR NO VIO CALL TESTIN ;RETURN IF NOT SPACE OR ^T DCX D MOV A,D ;TEST TIME-OUT ORA E JNZ FINCON PAGE ; ; OPERATOR HAS NOT RESPONDED WITH A SPACE OR CONTROL-T ; ON EITHER PORT 2 OR PORT 4. SUPPLY ONE FOR HIM. ; MVI A,' ' ;USE PORT 2 ; ; ; ; ROUTINE TO TEST FOR SPACE BAR INPUT (USE VIO IF THERE) ; OR CONTROL-T (DON'T USE VIO) IN ACC. ; RETURNS ONLY IF ACC IS NOT SPACE OR CONTROL-T. ; OTHERWISE, FALLS THROUGH TO SET IOBYTE. ; ON ENTRY: ; B = IOBYTE VALUE IF WANT TO USE VIO ; C = IOBYTE VALUE TO SUPPRESS VIO ; TESTIN: CPI ' ' JZ TSTIN1 ;SPACE BAR GOOD CPI CTRLT RNZ ;NO CONTROL-T BAD MOV B,C ;SUPPRESS VIO TSTIN1: LHLD VIOF MOV A,C ;ASSUME NO VIO INR L DCR L ;TEST JNZ SETIOBYTE ;BRIF VIO NOT THERE CALL VIOINIT ;INIT IT MOV A,B ;MOVE MAGIC VALUE TO ACC ; ; AT THIS POINT THE IOBYTE FIELD FOR CONSOLE IS IN A: ; 0 - TTY: (PORT 2 INPUT AND OUTPUT) ; 3 - VK1: (PORT 2 INPUT, VIO OUTPUT) ; 1 - CRT: (PORT 4 INPUT AND OUTPUT) ; 2 - VK2: (PORT 4 INPUT, VIO OUTPUT) ; SETIOBYTE: ; INITIALIZE IOBYTE. CONSOLE FIELD IS IN A. ORI INITIOBYTE ;OTHER FIELDS PER INITIOBYTE ;EQUATE ON PAGE 1 (0 IF NOT ;MODIFIED BY USER) STA IOBYTE ;SET IOBYTE ; ;EXIT FROM BIOS TO CCP COLD START ENTRY POINT JMP ENCCP ;CONTINUE IN CCP ; ; ; INITST: DB 0,0,0,40H,0AEH,37H,22H ; ; TEST FOR MPU-B AND SET TIMER IF THERE ; THIS CODE IS MEANT TO BE EXECUTED AT 80H, NOT HERE ; IF SER40A ;ONLY IF PTR ON SIO PORT 4 & 5 TEST: MVI A,MPUIN OUT MEMCTL ;INSTALL MPU-B AT D800H LXI H,MPUTSA ;ADDRESS OF MPU-B SIGNITURE MOV B,M ;SAVE WHAT'S THERE MVI A,0FFH-MPUTST ;COMPLEMENT OF WHAT SHOULD BE THERE MOV M,A ;TRY TO COMPLEMENT MEMORY XRA M ;0 IF RAM, 0FFH IF ROM INR A ;TEST FOR TRUE MOV M,B ;RESTORE IN CASE RAM JNZ TEST1-TEST+80H ;JIF NOT MPU-B LXI H,MPUTMC ;POINT TIMER CONTROL PORT MVI M,MPUTV1 LXI H,MPUTIM ;TIMER PORT LXI D,MPUTV2 ;VALUE FOR 9600 BAUD MOV M,E ;OUTPUT TO PORT MOV M,D TEST1: MVI A,MPUOUT ;REMOVE MPU-B FROM ADDRESS SPACE OUT MEMCTL RET ENDIF ; DB ' (C) 1976,1977' ; ; ; ;CAUTION: DO NOT ADD ROUTINES HERE UNLESS THEY ARE USED ;ONLY DURING SYSTEM INITIALIZATION. PUT ADDED CODE USED ;DURING SYSTEM INITIALIZATION ABOVE "ENSYS". READ COMMENTS ;ON PAGE 15. ; END