;************************************************************* ;VIO TERMINAL FIRMWARE REQUIRES REFRESH MEMORY TO BE AT ;F000 AND FIRMWARE ITSELF AT F800 ; COPYRIGHT IMSAI MANUFACTURING COMPANY ; SAN LEANDRO, CALIFORNIA ; 6/1/77 ;************************************************************** F000 = REFRESH EQU 0F000H ;REFRESH MEMORY ON VIO F780 = SYSRAM EQU 0F780H ;SYSTEM RAM F800 = VIOFM EQU 0F800H ;FIRMWARE BEGINNING FFFD ORG VIOFM+7FDH FFFD 564930 DB 'VI0' ;SYSTEM IDENTIFIER F7FF = CTRPORT EQU REFRESH+7FFH ;HARDWARE CONTROL WORD F780 ORG SYSRAM F780 00 CURLIN DB 0 ;CURRENT LINE # 0-23 F781 00 CURCOL DB 0 ;CURRENT COL # 0-79 F782 00 INVIDIO DB 0 ;INVERSE VIDIO MODE(BY CHAR) F783 00 VDIMDE DB 0 ;MODE 0=GRAPHICS, NOT 0= TEXT F784 00 INSRT DB 0 ;INSERTING CHARS MODE F785 00 ESCCNT DB 0 ;ESCAPE CHAR COUNT F786 00 ESCCDE DB 0 ;ESCAPE CODE LAST USED F787 0000 USERCTR DW 0 ;USER CTR TBLE PTR, NON ZERO F789 0000 USERESC DW 0 ;USER ESCAPE TBLE PTR,NON ZERO F78B 0000 USERCMD DW 0 ;USER MONITOR COMMAND TABLE F78D 0000 RAMPTR DW 0 ;RAM SPACE PTR WITH DIRECT I/O F78F 0000 CURPTR DW 0 ;CURSOR ADDRESS F791 00 PRTMD DB 0 ;PROTECTED MODE 0=NO F792 00 CCUR DB 0 ;CHAR UNDER CURSOR(FOR GRAPHICS MODE) F793 00 CCHAR DB 0 ;CURRENT CHARACTER TO DISPLAY F794 00 CTRLC DB 0 ;CONTROL WORD AS FOLLOWS ; 7 SCROLL MODE 0=SCROLL,1=WRAP ; 6 UNUSED ; 5 UP/LOW 0=UP,1=UP+LOW ; 4 1=INVERSE VIDIO SCREEN ; 3 00=BLANK,01=LOW128+INV,10=HIGH128+INV ; 2 11=256 CHAR GRAPHICS ; 1 #LINES 0=24,1=12 ; 0 #CHARS 0=80,1=40 F795 = TAB EQU $ F79F ORG $+10 ;80 BITS FOR TAB CONTROL F79F 0000 CLINE DW 0 ;CHARS/LINE F7A1 00 LPAGE DB 0 ;LINES/PAGE-1 F7A2 0000 NCHARS DW 0 ;#CHARS ON DISPLAY F7A4 00 PRUPRF DB 0 ;TRANSITION PROTECT FLAG F7A5 00 USERF DB 0 ;ENTRY POINT FLAG 0=INIT48,1=CHAR48,2=USER F7A6 0000 LASTC DW 0 ;LAST CHAR ON SCREEN PTR+1 ;*********************************** ; USER ENTRY POINTS ;********************************** F800 ORG VIOFM F800 C315F8 JMP INIT ;INITIALIZATION POINT F803 C37EF8 JMP CHAROUT ;CHARACTER OUTPUT F806 C3E2FB JMP MONT ;MONITOR ENTRY POINT F809 31FEF7 VIOTEST LXI SP,SYSRAM+7EH F80C CD15F8 CALL INIT F80F CD10FF CALL CHIN F812 C30FF8 JMP VIOTEST+6 ;DEMO TESTER ;********************************************** F815 E5 INIT PUSH H F816 D5 PUSH D F817 C5 PUSH B F818 F5 PUSH PSW F819 2180F7 LXI H,CURLIN ;START OF ZEROED AREA F81C 061F MVI B,CLINE-CURLIN AND 0FFH F81E AF XRA A F81F 77 INIT1 MOV M,A ;ZERO AREA F820 23 INX H F821 05 DCR B F822 C21FF8 JNZ INIT1 F825 2100F0 LXI H,REFRESH ;BEGIN CURSOR POS F828 228FF7 SHLD CURPTR F82B 218007 LXI H,1920 ;DEFAULT CHARS/SCREEN F82E 22A2F7 SHLD NCHARS F831 CD9FF9 CALL BLNKS ;CLEAR SCREEN AND HOME F834 3E08 MVI A,8H ;DEFAULT 80X24 SCREEN TEXT MODE F836 11DFF8 LXI D,BMP1 ;SET UP RETURN ADDR F839 D5 PUSH D ;SUBROUTINE TO SET HARDWARE CONTROL PORT F83A 3294F7 SETCMD STA CTRLC F83D 32FFF7 STA CTRPORT ;HARDWARE CONTROL PORT F840 2F CMA F841 E603 ANI 3 F843 0F RRC ;FINDING NCHARS ON SCREEN F844 212800 LXI H,40 ;COLS/LINE F847 D24BF8 JNC $+4 ;ENOUGH F84A 29 DAD H ;COLS/LINE=80 F84B 229FF7 SHLD CLINE F84E 21A1F7 LXI H,LPAGE ;PT AT LINES/PAGE F851 360B MVI M,11 F853 1F RAR F854 D259F8 JNC $+5 F857 3617 MVI M,23 F859 21E001 LXI H,480 ;COUNT FOR 12 X 40 SCREEN F85C D260F8 JNC $+4 F85F 29 DAD H F860 B7 ORA A ;SET FLAGS F861 CA65F8 JZ $+4 F864 29 DAD H F865 22A2F7 SHLD NCHARS F868 1100F0 LXI D,REFRESH F86B 19 DAD D F86C 22A6F7 SHLD LASTC ;LAST CHAR ON SCREEN PTR+1 F86F 3A94F7 LDA CTRLC ;CONTOL CODE F872 E60C ANI 0CH ;MODE BITS ONLY F874 EE0C XRI 0CH F876 3283F7 STA VDIMDE ;0=GRAPHICS ;CHECK CURSOR WITHIN POSSIBLE NEW BOUNDS F879 AF ESCRET XRA A F87A 3285F7 STA ESCCNT ;COUNT=0 F87D C9 RET ;**************************************************************** ; THIS IS THE NORMAL ENTRY POINT FOR COMMUNICATING WITH THE ; VIDIO MONITOR AS YOU WOULD A CRT. ;***************************************************************** F87E E5 CHAROUT PUSH H F87F D5 PUSH D F880 C5 PUSH B F881 F5 PUSH PSW F882 3293F7 STA CCHAR F885 2A8FF7 LHLD CURPTR ;CURSOR POSITION F888 3A92F7 LDA CCUR ;CHAR UNDER CURSOR F88B 77 MOV M,A ;REMOVE CURSOR F88C 2193F7 LXI H,CCHAR ;PT AT CURRENT CHAR F88F 7E MOV A,M ;GET CHAR F890 FE1B CPI 1BH ;ESCAPE CHAR? F892 CA4DF9 JZ ESCAPE F895 3A85F7 LDA ESCCNT ;ARE WE IN ESCAPE SEQ ALREADY? F898 B7 ORA A F899 C24DF9 JNZ ESCAPE ;YES F89C 7E MOV A,M ;CURRENT CHAR F89D FE7F CPI 7FH ;DELETE CHAR (RUBOUT)? F89F CA3CF9 JZ NOUSER+3 ;YES F8A2 3A83F7 LDA VDIMDE ;GRAPHICS MODE? F8A5 B7 ORA A F8A6 CAD6F8 JZ CHAR1 ;YES F8A9 7E MOV A,M F8AA FEFF CPI 0FFH ;DUMMY PAD FROM USER? F8AC CADFF8 JZ BMP1 ;YES F8AF E67F ANI 7FH ;STRIP PARITY BIT F8B1 77 MOV M,A F8B2 DE20 SBI 20H ;CONTROL CODE? F8B4 FA29F9 JM CONTROL ;YES F8B7 3A94F7 LDA CTRLC ;CONTROL WORD F8BA 47 MOV B,A ;TMP SAVE F8BB E60C ANI 0CH ;MODE ONLY F8BD FE08 CPI 08H ;LOW HALF OF CHAR GEN ROM? F8BF C2D6F8 JNZ CHAR1 ;NO,UPPER HALF F8C2 78 MOV A,B ;CONTROL WORD F8C3 E620 ANI 20H ;UP/LOW CASE F8C5 C2D6F8 JNZ CHAR1 ;LOWER OK AS IS F8C8 7E MOV A,M ;CURRENT CHAR F8C9 DE61 SBI 61H ;LOWER CASE A F8CB FAD6F8 JM CHAR1 ;NOT ALPHA F8CE DE1A SBI 7BH-61H F8D0 F2D6F8 JP CHAR1 ;NOT ALPHA F8D3 C65B ADI 7BH-20H ;RESTORE AND CONVERT TO UPPER CASE F8D5 77 MOV M,A F8D6 CD63FB CHAR1 CALL INSCHR ;INSERT CCHAR AT CURSOR POS F8D9 CDE7F8 CALL BMPCUR F8DC CD0CFB BMP10 CALL CALPOS ;CURSOR POS F8DF CD95FA BMP1 CALL INSCURS ;INSERT CURSOR F8E2 F1 POP PSW F8E3 C1 POP B F8E4 D1 POP D F8E5 E1 POP H F8E6 C9 RET F8E7 = BMPCUR EQU $ F8E7 CD26FB CALL BMPC ;BUMP CURSOR CHAR POSITION F8EA CCF9F8 CZ BMPCUR1 ;DO LINE FEED F8ED 3A91F7 LDA PRTMD ;PROTECT MODE? F8F0 EB XCHG ;H,L=CURRENT CURSOR PTR F8F1 A6 ANA M ;IS IT PROTECTED? F8F2 FAE7F8 JM BMPCUR ;YES,SKIP PROTECTED FIELD F8F5 C9 RET ;GO INSERT CURSOR F8F6 2180F7 LFEED LXI H,CURLIN F8F9 34 BMPCUR1 INR M F8FA 3AA1F7 LDA LPAGE ;MAX LINES/PAGE F8FD BE CMP M ;EXCEED MAX? F8FE F0 RP F8FF 35 DCR M ;LEAVE AT LAST LINE ;******************************** ;SCROLL UP OR WRAP AROUND AS SET BY CTRLC ;******************************************** F900 3A94F7 SCROLL LDA CTRLC ;KIND OF SCROLL? F903 E68C ANI 8CH ;LEAVE SCROLL AND MODE BITS F905 FA0DF9 JM SCROLL3 ;WRAP AROUND F908 FE0C CPI 0CH ;GRAPHICS MODE F90A C212F9 JNZ SCROLL1 ;NO, ALLOW SCROLL F90D AF SCROLL3 XRA A F90E 77 MOV M,A ;HOME CURSOR FOR WRAP AROUND F90F 23 INX H F910 77 MOV M,A F911 C9 RET F912 2A9FF7 SCROLL1 LHLD CLINE ;COLS/LINE F915 E5 PUSH H ;SAVE COLS/LINE F916 EB XCHG F917 2AA2F7 LHLD NCHARS ;# CAHRS PER PAGE F91A 7D MOV A,L F91B 93 SUB E F91C 4F MOV C,A F91D 44 MOV B,H F91E EB XCHG F91F 1100F0 LXI D,REFRESH F922 19 DAD D ;HL=SOURCE,DE=DEST. F923 CDDDFD CALL MVCUP F926 C331FA SCROLL2 JMP DLINE1 ;ERASE CURRENT LINE AND RETURN ;****************************** ;PROCESS CONTROL CODES ;************************ F929 EB CONTROL XCHG ;D,E=CCHR PTR F92A 2A87F7 LHLD USERCTR ;USER TABLE IF ANY F92D 7C MOV A,H F92E B7 ORA A F92F 1A LDAX D ;CCHAR IN A F930 CA39F9 JZ NOUSER ;NO TABLE USER DEFINED F933 CD11FA CALL LOOKUP F936 C245F9 JNZ FNDCTRL ;FOUND TABLE ENTRY F939 3A93F7 NOUSER LDA CCHAR F93C 2192FB LXI H,CTRTBL F93F CD11FA CALL LOOKUP F942 CADFF8 JZ BMP1 ;NOT FOUND F945 11DCF8 FNDCTRL LXI D,BMP10 ;RETURN ADDRESS F948 D5 PUSH D ;ON STACK F949 1181F7 LXI D,CURCOL F94C E9 PCHL I ; ;**************************************** ;PROCESS ESCAPE SEQUENCES ;************************** F94D 11DCF8 ESCAPE LXI D,BMP10 ;RETURN ADDR F950 D5 PUSH D F951 EB XCHG F952 2185F7 LXI H,ESCCNT F955 7E MOV A,M ;ESCCAPE COUNT F956 34 INR M ;ESCCNT=ESCCNT+1 F957 B7 ORA A F958 C8 RZ F959 3D DCR A F95A 23 INX H F95B 1A LDAX D ;GET CCHAR F95C C260F9 JNZ ESCAP1 ;ESCCNT>1 F95F 77 MOV M,A ;SAVE ESCAPE CODE F960 2A89F7 ESCAP1 LHLD USERESC ;USER ESCAPE TABLE PTR F963 7C MOV A,H F964 B7 ORA A F965 1A LDAX D ;ESCCODE F966 CA6FF9 JZ NUESC ;NO USER DEFINED TABLE F969 CD11FA CALL LOOKUP ;LOOKUP IN USERS TABLE F96C C27DF9 JNZ FNDESC ;FOUND ESCAPE SEQ IN USER F96F 3A86F7 NUESC LDA ESCCDE ;TRY AGAIN IN VIO TABLE F972 E6DF ANI 0DFH ;REMOVE LOWER CASE BIT F974 21C0FB LXI H,ESCTBL F977 CD11FA CALL LOOKUP F97A CA79F8 JZ ESCRET ;NOT FOUND F97D 3A94F7 FNDESC LDA CTRLC F980 113AF8 LXI D,SETCMD F983 E9 PCHL ; ;************************ ;CURSOR CONTROL ;******************** F984 1B UPLINE DCX D ;D,E=CURLIN PTR F985 1A BCKLNE LDAX D ;D,E=CURLIN OR CURCOL F986 B7 ORA A ;SET FLAGS F987 C8 RZ F988 3D DCR A ;BACK UP 1 F989 12 BCKL1 STAX D F98A C9 RET F98B AF CRET XRA A F98C 3284F7 STA INSRT ;REMOVE INSERT MODE F98F C389F9 JMP BCKL1 ;********************************** ;TOGGLE PROTECTED MODE FLAG ;********************************* F992 2191F7 PRTECT LXI H,PRTMD ;PT AT FLAG F995 C39BF9 JMP INSMDE+3 ;GO TOGGLE IT ;************************************* ;TOGGLE INSERT MODE FLAG ;************************************ F998 2184F7 INSMDE LXI H,INSRT F99B 7E MOV A,M F99C 2F CMA F99D 77 MOV M,A F99E C9 RET ;*********************** ;BLANK SCREEN AND HOME ;*********************** F99F 2AA2F7 BLNKS LHLD NCHARS ;#CHARS ON SCREEN F9A2 EB XCHG F9A3 2100F0 LXI H,REFRESH F9A6 3A91F7 BLNKS1 LDA PRTMD ;IN PROTECTED MODE? F9A9 E680 ANI 80H F9AB A6 ANA M ;PROTECTED? F9AC FAB1F9 JM BLNKS2 ;IS PROTECTED, DO NOT BLANK F9AF 3620 MVI M,' ' F9B1 23 BLNKS2 INX H F9B2 1B DCX D F9B3 7A MOV A,D F9B4 B3 ORA E ;DONE YET? F9B5 C2A6F9 JNZ BLNKS1 ;NO F9B8 210000 HOME LXI H,0 F9BB 2280F7 SHLD CURLIN F9BE C9 RET ;********************************************** ;BLANK FROM CURSOR TO END OF UNPROTECTED FIELD ;*********************************************** F9BF CDEEF9 BLANKL CALL CHARLN ;CALC # CHARS TO END OF FIELD F9C2 3A91F7 BLANKL3 LDA PRTMD ;PROTECTED MODE? F9C5 B7 ORA A F9C6 CACEF9 JZ BLANKL1 ;NOT PROTECTED,SKIP CHECK F9C9 7E MOV A,M ;GET CHAR F9CA B7 ORA A F9CB FAD1F9 JM BLANKL1+3 ;IS PROTECTED,DO NOT BLANK F9CE 3E20 BLANKL1 MVI A,' ' F9D0 77 MOV M,A ;INSERT BLANK F9D1 23 INX H ;NEXT CHAR F9D2 0D DCR C ;COUNT F9D3 C2C2F9 JNZ BLANKL3 F9D6 C9 RET ;********************************* ;TURN ON PROTECTED FIELD/TURN OFF PROT FIELD ;********************************************** F9D7 2182F7 PROTC LXI H,INVIDIO ;PT AT INVERTED VIDIO FLAG F9DA C39BF9 JMP INSMDE+3 ;********************************************* ;DELETE CHAR AND SHIFT PROTECTED FIELD LEFT ONE PLACE ;*********************************************** F9DD CDEEF9 DELETE CALL CHARLN F9E0 2A8FF7 LHLD CURPTR ;CURSOR POSITION F9E3 54 MOV D,H F9E4 5D MOV E,L F9E5 23 INX H F9E6 CDDDFD CALL MVCUP ;SHIFT LINE LEFT ONE PLACE F9E9 3E20 MVI A,' ' F9EB 1B DCX D ;BACK UP ONE F9EC 12 STAX D ;INSERT FINAL BLANK F9ED C9 RET I ; ;**************************************************** ;CALC # CHARS FROM CURSOR TO END OF UNPROT FIELD INCLUSIVE ; RETURN H,L=CURSOR PTR ;********************************************************** F9EE 3A91F7 CHARLN LDA PRTMD ;PROTECT MODE FLAG F9F1 E680 ANI 80H F9F3 57 MOV D,A ;SAVE PROTECT MODE BIT F9F4 2A8FF7 LHLD CURPTR ;CURSOR POSITION F9F7 E5 PUSH H F9F8 3A81F7 LDA CURCOL F9FB 5F MOV E,A ;E=CURRENT COLUMN F9FC 010000 LXI B,0 ;# CHARS TO END F9FF 3A9FF7 CHARLN1 LDA CLINE ;COLS/LINE FA02 93 SUB E FA03 1C INR E FA04 23 INX H FA05 0C INR C ;COUNT INCREASED FA06 3D DCR A ;DNE YET WITH LINE FA07 CA0FFA JZ CHARLN2 ;END OF LINE RETURN FA0A 7E MOV A,M ;H,L=END +1 FA0B A2 ANA D ;PROTECTED? FA0C F2FFF9 JP CHARLN1 ;NO, KEEP GOING FA0F E1 CHARLN2 POP H ;CURSOR POSITION FA10 C9 RET ;**************************************************************** ;TABLE LOOK UP ROUTINE. SEARCHES FIRST BYTE OF THREE BYTE TABLE OF ;RECORDS FOR A MATCH OR ZERO. ZERO INDICATES END OF TABLE WITH NO ;MATCH, RETURNED IN A REG.H,L LOADED WITH SECOND TWO BYTES OF TABLE ;IF MATCH FOUND. ;******************************************************************* FA11 47 LOOKUP MOV B,A ;SAVE FA12 7E MOV A,M ;GET FIRST BYTE OF RECORD FA13 1180F7 LXI D,CURLIN FA16 B7 ORA A FA17 C8 RZ ;DONE,NO MATCH FA18 B8 CMP B ;SAME AS REQUESTED? FA19 C223FA JNZ TBLUP1 ;NO FA1C 23 INX H FA1D 5E MOV E,M FA1E 23 INX H FA1F 56 MOV D,M FA20 EB XCHG FA21 B7 ORA A ;SET FLAGS FA22 C9 RET FA23 23 TBLUP1 INX H FA24 23 INX H FA25 23 INX H ;BUMP TO NEXT RECORD FA26 C312FA JMP LOOKUP+1 ; ;************************************************* ;DELETE CURRENT LINE AND RETURN CURSOR ;********************************************** FA29 CD4DFA DLINE CALL NMCHM ;SET UP FOR MOVE FA2C E5 PUSH H ;SAVE COLS/LINE FA2D 19 DAD D ;H,L=SOURCE BEGIN FA2E CDDDFD CALL MVCUP FA31 C1 DLINE1 POP B ;COLS/LINE FA32 EB XCHG FA33 C345FA JMP EN1 ;ERASE LINE ; ;*********************************************** ;ENTER NEW LINE AT CURSOR LINE,PUSH BOTTOM DOWN ;*********************************************** FA36 CD4DFA ENLINE CALL NMCHM ;SET UP FOR MOVE FA39 E5 PUSH H ;SAVE COLS/LINE FA3A 19 DAD D ;H,L=SOURCE BEGIN FA3B 09 DAD B ;H,L=END OF DEST+1 FA3C EB XCHG FA3D 09 DAD B ;H,L=END OF SOURCE+1 FA3E 2B DCX H FA3F 1B DCX D FA40 CD87FB CALL MVCDN ;MOVE DOWN 1 LINE FA43 C1 POP B FA44 23 INX H FA45 3620 EN1 MVI M,' ' FA47 23 INX H FA48 0D DCR C FA49 C245FA JNZ EN1 FA4C C9 RET FA4D AF NMCHM XRA A FA4E 12 STAX D ;COL=0 FA4F CD5DFA CALL CHARSN ;#CHARS TO END OF SCREEN FA52 EB XCHG ;D,E=DEST. FA53 2A9FF7 LHLD CLINE ;COLS/LINE FA56 7D MOV A,L ;COLS/LINE FA57 0B DCX B FA58 3D DCR A FA59 C257FA JNZ $-2 ;DECREASE COUNT BY ONE LINES WORTH FA5C C9 RET ;****************************************** ;CALC # CHARS TO END OF SCREEN FROM CURSOR ;******************************************** FA5D CD0CFB CHARSN CALL CALPOS FA60 E5 PUSH H ;SAVE FA61 EB XCHG ;D,E=CURSOR POS FA62 2AA6F7 LHLD LASTC ;LAST CHAR POSITION+1 FA65 7A MOV A,D FA66 2F CMA FA67 57 MOV D,A FA68 7B MOV A,E FA69 2F CMA FA6A 5F MOV E,A FA6B 13 INX D ;COMPLIMENT D,E FA6C 19 DAD D ;H,L=# CHARS TO END-1 FA6D E5 PUSH H FA6E C1 POP B ;B,C=#CHARS TO END FA6F E1 POP H ;CURRENT POSITION CURSOR FA70 C9 RET ;*********************** ;ESCAPE CODE PROCESSING ;************************ FA71 E6F3 HIGH128 ANI 0F3H FA73 F604 ORI 4H FA75 EB XCHG ;H,L=SETCMD ADDR FA76 E9 PCHL ;GRAPHIC MODE 256 CHAR ROM,NO INVERSE VIDIO FA77 F60C GRAPHIC ORI 0CH FA79 EB XCHG ;H,L=SETCMD ADDR FA7A E9 PCHL ;LOWER HALF OF ROM+REVERSE VIDIO FA7B E6F3 LOW128 ANI 0F3H FA7D F608 ORI 8H FA7F EB XCHG ;H,L=SETCMD ADDR FA80 E9 PCHL ;SCROLL TOGGLE FA81 EE80 SCRL XRI 80H FA83 EB XCHG ;H,L=SETCMD ADDR FA84 E9 PCHL ;UPPER LOWER CASE TOGGLE FA85 EE20 UPLOW XRI 20H FA87 EB XCHG ;H,L=SETCMD ADDR FA88 E9 PCHL ;INVERSE VIDIO TOGGLE FA89 EE10 VIDIO XRI 10H FA8B EB XCHG ;H,L=SETCMD ADDR FA8C E9 PCHL ;# LINES PER PAGE SWITCH FA8D EE02 LINES XRI 02H FA8F EB XCHG ;H,L=SETCMD ADDR FA90 E9 PCHL ;#COLS/LINE TIGGLE FA91 EE01 COLS XRI 01H FA93 EB XCHG ;H,L=SETCMD ADDR FA94 E9 PCHL ;************************************** ;INSERT CURSOR CHAR AT PROPER POSITION ;************************************* FA95 2A8FF7 INSCURS LHLD CURPTR FA98 7E MOV A,M FA99 3292F7 STA CCUR ;SAVE CHAR UNDER CURSOR FOR GRAPHICS MODE FA9C F680 ORI 80H ;BIT 7 FOR INVERSE VIDIO FA9E 77 MOV M,A ;STORE BACK FA9F 3A83F7 LDA VDIMDE FAA2 B7 ORA A FAA3 C0 RNZ ;NO GRAPHICS FAA4 367F MVI M,7FH ;BLOCK FOR GRAPHICS MODE FAA6 C9 RET ; ;**************************************** ;CLEAR TABS ;***************************************** FAA7 2195F7 CLRTBS LXI H,TAB ;TABS BITS FAAA 060A MVI B,10 ;#BYTES FOR TABS FAAC AF XRA A FAAD 77 CLRT1 MOV M,A FAAE 23 INX H FAAF 05 DCR B FAB0 C2ADFA JNZ CLRT1 FAB3 C379F8 JMP ESCRET ;PUT IN CURSOR ;*********************************** ;SET OR CLEAR TAB TOGGLE BIT ;********************************** FAB6 CDC4FA SETTAB CALL FNDTB FAB9 EE80 XRI 80H ;INVERT TAB BIT FABB 0F SETD2 RRC FABC 05 DCR B FABD C2BBFA JNZ SETD2 FAC0 12 STAX D ;STORE TAB BYTE FAC1 C379F8 JMP ESCRET ;DO CURSOR ;FIND TAB BIT, LEAVE IN A REG BIT 7 FAC4 3A81F7 FNDTB LDA CURCOL ;COL # FAC7 67 MOV H,A FAC8 24 INR H FAC9 1195F7 LXI D,TAB ;WORD PTR FACC 0E08 FNDTB1 MVI C,8 ;BIT COUNTER FACE 25 DCR H FACF CADAFA JZ FNDTDN ;FOUND IT FAD2 0D DCR C ;BIT COUNTER FAD3 C2CEFA JNZ FNDTB1+2 FAD6 13 INX D ;PT AT NEXT BYTE FAD7 C3CCFA JMP FNDTB1 FADA 1A FNDTDN LDAX D ;GET TAB BYTE BITS FADB 41 MOV B,C ;SAVE COUNT OF BITS FADC 07 FNDTB2 RLC FADD 0D DCR C FADE C2DCFA JNZ FNDTB2 ;ROTATE UNTIL FOUND FAE1 C9 RET ; ;*************************************************************** ;TAB TO BEGINNING OF NEXT UNPROTECTED FIELD OR TAB OR HOME IF NONE ;***************************************************************** FAE2 AF TABB XRA A FAE3 32A4F7 STA PRUPRF ;PROTECT/UNPROTECT TRANSITION FLAG FAE6 CD26FB TAB3 CALL BMPC ;BUMP CURSOR POSITION FAE9 C2F1FA JNZ TAB1 ;NO LINE FEED NECESSARY FAEC 34 INR M ;BUMP LINE # FAED BE CMP M ;EXCEED LPAGE? FAEE FA0DF9 JM SCROLL3 ;YES,HOME AND RETURN FAF1 3A91F7 TAB1 LDA PRTMD ;PROTECT MODE FLAG FAF4 EB XCHG ;H,L PTS AT CHAR FAF5 A6 ANA M ;PROTECTED? FAF6 7E MOV A,M ;GET CHAR FAF7 11A4F7 LXI D,PRUPRF ;TRANSITION FLAG FAFA F201FB JP TAB2 ;NO PROTECTED FIELD FAFD 12 STAX D ;SET TRANSITION FLAG FAFE C3E6FA JMP TAB3 FB01 1A TAB2 LDAX D ;GET TRANSITION FLAG FB02 B7 ORA A FB03 F8 RM ;UNPROT FIELD WITH TRANSITION FB04 CDC4FA CALL FNDTB ;FIND TAB POSITION BIT FB07 B7 ORA A ;SET FLAGS FB08 F8 RM ;TAB IS SET FB09 C3E6FA JMP TAB3 ;************************************************ ;CALCULATE CURSOR POSITION FROM CURLIN AND CURCOL ;************************************************** FB0C 2A9FF7 CALPOS LHLD CLINE ;CHARS/LINE-1 FB0F EB XCHG FB10 2A80F7 LHLD CURLIN ;L=CURLIN,H=CURCOL FB13 4C MOV C,H FB14 45 MOV B,L FB15 2100F0 LXI H,REFRESH ;BOTTOM OF REFRESH MEMORY FB18 04 INR B FB19 05 CALPOS1 DCR B ;DONE YET FB1A CA21FB JZ CALPOS2 ;YES FB1D 19 DAD D ;ADD ANOTHER LINE OF CHARS FB1E C319FB JMP CALPOS1 FB21 09 CALPOS2 DAD B ;ADD CURRENT COL FB22 228FF7 SHLD CURPTR ;SAVE FB25 C9 RET ;************************** ;BMPC BUMP CURSOR 1 PLACE. ON RETURN ; D,E=CURSOR POSITION ; H,L=CURCOL PTR OR CURLIN PTR DEPENDING ON Z FLAG ; Z FLAG=0 IF NO LINE FEED NEEDED,1 IF LINE FEED NEEDED ; CURLIN AND CURCOL AND CURPTR ARE UPDATED AS IF LINE FEED ; A REG =LPAGE IF LINE FEED NEEDED ;********************************************************** FB26 2A8FF7 BMPC LHLD CURPTR FB29 23 INX H FB2A 228FF7 SHLD CURPTR ;UPDATE ABS CURSOR ADDRESS FB2D EB XCHG ;D,E=PTR FB2E 2181F7 LXI H,CURCOL FB31 34 INR M ;BUMP COLUMN FB32 3A9FF7 LDA CLINE ;MAX COLS/LINE FB35 96 SUB M ;ZERO IF EXCEED LINE FB36 C0 RNZ ;OK AS IS FB37 77 MOV M,A ;COL=0 FB38 2B DCX H FB39 3AA1F7 LDA LPAGE ;MAX LINES/PAGE FB3C C9 RET ;************************************************ ;ADDRESSABLE CURSOR FUNCTION ;******************************** FB3D 2185F7 ADDCURS LXI H,ESCCNT ;PT AT ESCAPE COUNT FB40 1180F7 LXI D,CURLIN ;PT AT CURRENT LINE COUNT FB43 3A93F7 LDA CCHAR FB46 D620 SUI 20H ;REMOVE OFFSET FOR COUNT FB48 47 MOV B,A FB49 7E MOV A,M ;GET COUNT FB4A D603 SUI 3 FB4C F8 RM ;NO VALID NUMBS YET FB4D C259FB JNZ XADD ;X AXIS VALUE ;Y-AXIS VALUE FB50 3AA1F7 LDA LPAGE FB53 12 XADD3 STAX D ;MAX LINE # FB54 B8 CMP B FB55 F8 RM FB56 78 MOV A,B FB57 12 STAX D FB58 C9 RET FB59 3600 XADD MVI M,0 ;ESCCNT=0 FB5B 3A9FF7 LDA CLINE ;MAX COL/LINE FB5E 13 INX D FB5F 3D DCR A FB60 C353FB JMP XADD3 ; ;******************************************************** ;INSERT CHAR AT CURSOR POSITION.EITHER WRITES OVER PREVIOS ;CHAR OR PUSHES ENTIRE FIELD OVER ONE CHAR BEFORE INSERTING. ;************************************************************ FB63 2A8FF7 INSCHR LHLD CURPTR ;CURSOR ADDRESS FB66 E5 PUSH H ;SAVE FB67 3A84F7 LDA INSRT ;INSERT FLAG FB6A B7 ORA A FB6B CA7AFB JZ INSC3 ;OVERWRITE FB6E CDEEF9 CALL CHARLN FB71 0B DCX B ;3CHARS-1 TO END FB72 09 DAD B ;H,L PTS AT LAST CHAR ON LINE FB73 54 MOV D,H FB74 5D MOV E,L FB75 1B DCX D ;D,E PTS AT SOURCE FB76 EB XCHG ;H,L=SOURCE,D,E=DEST FB77 CD87FB CALL MVCDN ;MOVE CHARS RIGHT FB7A E1 INSC3 POP H ;CURSOR POSITION FB7B 3A82F7 LDA INVIDIO FB7E E680 ANI 80H FB80 47 MOV B,A ;INVERT BIT FB81 3A93F7 LDA CCHAR FB84 B0 ORA B ;MERGE WITH INVERT BIT FB85 77 INSC4 MOV M,A FB86 C9 RET ;******************************************************** ;SHIFT CHARS RIGHT FROM D,E TO H,L, B,C CHARS FROM RIGHT ;******************************************************** FB87 79 MVCDN MOV A,C FB88 B0 ORA B FB89 C8 RZ ;DONE FB8A 7E MOV A,M FB8B 12 STAX D FB8C 2B DCX H FB8D 1B DCX D FB8E 0B DCX B FB8F C387FB JMP MVCDN I ; ; CONTROL FUNCTION JUMP TABLE FB92 = CTRTBL EQU $ FB92 0D DB 0DH ;CARRIAGE RETURN FB93 8BF9 DW CRET FB95 0A DB 0AH ;LINE FEED FB96 F6F8 DW LFEED FB98 0B DB 0BH ;UP CURSOR (CTRL K) FB99 84F9 DW UPLINE FB9B 0C DB 0CH ;FORWARD CURSOR (CTRL L) FB9C E7F8 DW BMPCUR FB9E 08 DB 08H ;BACK CURSOR (CTRL H) FB9F 85F9 DW BCKLNE FBA1 1E DB 1EH ;HOME CURSOR (CTRL ^) FBA2 B8F9 DW HOME FBA4 1A DB 1AH ;SCREEN ERASE (CTRL Z) FBA5 9FF9 DW BLNKS FBA7 15 DB 15H ;CLEAR TO EOL (CTRL U) FBA8 BFF9 DW BLANKL FBAA 16 DB 16H ;PROTECTED FIELDS (CTRL V) FBAB D7F9 DW PROTC FBAD 09 DB 09H ;TAB (CTRL I) FBAE E2FA DW TABB FBB0 7F DB 7FH ;DELETE CHAR (RUBOUT) FBB1 DDF9 DW DELETE FBB3 14 DB 14H ;INSERT MODE (CTRL T) FBB4 98F9 DW INSMDE FBB6 04 DB 04H ;DELETE LINE CTRL D FBB7 29FA DW DLINE FBB9 05 DB 05H ;INSERT LINE (CTRL E) FBBA 36FA DW ENLINE FBBC 10 DB 10H ;PROTECTED MODE TOGGLE (CTRL P) FBBD 92F9 DW PRTECT FBBF 00 DB 0 ;TERMINATOR ; ESCAPE FUNCTION JUMP TABLE FBC0 = ESCTBL EQU $ FBC0 1D DB 1DH ;CURSOR CONTROL ('=' LESS BIT 5 LOWER CASE) FBC1 3DFB DW ADDCURS FBC3 49 DB 49H ;SET TAB FBC4 B6FA DW SETTAB FBC6 09 DB 09H ;CLEAR TABS FBC7 A7FA DW CLRTBS FBC9 54 DB 'T' ;LOWER 128 BYTES OF ROM FBCA 7BFA DW LOW128 FBCC 45 DB 'E' ;EXTENDED MODE UPPER 128 FBCD 71FA DW HIGH128 FBCF 47 DB 'G' ;GRAPHIC SET FBD0 77FA DW GRAPHIC FBD2 53 DB 'S' ;SCROLL TOGGLE FBD3 81FA DW SCRL FBD5 55 DB 'U' ;UPPER/LOWER CASE FBD6 85FA DW UPLOW FBD8 56 DB 'V' ;INVERSE VIDIO TOGGLE FBD9 89FA DW VIDIO FBDB 4C DB 'L' ;LINES/PAGE FBDC 8DFA DW LINES FBDE 43 DB 'C' ;COLS/LINE FBDF 91FA DW COLS FBE1 00 DB 0 ;TERMINATOR I ; ;******************************************************* ;8085 MONITOR PROGRAM USING THE VIO FIRMWARE ; COPYRIGHT IMSAI MANUFACTURING COMPANY, INC. ; SAN LEANDRO,CALIFORNIA ; 6/7/77 ;******************************************************* FBE2 31FFF7 MONT LXI SP,REFRESH+7FFH ;TOP OF MEMORY FBE5 3EAA MVI A,0AAH FBE7 D303 OUT 3 FBE9 2F CMA FBEA D303 OUT 3 FBEC 2F CMA FBED D303 OUT 3 FBEF 3E27 MVI A,27H FBF1 D303 OUT 3 ;SET UP USART FBF3 CD15F8 CALL INIT ;INIT VIO FBF6 2129FC LXI H,SIGNON FBF9 CDB6FF CALL MSGNC ;SIGNON MSG FBFC 31FFF7 PRMPT LXI SP,REFRESH+7FFH FBFF CD50FF CALL CRLF FC02 3E3F MVI A,'?' FC04 CD7EF8 CALL CHAROUT FC07 CD10FF CALL CHIN ;GET COMMAND FC0A 47 MOV B,A ;SAVE IT FC0B 11FCFB LXI D,PRMPT FC0E D5 PUSH D ;RETURN ADDRESS FC0F 2A8BF7 LHLD USERCMD ;USER COMMAND TABLE FC12 7C MOV A,H FC13 B7 ORA A ;SET FLAGS FC14 78 MOV A,B ;RETRIEVE CODE FC15 CA1EFC JZ NUCMD ;NO USER COMMAND TABLE FC18 CD11FA CALL LOOKUP ;LOOKUP IN USER TABLE FC1B C228FC JNZ FNDCMD ;FOUND COMMAND FC1E 78 NUCMD MOV A,B ;GET COMMAND AGAIN FC1F 21C0FF LXI H,CMDTBL ;COMAND TABLE PTR FC22 CD11FA CALL LOOKUP FC25 C8 RZ ;NO ENTRY,PROMPT AGIN FC26 0601 MVI B,1 ;FOR PROT/UNPROT FC28 E9 FNDCMD PCHL ;GO TO ROUTINE FC29 494D534149SIGNON DB 'IMSAI SMP/80.0',0 FC38 434F505952 DB 'COPYRIGHT 6/77' ; ;************************************************* ;JUMP TO MEMORY "JAAAA" ;CALL MEMORY WITH RETURN TO MONITOR ;*********************** FC46 D1 JUMP POP D ;REMOVE RETURN ADDRESS FC47 CD5BFF CALL1 CALL IHEX ;GET JUMP ADDRESS FC4A E9 PCHL ;DO IT ;*************************************** ;ENTER BYTE INTO MEMORY AND MODIFY IF DESIRED ;****************************************************** FC4B CD5BFF ENTR CALL IHEX ;START ADDR FC4E CD50FF CALL CRLF FC51 CDB6FC CALL OHEXHL ;DISPLAY ADDRESS FC54 7E MOV A,M ;GET BYTE IN MEMORY FC55 5F MOV E,A ;PRESET FOR IHEX FC56 CDADFC CALL OHEXB ;DISPLAY BYTE FC59 EB XCHG ;D,E=ADDRESS,L=DEFAULT CHAR FC5A CD5EFF CALL IHEX+3 ;GET MODIFIER OR DEFAULT FC5D EB XCHG ;H,L=ADDR,E=BYTE FC5E 73 MOV M,E FC5F 2B DCX H FC60 FE0A CPI 0AH ;DONE? FC62 C8 RZ ;YES FC63 FE2D CPI '-' ;BACKWARD FC65 CA4EFC JZ ENTR+3 ;YES FC68 23 INX H FC69 23 INX H ;DEFAULT FORWARD FC6A C34EFC JMP ENTR+3 ;***************************************************** ;DISPLAY MEMORY "D,START,END CR" ;************************************* FC6D CD20FD DISP CALL SIZE ;H,L=START,B,C=SIZE FC70 3A94F7 LDA CTRLC ;#LINES/COLS FC73 0F RRC ;#LINES BIT IN CARRY FC74 0F RRC FC75 160C MVI D,12 FC77 DA7CFC JC $+5 FC7A 1618 MVI D,24 FC7C CD50FF DISP2 CALL CRLF FC7F DB03 IN 3 FC81 E602 ANI 2 ;ANY INPUT FC83 C0 RNZ ;YES,INTERRRUPT FC84 1E08 MVI E,8 FC86 3A94F7 LDA CTRLC FC89 0F RRC FC8A DA8FFC JC $+5 FC8D 1E10 MVI E,16 FC8F CDB6FC CALL OHEXHL ;OUTPUT ASCII H,L REG FC92 7E DISP1 MOV A,M ;GET DATA BYTE FC93 CDADFC CALL OHEXB ;OUTPUT WITH TRAIL BLANK FC96 23 INX H FC97 0B DCX B FC98 78 MOV A,B FC99 B1 ORA C FC9A C8 RZ ;DONE FC9B 1D DCR E FC9C C292FC JNZ DISP1 ;KEEP WITH CURRENT LINE FC9F 15 DCR D ;FILLED PAGE YET? FCA0 C27CFC JNZ DISP2 FCA3 CD10FF CALL CHIN ;WAIT FOR PAGE PROMT FCA6 C370FC JMP DISP+3 ;**************************** ;ALLOW ESCAPE SEQUENCES TO CONTROL ;********************************* FCA9 CD10FF ESCAP CALL CHIN ;READ ESCAPE SEQUENCE CODE FCAC C9 RET ;******************************** ;OUTPUT HEX WITH TRAILING BYTE ;****************************** FCAD CD9AFF OHEXB CALL OHEX FCB0 3E20 MVI A,' ' FCB2 CD7EF8 CALL CHAROUT FCB5 C9 RET ;******************************** ;OUTPUT 16 BIT ASCII HEX FROM H,L ;********************************* FCB6 7C OHEXHL MOV A,H FCB7 CD9AFF CALL OHEX FCBA 7D MOV A,L FCBB CDADFC CALL OHEXB FCBE C9 RET ;******************************************* ;PROTECT /UNPROTECT RAM4A-4 MEMORY ;****************************************** FCBF 04 PROT INR B ;PROTECT/UNPROTECT FLAG FCC0 CD3AFF UNPRT CALL PARM2 ;GET START,END ADDRESSES IN H,L D,E FCC3 7A MEMP MOV A,D FCC4 E6FC ANI 0FCH ;GET 1K OFFSET ONLY FCC6 B0 ORA B FCC7 57 MOV D,A FCC8 7C MOV A,H FCC9 E6FC ANI 0FCH FCCB B0 ORA B FCCC D3FE PROT1 OUT 0FEH ;DO IT FCCE BA CMP D ;DONE? FCCF C8 RZ ;YES FCD0 C604 ADI 4 ;SET FOR NEXT 1K BLOCK FCD2 C3CCFC JMP PROT1 ;************************************************** ;INTEL LOADER LOADS INTEL FORMAT TAPES FROM ;TELETYPE (PORT 2,3) ;*********************************************** FCD5 CD10FF INTEL CALL CHIN ;READ WITHOUT ECHO FCD8 DE3A SBI ':' ;RCORD MARKER? FCDA C2D5FC JNZ INTEL ;NO FCDD 57 MOV D,A ;ZERO CHECKSUM FCDE CD04FD CALL IBYTE ;INPUT 2 HEX CHARS FCE1 B7 ORA A ;SET FLAGS FCE2 C8 RZ ;COUNT =0 MEANS END FCE3 57 MOV D,A ;BYTE COUNT FCE4 CD04FD CALL IBYTE FCE7 67 MOV H,A FCE8 CD04FD CALL IBYTE FCEB 6F MOV L,A FCEC CD04FD CALL IBYTE ;DUMMY RECORD TYPE IGNORED FCEF CD04FD DATA CALL IBYTE FCF2 77 MOV M,A FCF3 23 INX H FCF4 15 DCR D FCF5 C2EFFC JNZ DATA FCF8 CD04FD CALL IBYTE ;READ AND ADD CHECKSUM FCFB CAD5FC JZ INTEL ;OK AS IS FCFE 3E43 MVI A,'C' FD00 CD7EF8 CALL CHAROUT ;ERROR MESSAGE FD03 C9 RET ;************************* ;READ 2 ASCII HEX BYTES AND CONVERT TO BINARY ;******************************************** FD04 CD10FF IBYTE CALL CHIN ;READ CHAR FD07 CD74FF CALL ASBI ;CONVERT TO BINARY FD0A DA07FE JC ERR2 FD0D 87 ADD A FD0E 87 ADD A FD0F 87 ADD A FD10 87 ADD A FD11 5F MOV E,A ;SAVE FD12 CD10FF CALL CHIN FD15 CD74FF CALL ASBI FD18 DA07FE JC ERR2 ;INVALID ASCII HEX CHAR FD1B 83 ADD E FD1C 5F MOV E,A ;SAVE CHAR FD1D 82 ADD D ;ADD TO CHECKSUM FD1E 57 MOV D,A FD1F C9 RET ;************************************************* ;SIZE INPUTS START,END ADDR AND CONVERTS TO START ; AND SIZE IN H,L AND B,C ;************************************************* FD20 CD3AFF SIZE CALL PARM2 ;H,L=START D,E=END FD23 F5 PUSH A FD24 7B MOV A,E FD25 95 SUB L ;LOW BYTE SIZE FD26 4F MOV C,A FD27 7A MOV A,D FD28 9C SBB H ;HIGH BYTE SIZE FD29 47 MOV B,A FD2A 03 INX B ;ADD 1 FD2B F1 POP A FD2C C9 RET ;******************************************** ;MEMORY MOVE "M SOURCE BEG,SOURCE END,DEST BEG" ;*********************************************** FD2D CDD7FD MOVE CALL PARM4 ;START,END,DEST FD30 CDDDFD MOVE1 CALL MVCUP ;DO MOVE FD33 C9 RET ;****************************** ;FILL MEMORY WITH CHAR ;**************************** FD34 CDD7FD FILL CALL PARM4 ;START,END,FILL CHAR IN L FD37 7B MOV A,E ;FILL CHAR FD38 77 MOV M,A ;STORE IN FIRST LOCATION FD39 0B DCX B FD3A 54 MOV D,H FD3B 5D MOV E,L ;DEST ADDR FD3C 13 INX D ;=START ADDR+1 FD3D C330FD JMP MOVE1 ;******************************* ;MEMORY TEST ROUTINE ;**************************** FD40 CD20FD MEMTEST CALL SIZE ;H,L=START,B,C=SIZE FD43 0B DCX B ;B,C=SIZE-1 OR 0 FD44 AF MEM2 XRA A FD45 56 MOV D,M ;SAVE CELL FD46 77 MEM1 MOV M,A FD47 BE CMP M FD48 C25DFD JNZ MEMERR ;NOT GOOD FD4B 3D DCR A ;NEXT PATTERN FD4C C246FD JNZ MEM1 FD4F 72 MOV M,D ;RESTORE MEMORY FD50 DB03 IN 3 FD52 E602 ANI 2 ;BAIL OUT? FD54 C0 RNZ ;YES FD55 23 INX H FD56 0B DCX B FD57 78 MOV A,B FD58 B1 ORA C FD59 C244FD JNZ MEM2 FD5C C9 RET FD5D 23 MEMERR INX H ;ADJUST FOR PRNMEM FD5E 5F MOV E,A ;SAVE FD5F CD8DFF CALL PNTMEM ;PRINT ADDR,CONTENTS FD62 7B MOV A,E ;RESTORE FD63 C389FF JMP SRCPNT1 ;PRINT SOULD BE ;********************************** ;DO DIRECT INPUT/OUTPUT FROM SPECIFIED PORT ;************************************* FD66 05 INPORT DCR B ;B=0=INPUT,B=1=OUTPUT FD67 CD3AFF OUTPORT CALL PARM2 ;INPUT PORT,VALUE IN H,L AND D,E FD6A 78 MOV A,B ;FLAG FD6B 07 RLC FD6C 07 RLC FD6D 07 RLC FD6E EE08 XRI 08H ;INVERT BIT 3 FD70 F6D3 ORI 0D3H ;FORM I/O INST FD72 55 MOV D,L FD73 2A8DF7 LHLD RAMPTR ;GET AVAIL RAM PTR FD76 77 MOV M,A FD77 BE CMP M FD78 C0 RNZ ;INVALID RAM FD79 E5 PUSH H FD7A 23 INX H FD7B 72 MOV M,D ;PORT # FD7C 23 INX H FD7D 36C9 MVI M,0C9H ;RETURN FD7F 2187FD LXI H,IORET FD82 E3 XTHL ;PUT RETURN ADDRESS,GET START ADDR FD83 78 MOV A,B FD84 B7 ORA A ;SET FLAG FOR IN OR OUT FD85 7B MOV A,E ;OUTPUT BYTE FD86 E9 PCHL FD87 C0 IORET RNZ ;DONE IF OUTPUT INST FD88 CDADFC CALL OHEXB ;PRINT VALUE IF INPUT FD8B C9 RET ;******************************** ;SET FREE RAM PTR FOR DIRECT IO INSTS ;*********************************** FD8C CD5BFF RAMFND CALL IHEX ;GET RAM ADDR FD8F 228DF7 SHLD RAMPTR ;SAVE IN VIO RAM FD92 C9 RET ;************************************************ ;COMPARE MEMORY BLOCKS AND PRINT DIFFERENCES ;********************************************** FD93 CDD7FD CMPBLK CALL PARM4 ;START,SIZE,DEST IN HL BC,DE FD96 1A CMPBLK1 LDAX D ;DEST BYTE FD97 BE CMP M ;SAME AS SOURCE BYTE? FD98 23 INX H FD99 13 INX D FD9A CAA5FD JZ CMPB1 ;YES, NO PRINT FD9D CD8DFF CALL PNTMEM ;PRINT ADDR,SOURCE DEST FDA0 EB XCHG FDA1 CD90FF CALL PNTMEM+3 ;NO CRLF FDA4 EB XCHG FDA5 0B CMPB1 DCX B FDA6 78 MOV A,B FDA7 B1 ORA C FDA8 C8 RZ ;YES,RETURN FDA9 DB03 IN 3 FDAB E602 ANI 2 FDAD C0 RNZ ;BAIL OUT FDAE C396FD JMP CMPBLK1 ;**************************************** ;SEARCH MEMORY FOR MASKED 16 BIT VALUE ;S,FROM,TO,16BIT VALUE,16 BIT MASK ;***************************************** FDB1 CDD7FD SEARCH CALL PARM4 ;START,SIZE,VALUE IN H,L B,C D,E FDB4 E5 PUSH H ;SAVE FDB5 21FFFF LXI H,-1 ;DEFAULT MASK ALL FDB8 FE0A CPI 0AH ;USER SPECIFIED MASK? FDBA C45BFF CNZ IHEX ;YES,READ IT INTO H,L FDBD E3 XTHL ;MASK ON STACK,START IN H,L FDBE 7E SEARCH1 MOV A,M ;LOW BYTE FDBF E3 XTHL ;H,L=MASK VALUE FDC0 A4 ANA H ;MASK HIGH BYTE FDC1 BA CMP D ;IS IT CORRECT VALUE? FDC2 E3 XTHL ;RESTORE START PTR FDC3 23 INX H ;BUMP PTR FDC4 C2CFFD JNZ CMP16 ;NO MATCH FDC7 7E MOV A,M ;LOW BYTE FDC8 E3 XTHL ;GET MASK IN H,L FDC9 A5 ANA L FDCA BB CMP E FDCB E3 XTHL ;H,L=START,STACK=MASK FDCC CC85FF CZ SRCPNT ;PRINT MATCH IF FOUND FDCF 0B CMP16 DCX B FDD0 78 MOV A,B FDD1 B1 ORA C FDD2 C2BEFD JNZ SEARCH1 FDD5 C1 POP B ;REMOVE MASK VALUE FDD6 C9 RET ;******************************* ;PARM4 INPUTS START,END,VALUE AND ;CONVERTS TO START,SIZE,VALUE IN H,L B,C AND D,E ;RESPECTIVELY ;************************************************** FDD7 CD20FD PARM4 CALL SIZE FDDA C34AFF JMP PARM3 ;************************************** ;MVCUP MOVE B,C CHARS FROM H,L TO D,E FROM BOTTOM ;************************************************ FDDD 78 MVCUP MOV A,B FDDE B1 ORA C FDDF C8 RZ FDE0 7E MOV A,M FDE1 12 STAX D ;MOVE IT FDE2 0B DCX B FDE3 23 INX H FDE4 13 INX D FDE5 C3DDFD JMP MVCUP ;KEEP GOING ;************************************************* ;LOAD OR EXECUTE CASETTE FILE USING HEADER OR ;USER SPECIFIED START,END,EXEC ADDRESSES ;************************************************** FDE8 05 EXEC DCR B ;EXECUTE FLAG FDE9 C5 LOAD PUSH B ;SAVE EXEC/LOAD FLAG FDEA CD3AFF CALL PARM2 ;ANY PARMS SPECIFIED? FDED 7A MOV A,D FDEE B3 ORA E FDEF CA04FE JZ HEADER ;NO PARMS,OR NOT ENOUGH PARMS ;SKIP HEADER IF PRESENT FDF2 E5 PUSH H ;START FDF3 D5 PUSH D ;END FDF4 CD5BFF CALL IHEX ;GET EXEC IF ANY FDF7 E5 PUSH H ;EXEC ADDR FDF8 CD66FE CALL RDHEAD ;READ HEADER IF THERE FDFB C212FE JNZ RDRCRDS ;NOT THERE DO OBLECT FDFE F1 POP A FDFF F1 POP A FE00 F1 POP A ;REMOVE HEADER PARMS FE01 C312FE JMP RDRCRDS ;DO OBJECT FE04 CD66FE HEADER CALL RDHEAD ;READ HEADER FE07 3E54 ERR2 MVI A,'T' ;TYPE CODE ERROR FE09 CA12FE JZ RDRCRDS ;NO ERROR FE0C CD7EF8 ERR1 CALL CHAROUT FE0F C3FCFB JMP PRMPT ;BAIL OUT FE12 C1 RDRCRDS POP B ;EXEC FE13 E1 POP H ;END FE14 D1 POP D ;START FE15 C5 PUSH B ;RETURN EXEC ADDR FE16 E5 PUSH H ;END FE17 D5 PUSH D ;START FE18 7D MOV A,L FE19 93 SUB E FE1A 6F MOV L,A FE1B 7C MOV A,H FE1C 9A SBB D FE1D 67 MOV H,A FE1E 29 DAD H FE1F 4C MOV C,H FE20 0C INR C ;RECORD COUNT TO READ FE21 CDC2FE RDRCRD CALL CASIN ;TYPE CODE FE24 FE81 RDRCRD1 CPI 81H ;ABS BINARY? FE26 C207FE JNZ ERR2 ;TYPE CODE ERROR FE29 CDC2FE CALL CASIN ;BYTE COUNT FE2C 47 MOV B,A ;SAVE RECORD BYTE COUNT FE2D 210000 LXI H,0 ;0 CHECKSUM FE30 CDD0FE RDATA CALL CASINCK ;READ DATA BYTE FE33 12 STAX D ;STORE IT FE34 13 INX D FE35 05 DCR B FE36 C230FE JNZ RDATA ;CONTINUE IF NOT DONE FE39 D5 PUSH D ;SAVE MEMORY PTR FE3A EB XCHG ;DE=CHECKSUM FE3B CD07FF CALL CASWD ;READ TAPE CHECKSUM FE3E 65 MOV H,L FE3F 6F MOV L,A ;REVERSE BYTES FE40 19 DAD D ;ADD TO COMPUTED CHECKSUM FE41 7C MOV A,H FE42 B5 ORA L FE43 3E43 MVI A,'C' ;CHECKSUM ERROR FE45 C47EF8 CNZ CHAROUT ;TYPE 'C' FE48 C250FE JNZ $+8 FE4B 3E2A MVI A,'*' FE4D CD7EF8 CALL CHAROUT ;TYPE * FOR GOOD RECORD FE50 D1 POP D ;RETRIEVE MEMORY PTR FE51 0D DCR C ;ALL RECORDS READ YET FE52 C221FE JNZ RDRCRD ;NO READ ANOTHER FE55 CD50FF CALL CRLF FE58 0E03 MVI C,3 FE5A E1 LP2 POP H FE5B CDB6FC CALL OHEXHL FE5E 0D DCR C FE5F C25AFE JNZ LP2 FE62 F1 POP PSW ;EXEC/LOAD FLAG FE63 1F RAR FE64 D8 RC ;DONE FE65 E9 PCHL ;****************************** ;READ HEADER RECORD ;********************** FE66 CD8EFE RDHEAD CALL CASINIT ;INIT CASETTE FE69 CDC2FE CALL CASIN ;READ TYPE CODE FE6C FE01 CPI 1 ;HEADER RECORD? FE6E C0 RNZ ;NO FE6F CDC2FE CALL CASIN ;RECORD LENGTH FE72 0E05 MVI C,5 ;NAME SIZE FE74 CDC2FE NM1 CALL CASIN ;NAME BYTE FE77 CD7EF8 CALL CHAROUT ;DISPLAY IT FE7A 0D DCR C FE7B C274FE JNZ NM1 ;DO IT TILL DONE FE7E 0E03 MVI C,3 FE80 CD07FF ADDRS CALL CASWD ;INPUT START,END,EXEC FE83 E3 XTHL ;EXCH RETURN ADDR WITH PARM FE84 E5 PUSH H ;PUSH RETURN ADDR AGAIN FE85 0D DCR C FE86 C280FE JNZ ADDRS FE89 CD07FF CALL CASWD ;DUMMY CHECKSUM FE8C AF XRA A ;ZER FLAGS FOR NORMAL RETURN FE8D C9 RET ;******************************************* ;CASINIT READ CASETTE UNTIL 32 SYNC BYTES READ ;********************************************** FE8E CDF6FE CASINIT CALL BYTESET ;READ FIRST SYNC FE91 061F MVI B,31 FE93 CDC2FE CASIN2 CALL CASIN FE96 FEE6 CPI 0E6H FE98 3E49 MVI A,'I' FE9A C20CFE JNZ ERR1 FE9D 05 DCR B FE9E C293FE JNZ CASIN2 FEA1 C9 RET ;******************************* ;CASETTE OUTPUT BYTE ;************************** FEA2 F5 CASOUT PUSH A ;SAVE IT FEA3 DB03 IN 3 FEA5 E604 ANI 4 FEA7 CAA3FE JZ CASOUT+1 FEAA F1 POP A FEAB D300 OUT 0 ;WRITE BYTE FEAD C9 RET ;***************************** ;GENERATE SYNC STREAM ;*************************** FEAE CD5BFF GEN CALL IHEX ;WAIT FOR RETURN FEB1 3E10 MVI A,10H FEB3 D303 OUT 3 ;WRITE ENABLE MIO FEB5 3EE6 GEN1 MVI A,0E6H FEB7 CDA2FE CALL CASOUT FEBA DB03 IN 3 FEBC E602 ANI 2 FEBE C0 RNZ FEBF C3B5FE JMP GEN1 ;**************************************** ;READ BYTE FROM CASETTE WITHOUT CHECKSUM ;************************************************ FEC2 DB03 CASIN IN 3 FEC4 0F RRC FEC5 0F RRC ;C=SERIAL READY FEC6 DAFCFB JC PRMPT ;BAIL OUT FEC9 0F RRC ;C=CASETTE READY FECA D2C2FE JNC CASIN ;KEEP TRYING FECD DB00 IN 0 ;DATA PORT FECF C9 RET ;***************************************** ;CASINCK- READ BYTE WITH CHECKSUM ;************************************** FED0 CDC2FE CASINCK CALL CASIN FED3 C5 CHKSUM PUSH B FED4 4F MOV C,A ;NEW CHAR IN LOW BYTE FED5 0600 MVI B,0 FED7 09 DAD B ;ADD TO CHECKSUM FED8 C1 POP B ;RESTORE FED9 C9 RET ;**************************** ;ALLIGN CASETTE BY READING AND DISPLAYING BYTES ;******************************************* FEDA CD10FF ALIGN CALL CHIN ;WAIT FOR CR FEDD CDF6FE CALL BYTESET FEE0 2100F0 ALL4 LXI H,REFRESH FEE3 11E101 LXI D,481 ;FILL SMALLEST SCREEN FEE6 1B ALL3 DCX D FEE7 7A MOV A,D FEE8 B3 ORA E FEE9 CAE0FE JZ ALL4 ;START AGAIN EVERY 256 CHARS FEEC 367F MVI M,7FH FEEE CDC2FE CALL CASIN ;READ NEXT CHAR FEF1 77 MOV M,A ;PUT IN SCREEN FEF2 23 INX H FEF3 C3E6FE JMP ALL3 ;******************************* ;GET CASETTE IN BYTE MODE IE READ FIRST 0E6H ;******************************************* FEF6 3E60 BYTESET MVI A,60H ;BIT MODE FEF8 D303 OUT 3 FEFA CDC2FE BYTE1 CALL CASIN ;READ BYTE EVERY BIT TIME FEFD FEE6 CPI 0E6H ;SYNC YET FEFF C2FAFE JNZ BYTE1 ;NO FF02 3E20 MVI A,20H ;BYTE MODE FF04 D303 OUT 3 FF06 C9 RET ;******************************* ;CASWD-INPUT WORD TO H,L ADD FIRST BYTE ONLY ;TO CHECKSUM ;******************************************* FF07 CDC2FE CASWD CALL CASIN ;READ LOW BYTE FF0A 6F MOV L,A FF0B CDC2FE CALL CASIN ;READ HIGH BYTE FF0E 67 MOV H,A FF0F C9 RET ;******************************** ;CHARACTER INPUT ROUTINES ;**************************** FF10 CD21FF CHIN CALL CHIN1 FF13 FE03 CPI 03 ;CRTL C? FF15 CAE2FB JZ MONT ;YES,RESET AND PROMPT FF18 CD7EF8 CALL CHAROUT FF1B FE0D CPI 0DH FF1D CC50FF CZ CRLF ;ADD LINE FEED FF20 C9 RET FF21 DB03 CHIN1 IN 3 FF23 E602 ANI 2 FF25 CA21FF JZ CHIN1 FF28 DB02 IN 2 ;READ PORT 2 FF2A E67F ANI 7FH ;MASK PARITY FF2C C9 RET FF2D 0000000000 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 ;********************************** ;PARM2 READ 2 PARAMATERS 16 BITS EACH INTO H,L AND D,E ;******************************************************** FF3A CD5BFF PARM2 CALL IHEX FF3D 54 MOV D,H FF3E 5D MOV E,L FF3F FE0A CPI 0AH ;TERMINATED? FF41 C8 RZ ;YES,USE SAME VALUE FF42 FE2C CPI ',' FF44 CA4AFF JZ PARM3 FF47 FE20 CPI ' ' FF49 C0 RNZ ;INVALID FF4A EB PARM3 XCHG FF4B CD5BFF CALL IHEX ;GET SECOND PARM FF4E EB XCHG FF4F C9 RET ;*********************** ;CRLF DO CARRIAGE RETURN/LINE FEED ;********************************* FF50 3E0D CRLF MVI A,0DH FF52 CD7EF8 CALL CHAROUT FF55 3E0A MVI A,0AH FF57 CD7EF8 CALL CHAROUT FF5A C9 RET ;:************************************************ ;INPUT CHARS ASSUMED HEX AND CONVERT TO BINARY ;TERMINATES ON FIRST NO HEX CHAR WHICH IS LEFT ;IN A REG. H,L RETURNS WITH VALUE ;************************************************* FF5B 210000 IHEX LXI H,0 FF5E CD10FF CALL CHIN ;READ CHAR FF61 F5 PUSH A FF62 CD74FF CALL ASBI ;CONVERT TO BIBARY FF65 D26AFF JNC IHEX1 FF68 F1 POP A FF69 C9 RET FF6A 29 IHEX1 DAD H FF6B 29 DAD H FF6C 29 DAD H FF6D 29 DAD H ;ADD NEW DIGIT FF6E 85 ADD L FF6F 6F MOV L,A FF70 F1 POP A FF71 C35EFF JMP IHEX+3 ;************************************************ ;CONVERT ASCII HEX CHAR IN A-REG TO BINARY IN A REG ;RETURN WITH CARRY SET IF INVALID CHAR,RESET OTHERWISE ;******************************************************** FF74 D630 ASBI SUI 30H ;REMOVE ASCII BIAS FF76 D8 RC ;INVALID <0 FF77 FE0A CPI 10 FF79 DA83FF JC ASBI1 ;VALID 0-9 FF7C D611 SUI 17 FF7E D8 RC ;INVALID FF7F C60A ADI 10 FF81 FE10 CPI 16 ;SET CARRY IF <0FH FF83 3F ASBI1 CMC FF84 C9 RET ;***************************************** ;PRINT H,L AND 16 BIT MEMORY AT H,L ;************************************** FF85 CD8DFF SRCPNT CALL PNTMEM FF88 7E MOV A,M ;BYTE 2 FF89 CD9AFF SRCPNT1 CALL OHEX FF8C C9 RET FF8D CD50FF PNTMEM CALL CRLF FF90 2B DCX H ;BACK UP 1 FF91 CDB6FC CALL OHEXHL FF94 7E MOV A,M FF95 CDADFC CALL OHEXB FF98 23 INX H FF99 C9 RET ;********************************************** ;OUTPUT HEX CHARS TO VIDIO FROM A REG ;********************************************* FF9A F5 OHEX PUSH PSW ;SAVE CHAR FF9B 0F RRC FF9C 0F RRC FF9D 0F RRC FF9E 0F RRC FF9F CDA7FF CALL BIAS ;BINARY TO ASCII AND OUT FFA2 F1 POP PSW FFA3 CDA7FF CALL BIAS FFA6 C9 RET ;**************************** ;CONVERT BINARY TO ASCII ;*************************** FFA7 E60F BIAS ANI 0FH ;MASK NIBBLE FFA9 C690 ADI 90H FFAB 27 DAA FFAC CE40 ACI 40H FFAE 27 DAA FFAF CD7EF8 CALL CHAROUT FFB2 C9 RET ;********************************************* ;OUTPUT MESSAGE PTED TO BY H,L AND TERMINATED ;BY ONE BYTE OF BINARY ZEROS ;******************************************** FFB3 CD50FF MSG CALL CRLF FFB6 7E MSGNC MOV A,M FFB7 B7 ORA A FFB8 C8 RZ FFB9 CD7EF8 CALL CHAROUT FFBC 23 INX H FFBD C3B6FF JMP MSGNC FFC0 = CMDTBL EQU $ FFC0 48 DB 'H' FFC1 D5FC DW INTEL ;INTEL HEX LOADS FFC3 52 DB 'R' ;FREE RAM LOCATION FFC4 8CFD DW RAMFND FFC6 47 DB 'G' FFC7 AEFE DW GEN ;GENERATE SYNC STREAM FFC9 41 DB 'A' FFCA DAFE DW ALIGN ;ALLIGN CASETTE ON MIO FFCC 56 DB 'V' FFCD 93FD DW CMPBLK ;COMPARE MEMORY BLOCKS FFCF 49 DB 'I' FFD0 66FD DW INPORT ;INPUT FROM SPECIFIED PORT FFD2 4F DB 'O' FFD3 67FD DW OUTPORT ;OUPUT TO SPECIFIED PORT FFD5 54 DB 'T' FFD6 40FD DW MEMTEST FFD8 4A DB 'J' FFD9 46FC DW JUMP ;JUMP TO ADDRESS FFDB 43 DB 'C' FFDC 47FC DW CALL1 ;CALL MEMORY WITH RETURN FFDE 44 DB 'D' ;DISPLAY MEMORY FFDF 6DFC DW DISP FFE1 45 DB 'E' FFE2 4BFC DW ENTR ;ENTER INTO MEMORY FFE4 4D DB 'M' FFE5 2DFD DW MOVE ;MOVE MEMORY BLOCK FFE7 46 DB 'F' ;FILL MEMORY FFE8 34FD DW FILL FFEA 55 DB 'U' FFEB C0FC DW UNPRT ;UNPROTECT MEMORY FFED 50 DB 'P' FFEE BFFC DW PROT ;PROTECT MEMORY FFF0 4C DB 'L' FFF1 E9FD DW LOAD ;LOAD CASETTE FFF3 53 DB 'S' FFF4 B1FD DW SEARCH ;16 BIT MASKED SEARCH FFF6 58 DB 'X' FFF7 E8FD DW EXEC ;EXECUTE FROM CASETTE FFF9 1B DB 1BH ;ESCAPE CODE FFFA A9FC DW ESCAP FFFC 00 DB 0 FFFD END