ÚVOD | Novinky | 8 Bitů | Příslušenství | Drobnosti | TTL | Kontakt
SAPI-1 | ONDRA | PMI-80 | PMD-85 | klony PMD-85 | klony SM50/40 | PETR | PLAN-80A | IQ151 | TNS | FK-1 | HVĚZDA | SP 830 | PCS 1-QR6000
ZPS | Technické prostředky | Programové vybavení | Dokumentace
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TITLE 'MONITOR SAPI-1 V4.1F' ; 30.7.1985 (P+S) ; MODIFIKACE MONITORU "M4F" PRO KLAVESNICI C259.11 ; 15.7.1985 ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ; ; VOLBA SYSTEMU SP1 EQU -1 ; -1 YES SP1A EQU 0 ;FOR CP/M SYSTEM MONITOR CPM EQU 00 ;JPR-1 EPROM VERSION ; ; ; *** DEFINOVANI PAMETOVEHO PROSTORU * ; MONIT EQU 100H ; START MONITORU ; NASTAVENI PAMETI R A M RAM EQU 4000H ;START RAM IF CPM ERAM EQU 9FFFH ;TOP RAM TVBEG EQU 0E800H ;TV-RAM EP2 EQU 800H+200H ; SECOND EPROM ELSE ERAM EQU 0FFFFH ;RAM-1 48K TVBEG EQU 3800H ;TV-RAM EP2 EQU 800H ; SECOND EPROM ENDIF @R@ EQU 4000H ;RESTART VECTOR RSTN EQU 0CFH ; RST 1 ; GLOBAL CONSTANTS CR EQU 0DH ; CARRIAGE RETURN HT EQU 9 ; TAB BACK EQU 8 ; BACK SPACE BELL EQU 7 ; BELL LF EQU 0AH ; LINE FEED ETX EQU 03H ; BREAK CHAR.(CONTROL C) CTRLW EQU 17H ; BREAK USER BEGIO EQU 55H ; START VALUE FOR I/O BYTE ; I/O STATUS BYTE MASKS AND VALUES CMSK EQU 11111100B ; MASK FOR CONZOLE RMSK EQU 11110011B ; MASK FOR READER PMSK EQU 11001111B ; MASK FOR PUNCH LMSK EQU 00111111B ; MASK FOR LIST CTTY EQU 00000000B ; CONZOLE=TTY CCRT EQU 00000001B ; CONZOLE=CRT BATCH EQU 00000010B ; INPUT=READER,OUTPUT=LIST CUSE EQU 00000011B ; USER REFINED CONZOLE RTTY EQU 00000000B ; READER=TTY RPTR EQU 00000100B ; READER=PTR RUSE1 EQU 00001000B ; USER DEFINED READER 1 RUSE2 EQU 00001100B ; USER DEFINED READER 2 PTTY EQU 00000000B ; PUNCH=TTY PPTR EQU 00010000B ; PUNCH=PTR PUSE1 EQU 00100000B ; USER DEFINED PUNCH 1 PUSE2 EQU 00110000B ; USER DEFINED PUNCH 2 LTTY EQU 00000000B ; LIST=TTY LCRT EQU 01000000B ; LIST=CRT LLPT EQU 10000000B ; LIST=LPT LUSE EQU 11000000B ; USER DEFINED LIST ; ; SEPI CONTROL I/O ; UDATA EQU 12H USTAT EQU 11H MMODE EQU 11H UMODE EQU 10H URES EQU 13H ALLINT EQU 02H ASEG IF SP1 ; ; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ; RESTARTS & CP/M ENTRY ; ; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ IF CPM ORG 100H ENDIF IF NOT CPM ORG 0 ; BEGIN MEMORY ENDIF JMP COLD ; COLD START DB 55H ;INTEL IOBYT DB 40H ;V 4.0 JMP CCPM JMP @R@ ; MINUS: MVI A,'-' JMP COA JMP @R@+3 ; EQUAL: MVI A,'=' JMP COA JMP @R@+6 ; QUES: MVI A,'?' JMP COA JMP @R@+9 ; IOCHK: LDA IOBYT RET DB 'P' JMP @R@+12 ; IOSET: MOV A,C STA IOBYT RET JMP @R@+15 ; SPCL: LHLD CADR MOV A,M RET ; FOR PEDIT JMP @R@+18 ; CCPM: MOV A,C ;CONTINUE ENTRY TO CPM MOV C,E ; INTEL PUSH D ;DE->HL LXI H,TCPM MVI B,11 ; MAX CPM ENTRY JMP INJM@ ;------------------------------- TCPM: DW COLD,CI DW CO,RI DW PO,LO DW CICO,IOCHK DW IOSET,ERROR DW ERROR,CSTS CI: PUSH H LXI H,CITB JMP IOCOM-3 ; TABCOD: DB 'AQ1' DB 1BH,0DH ; ESC, CR DB 'P0' DB 'ZSW2 LO9' DB 'XDE3MKI8' DB 'CFR4NJU7' DB 'VGT5BHY6' ; POKRACOVANI TABULKY - SHIFT DB 10H,11H ; ^A ^Q DB '!' DB 0AH,0DH DB 7FH DB ')' DB 'Z' DB 13H,17H ; ^S, ^W DB '?' DB 9 ; TABELATOR/SHIFT SPC DB '=#(' DB 3 ; EXT/SHIFT X DB '&E".*@>' DB '[\%$,-:<' DB ']_' DB 8 ; BACKSPACE DB '^' DB ';+/' DB 27H ; ' UVOZOVKA ; I/O DEVICE TABLE ; IOTAB: DB 'C',03H ;CONSOLE (LOCAL, MASK) DB 'TCB1' ;PHYSICAL DB 'R',0CH ;READER DB 'TP12' DB 'P',30H ;PUNCHER DB 'TP12' DB 'L',0C0H ;LIST DB 'TCL1' ; ASSING TABLE FOR LOG. DEVICE ; COTB: DW COLO,CRT,LO,COLOC CITB: DW KBR,KBR,RI,CILOC LOTB: DW COLO,CO,LPR,LILOC RITB: DW KBR,RDR,R1LOC,R2LOC POTB: DW CO,PUN,P1LOC,P2LOC ; ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% VERS: DB CR,LF DB 'SAPI-1 V4.1' LVER EQU $-VERS ; DELKA OHLASENI ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ;*************************************************** IF CPM ORG MONIT+100H ELSE ORG MONIT ; *** ZACATEK MONITORU *** ENDIF ;*************************************************** ; TABLE OF EXTERNALLY REFERENCED ROUTINES JMP COLD ; START MONITORU JMP CI ; CONZOLE INPUT <A> JMP RI ; READER INPUT <A>, CY=1 ERROR JMP CO ; CONZOLE OUTPUT <C> JMP PO ; PUNCH OUTPUT <C> JMP LO ; LIST OUTPUT <C> JMP CSTS ; CONZOLE INPUT STATUS JMP IOCHK ; I/O BYTE CHEK <A> JMP IOSET ; I/O BYTE SET <C> JMP MEMCK ; SIZE MEMORY CHECK JMP IODEF ; DEFINE USER I/O ENTRY POINTS JMP SPCL ; I/O CONTROL SPECIAL JMP CRLF ; NOVY RADEK JMP EXPR ; SKLADANI ADRES (N=POCET <C>, SP) JMP ERROR ; HLASENI CHYBY JMP ASHEX ; PREVOD ASCII->HEX,CHYBA-CARRY JMP DADR ; ZOBRAZENI ADRESY <HL> JMP DBYT ; ZOBRAZENI ZNAKU <A> NA 'CO' JMP HILO ; HL+1,SROVNANI S DE,(HL=0) JMP NEXT ; PREDANI MONITORU JMP SPACE ; MEZERA NA 'CO' JMP CINCR ; ECHO+ANALIZA JMP TEXT ; VYPIS TEXTU <HL=ADRESA>,<D=DELKA> JMP XY ; PROVEDENI POVELU DLE <A> JMP HXASC ; PREVOD HEX->ASCII DO <A>,<C> JMP EXFLG ; EXTERNAL CONTROL FLAGS ; ;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" ; ASSIGN I/O DEVICE MODUL ; ASIGN: CALL CIMIN ;NAME ; <A>..NAME (EXTERN CALLS) LXI H,IOTAB ;TABLE MVI C,4 ;COUNTER LXI D,6 ;OFFSET ASS0: CMP M ;IS IT? JZ ASS1 ;+ DAD D ;ADR DCR C ;ALL ? JNZ ASS0 ;- ; ; ERROR MESSAGE ; ERROR: CALL QUES CALL BEEP JMP INIC ;START ; ASS1: CALL EQUAL CALL ECHO ;PHIS.D INX H MOV B,M ;MASK MVI C,0 ;IOBYT ASS2: INX H CMP M ;IS IT? JZ ASS3 ;+ PUSH PSW MVI A,55H ;OFFSET ADD C MOV C,A JC ERROR ;NO # POP PSW JMP ASS2 ;NEXT ASS3: MOV A,C ;COMPUTE IOBYT ANA B ;MASK MOV C,A ;SAVE MOV A,B CMA ;NEG IONEW: LXI H,IOBYT ANA M ORA C MOV M,A RET ; ; QUERY DEVICE ; QUERY: LXI H,IOTAB ;TABLE LDA IOBYT ; READ MOV B,A ;SAVE CALL $+3 CALL $+3 ;DO IT ; DISPLAY ASSIGN I/O CALL SPACE MOV A,M ; READ LOGICAL NAME CALL COA CALL EQUAL PUSH H ;SAVE ADR INX H INX H ;ADR MOV A,B ANI 3 MOV E,A MVI D,0 DAD D ;PHYSICAL DEVICE ADR MOV A,M CALL COA MOV A,B RRC RRC ;ROTATE IOBYT MOV B,A POP H MVI E,6 ;OFFSET DAD D RET ;HL=NEXT ADR ; ;%%%%%%%%%%%%%%%%%%%%%%%%% ; I/O DEVICE CONTROL ;%%%%%%%%%%%%%%%%%%%%%%%%% CSTS1: ORA A JM CSLOC ;USER CSTS XRA A RET ;BATCH-NOT READY ; CSTS: LDA IOBYT RAR RAR JC CSTS1 IF NOT CPM ; STATUS KLAVESNICE KBSTS: LDA 2400H ; STATUS SC/ RRC MVI A,0FFH ACI 0 RET DW -1,-1,-1,-1,-1,-1,-1,-1,-1,-1 DW -1,-1,-1,-1,-1,-1,-1,-1,-1,-1 DW -1,-1,-1,-1,-1,-1,-1,-1,-1,-1 DB -1,-1,-1,-1,-1 ; ELSE PUSH B PUSH D PUSH H MVI C,6 MVI E,0FFH CALL 5 CPI CTRLW CZ RESTA ; BREAK ORA A POP H POP D POP B RET ; ENDIF BEEP: PUSH B MVI C,40 CALL CLICK DCR C JNZ $-4 POP B RET CLICK: MVI H,24H ; PORT0 MVI M,0 ; REPRO ON CLCK1: DCR B JNZ CLCK1 MVI M,2 ; REPRO OFF CLCK2: DCR B JNZ CLCK2 RET ; PROHLEDAVANI KLAVESNICE ANK-1 ;=============================== ; KONSTANTNI DOBA PROHLEDAVANI 0.816 MS/488NS. ; PLATNA POSLEDNI NALEZENA KLAVESA. ; B...CITAC DO 8, C... LINEARNI KOD ; D...SHIFT FLAG, SOUCASNE MASKA LED. ; E...CITAC LINEARNIHO KODU KLAVES: ; A-Q-1-LF-CR-P-0 Z-S-W-SP-L-O-9.. ; H...UKAZATEL NA PORT0 JPR-1 ; L...VYBER MATICE VODOROVNE ; PO PROVEDENI KOD V 'A', 'C' REGISTRU. ; PRIZNAK 'SHIFT' V 'D' REGISTRU. ; FLAG 'SIGN' SIGNALIZUJE STISKNUTI- ; PLUS...ANO, MINUS...NE KEYIN: PUSH H ; V2.2 20.1.85 LXI D,1FFFH ; MASKA&CITAC MVI C,0 MVI H,24H ; PORT0 MVI A,11101111B NXLIN: MOV L,A ANA D MOV M,A MVI B,8 ; CITAC BITU MOV A,M KEY: RRC INR E ; NACTI KOD JC NXKEY ; SKOC, KDYZ NIC MOV C,E ; KOD KLAVESY JNZ NXKEY ; SHIFT ? MVI D,3FH ; ANO NASTAV MASKU NXKEY: DCR B JNZ KEY MOV A,L RRC JC NXLIN DCR C ; NASTAV 'SIGN' POP H RM ; STISKNUTA? MOV A,D ; SHIFT? ANI 20H MOV A,C RZ ; NE,NAVRAT ADD E ; ANO, +39 MOV C,A RET ENDIF ; ; ; CALL RESTA ;^W KBR: CALL KBRD CPI CTRLW JZ KBR-3 ; SIMUL. INTERRUPT CPI CTRLQ RNZ PUSH B ;WINDOW PUSH D PUSH H MVI B,0 CALL UCMD ;CLEAR CALL KBRD ;NUMBER OF RESEVED LINES ANI 0FH ;MAX 15 STA RESL MVI B,80H ;SET NEW LINE CALL UCMD POP H POP D POP B JMP KBR ;NEW CHAR. ; CICO: MOV A,C ; DIRECT CRT/KBRD INR A JNZ CRT ; ONLY OUTPUT CALL KBSTS RZ KBRD: PUSH H ; IF CPM KBR1 MVI E,0FFH MVI C,6 CALL 5 ANI 7FH JNZ KBR1 ;WAIT ELSE MVI H,27H MVI M,2 ; AC/=0 ZVUK/=1 KBRD1: MOV A,M ; SC/ = 00 RRC JC KBRD1 INR H MOV A,M ; KOD ZNAKU CMA ANI 7FH MOV L,A DCR H MVI M,3 ; AC/=1 KBRD2: MOV A,M RRC JNC KBRD2 MVI M,2 ; AC/=0 LDA MODE ANI 4 ; LOWER OPTION? MOV A,L POP H JNZ CNTRP ; IF LOWER CPI 61H ; <'a' JC CNTRP CPI 7BH ; >'z' JNC CNTRP SUI 20H ; LOWER=>UPPER JMP CNTRP DW -1,-1,-1,-1,-1,-1,-1,-1,-1,-1 ENDIF ; CNTRP: CPI CTRLP ;^P RNZ LDA MODE XRI 1 STA MODE ; LPR ON/OFF JMP KBRD ; ; RI: PUSH H LXI H,RITB LDA IOBYT RICOM: RRC RRC JMP IOCOM ; PO: PUSH H LXI H,POTB LDA IOBYT RRC RRC JMP RICOM ; LO: PUSH H LXI H,LOTB LDA IOBYT RLC RLC JMP IOCOM ;---------------------------- ; COLO: CALL LPR JMP CRT ;---------------------------- ; ; ; RUN AND BREAK MODUL: ; RESTA: DI ;SAVE ALL SHLD HLSAV PUSH PSW LXI H,2 ;OFSSET DAD SP SHLD SPSAV POP PSW POP H ;PC LXI SP,HLSAV PUSH D PUSH B PUSH PSW XCHG DCX D ; PC-1 LXI H,BRAD ;BREAK ? MVI C,2 ; TWO BREAKS RST10: PUSH B ;COUNTER MOV C,M MVI M,0 INX H MOV B,M MVI M,0 INX H MOV A,C ORA B ;0 ? JZ RST20 ;NO BREAK MOV A,M ;RESTORE INSTR STAX B INX H PUSH H MOV H,B MOV L,C ;BREAK/INTR ? CALL COMPR POP H JNZ RST20 DCX D ;PC-1 RST20: POP B DCR C JNZ RST10 XCHG INX H ;RESTORE PC SHLD PCSAV STC CALL X+3 ;DISPLAY ALL REGISTERS JMP NEXT ;WAIT FOR COMMAND ; ; GO TO COMMAND ; GOTO: CALL EQUAL CALL CINCR ;COMMAND JC GO@ ;IF CR THEN GOTO FROM OLD PC JZ GO@BR ; OLD PC AND BREAK CALL EXPRM ;START ADR POP H SHLD PCSAV ;SET NEW MOV A,B ;ONLY START ADR ? CPI CR JZ GO@ GO@BR: CALL RADR ;READ BREAK ADR SHLD BRAD MOV A,M ;SAVE INSTR. CODE STA INSTR MVI M,RSTN ;SET RST MVI A,CR CMP B ;ONLY 1-BREAK ? JZ GO@ ; SECOND BREAK CALL RADR SHLD BRAD2 MOV A,M STA INST2 MVI M,RSTN ; START PROGRAM GO@: CALL CRLF DI LXI SP,ACSAV ;REASTORE REGISTERS POP PSW POP B POP D LHLD SPSAV ;STACK SPHL LHLD PCSAV ; PC XTHL LHLD HLSAV RET ;CONTINUE... ; ; EXAMINE REGISTRS ; X: CALL CINCR ;COMMAND LXI H,RGNAM ;NAME TABLE MVI D,HIGH ACSAV ;DATA JNC X1 ;CHANGE CALL CRLF X0: CALL XDISP RZ ;END INX H JMP X0 X1: JZ X2 ;NO CHANGE MOV E,A ;SAVE NAME DB 1 ; LXI B,## X10: INX H INX H MOV A,M ; READ NAME REG. ANI 7FH JZ ERROR ; NO FIND CMP E JNZ X10 ; NEXT CALL XDIS1 ; DISPLAY IT JMP X2+3 ; X2: CALL XDISP+3 RZ CALL CIMIN ;- COMMAND RC ;CR - END MOV E,M ;LOW ADR INX H JZ X2 ;SP - NEXT XCHG PUSH D CALL RBYT ; READ NEW BYTE AND CHANGE DCR B JZ $+6 MOV M,D ; HIGH BYTE DCX H MOV M,E ;LOW POP D XCHG CPI CR ;LAST? RZ ;+ JMP X2 ;NEXT ; XDISP: CALL SPACE MOV A,M ANI 7FH RZ CALL COA XDIS1: CALL EQUAL ;NAME= MOV A,M RLC MVI A,1 ACI 0 ; COMPUTE LENGHT MOV B,A ; SAVE INX H MOV E,M ; LOW ADR LDAX D ;HIG BYTE CALL DBYT MOV A,B ;SINGLE REG. ? DCR A DCX D LDAX D ;READ SECOND BYTE CNZ DBYT ;IF 2.BYTE REG. THEN DISP. ORA E ;NZY (IN PAGE) RET ; ; X: COMMAND TABLE RGNAM: DB 'A',LOW ACSAV+1 DB 'F',LOW ACSAV DB 'B',LOW BCSAV+1 DB 'C',LOW BCSAV DB 'D',LOW DESAV+1 DB 'E',LOW DESAV DB 'H',LOW HLSAV+1 DB 'L',LOW HLSAV DB 'P' OR 80H,LOW PCSAV+1 DB 'S' OR 80H,LOW SPSAV+1 DB 0 ; ; DISPLAY CONTENS OF MEMORY ; DISP: CALL EXPR ; FROM -TO POP D POP H DI0: PUSH H ;FIRST ADR CALL DNADR ;NEW ADR DI1: MOV A,M CALL DBYTE CALL HILO JC DIA ;DISPLAY ASCII MOV A,L ANI 7 JNZ DI1 ;NEXT BYTE DIA: POP H CALL SPACE DI2: MOV A,M MVI C,'.' ;NO ASCII CPI ' ' JNC $+4 MOV A,C CPI 60H JC $+5 SUI ' ' CALL COA CALL HILO RC MOV A,L ANI 7 JNZ DI2 ;NEXT ASCII CALL CSTS JZ DI0 ;NEXT LINE CALL CIMIN ;#VERS."F" - RC ;#IF SPC WAIT RNZ ;#ELSE BREAK. CALL CINCR ;#CR? JNC DI0 ;#BREAK,IF CR RET ; ; FILL MEMORY BLOCK WITH BYTE ; FILL: INR C CALL EXPR ;FROM-TO-WITH POP B POP D POP H FI1: MOV M,C CALL HILO JNC FI1 RET ; ; MOVE BLOCK MEMORY ; MOVE: INR C CALL EXPR POP B POP D POP H MO1: MOV A,M STAX B INX B CALL HILO JNC MO1 RET ; ; SUBSTITUTE MEMORY ; SUBS: CALL RADR ;ADR SU1: MOV A,M CALL DBYT CALL CIMIN ;- & CINCR RC ;CR JZ SU2 CALL RBYT ;CHANGE RZ ;END SU2: INX H ;NEXT BYTE CPI ',' ;IF , THEN DISPLAY ADR CZ DNADR JMP SU1 ; ; CONSOLE MODUL ; ; ECHO: CALL CI COA: PUSH B MOV C,A CALL CO POP B RET ; IF SP1A MINUS: MVI A,'-' JMP COA ; EQUAL: MVI A,'=' JMP COA ; QUES: MVI A,'?' JMP COA ; ENDIF ; ;SET MODE. I/O FLAGS ; EXFLG: MOV B,A MOV A,C CPI EXSER ; OVERFLOW ? MOV A,B RNC PUSH H ; <A> .. COMMAND ; <C> .. 0-N SLUZBA MVI B,0 ; 0-MODE, 1-@IF1..4@OF2 LXI H,MODE ; 0=0 DAD B ; 5- RESERVE_LINE, 6-S@FLG MOV M,A POP H RET ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ; **** S T A R T M O N I T O R U **** ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ; COLD: OUT URES ; RESET XRA A ;MONITORU OUT UMODE MVI A,0DH OUT MMODE NOP ; RESERVA NOP NOP NOP ; ;------------------------------------- BEG: DI ; COMMAND "C" LXI H,MSTAK ; SET STACK POINTER SPHL LXI D,@R@+255 MVI C,0 CALL FI1 ;CLEAR M-RAM MVI A,BEGIO ;SET IOBYTE STA IOBYT CALL COINIT ;TV CALL EP2? ;M-PLUS ? CZ EP2+3 ;INIT M-PLUS LXI H,RAM MEM1: INR H ; NEXT PAGE MOV A,H IF HIGH ERAM NE 0FFH CPI HIGH ERAM+1 ELSE CPI 0 ENDIF JZ MEM2 MOV A,M CMA MOV M,A ; WRITE COMPLEMENT CMP M ; WRITE O.K. ? CMA MOV M,A ; RAM RESTORE JZ MEM1 MEM2: DCX H ; LAST BYTE IN RAM SHLD MEMTOP ; SAVE ADDRES MVI A,17H ; LIN. KOD 'C' STA LASTC ; LAST CODE MVI A,0FFH STA FLAG ; ZAKAZ CSTS LXI H,MSTAK-20H SHLD SPSAV ; OHLASENI MONITORU INIC: LXI H,VERS ; TEXT OHLASENI MVI D,LVER ; DELKA TEXTU CALL TEXT ; TEXT OHLASENI ;------------------------------------ ; * VYHODNOCENI POVELU OPERATORA * ;------------------------------------ NEXT: LXI SP,MSTAK ; SET STACK FOR MONITOR LXI H,NEXT PUSH H ;RET. ADR IF NOT CPM MVI H,30H ;INTERRUPT ENABLE MVI M,2 ENDIF CALL CRLF MVI A,0C3H ; JMP STA @R@ ; SET INTERUPT ADR "08CH" LXI H,RESTA SHLD @R@+1 MVI C,'.' CALL CO CALL CINCR ; POVEL XY: MOV L,A ; L-COMMAND PUSH H ; SAVE SUI 'A' JM NEXT ; ASCII < "A" LXI H,CTBL ; ZACATEK COMMAND TABLE LXI B,(LCT SHL 8) OR 2 INJM@: CMP B JNC ERROR ;OVERFLOW INJMP: ADD A ;2* ADD L MOV L,A MOV A,M INX H MOV H,M MOV L,A XTHL ;SET HL RET ;START ;---------------------------------- ; * TABULKA POVELU MOVITORU * ;---------------------------------- ; CTBL: DW ASIGN ; ASSING I/O RUTINE DW EXROM ;B DW BEG ; CLEAR DW DISP ; DISPLAY MEMORY DW EXROM ; END OF FILE DW FILL ; FILL MEMORY DW GOTO ; GOTO WITH BREAK DW EXROM DW EXROM ;I DW EXROM ;J DW EXROM ;K DW EXROM ;L DW MOVE ; MOVE MEM. DW EXROM ; N - BLANK DW EXROM ;O DW EXROM ;P DW QUERY ; Q - MEMTOP & IOBYTE DW EXROM ; READ TAPE DW SUBS ; SUBSTITUTE DW EXROM DW EXROM ;U DW EXROM DW EXROM ;WRITE TO TAPE DW X ;X - EXAMINE LCT EQU ($-CTBL)/2 ; ; EXTEND ROM WITH MONIT-PLUS ? ; EXROM: CALL EP2? JNZ ERROR ;NO, ERROR JMP EP2 + 6 ;YES, EXECUTE COMMAND ; EP2?: LDA EP2 CPI 0C3H ;JMP? RET ; ; ;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ; * EXTERNAL RUTINES FOR MONITOR * ;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ; HIGH NIBBLE HBYTE: RRC RRC RRC RRC LBYTE: ANI 0FH ; PREVOD HEXADECIMALNI CIFRY NA ASCII V "C" REG HXASC: ADI 90H DAA ACI 40H DAA MOV C,A RET ; SKLADANI ADRES (VSTUP PARAMETRU) DO STACKU, POCET V C-REG EXPRO: JC ERROR ;# VERS."C" # EXPR: CALL EQUAL ; TISK = LXI H,0 EX0: CALL ECHO EX1: MOV B,A CPI 27H ;' JZ EX4 CALL ASHEX ; HEX CIFRA ? JC EX3 ; POSUV "HL" O 4 BITY VLEVO DAD H DAD H DAD H DAD H ORA L MOV L,A JMP EX0 ; DALSI ZNAK EX3: MOV A,B CALL ANAL JNZ ERROR ; NENI HEX CIFRA XTHL PUSH H DCR C ; CARKA, MEZERA JNZ EXPRO ; DALSI ADRESY RNC ;#VERS."F"# ; CRLF: MVI C,CR CALL CO MVI C,LF ; DO CR,LF ; CO: PUSH H LXI H,COTB LDA IOBYT IOCOM: ANI 3 JMP INJMP EXPRM: MVI C,1 LXI H,0 JMP EX1 ; EX4: CALL CINCR ;COMMAND MOV B,A ;SAVE JZ EX3 MOV H,L MOV L,A JMP EX4 ; IODEF:... DEFINE USER I/O RUTINE IODEF: PUSH B PUSH H LXI H,MEMTOP ;NEW FUNCTION MOV A,C ; NUMBER CPI 8 JZ IODEF1 JP ERROR ADD C ADD C MOV C,A MVI B,0 ; OFFSET LXI H,CILOC ; COMPUTE ADR DAD B MVI M,0C3H ; JMP INX H IODEF1: MOV M,E INX H MOV M,D ; ADR POP H ; UNSAVE POP B RET ; INKREMENTRUJE "HL" ,KONTROLUJE "HL"=0 NEBO ; "HL">"DE"...CARRY=1 HILO: INX H MOV A,H ORA L STC RZ ; NAVRAT PO "HL"=0000 COMPR: MOV A,D CMP H RNZ MOV A,E CMP L RET ; READ ADR RADR: MVI C,1 CALL EXPR POP H RET ; READ NEW BYTE RBYT: PUSH B PUSH H CALL EXPRM POP D POP H MOV M,E MOV A,B CPI CR POP B RET ; DISPLAY NEW ADR DNADR: CALL CRLF DADR: CALL DADR0 JMP SPACE IF SP1A ; CHEK I/O STATUS BYTE IOCHK: LDA IOBYT RET ; SET I/O STATUS BYTE IOSET: MOV A,C STA IOBYT RET ENDIF ; DISPLAY ADDRES INT0 "HL" DADR0: MOV A,H CALL DBYT MOV A,L ; DISPLAY BYTE INT0 ACC DBYT: PUSH PSW CALL HBYTE CALL CO POP PSW CALL LBYTE JMP CO ; CHEK SIZE RAM MEMORY MEMCK: PUSH H LHLD MEMTOP MOV A,L MOV B,H POP H RET ; PREVOD ZNAKU ASCII NA HEXADEC ASHEX: SUI '0' ;#VERS."F"# RC ; <'0' CPI 17H ; >'F' CMC RC CPI 10 ; '0'..'9' CMC RNC CPI 11H ; 0AH..10H RC SUI 7 ; 'A'..'F' RET CIMIN: CALL MINUS ;- ; CINCR: CALL ECHO ANAL: CPI ',' ANAL0: RZ CPI ' ' RZ CPI CR STC RZ ORA A RET ; PO CR CARRY=1 ; VYPIS TEXTU - HL ADRESA, D DELKA TEXT: MOV C,M INX H CALL CO DCR D JNZ TEXT RET DBYTE: CALL DBYT SPACE: MVI C,' ' ; DISPLAY MEZERY JMP CO ; ; ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ; I/O DEVICE ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ; ; T.V. PARAM. WIDTH EQU 40 HEIGHT EQU 24 LINOF EQU 64 ;OFFSET LREST EQU LINOF - WIDTH TVEND EQU TVBEG + 5E7H ERS EQU 1FH ;ERASE SCREEN EOL EQU 1EH ;ERASE END OF LINE CTRLQ EQU 11H ;^Q-RESERVE CTRLP EQU 10H ;^P-LIST CURSOR EQU 0A0H ;CODE HOME EQU 1DH ;HOME ; ;------------------------------------------------- COINIT: LXI H,TVBEG SHLD CADR ;SET CURSOR ADR MVI C,ERS ;CLEAR SCREEN ; ;%%%%%%%%%%%%%%%%%%%%%%%%%% ; CONSOLE OUTPUT ; <C>...WRITE ON SCREN ; CRT: PUSH D PUSH H LXI H,COEX ;RET-ADR PUSH H ;PUT TO STACK LHLD CADR ;CLEAR CURSOR LDA CHAR ;ADR RESTORE MOV M,A ;CHART CALL COADR ;COMPUTE ADR MOV A,C CPI ' ' ;IF ' '...'Z' THEN WRITE JNC CRTWR ;ELSE DECODE CONTROL CPI CR ;CHARTS AND DO JZ CR@ ;CHANGE ON SCREEN CPI LF JZ LF@ CPI EOL JZ EOL@ ;ERASE TO END LINE CPI BACK JZ BACK@ ;LEFT SHIFT CPI HOME JZ HOME@ ;LEFT UP CPI ERS JZ ERS@ CPI BELL JZ BEEP RET ; CRTWR: LDA MODE ANI 0C0H ;MODE MOV D,A ; SAVE MOV A,C ;6.BITS ANI 3FH ORA D ;COMPOSITE MOV M,A ;WRITE! SUI 0C0H ;DOUBLE ? CNC CONXT ;+ CONXT: CALL COADR ;COMPUTE NEXT ADR MOV A,D INR A STA COLUM ;NEW POSITION SUI WIDTH ;END LINE RC ;NO STA COLUM ;SET POSITION AND COMPUTE ; NEXT LINE LF@: MOV A,E INR A CPI HEIGHT ;END OF SCREEN? JC LF@1 ;NO LHLD RESL MVI H,0 CALL COADR+3 ;FIRST LINE PUSH B LDA RESL ;LINE COUNTER SUI HEIGHT CMA MOV C,A ROLL: MVI B,WIDTH XCHG ROLL1: LXI H,LINOF ;OFFSET DAD D MOV A,M STAX D ;COPY INX D ;+ DCR B JNZ ROLL1 ;ALL LINE LXI H,LREST ;NEW LINE DAD D DCR C JNZ ROLL ;NEXT LINE POP B ; ERS@: CALL EOL@ LXI D,LREST DAD D LXI D,TVEND-1 CALL COMPR JNC ERS@ RET ; ; ; "EXIT" AND SET CURSOR COEX: CALL COADR ;WRITE CURSOR LDA MODE RRC ;CY=1.. LIST CC LPR ;PRINT ECHO MOV A,M STA CHAR ;ADD SAVE CHAR SHLD CADR LDA MODE ;#VERS."F"# ANI 20H ;#SUPRESS CURSOR? JNZ COEX1 ;# MVI M,CURSOR COEX1: POP H ;UNSAVE POP D MOV A,C RET ;END OF CONSOLE OUTPUT ; SUBROUTINES ;-------------------------------------------------- COADR: LHLD LINE ;COMPARE ADR <HL> PUSH H MVI H,0 DAD H DAD H DAD H DAD H DAD H DAD H ;64* LXI D,TVBEG ;TV-RAM DAD D ;BEGIN LINE POP D ;SET DE MOV A,L ;D-COLUM ORA D ;E-LINE MOV L,A ;HL...ADR RET ; ERASE FROM CURSOR TO END LINE EOL@: MVI M,' ' INX H MOV A,L ANI 3FH CPI WIDTH JC EOL@ RET BACK@: MOV A,D ;COLUMN:0 ? ORA A JNZ BAC@1 ;NO FINST POSITIONS INR E ;IF LINE=0 THEN BEGIN DCR E ;OF SCREEN RZ LDA RESL ;SAVE "RESERVE" PARTIONS CMP E RZ ;YES,GO OUT MOV A,E ;NO SET NEW LINE DCR A STA LINE MVI A,WIDTH BAC@1: DCR A DB 16H ;MVI D,# CR@: XRA A ;CARIG. RETURN STA COLUM RET ;SET CURSOR ON BEGIN "NORMAL" SCREEN HOME@: CALL CR@ ;NULL LDA RESL ;"RESERVE" LINE SET LF@1: STA LINE RET ; ; UNDERLINE UCMD: LDA RESL ;EMPTY ? ORA A RZ ;EMPTY DCR A MOV L,A MVI H,0 CALL COADR+3 MVI D,WIDTH RESX: MOV A,M ;UNDER LINE ANI 3FH ;ASCII ORA B ;PARAM MOV M,A INX H DCR D JNZ RESX RET ;********************************************************** ; ; LINE PRINTER ; LPR: PUSH H LXI H,2C01H MOV M,C DCR H MOV M,L INR H LPR1: MOV A,M ADD A JP LPR1 DCR H MVI M,3 INR H LPR2: MOV A,M ADD A JM LPR2 DCR H MOV M,L POP H RET ; ; ; PUNCH OUTPUT ; PUN: RET ; EMPTY DS 20 ; RESERVA ; ; READER INPUT ; RDR: STC ; CHYBA SNIMACE RET ; ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ORG @R@ ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ; SYSTEM RAM SAPI-1 ; RST1: DS 21 ;RESTART VECTOR ;<<... USER & MONITOR STACK ; ; ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ORG @R@+090H ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ; MONITOR DATA ; MSTAK: DS 2 ; SAVE REGISTERS ACSAV: DS 2 BCSAV: DS 2 DESAV: DS 2 HLSAV: DS 2 PCSAV: DS 2 SPSAV: DS 2 ; BRAD: DS 2 INSTR: DS 1 BRAD2: DS 2 INST2: DS 1 LASTC: DS 1 ;LAST CODE "REPEAT" CADR: DS 2 ; CURSOR ADR CHAR: DS 1 ; CODE FLAG: DS 1 ; FLAG MEMBR LIMIT: DS 2 ; TIME LIMIT FOR AUTO REPEAT @BT: DS 1 @PED: DS 1 UADR: DS 2 ;USER ADR SADR: DS 2 ; START ADR EADR: DS 2 ; END ADR SUM: DS 1 ;******************************* ;MONITOR PLUS DATA JOINT: DS 1 FNAME: DS 11 BNO: DS 1 ;BLOCK NUMSER,FILE NUMBER BTO: DS 1 BNI: DS 1 ; --- " --- BTI: DS 1 ADRO: DS 2 ADRI: DS 2 PBITM: DS 2 FND: DS 1 ; FIND FLAG ;------------------------- ; USER I/O DEVICE ; IODEF NUMBER CILOC: DS 3 ; (0) COLOC: DS 3 ; (1) R1LOC: DS 3 ; (2) R2LOC: DS 3 ; (3) P1LOC: DS 3 ; (4) P2LOC: DS 3 ; (5) LILOC: DS 3 ; (6) CSLOC: DS 3 ; (7) ;****************************** ;<< EXTERNE OVLADANE FLAGY: >> ;****************************** MODE: DS 1 ;CRT-MODE @IF1: DS 1 ;OPEN FLAGS @IF2: DS 1 @OF1: DS 1 @OF2: DS 1 LINE: DS 1 ;LINE COLUM: DS 1 ;COLUMN RESL: DS 1 ;RESERVE UBYTE: DS 1 ;USER BYTE (REALTIME..) @SFLG: DS 1 ;#0..NO STOP EXSER EQU $-MODE ;EXTERNAL SERVICE IOBYT: DS 1 ;I/O CONTROL MEMTOP: DS 2 ;MEMTOP "RAM" ;------------------------- ; I/O BUFFERS DS 1 ;BLOCK LABEL BOUT: DS 255 ;BLOCK LENGHT BOEND EQU $ ; DS 1 ; BLOCK LABELS BIN: DS 255 ;BLOCK LENGHT BIEND EQU $ ; WRNM: DS 11 ;============================= ORG @R@ + 300H ;============================= ; "MAT" ARRAY DS 0FFH ;============================= ORG @R@ + 400H ;============================= ; SYSTEM OR USER PROGRAMS ;---->>>>>>>>>>> ; ; ; END
ÚVOD | Novinky | 8 Bitů | Příslušenství | Drobnosti | TTL | Kontakt
SAPI-1 | ONDRA | PMI-80 | PMD-85 | klony PMD-85 | klony SM50/40 | PETR | PLAN-80A | IQ151 | TNS | FK-1 | HVĚZDA | SP 830 | PCS 1-QR6000
ZPS | Technické prostředky | Programové vybavení | Dokumentace