CP/M RMAC ASSEM 1.1 #001 MYVIO.ASM VERSION OF 73 MAY 84 RHP TITLE 'MYVIO.ASM VERSION OF 73 MAY 84 RHP' ;************************************************************** ;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 REFRESH+780H ;SYSTEM RAM F800 = VIOFM EQU 0F800H ;FIRMWARE BEGINNING 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 DS 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 C327F8 JMP INIT ;INITIALIZATION POINT CP/M RMAC ASSEM 1.1 #002 MYVIO.ASM VERSION OF 73 MAY 84 RHP F803 C391F8 JMP CHAROUT ;DISPLAY CHARACTER IN A F806 C3F5FB JMP MONT ;MONITOR ENTRY POINT F809 C389FE JMP CONST ;GET CONSOLE STATUS F80C C376FE JMP CHIN1 ;GET CONSOLE DATA F80F C382FE JMP PRSTAT ;GET PRINTER STATUS F812 C392FE JMP PRINTA ;PRINT CHARACTER IN A F815 C393FE JMP PRINTC ;PRINT CHARACTER IN C F818 C390F8 JMP CHAROUC ;DISPLAY CHARACTER IN C F81B 31FEF7 VIOTEST LXI SP,SYSRAM+7EH F81E CD27F8 CALL INIT F821 CD65FE CALL CHIN F824 C321F8 JMP VIOTEST+6 ;DEMO TESTER ;************************************************************** F827 E5 INIT PUSH H F828 D5 PUSH D F829 C5 PUSH B F82A F5 PUSH PSW F82B 2180F7 LXI H,CURLIN ;START OF ZEROED AREA F82E 061F MVI B,CLINE-CURLIN AND 0FFH F830 AF XRA A F831 77 INIT1 MOV M,A ;ZERO AREA F832 23 INX H F833 05 DCR B F834 C231F8 JNZ INIT1 F837 2100F0 LXI H,REFRESH ;BEGIN CURSOR POS F83A 228FF7 SHLD CURPTR F83D 218007 LXI H,1920 ;DEFAULT CHARS/SCREEN F840 22A2F7 SHLD NCHARS F843 CDB2F9 CALL BLNKS ;CLEAR SCREEN AND HOME F846 3E08 MVI A,8H ;DEFAULT 80X24 SCREEN TEXT MODE F848 11F2F8 LXI D,BMP1 ;SET UP RETURN ADDR F84B D5 PUSH D ;SUBROUTINE TO SET HARDWARE CONTROL PORT F84C 3294F7 SETCMD STA CTRLC F84F 32FFF7 STA CTRPORT ;HARDWARE CONTROL PORT F852 2F CMA F853 E603 ANI 3 F855 0F RRC ;FINDING NCHARS ON SCREEN F856 212800 LXI H,40 ;COLS/LINE F859 D25DF8 JNC SETCM1 ;ENOUGH F85C 29 DAD H ;COLS/LINE=80 F85D 229FF7 SETCM1 SHLD CLINE F860 21A1F7 LXI H,LPAGE ;PT AT LINES/PAGE F863 360B MVI M,11 F865 1F RAR F866 D26BF8 JNC SETCM2 F869 3617 MVI M,23 F86B 21E001 SETCM2 LXI H,480 ;COUNT FOR 12 X 40 SCREEN F86E D272F8 JNC SETCM3 F871 29 DAD H F872 B7 SETCM3 ORA A ;SET FLAGS F873 CA77F8 JZ SETCM4 CP/M RMAC ASSEM 1.1 #003 MYVIO.ASM VERSION OF 73 MAY 84 RHP F876 29 DAD H F877 22A2F7 SETCM4 SHLD NCHARS F87A 1100F0 LXI D,REFRESH F87D 19 DAD D F87E 22A6F7 SHLD LASTC ;LAST CHAR ON SCREEN PTR+1 F881 3A94F7 LDA CTRLC ;CONTOL CODE F884 E60C ANI 0CH ;MODE BITS ONLY F886 EE0C XRI 0CH F888 3283F7 STA VDIMDE ;0=GRAPHICS ;CHECK CURSOR WITHIN POSSIBLE NEW BOUNDS F88B AF ESCRET XRA A F88C 3285F7 STA ESCCNT ;COUNT=0 F88F C9 RET ;TO LAST ADDR ON STACK, BMP1 ;************************************************************** ; THIS IS THE NORMAL ENTRY POINT FOR COMMUNICATING WITH THE ; VIDIO MONITOR AS YOU WOULD A CRT. ;************************************************************** F890 79 CHAROUC MOV A,C F891 E5 CHAROUT PUSH H F892 D5 PUSH D F893 C5 PUSH B F894 F5 PUSH PSW F895 3293F7 STA CCHAR F898 2A8FF7 LHLD CURPTR ;CURSOR POSITION F89B 3A92F7 LDA CCUR ;CHAR UNDER CURSOR F89E 77 MOV M,A ;REMOVE CURSOR F89F 2193F7 LXI H,CCHAR ;PT AT CURRENT CHAR F8A2 7E MOV A,M ;GET CHAR F8A3 FE1B CPI 1BH ;ESCAPE CHAR? F8A5 CA60F9 JZ ESCAPE F8A8 3A85F7 LDA ESCCNT ;ARE WE IN ESCAPE SEQ ALREADY? F8AB B7 ORA A F8AC C260F9 JNZ ESCAPE ;YES F8AF 7E MOV A,M ;CURRENT CHAR F8B0 FE7F CPI 7FH ;DELETE CHAR (RUBOUT)? F8B2 CA4FF9 JZ NOUSER1 ;YES F8B5 3A83F7 LDA VDIMDE ;GRAPHICS MODE? F8B8 B7 ORA A F8B9 CAE9F8 JZ CHAR1 ;YES F8BC 7E MOV A,M F8BD FEFF CPI 0FFH ;DUMMY PAD FROM USER? F8BF CAF2F8 JZ BMP1 ;YES F8C2 E67F ANI 7FH ;STRIP PARITY BIT F8C4 77 MOV M,A F8C5 DE20 SBI 20H ;CONTROL CODE? F8C7 FA3CF9 JM CONTROL ;YES F8CA 3A94F7 LDA CTRLC ;CONTROL WORD F8CD 47 MOV B,A ;TMP SAVE F8CE E60C ANI 0CH ;MODE ONLY F8D0 FE08 CPI 08H ;LOW HALF OF CHAR GEN ROM? F8D2 C2E9F8 JNZ CHAR1 ;NO,UPPER HALF CP/M RMAC ASSEM 1.1 #004 MYVIO.ASM VERSION OF 73 MAY 84 RHP F8D5 78 MOV A,B ;CONTROL WORD F8D6 E620 ANI 20H ;UP/LOW CASE F8D8 C2E9F8 JNZ CHAR1 ;LOWER OK AS IS F8DB 7E MOV A,M ;CURRENT CHAR F8DC DE61 SBI 61H ;LOWER CASE A F8DE FAE9F8 JM CHAR1 ;NOT ALPHA F8E1 DE1A SBI 7BH-61H F8E3 F2E9F8 JP CHAR1 ;NOT ALPHA F8E6 C65B ADI 7BH-20H ;RESTORE AND CONVERT TO UPPER CASE F8E8 77 MOV M,A F8E9 CD76FB CHAR1 CALL INSCHR ;INSERT CCHAR AT CURSOR POS F8EC CDFAF8 CALL BMPCUR F8EF CD1FFB BMP10 CALL CALPOS ;CURSOR POS F8F2 CDA8FA BMP1 CALL INSCURS ;INSERT CURSOR F8F5 F1 POP PSW F8F6 C1 POP B F8F7 D1 POP D F8F8 E1 POP H F8F9 C9 RET ;TO EXTERNAL WORLD F8FA = BMPCUR EQU $ F8FA CD39FB CALL BMPC ;BUMP CURSOR CHAR POSITION F8FD CC0CF9 CZ BMPCUR1 ;DO LINE FEED F900 3A91F7 LDA PRTMD ;PROTECT MODE? F903 EB XCHG ;H,L=CURRENT CURSOR PTR F904 A6 ANA M ;IS IT PROTECTED? F905 FAFAF8 JM BMPCUR ;YES,SKIP PROTECTED FIELD F908 C9 RET ;GO INSERT CURSOR F909 2180F7 LFEED LXI H,CURLIN F90C 34 BMPCUR1 INR M F90D 3AA1F7 LDA LPAGE ;MAX LINES/PAGE F910 BE CMP M ;EXCEED MAX? F911 F0 RP F912 35 DCR M ;LEAVE AT LAST LINE ;************************************************************** ;SCROLL UP OR WRAP AROUND AS SET BY CTRLC ;************************************************************** F913 3A94F7 SCROLL LDA CTRLC ;KIND OF SCROLL? F916 E68C ANI 8CH ;LEAVE SCROLL AND MODE BITS F918 FA20F9 JM SCROLL3 ;WRAP AROUND F91B FE0C CPI 0CH ;GRAPHICS MODE F91D C225F9 JNZ SCROLL1 ;NO, ALLOW SCROLL F920 AF SCROLL3 XRA A F921 77 MOV M,A ;HOME CURSOR FOR WRAP AROUND F922 23 INX H F923 77 MOV M,A F924 C9 RET F925 2A9FF7 SCROLL1 LHLD CLINE ;COLS/LINE F928 E5 PUSH H ;SAVE COLS/LINE F929 EB XCHG F92A 2AA2F7 LHLD NCHARS ;# CHARS PER PAGE F92D 7D MOV A,L CP/M RMAC ASSEM 1.1 #005 MYVIO.ASM VERSION OF 73 MAY 84 RHP F92E 93 SUB E F92F 4F MOV C,A F930 44 MOV B,H F931 EB XCHG F932 1100F0 LXI D,REFRESH F935 19 DAD D ;HL=SOURCE,DE=DEST. F936 CDC9FD CALL MVCUP F939 C344FA SCROLL2 JMP DLINE1 ;ERASE CURRENT LINE AND RETURN ;************************************************************** ;PROCESS CONTROL CODES ;************************************************************** F93C EB CONTROL XCHG ;D,E=CCHR PTR F93D 2A87F7 LHLD USERCTR ;USER TABLE IF ANY F940 7C MOV A,H F941 B7 ORA A F942 1A LDAX D ;CCHAR IN A F943 CA4CF9 JZ NOUSER ;NO TABLE USER DEFINED F946 CD24FA CALL LOOKUP F949 C258F9 JNZ FNDCTRL ;FOUND TABLE ENTRY F94C 3A93F7 NOUSER LDA CCHAR F94F 21A5FB NOUSER1 LXI H,CTRTBL F952 CD24FA CALL LOOKUP F955 CAF2F8 JZ BMP1 ;NOT FOUND F958 11EFF8 FNDCTRL LXI D,BMP10 ;RETURN ADDRESS F95B D5 PUSH D ;ON STACK F95C 1181F7 LXI D,CURCOL F95F E9 PCHL ;************************************************************** ;PROCESS ESCAPE SEQUENCES ;************************************************************** F960 11EFF8 ESCAPE LXI D,BMP10 ;RETURN ADDR F963 D5 PUSH D F964 EB XCHG F965 2185F7 LXI H,ESCCNT F968 7E MOV A,M ;ESCCAPE COUNT F969 34 INR M ;ESCCNT=ESCCNT+1 F96A B7 ORA A F96B C8 RZ F96C 3D DCR A F96D 23 INX H ;POINT TO ESCAPE CODE F96E 1A LDAX D ;GET CCHAR F96F C273F9 JNZ ESCAP1 ;ESCCNT>1 F972 77 MOV M,A ;SAVE ESCAPE CODE F973 2A89F7 ESCAP1 LHLD USERESC ;USER ESCAPE TABLE PTR F976 7C MOV A,H F977 B7 ORA A F978 1A LDAX D ;ESCCODE F979 CA82F9 JZ NUESC ;NO USER DEFINED TABLE F97C CD24FA CALL LOOKUP ;LOOKUP IN USERS TABLE F97F C290F9 JNZ FNDESC ;FOUND ESCAPE SEQ IN USER F982 3A86F7 NUESC LDA ESCCDE ;TRY AGAIN IN VIO TABLE F985 E6DF ANI 0DFH ;REMOVE LOWER CASE BIT CP/M RMAC ASSEM 1.1 #006 MYVIO.ASM VERSION OF 73 MAY 84 RHP F987 21D3FB LXI H,ESCTBL F98A CD24FA CALL LOOKUP F98D CA8BF8 JZ ESCRET ;NOT FOUND F990 3A94F7 FNDESC LDA CTRLC F993 114CF8 LXI D,SETCMD F996 E9 PCHL ;************************************************************** ;CURSOR CONTROL ;************************************************************** F997 1B UPLINE DCX D ;D,E=CURLIN PTR F998 1A BCKLNE LDAX D ;D,E=CURLIN OR CURCOL F999 B7 ORA A ;SET FLAGS F99A C8 RZ F99B 3D DCR A ;BACK UP 1 F99C 12 BCKL1 STAX D F99D C9 RET F99E AF CRET XRA A F99F 3284F7 STA INSRT ;REMOVE INSERT MODE F9A2 C39CF9 JMP BCKL1 ;************************************************************** ;TOGGLE PROTECTED MODE FLAG ;************************************************************** F9A5 2191F7 PRTECT LXI H,PRTMD ;PT AT FLAG F9A8 C3AEF9 JMP INSMDE+3 ;GO TOGGLE IT ;************************************************************** ;TOGGLE INSERT MODE FLAG ;************************************************************** F9AB 2184F7 INSMDE LXI H,INSRT F9AE 7E INSMD1 MOV A,M F9AF 2F CMA F9B0 77 MOV M,A F9B1 C9 RET ;************************************************************** ;BLANK SCREEN AND HOME ;************************************************************** F9B2 2AA2F7 BLNKS LHLD NCHARS ;#CHARS ON SCREEN F9B5 EB XCHG F9B6 2100F0 LXI H,REFRESH F9B9 3A91F7 BLNKS1 LDA PRTMD ;IN PROTECTED MODE? F9BC E680 ANI 80H F9BE A6 ANA M ;PROTECTED? F9BF FAC4F9 JM BLNKS2 ;IS PROTECTED, DO NOT BLANK F9C2 3620 MVI M,' ' F9C4 23 BLNKS2 INX H F9C5 1B DCX D F9C6 7A MOV A,D F9C7 B3 ORA E ;DONE YET? CP/M RMAC ASSEM 1.1 #007 MYVIO.ASM VERSION OF 73 MAY 84 RHP F9C8 C2B9F9 JNZ BLNKS1 ;NO F9CB 210000 HOME LXI H,0 F9CE 2280F7 SHLD CURLIN F9D1 C9 RET ;************************************************************** ;BLANK FROM CURSOR TO END OF UNPROTECTED FIELD ;************************************************************** F9D2 CD01FA BLANKL CALL CHARLN ;CALC # CHARS TO END OF FIELD F9D5 3A91F7 BLANKL3 LDA PRTMD ;PROTECTED MODE? F9D8 B7 ORA A F9D9 CAE1F9 JZ BLANKL1 ;NOT PROTECTED,SKIP CHECK F9DC 7E MOV A,M ;GET CHAR F9DD B7 ORA A F9DE FAE4F9 JM BLANKL2 ;IS PROTECTED,DO NOT BLANK F9E1 3E20 BLANKL1 MVI A,' ' F9E3 77 MOV M,A ;INSERT BLANK F9E4 23 BLANKL2 INX H ;NEXT CHAR F9E5 0D DCR C ;COUNT F9E6 C2D5F9 JNZ BLANKL3 F9E9 C9 RET ;************************************************************** ;TURN ON PROTECTED FIELD/TURN OFF PROT FIELD ;************************************************************** F9EA 2182F7 PROTC LXI H,INVIDIO ;PT AT INVERTED VIDIO FLAG F9ED C3AEF9 JMP INSMD1 ;************************************************************** ;DELETE CHAR AND SHIFT PROTECTED FIELD LEFT ONE PLACE ;************************************************************** F9F0 CD01FA DELETE CALL CHARLN F9F3 2A8FF7 LHLD CURPTR ;CURSOR POSITION F9F6 54 MOV D,H F9F7 5D MOV E,L F9F8 23 INX H F9F9 CDC9FD CALL MVCUP ;SHIFT LINE LEFT ONE PLACE F9FC 3E20 MVI A,' ' F9FE 1B DCX D ;BACK UP ONE F9FF 12 STAX D ;INSERT FINAL BLANK FA00 C9 RET ;************************************************************** ;CALC # CHARS FROM CURSOR TO END OF UNPROT FIELD INCLUSIVE ; RETURN H,L=CURSOR PTR ;************************************************************** FA01 3A91F7 CHARLN LDA PRTMD ;PROTECT MODE FLAG FA04 E680 ANI 80H FA06 57 MOV D,A ;SAVE PROTECT MODE BIT FA07 2A8FF7 LHLD CURPTR ;CURSOR POSITION FA0A E5 PUSH H FA0B 3A81F7 LDA CURCOL CP/M RMAC ASSEM 1.1 #008 MYVIO.ASM VERSION OF 73 MAY 84 RHP FA0E 5F MOV E,A ;E=CURRENT COLUMN FA0F 010000 LXI B,0 ;# CHARS TO END FA12 3A9FF7 CHARLN1 LDA CLINE ;COLS/LINE FA15 93 SUB E FA16 1C INR E FA17 23 INX H FA18 0C INR C ;COUNT INCREASED FA19 3D DCR A ;DNE YET WITH LINE FA1A CA22FA JZ CHARLN2 ;END OF LINE RETURN FA1D 7E MOV A,M ;H,L=END +1 FA1E A2 ANA D ;PROTECTED? FA1F F212FA JP CHARLN1 ;NO, KEEP GOING FA22 E1 CHARLN2 POP H ;CURSOR POSITION FA23 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. ;************************************************************** FA24 47 LOOKUP MOV B,A ;SAVE FA25 7E LOOKU1 MOV A,M ;GET FIRST BYTE OF RECORD FA26 1180F7 LXI D,CURLIN FA29 B7 ORA A FA2A C8 RZ ;DONE,NO MATCH FA2B B8 CMP B ;SAME AS REQUESTED? FA2C C236FA JNZ TBLUP1 ;NO FA2F 23 INX H FA30 5E MOV E,M FA31 23 INX H FA32 56 MOV D,M FA33 EB XCHG FA34 B7 ORA A ;SET FLAGS FA35 C9 RET FA36 23 TBLUP1 INX H FA37 23 INX H FA38 23 INX H ;BUMP TO NEXT RECORD FA39 C325FA JMP LOOKU1 ;************************************************************** ;DELETE CURRENT LINE AND RETURN CURSOR ;************************************************************** FA3C CD60FA DLINE CALL NMCHM ;SET UP FOR MOVE FA3F E5 PUSH H ;SAVE COLS/LINE FA40 19 DAD D ;H,L=SOURCE BEGIN FA41 CDC9FD CALL MVCUP FA44 C1 DLINE1 POP B ;COLS/LINE FA45 EB XCHG FA46 C358FA JMP EN1 ;ERASE LINE ;************************************************************** ;ENTER NEW LINE AT CURSOR LINE,PUSH BOTTOM DOWN CP/M RMAC ASSEM 1.1 #009 MYVIO.ASM VERSION OF 73 MAY 84 RHP ;************************************************************** FA49 CD60FA ENLINE CALL NMCHM ;SET UP FOR MOVE FA4C E5 PUSH H ;SAVE COLS/LINE FA4D 19 DAD D ;H,L=SOURCE BEGIN FA4E 09 DAD B ;H,L=END OF DEST+1 FA4F EB XCHG FA50 09 DAD B ;H,L=END OF SOURCE+1 FA51 2B DCX H FA52 1B DCX D FA53 CD9AFB CALL MVCDN ;MOVE DOWN 1 LINE FA56 C1 POP B FA57 23 INX H FA58 3620 EN1 MVI M,' ' FA5A 23 INX H FA5B 0D DCR C FA5C C258FA JNZ EN1 FA5F C9 RET FA60 AF NMCHM XRA A FA61 12 STAX D ;COL=0 FA62 CD70FA CALL CHARSN ;#CHARS TO END OF SCREEN FA65 EB XCHG ;D,E=DEST. FA66 2A9FF7 LHLD CLINE ;COLS/LINE FA69 7D MOV A,L ;COLS/LINE FA6A 0B NMCHM1 DCX B FA6B 3D DCR A FA6C C26AFA JNZ NMCHM1 ;DECREASE COUNT BY ONE LINES WORTH FA6F C9 RET ;************************************************************** ;CALC # CHARS TO END OF SCREEN FROM CURSOR ;************************************************************** FA70 CD1FFB CHARSN CALL CALPOS FA73 E5 PUSH H ;SAVE FA74 EB XCHG ;D,E=CURSOR POS FA75 2AA6F7 LHLD LASTC ;LAST CHAR POSITION+1 FA78 7A MOV A,D FA79 2F CMA FA7A 57 MOV D,A FA7B 7B MOV A,E FA7C 2F CMA FA7D 5F MOV E,A FA7E 13 INX D ;COMPLIMENT D,E FA7F 19 DAD D ;H,L=# CHARS TO END-1 FA80 E5 PUSH H FA81 C1 POP B ;B,C=#CHARS TO END FA82 E1 POP H ;CURRENT POSITION CURSOR FA83 C9 RET ;************************************************************** ;ESCAPE CODE PROCESSING ;************************************************************** FA84 E6F3 HIGH128 ANI 0F3H CP/M RMAC ASSEM 1.1 #010 MYVIO.ASM VERSION OF 73 MAY 84 RHP FA86 F604 ORI 4H FA88 EB XCHG ;H,L=SETCMD ADDR FA89 E9 PCHL ;GRAPHIC MODE 256 CHAR ROM,NO INVERSE VIDIO FA8A F60C GRAPHIC ORI 0CH FA8C EB XCHG ;H,L=SETCMD ADDR FA8D E9 PCHL ;LOWER HALF OF ROM+REVERSE VIDIO FA8E E6F3 LOW128 ANI 0F3H FA90 F608 ORI 8H FA92 EB XCHG ;H,L=SETCMD ADDR FA93 E9 PCHL ;SCROLL TOGGLE FA94 EE80 SCRL XRI 80H FA96 EB XCHG ;H,L=SETCMD ADDR FA97 E9 PCHL ;UPPER LOWER CASE TOGGLE FA98 EE20 UPLOW XRI 20H FA9A EB XCHG ;H,L=SETCMD ADDR FA9B E9 PCHL ;INVERSE VIDIO TOGGLE FA9C EE10 VIDIO XRI 10H FA9E EB XCHG ;H,L=SETCMD ADDR FA9F E9 PCHL ;# LINES PER PAGE SWITCH FAA0 EE02 LINES XRI 02H FAA2 EB XCHG ;H,L=SETCMD ADDR FAA3 E9 PCHL ;#COLS/LINE TOGGLE FAA4 EE01 COLS XRI 01H FAA6 EB XCHG ;H,L=SETCMD ADDR FAA7 E9 PCHL ;************************************************************** ;INSERT CURSOR CHAR AT PROPER POSITION ;************************************************************** FAA8 2A8FF7 INSCURS LHLD CURPTR FAAB 7E MOV A,M FAAC 3292F7 STA CCUR ;SAVE CHAR UNDER CURSOR FOR GRAPHICS MODE FAAF F680 ORI 80H ;BIT 7 FOR INVERSE VIDIO FAB1 77 MOV M,A ;STORE BACK FAB2 3A83F7 LDA VDIMDE FAB5 B7 ORA A CP/M RMAC ASSEM 1.1 #011 MYVIO.ASM VERSION OF 73 MAY 84 RHP FAB6 C0 RNZ ;NO GRAPHICS FAB7 367F MVI M,7FH ;BLOCK FOR GRAPHICS MODE FAB9 C9 RET ;************************************************************** ;CLEAR TABS ;************************************************************** FABA 2195F7 CLRTBS LXI H,TAB ;TABS BITS FABD 060A MVI B,10 ;#BYTES FOR TABS FABF AF XRA A FAC0 77 CLRT1 MOV M,A FAC1 23 INX H FAC2 05 DCR B FAC3 C2C0FA JNZ CLRT1 FAC6 C38BF8 JMP ESCRET ;PUT IN CURSOR ;************************************************************** ;SET OR CLEAR TAB TOGGLE BIT ;************************************************************** FAC9 CDD7FA SETTAB CALL FNDTB FACC EE80 XRI 80H ;INVERT TAB BIT FACE 0F SETD2 RRC FACF 05 DCR B FAD0 C2CEFA JNZ SETD2 FAD3 12 STAX D ;STORE TAB BYTE FAD4 C38BF8 JMP ESCRET ;DO CURSOR ;FIND TAB BIT, LEAVE IN A REG BIT 7 FAD7 3A81F7 FNDTB LDA CURCOL ;COL # FADA 67 MOV H,A FADB 24 INR H FADC 1195F7 LXI D,TAB ;WORD PTR FADF 0E08 FNDTB1 MVI C,8 ;BIT COUNTER FAE1 25 FNDTB3 DCR H FAE2 CAEDFA JZ FNDTDN ;FOUND IT FAE5 0D DCR C ;BIT COUNTER FAE6 C2E1FA JNZ FNDTB3 FAE9 13 INX D ;PT AT NEXT BYTE FAEA C3DFFA JMP FNDTB1 FAED 1A FNDTDN LDAX D ;GET TAB BYTE BITS FAEE 41 MOV B,C ;SAVE COUNT OF BITS FAEF 07 FNDTB2 RLC FAF0 0D DCR C FAF1 C2EFFA JNZ FNDTB2 ;ROTATE UNTIL FOUND FAF4 C9 RET ;************************************************************** ;TAB TO BEGINNING OF NEXT UNPROTECTED FIELD OR TAB OR HOME IF NONE ;************************************************************** FAF5 AF TABB XRA A FAF6 32A4F7 STA PRUPRF ;PROTECT/UNPROTECT TRANSITION FLAG CP/M RMAC ASSEM 1.1 #012 MYVIO.ASM VERSION OF 73 MAY 84 RHP FAF9 CD39FB TAB3 CALL BMPC ;BUMP CURSOR POSITION FAFC C204FB JNZ TAB1 ;NO LINE FEED NECESSARY FAFF 34 INR M ;BUMP LINE # FB00 BE CMP M ;EXCEED LPAGE? FB01 FA20F9 JM SCROLL3 ;YES,HOME AND RETURN FB04 3A91F7 TAB1 LDA PRTMD ;PROTECT MODE FLAG FB07 EB XCHG ;H,L PTS AT CHAR FB08 A6 ANA M ;PROTECTED? FB09 7E MOV A,M ;GET CHAR FB0A 11A4F7 LXI D,PRUPRF ;TRANSITION FLAG FB0D F214FB JP TAB2 ;NO PROTECTED FIELD FB10 12 STAX D ;SET TRANSITION FLAG FB11 C3F9FA JMP TAB3 FB14 1A TAB2 LDAX D ;GET TRANSITION FLAG FB15 B7 ORA A FB16 F8 RM ;UNPROT FIELD WITH TRANSITION FB17 CDD7FA CALL FNDTB ;FIND TAB POSITION BIT FB1A B7 ORA A ;SET FLAGS FB1B F8 RM ;TAB IS SET FB1C C3F9FA JMP TAB3 ;************************************************************** ;CALCULATE CURSOR POSITION FROM CURLIN AND CURCOL ;************************************************************** FB1F 2A9FF7 CALPOS LHLD CLINE ;CHARS/LINE-1 FB22 EB XCHG FB23 2A80F7 LHLD CURLIN ;L=CURLIN,H=CURCOL FB26 4C MOV C,H FB27 45 MOV B,L FB28 2100F0 LXI H,REFRESH ;BOTTOM OF REFRESH MEMORY FB2B 04 INR B FB2C 05 CALPOS1 DCR B ;DONE YET FB2D CA34FB JZ CALPOS2 ;YES FB30 19 DAD D ;ADD ANOTHER LINE OF CHARS FB31 C32CFB JMP CALPOS1 FB34 09 CALPOS2 DAD B ;ADD CURRENT COL FB35 228FF7 SHLD CURPTR ;SAVE FB38 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 ;************************************************************** FB39 2A8FF7 BMPC LHLD CURPTR FB3C 23 INX H FB3D 228FF7 SHLD CURPTR ;UPDATE ABS CURSOR ADDRESS FB40 EB XCHG ;D,E=PTR FB41 2181F7 LXI H,CURCOL FB44 34 INR M ;BUMP COLUMN CP/M RMAC ASSEM 1.1 #013 MYVIO.ASM VERSION OF 73 MAY 84 RHP FB45 3A9FF7 LDA CLINE ;MAX COLS/LINE FB48 96 SUB M ;ZERO IF EXCEED LINE FB49 C0 RNZ ;OK AS IS FB4A 77 MOV M,A ;COL=0 FB4B 2B DCX H FB4C 3AA1F7 LDA LPAGE ;MAX LINES/PAGE FB4F C9 RET ;************************************************************** ;ADDRESSABLE CURSOR FUNCTION ;************************************************************** FB50 2185F7 ADDCURS LXI H,ESCCNT ;PT AT ESCAPE COUNT FB53 1180F7 LXI D,CURLIN ;PT AT CURRENT LINE COUNT FB56 3A93F7 LDA CCHAR FB59 D620 SUI 20H ;REMOVE OFFSET FOR COUNT FB5B 47 MOV B,A FB5C 7E MOV A,M ;GET COUNT FB5D D603 SUI 3 FB5F F8 RM ;NO VALID NUMBS YET FB60 C26CFB JNZ XADD ;X AXIS VALUE ;Y-AXIS VALUE FB63 3AA1F7 LDA LPAGE FB66 12 XADD3 STAX D ;MAX LINE # FB67 B8 CMP B FB68 F8 RM FB69 78 MOV A,B FB6A 12 STAX D FB6B C9 RET FB6C 3600 XADD MVI M,0 ;ESCCNT=0 FB6E 3A9FF7 LDA CLINE ;MAX COL/LINE FB71 13 INX D FB72 3D DCR A FB73 C366FB JMP XADD3 ;************************************************************** ;INSERT CHAR AT CURSOR POSITION.EITHER WRITES OVER PREVIOS ;CHAR OR PUSHES ENTIRE FIELD OVER ONE CHAR BEFORE INSERTING. ;************************************************************** FB76 2A8FF7 INSCHR LHLD CURPTR ;CURSOR ADDRESS FB79 E5 PUSH H ;SAVE FB7A 3A84F7 LDA INSRT ;INSERT FLAG FB7D B7 ORA A FB7E CA8DFB JZ INSC3 ;OVERWRITE FB81 CD01FA CALL CHARLN FB84 0B DCX B ;3CHARS-1 TO END FB85 09 DAD B ;H,L PTS AT LAST CHAR ON LINE FB86 54 MOV D,H FB87 5D MOV E,L FB88 1B DCX D ;D,E PTS AT SOURCE FB89 EB XCHG ;H,L=SOURCE,D,E=DEST FB8A CD9AFB CALL MVCDN ;MOVE CHARS RIGHT CP/M RMAC ASSEM 1.1 #014 MYVIO.ASM VERSION OF 73 MAY 84 RHP FB8D E1 INSC3 POP H ;CURSOR POSITION FB8E 3A82F7 LDA INVIDIO FB91 E680 ANI 80H FB93 47 MOV B,A ;INVERT BIT FB94 3A93F7 LDA CCHAR FB97 B0 ORA B ;MERGE WITH INVERT BIT FB98 77 INSC4 MOV M,A FB99 C9 RET ;************************************************************** ;SHIFT CHARS RIGHT FROM D,E TO H,L, B,C CHARS FROM RIGHT ;************************************************************** FB9A 79 MVCDN MOV A,C FB9B B0 ORA B FB9C C8 RZ ;DONE FB9D 7E MOV A,M FB9E 12 STAX D FB9F 2B DCX H FBA0 1B DCX D FBA1 0B DCX B FBA2 C39AFB JMP MVCDN ; CONTROL FUNCTION JUMP TABLE FBA5 = CTRTBL EQU $ FBA5 0D DB 0DH ;CARRIAGE RETURN FBA6 9EF9 DW CRET FBA8 0A DB 0AH ;LINE FEED FBA9 09F9 DW LFEED FBAB 04 DB 04H ;DELETE LINE (CTRL D) FBAC 3CFA DW DLINE FBAE 05 DB 05H ;INSERT LINE (CTRL E) FBAF 49FA DW ENLINE FBB1 08 DB 08H ;BACK CURSOR (CTRL H) FBB2 98F9 DW BCKLNE FBB4 09 DB 09H ;TAB (CTRL I) FBB5 F5FA DW TABB FBB7 0B DB 0BH ;UP CURSOR (CTRL K) FBB8 97F9 DW UPLINE FBBA 0C DB 0CH ;FORWARD CURSOR (CTRL L) FBBB FAF8 DW BMPCUR FBBD 10 DB 10H ;PROTECTED MODE TOGGLE (CTRL P) FBBE A5F9 DW PRTECT FBC0 14 DB 14H ;INSERT MODE (CTRL T) FBC1 ABF9 DW INSMDE FBC3 15 DB 15H ;CLEAR TO EOL (CTRL U) FBC4 D2F9 DW BLANKL FBC6 16 DB 16H ;PROTECTED FIELDS (CTRL V) FBC7 EAF9 DW PROTC FBC9 1A DB 1AH ;SCREEN ERASE (CTRL Z) FBCA B2F9 DW BLNKS FBCC 1E DB 1EH ;HOME CURSOR (CTRL ^) FBCD CBF9 DW HOME FBCF 7F DB 7FH ;DELETE CHAR (RUBOUT) FBD0 F0F9 DW DELETE CP/M RMAC ASSEM 1.1 #015 MYVIO.ASM VERSION OF 73 MAY 84 RHP FBD2 00 DB 0 ;TERMINATOR ; ESCAPE FUNCTION JUMP TABLE FBD3 = ESCTBL EQU $ FBD3 1D DB 1DH ;CURSOR CONTROL ('=' LESS BIT 5 LOWER CASE) FBD4 50FB DW ADDCURS FBD6 09 DB 09H ;CLEAR TABS FBD7 BAFA DW CLRTBS FBD9 43 DB 'C' ;COLS/LINE FBDA A4FA DW COLS FBDC 45 DB 'E' ;EXTENDED MODE UPPER 128 FBDD 84FA DW HIGH128 FBDF 47 DB 'G' ;GRAPHIC SET FBE0 8AFA DW GRAPHIC FBE2 49 DB 'I' ;SET TAB FBE3 C9FA DW SETTAB FBE5 4C DB 'L' ;LINES/PAGE FBE6 A0FA DW LINES FBE8 53 DB 'S' ;SCROLL TOGGLE FBE9 94FA DW SCRL FBEB 54 DB 'T' ;LOWER 128 BYTES OF ROM FBEC 8EFA DW LOW128 FBEE 55 DB 'U' ;UPPER/LOWER CASE FBEF 98FA DW UPLOW FBF1 56 DB 'V' ;INVERSE VIDIO TOGGLE FBF2 9CFA DW VIDIO FBF4 00 DB 0 ;TERMINATOR ;************************************************************** ;8085 MONITOR PROGRAM USING THE VIO FIRMWARE ; COPYRIGHT IMSAI MANUFACTURING COMPANY, INC. ; SAN LEANDRO,CALIFORNIA ; 6/7/77 ;************************************************************** FBF5 31FFF7 MONT LXI SP,REFRESH+7FFH ;TOP OF MEMORY FBF8 CD27F8 CALL INIT ;INIT VIO FBFB 212BFC LXI H,SIGNON FBFE CD1AFF CALL MSGNC ;SIGNON MSG FC01 CDB4FE PRMPT CALL CRLF FC04 3E3F MVI A,'?' FC06 CD91F8 CALL CHAROUT FC09 CD65FE CALL CHIN ;GET COMMAND FC0C 47 MOV B,A ;SAVE IT FC0D 1101FC LXI D,PRMPT FC10 D5 PUSH D ;RETURN ADDRESS FC11 2A8BF7 LHLD USERCMD ;USER COMMAND TABLE FC14 7C MOV A,H FC15 B7 ORA A ;SET FLAGS FC16 78 MOV A,B ;RETRIEVE CODE FC17 CA20FC JZ NUCMD ;NO USER COMMAND TABLE FC1A CD24FA CALL LOOKUP ;LOOKUP IN USER TABLE FC1D C22AFC JNZ FNDCMD ;FOUND COMMAND FC20 78 NUCMD MOV A,B ;GET COMMAND AGAIN FC21 2124FF LXI H,CMDTBL ;COMAND TABLE PTR CP/M RMAC ASSEM 1.1 #016 MYVIO.ASM VERSION OF 73 MAY 84 RHP FC24 CD24FA CALL LOOKUP FC27 C8 RZ ;NO ENTRY,PROMPT AGIN FC28 0601 MVI B,1 ;FOR PROT/UNPROT FC2A E9 FNDCMD PCHL ;GO TO ROUTINE FC2B 5220482050SIGNON DB 'R H PETERS VIO',0 FC3A 4D4F4E4954 DB 'MONITOR 4/84' ;************************************************************** ;JUMP TO MEMORY "JAAAA" ;CALL MEMORY WITH RETURN TO MONITOR ;************************************************************** FC48 D1 JUMP POP D ;REMOVE RETURN ADDRESS FC49 CDBFFE CALL1 CALL IHEX ;GET JUMP ADDRESS FC4C E9 PCHL ;DO IT ;************************************************************** ;ENTER BYTE INTO MEMORY AND MODIFY IF DESIRED ;************************************************************** FC4D CDBFFE ENTR CALL IHEX ;START ADDR FC50 CDB4FE ENTR1 CALL CRLF FC53 CDB8FC CALL OHEXHL ;DISPLAY ADDRESS FC56 7E MOV A,M ;GET BYTE IN MEMORY FC57 5F MOV E,A ;PRESET FOR IHEX FC58 CDAFFC CALL OHEXB ;DISPLAY BYTE FC5B EB XCHG ;D,E=ADDRESS,L=DEFAULT CHAR FC5C CDC2FE CALL IHEX2 ;GET MODIFIER OR DEFAULT FC5F EB XCHG ;H,L=ADDR,E=BYTE FC60 73 MOV M,E FC61 2B DCX H FC62 FE0A CPI 0AH ;DONE? FC64 C8 RZ ;YES FC65 FE2D CPI '-' ;BACKWARD FC67 CA50FC JZ ENTR1 ;YES FC6A 23 INX H FC6B 23 INX H ;DEFAULT FORWARD FC6C C350FC JMP ENTR1 ;************************************************************** ;DISPLAY MEMORY "D,START,END CR" ;************************************************************** FC6F CD0CFD DISP CALL SIZE ;H,L=START,B,C=SIZE FC72 3A94F7 DISP4 LDA CTRLC ;#LINES/COLS FC75 0F RRC ;#LINES BIT IN CARRY FC76 0F RRC FC77 160C MVI D,12 FC79 DA7EFC JC DISP2 FC7C 1618 MVI D,24 FC7E CDB4FE DISP2 CALL CRLF FC81 DB03 IN 3 FC83 E602 ANI 2 ;ANY INPUT FC85 C0 RNZ ;YES,INTERRRUPT CP/M RMAC ASSEM 1.1 #017 MYVIO.ASM VERSION OF 73 MAY 84 RHP FC86 1E08 MVI E,8 FC88 3A94F7 LDA CTRLC FC8B 0F RRC FC8C DA91FC JC DISP3 FC8F 1E10 MVI E,16 FC91 CDB8FC DISP3 CALL OHEXHL ;OUTPUT ASCII H,L REG FC94 7E DISP1 MOV A,M ;GET DATA BYTE FC95 CDAFFC CALL OHEXB ;OUTPUT WITH TRAIL BLANK FC98 23 INX H FC99 0B DCX B FC9A 78 MOV A,B FC9B B1 ORA C FC9C C8 RZ ;DONE FC9D 1D DCR E FC9E C294FC JNZ DISP1 ;KEEP WITH CURRENT LINE FCA1 15 DCR D ;FILLED PAGE YET? FCA2 C27EFC JNZ DISP2 FCA5 CD65FE CALL CHIN ;WAIT FOR PAGE PROMT FCA8 C372FC JMP DISP4 ;************************************************************** ;ALLOW ESCAPE SEQUENCES TO CONTROL ;************************************************************** FCAB CD65FE ESCAP CALL CHIN ;READ ESCAPE SEQUENCE CODE FCAE C9 RET ;************************************************************** ;OUTPUT HEX WITH TRAILING BYTE ;************************************************************** FCAF CDFEFE OHEXB CALL OHEX FCB2 3E20 MVI A,' ' FCB4 CD91F8 CALL CHAROUT FCB7 C9 RET ;************************************************************** ;OUTPUT 16 BIT ASCII HEX FROM H,L ;************************************************************** FCB8 7C OHEXHL MOV A,H FCB9 CDFEFE CALL OHEX FCBC 7D MOV A,L FCBD CDAFFC CALL OHEXB FCC0 C9 RET ;************************************************************** ;INTEL LOADER LOADS INTEL FORMAT TAPES FROM ;TELETYPE (PORT 2,3) ;************************************************************** FCC1 CD65FE INTEL CALL CHIN ;READ WITHOUT ECHO FCC4 DE3A SBI ':' ;RCORD MARKER? FCC6 C2C1FC JNZ INTEL ;NO FCC9 57 MOV D,A ;ZERO CHECKSUM FCCA CDF0FC CALL IBYTE ;INPUT 2 HEX CHARS CP/M RMAC ASSEM 1.1 #018 MYVIO.ASM VERSION OF 73 MAY 84 RHP FCCD B7 ORA A ;SET FLAGS FCCE C8 RZ ;COUNT =0 MEANS END FCCF 57 MOV D,A ;BYTE COUNT FCD0 CDF0FC CALL IBYTE FCD3 67 MOV H,A FCD4 CDF0FC CALL IBYTE FCD7 6F MOV L,A FCD8 CDF0FC CALL IBYTE ;DUMMY RECORD TYPE IGNORED FCDB CDF0FC DATA CALL IBYTE FCDE 77 MOV M,A FCDF 23 INX H FCE0 15 DCR D FCE1 C2DBFC JNZ DATA FCE4 CDF0FC CALL IBYTE ;READ AND ADD CHECKSUM FCE7 CAC1FC JZ INTEL ;OK AS IS FCEA 3E43 MVI A,'C' FCEC CD91F8 CALL CHAROUT ;ERROR MESSAGE FCEF C9 RET ;************************************************************** ;READ 2 ASCII HEX BYTES AND CONVERT TO BINARY ;************************************************************** FCF0 CD65FE IBYTE CALL CHIN ;READ CHAR FCF3 CDD8FE CALL ASBI ;CONVERT TO BINARY FCF6 DAD4FD JC ERR2 FCF9 87 ADD A FCFA 87 ADD A FCFB 87 ADD A FCFC 87 ADD A FCFD 5F MOV E,A ;SAVE FCFE CD65FE CALL CHIN FD01 CDD8FE CALL ASBI FD04 DAD4FD JC ERR2 ;INVALID ASCII HEX CHAR FD07 83 ADD E FD08 5F MOV E,A ;SAVE CHAR FD09 82 ADD D ;ADD TO CHECKSUM FD0A 57 MOV D,A FD0B C9 RET ;************************************************************** ;SIZE INPUTS START,END ADDR AND CONVERTS TO START ; AND SIZE IN H,L AND B,C ;************************************************************** FD0C CD9EFE SIZE CALL PARM2 ;H,L=START D,E=END FD0F F5 PUSH A FD10 7B MOV A,E FD11 95 SUB L ;LOW BYTE SIZE FD12 4F MOV C,A FD13 7A MOV A,D FD14 9C SBB H ;HIGH BYTE SIZE FD15 47 MOV B,A FD16 03 INX B ;ADD 1 FD17 F1 POP A FD18 C9 RET CP/M RMAC ASSEM 1.1 #019 MYVIO.ASM VERSION OF 73 MAY 84 RHP ;************************************************************** ;MEMORY MOVE "M SOURCE BEG,SOURCE END,DEST BEG" ;************************************************************** FD19 CDC3FD MOVE CALL PARM4 ;START,END,DEST FD1C CDC9FD MOVE1 CALL MVCUP ;DO MOVE FD1F C9 RET ;************************************************************** ;FILL MEMORY WITH CHAR ;************************************************************** FD20 CDC3FD FILL CALL PARM4 ;START,END,FILL CHAR IN L FD23 7B MOV A,E ;FILL CHAR FD24 77 MOV M,A ;STORE IN FIRST LOCATION FD25 0B DCX B FD26 54 MOV D,H FD27 5D MOV E,L ;DEST ADDR FD28 13 INX D ;=START ADDR+1 FD29 C31CFD JMP MOVE1 ;************************************************************** ;MEMORY TEST ROUTINE ;************************************************************** FD2C CD0CFD MEMTEST CALL SIZE ;H,L=START,B,C=SIZE FD2F 0B DCX B ;B,C=SIZE-1 OR 0 FD30 AF MEM2 XRA A FD31 56 MOV D,M ;SAVE CELL FD32 77 MEM1 MOV M,A FD33 BE CMP M FD34 C249FD JNZ MEMERR ;NOT GOOD FD37 3D DCR A ;NEXT PATTERN FD38 C232FD JNZ MEM1 FD3B 72 MOV M,D ;RESTORE MEMORY FD3C DB03 IN 3 FD3E E602 ANI 2 ;BAIL OUT? FD40 C0 RNZ ;YES FD41 23 INX H FD42 0B DCX B FD43 78 MOV A,B FD44 B1 ORA C FD45 C230FD JNZ MEM2 FD48 C9 RET FD49 23 MEMERR INX H ;ADJUST FOR PRNMEM FD4A 5F MOV E,A ;SAVE FD4B CDF1FE CALL PNTMEM ;PRINT ADDR,CONTENTS FD4E 7B MOV A,E ;RESTORE FD4F C3EDFE JMP SRCPNT1 ;PRINT SOULD BE ;************************************************************** ;DO DIRECT INPUT/OUTPUT FROM SPECIFIED PORT ;************************************************************** CP/M RMAC ASSEM 1.1 #020 MYVIO.ASM VERSION OF 73 MAY 84 RHP FD52 05 INPORT DCR B ;B=0=INPUT,B=1=OUTPUT FD53 CD9EFE OUTPORT CALL PARM2 ;INPUT PORT,VALUE IN H,L AND D,E FD56 78 MOV A,B ;FLAG FD57 07 RLC FD58 07 RLC FD59 07 RLC FD5A EE08 XRI 08H ;INVERT BIT 3 FD5C F6D3 ORI 0D3H ;FORM I/O INST FD5E 55 MOV D,L FD5F 2A8DF7 LHLD RAMPTR ;GET AVAIL RAM PTR FD62 77 MOV M,A FD63 BE CMP M FD64 C0 RNZ ;INVALID RAM FD65 E5 PUSH H FD66 23 INX H FD67 72 MOV M,D ;PORT # FD68 23 INX H FD69 36C9 MVI M,0C9H ;RETURN FD6B 2173FD LXI H,IORET FD6E E3 XTHL ;PUT RETURN ADDRESS,GET START ADDR FD6F 78 MOV A,B FD70 B7 ORA A ;SET FLAG FOR IN OR OUT FD71 7B MOV A,E ;OUTPUT BYTE FD72 E9 PCHL FD73 C0 IORET RNZ ;DONE IF OUTPUT INST FD74 CDAFFC CALL OHEXB ;PRINT VALUE IF INPUT FD77 C9 RET ;************************************************************** ;SET FREE RAM PTR FOR DIRECT IO INSTS ;************************************************************** FD78 CDBFFE RAMFND CALL IHEX ;GET RAM ADDR FD7B 228DF7 SHLD RAMPTR ;SAVE IN VIO RAM FD7E C9 RET ;************************************************************** ;COMPARE MEMORY BLOCKS AND PRINT DIFFERENCES ;************************************************************** FD7F CDC3FD CMPBLK CALL PARM4 ;START,SIZE,DEST IN HL BC,DE FD82 1A CMPBLK1 LDAX D ;DEST BYTE FD83 BE CMP M ;SAME AS SOURCE BYTE? FD84 23 INX H FD85 13 INX D FD86 CA91FD JZ CMPB1 ;YES, NO PRINT FD89 CDF1FE CALL PNTMEM ;PRINT ADDR,SOURCE DEST FD8C EB XCHG FD8D CDF4FE CALL PNTME1 ;NO CRLF FD90 EB XCHG FD91 0B CMPB1 DCX B FD92 78 MOV A,B FD93 B1 ORA C FD94 C8 RZ ;YES,RETURN FD95 DB03 IN 3 CP/M RMAC ASSEM 1.1 #021 MYVIO.ASM VERSION OF 73 MAY 84 RHP FD97 E602 ANI 2 FD99 C0 RNZ ;BAIL OUT FD9A C382FD JMP CMPBLK1 ;************************************************************** ;SEARCH MEMORY FOR MASKED 16 BIT VALUE ;S,FROM,TO,16BIT VALUE,16 BIT MASK ;************************************************************** FD9D CDC3FD SEARCH CALL PARM4 ;START,SIZE,VALUE IN H,L B,C D,E FDA0 E5 PUSH H ;SAVE FDA1 21FFFF LXI H,-1 ;DEFAULT MASK ALL FDA4 FE0A CPI 0AH ;USER SPECIFIED MASK? FDA6 C4BFFE CNZ IHEX ;YES,READ IT INTO H,L FDA9 E3 XTHL ;MASK ON STACK,START IN H,L FDAA 7E SEARCH1 MOV A,M ;LOW BYTE FDAB E3 XTHL ;H,L=MASK VALUE FDAC A4 ANA H ;MASK HIGH BYTE FDAD BA CMP D ;IS IT CORRECT VALUE? FDAE E3 XTHL ;RESTORE START PTR FDAF 23 INX H ;BUMP PTR FDB0 C2BBFD JNZ CMP16 ;NO MATCH FDB3 7E MOV A,M ;LOW BYTE FDB4 E3 XTHL ;GET MASK IN H,L FDB5 A5 ANA L FDB6 BB CMP E FDB7 E3 XTHL ;H,L=START,STACK=MASK FDB8 CCE9FE CZ SRCPNT ;PRINT MATCH IF FOUND FDBB 0B CMP16 DCX B FDBC 78 MOV A,B FDBD B1 ORA C FDBE C2AAFD JNZ SEARCH1 FDC1 C1 POP B ;REMOVE MASK VALUE FDC2 C9 RET ;************************************************************** ;PARM4 INPUTS START,END,VALUE AND ;CONVERTS TO START,SIZE,VALUE IN H,L B,C AND D,E ;RESPECTIVELY ;************************************************************** FDC3 CD0CFD PARM4 CALL SIZE FDC6 C3AEFE JMP PARM3 ;************************************************************** ;MVCUP MOVE B,C CHARS FROM H,L TO D,E FROM BOTTOM ;************************************************************** FDC9 78 MVCUP MOV A,B FDCA B1 ORA C FDCB C8 RZ FDCC 7E MOV A,M FDCD 12 STAX D ;MOVE IT FDCE 0B DCX B FDCF 23 INX H FDD0 13 INX D CP/M RMAC ASSEM 1.1 #022 MYVIO.ASM VERSION OF 73 MAY 84 RHP FDD1 C3C9FD JMP MVCUP ;KEEP GOING FDD4 3E54 ERR2 MVI A,'T' ;TYPE CODE ERROR FDD6 CADFFD JZ RDRCRDS ;NO ERROR FDD9 CD91F8 CALL CHAROUT FDDC C301FC JMP PRMPT ;BAIL OUT FDDF C1 RDRCRDS POP B ;EXEC FDE0 E1 POP H ;END FDE1 D1 POP D ;START FDE2 C5 PUSH B ;RETURN EXEC ADDR FDE3 E5 PUSH H ;END FDE4 D5 PUSH D ;START FDE5 7D MOV A,L FDE6 93 SUB E FDE7 6F MOV L,A FDE8 7C MOV A,H FDE9 9A SBB D FDEA 67 MOV H,A FDEB 29 DAD H FDEC 4C MOV C,H FDED 0C INR C ;RECORD COUNT TO READ FDEE CD33FE RDRCRD CALL CASIN ;TYPE CODE FDF1 FE81 RDRCRD1 CPI 81H ;ABS BINARY? FDF3 C2D4FD JNZ ERR2 ;TYPE CODE ERROR FDF6 CD33FE CALL CASIN ;BYTE COUNT FDF9 47 MOV B,A ;SAVE RECORD BYTE COUNT FDFA 210000 LXI H,0 ;0 CHECKSUM FDFD CD41FE RDATA CALL CASINCK ;READ DATA BYTE FE00 12 STAX D ;STORE IT FE01 13 INX D FE02 05 DCR B FE03 C2FDFD JNZ RDATA ;CONTINUE IF NOT DONE FE06 D5 PUSH D ;SAVE MEMORY PTR FE07 EB XCHG ;DE=CHECKSUM FE08 CD5CFE CALL CASWD ;READ TAPE CHECKSUM FE0B 65 MOV H,L FE0C 6F MOV L,A ;REVERSE BYTES FE0D 19 DAD D ;ADD TO COMPUTED CHECKSUM FE0E 7C MOV A,H FE0F B5 ORA L FE10 3E43 MVI A,'C' ;CHECKSUM ERROR FE12 C491F8 CNZ CHAROUT ;TYPE 'C' FE15 C21DFE JNZ RDATA1 FE18 3E2A MVI A,'*' FE1A CD91F8 CALL CHAROUT ;TYPE * FOR GOOD RECORD FE1D D1 RDATA1 POP D ;RETRIEVE MEMORY PTR FE1E 0D DCR C ;ALL RECORDS READ YET FE1F C2EEFD JNZ RDRCRD ;NO READ ANOTHER FE22 CDB4FE CALL CRLF FE25 0E03 MVI C,3 FE27 E1 LP2 POP H FE28 CDB8FC CALL OHEXHL FE2B 0D DCR C FE2C C227FE JNZ LP2 FE2F F1 POP PSW ;EXEC/LOAD FLAG CP/M RMAC ASSEM 1.1 #023 MYVIO.ASM VERSION OF 73 MAY 84 RHP FE30 1F RAR FE31 D8 RC ;DONE FE32 E9 PCHL ;************************************************************** ;READ BYTE FROM CASETTE WITHOUT CHECKSUM ;************************************************************** FE33 DB03 CASIN IN 3 FE35 0F RRC FE36 0F RRC ;C=SERIAL READY FE37 DA01FC JC PRMPT ;BAIL OUT FE3A 0F RRC ;C=CASETTE READY FE3B D233FE JNC CASIN ;KEEP TRYING FE3E DB00 IN 0 ;DATA PORT FE40 C9 RET ;************************************************************** ;CASINCK- READ BYTE WITH CHECKSUM ;************************************************************** FE41 CD33FE CASINCK CALL CASIN FE44 C5 CHKSUM PUSH B FE45 4F MOV C,A ;NEW CHAR IN LOW BYTE FE46 0600 MVI B,0 FE48 09 DAD B ;ADD TO CHECKSUM FE49 C1 POP B ;RESTORE FE4A C9 RET ;************************************************************** ;GET CASETTE IN BYTE MODE IE READ FIRST 0E6H ;************************************************************** FE4B 3E60 BYTESET MVI A,60H ;BIT MODE FE4D D303 OUT 3 FE4F CD33FE BYTE1 CALL CASIN ;READ BYTE EVERY BIT TIME FE52 FEE6 CPI 0E6H ;SYNC YET FE54 C24FFE JNZ BYTE1 ;NO FE57 3E20 MVI A,20H ;BYTE MODE FE59 D303 OUT 3 FE5B C9 RET ;************************************************************** ;CASWD-INPUT WORD TO H,L ADD FIRST BYTE ONLY ;TO CHECKSUM ;************************************************************** FE5C CD33FE CASWD CALL CASIN ;READ LOW BYTE FE5F 6F MOV L,A FE60 CD33FE CALL CASIN ;READ HIGH BYTE FE63 67 MOV H,A FE64 C9 RET ;************************************************************** ;CHARACTER INPUT ROUTINES ;************************************************************** CP/M RMAC ASSEM 1.1 #024 MYVIO.ASM VERSION OF 73 MAY 84 RHP FE65 CD76FE CHIN CALL CHIN1 FE68 FE03 CPI 03 ;CRTL C? FE6A CAF5FB JZ MONT ;YES,RESET AND PROMPT FE6D CD91F8 CALL CHAROUT FE70 FE0D CPI 0DH FE72 CCB4FE CZ CRLF ;ADD LINE FEED FE75 C9 RET FE76 CD89FE CHIN1 CALL CONST FE79 B7 ORA A FE7A CA76FE JZ CHIN1 FE7D DB02 IN 2 ;READ PORT 2 FE7F E67F ANI 7FH ;MASK PARITY FE81 C9 RET FE82 DB03 PRSTAT IN 3 ;READ STATUS PORT FE84 E608 ANI 8 ;CHECK THE READY BIT FE86 C38DFE JMP STAT1 FE89 DB03 CONST IN 3 ;READ STATUS PORT FE8B E602 ANI 2 ;CHECK FOR KEYPRESS FE8D 3EFF STAT1 MVI A,0FFH ;GET READY FOR KEYPRESS FE8F C0 RNZ FE90 2F CMA ;NO KEYPRESS FE91 C9 RET FE92 4F PRINTA MOV C,A FE93 CD82FE PRINTC CALL PRSTAT FE96 B7 ORA A FE97 CA93FE JZ PRINTC FE9A 79 MOV A,C FE9B D301 OUT 1 FE9D C9 RET ;************************************************************** ;PARM2 READ 2 PARAMETERS 16 BITS EACH INTO H,L AND D,E ;************************************************************** FE9E CDBFFE PARM2 CALL IHEX FEA1 54 MOV D,H FEA2 5D MOV E,L FEA3 FE0A CPI 0AH ;TERMINATED? FEA5 C8 RZ ;YES,USE SAME VALUE FEA6 FE2C CPI ',' FEA8 CAAEFE JZ PARM3 FEAB FE20 CPI ' ' FEAD C0 RNZ ;INVALID FEAE EB PARM3 XCHG FEAF CDBFFE CALL IHEX ;GET SECOND PARM FEB2 EB XCHG FEB3 C9 RET ;************************************************************** ;CRLF DO CARRIAGE RETURN/LINE FEED ;************************************************************** CP/M RMAC ASSEM 1.1 #025 MYVIO.ASM VERSION OF 73 MAY 84 RHP FEB4 3E0D CRLF MVI A,0DH FEB6 CD91F8 CALL CHAROUT FEB9 3E0A MVI A,0AH FEBB CD91F8 CALL CHAROUT FEBE 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 ;************************************************************** FEBF 210000 IHEX LXI H,0 FEC2 CD65FE IHEX2 CALL CHIN ;READ CHAR FEC5 F5 PUSH A FEC6 CDD8FE CALL ASBI ;CONVERT TO BIBARY FEC9 D2CEFE JNC IHEX1 FECC F1 POP A FECD C9 RET FECE 29 IHEX1 DAD H FECF 29 DAD H FED0 29 DAD H FED1 29 DAD H ;ADD NEW DIGIT FED2 85 ADD L FED3 6F MOV L,A FED4 F1 POP A FED5 C3C2FE JMP IHEX2 ;************************************************************** ;CONVERT ASCII HEX CHAR IN A-REG TO BINARY IN A REG ;RETURN WITH CARRY SET IF INVALID CHAR,RESET OTHERWISE ;************************************************************** FED8 D630 ASBI SUI 30H ;REMOVE ASCII BIAS FEDA D8 RC ;INVALID <0 FEDB FE0A CPI 10 FEDD DAE7FE JC ASBI1 ;VALID 0-9 FEE0 D611 SUI 17 FEE2 D8 RC ;INVALID FEE3 C60A ADI 10 FEE5 FE10 CPI 16 ;SET CARRY IF <0FH FEE7 3F ASBI1 CMC FEE8 C9 RET ;************************************************************** ;PRINT H,L AND 16 BIT MEMORY AT H,L ;************************************************************** FEE9 CDF1FE SRCPNT CALL PNTMEM FEEC 7E MOV A,M ;BYTE 2 FEED CDFEFE SRCPNT1 CALL OHEX FEF0 C9 RET FEF1 CDB4FE PNTMEM CALL CRLF CP/M RMAC ASSEM 1.1 #026 MYVIO.ASM VERSION OF 73 MAY 84 RHP FEF4 2B PNTME1 DCX H ;BACK UP 1 FEF5 CDB8FC CALL OHEXHL FEF8 7E MOV A,M FEF9 CDAFFC CALL OHEXB FEFC 23 INX H FEFD C9 RET ;************************************************************** ;OUTPUT HEX CHARS TO VIDIO FROM A REG ;************************************************************** FEFE F5 OHEX PUSH PSW ;SAVE CHAR FEFF 0F RRC FF00 0F RRC FF01 0F RRC FF02 0F RRC FF03 CD0BFF CALL BIAS ;BINARY TO ASCII AND OUT FF06 F1 POP PSW FF07 CD0BFF CALL BIAS FF0A C9 RET ;************************************************************** ;CONVERT BINARY TO ASCII ;************************************************************** FF0B E60F BIAS ANI 0FH ;MASK NIBBLE FF0D C690 ADI 90H FF0F 27 DAA FF10 CE40 ACI 40H FF12 27 DAA FF13 CD91F8 CALL CHAROUT FF16 C9 RET ;************************************************************** ;OUTPUT MESSAGE PTED TO BY H,L AND TERMINATED ;BY ONE BYTE OF BINARY ZEROS ;************************************************************** FF17 CDB4FE MSG CALL CRLF FF1A 7E MSGNC MOV A,M FF1B B7 ORA A FF1C C8 RZ FF1D CD91F8 CALL CHAROUT FF20 23 INX H FF21 C31AFF JMP MSGNC FF24 = CMDTBL EQU $ FF24 1B DB 1BH ;ESCAPE CODE FF25 ABFC DW ESCAP FF27 43 DB 'C' ;CALL MEMORY WITH RETURN FF28 49FC DW CALL1 FF2A 44 DB 'D' ;DISPLAY MEMORY FF2B 6FFC DW DISP FF2D 45 DB 'E' ;ENTER INTO MEMORY FF2E 4DFC DW ENTR FF30 46 DB 'F' ;FILL MEMORY CP/M RMAC ASSEM 1.1 #027 MYVIO.ASM VERSION OF 73 MAY 84 RHP FF31 20FD DW FILL FF33 48 DB 'H' ;INTEL HEX LOADS FF34 C1FC DW INTEL FF36 49 DB 'I' ;INPUT FROM SPECIFIED PORT FF37 52FD DW INPORT FF39 4A DB 'J' ;JUMP TO ADDRESS FF3A 48FC DW JUMP FF3C 4D DB 'M' ;MOVE MEMORY BLOCK FF3D 19FD DW MOVE FF3F 4F DB 'O' ;OUTPUT TO SPECIFIED PORT FF40 53FD DW OUTPORT FF42 52 DB 'R' ;FREE RAM LOCATION FF43 78FD DW RAMFND FF45 53 DB 'S' ;16 BIT MASKED SEARCH FF46 9DFD DW SEARCH FF48 54 DB 'T' ;TEST MEMORY FF49 2CFD DW MEMTEST FF4B 56 DB 'V' ;COMPARE MEMORY BLOCKS FF4C 7FFD DW CMPBLK FF4E 00 DB 0 FF4F END