Ú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 PLUS, MIKOS V4.0D - SAPI 1' ; 30.7.1985 (P+S) ; V4.0H ZPETNE UPRAVENA NA V4.0D ; 4.11.2014 EC1045.01 ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ; CPM EQU 0 ;EPROM VERSION ; ; * ROZDELENI PAMETI * ; IF NOT CPM @R@ EQU 4000H MONIT EQU 100H EPROM EQU 800H LSYSR EQU 400H TVBEG EQU 3800H PEDIT EQU 4400H BASIC EQU 4400H TRACER EQU 4C00H ELSE ; @R@ EQU 4000H ;SYS RAM MONIT EQU 200H ;MONITOR EPROM EQU 800H+200H ; CPM LSYSR EQU 400H ;SYS.RAM TVBEG EQU 0E800H PEDIT EQU 1200H ;START BASIC EQU 4400H TRACER EQU 2000H ENDIF ; ; ; ; * MONITOR ENTRY * ; CSTS EQU MONIT + 12H CI EQU MONIT + 3 RI EQU MONIT + 6 CO EQU MONIT + 09H PO EQU MONIT + 0CH CINCR EQU MONIT + 3FH IODEF EQU MONIT + 1EH EXPR EQU MONIT + 27H DBYT EQU MONIT + 33H DADR EQU MONIT + 30H CRLF EQU MONIT + 24H HILO EQU MONIT + 36H NEXT EQU MONIT + 39H TEXT EQU MONIT + 42H IOCHK EQU MONIT + 15H SPACE EQU MONIT + 3CH IOSET EQU MONIT + 18H ERROR EQU MONIT + 2AH ASHEX EQU MONIT + 2DH HXASC EQU MONIT + 48H ASSEX EQU MONIT + 51H ; ; LENGHT EQU 255 ; BLOCK LENGHT NAMLE EQU 11 ; NAME LENGHT COMLE EQU 64 ; COMNENT LENGTH ;------------------------------------------ CR EQU 0DH ;KONSTANTY LF EQU 0AH DEL EQU 7FH ; DELETE ETX EQU 03H HT EQU 9 ;TAB PREAM EQU 10H ; PREAMBLE/POSTAMBLE SUBS EQU 1AH ; END FLAG ; ; SER. I/O USER EQU 13H UDATA EQU 12H USTAT EQU 11H UMODE EQU 10H ; BLOCK LABELS SOH EQU 01H ; START OF HEADER EOT@ EQU 04H ; END OF TAPE CAN EQU ':' ; VOLUME NAME ; 'A' ; DATA BLOCK ; 'B' ; BINARY BLOCK ; ;===================================== ASEG ORG EPROM ;START ;===================================== JMP MICOS ;BRANCH TABLE JMP INITS ;INIT SYSTEM JMP EXMON ;EXPAND JMP FIND JMP OPEN JMP CLOSE JMP LOAD JMP SAVE ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ; ; INIT SYSTEM AND I/O ; INITS: MVI C,0A9H ;LO=L,RI-1,PO-1 MOV A,C STA FND ;NO FIND MODE CALL IOSET ; SET P=R=1 CALL TXIMM ;OHLASENI DB 'MIKOS-1 V4.0D ' DB '+' OR 80H CALL ICMD1 JMP OCMD1 ; ; ; INPUT SET ; ICMD: MVI A,'R' CALL ASSEX ICMD1: XRA A STA @IF1 ;FIND FLAG MVI C,2 LXI D,GET@ JMP IODEF ; ; OUTPUT SET ; OCMD: MVI A,'P' CALL ASSEX OCMD1: XRA A STA @OF1 ;OPEN FLAG MVI C,4 LXI D,PUT@ JMP IODEF ; ; MONITOR EXTENSION ; EXMON: MOV A,L ;COMMAND CPI 'W' JZ WRITE CPI 'R' JZ READ@ CPI 'J' JZ JUMP CPI 'N' JZ NULL CPI 'E' JZ EOF CPI 'I' JZ ICMD CPI 'O' JZ OCMD CPI 'P' JZ PCMD CPI 'B' JZ BCMD CPI 'T' JZ TCMD CPI 'K' JZ MICOS JMP ERROR ;MONITOR ; ; JUMP TO SYSTEM PROGRAMS ; BCMD: MVI B,'B' ;BASIC LXI H,BASIC B0: LXI D,@BT ; REENTRY FLAG B1: MOV A,M CPI 0C3H ;JUMP JNZ ERROR ;NO EPROM IN SYSTEM LDAX D CMP B ;WARM START ? JZ B2 ;+2 ORA A JNZ ERROR MOV A,B STAX D ;SET FLAG PCHL ;COLD START ; B2: INX H INX H INX H PCHL ;WARM START ; TCMD: MVI B,'T' LXI H,TRACER JMP B0 ; PCMD: MVI B,'P' ;PEDIT LXI H,PEDIT LXI D,@PED JMP B1 ; ; ; JUMP TO USER PROGRAM ; JUMP: LHLD EADR XCHG LHLD SADR MOV A,L ;NO PRGM ORA H JZ ERROR ;EMPTY FILE PUSH H ;START MVI B,0 ; SUM J1: MOV A,M ADD B MOV B,A CALL HILO JNC J1 LDA SUM CMP B JNZ ERROR RET ; GOTO ; ; ; END OF FILE COMMAND ; EOF: MVI C,1 CALL EXPR POP H ; START ADR MVI B,1 ; TYP RECORDU XRA A ; PARAM. MOV E,A ; POCET BYTE CALL PBEG XRA A SUB D ; MONTROLNI COUCET CALL PBYTE MVI C,SUBS ; CLOSE JMP PO ; ; 120*BLANK NULL: LEAD: LXI B,7800H CALL PO DCR B JNZ LEAD+3 RET ; ; READ HEX INTEL FORMAT ; READ@: DCR C CALL EXPR ;OFFSET RED1: POP H PUSH H REDC0: MVI D,9 ; MAX POCET ZNAKU BEZ ODDELELNI REDC1: CALL MREAD ; CTI BYTE CALL TERM ; ODDELOVAC ? JZ REDC0 ; ANO, NASTAV CITAC MVI C,':' ; ZACATEK RECORDU ? SUB C JZ REDC2 ; ANO, CTI HEX DATA DCR D ; DALSI ZNAK ? JNZ REDC1 ; ANO JMP REDER ; ERROR ':' .. CHYBI ':' NA PASCE REDC2: MOV D,A ; NULOVANI KONTR. SOUCTU CALL RBYTE ; DELKA RADKU JZ RED3 ; KDYZ 0, KONEC MOV E,A ; NASTAVENI CITACE CALL RBYTE ; HIGH ADR PUSH PSW CALL RBYTE ; LOW ADR POP B MOV C,A DAD B ; OFFSET ADRESY CALL RBYTE ; PRIZNAK RED2: CALL RBYTE ; STROJ. KOD MOV M,A CMP M ; TEST PAMETI MVI C,'M' ; ERROR 'M' .. MEMORY JNZ REDER INX H DCR E ; CITAC BYTE STROJ. KODU JNZ RED2 CALL RBYTE ; KONTR. SOUCET Z PASKY JZ RED1 ; OK MVI C,'S' ; ERROR 'S' .. CHECK SUM REDER: CALL CO ; TYP CHYBY CALL DADR JMP ERROR RED3: PUSH H CALL RBYTE ; HYGH START ADR MOV H,A CALL RBYTE ; LOW START ADR MOV L,A CALL RBYTE ; CHECK SUN CALL RBYTE JNZ REDER-2 ; ERROR POP D MOV A,D ORA E ; OFFSET ? POP D ; STACK CORECTION RNZ ; YES, NO START MOV A,H ORA L ; START ADR RZ ; NO PCHL ; GOTO ; ; WRITE CONTENTS RAM TO TAPE HEX WRITE: CALL EXPR CALL CRLF POP D POP H WR1: MOV A,L ADI 10H MOV C,A MOV A,H ACI 0 MOV B,A MOV A,E SUB C MOV C,A MOV A,D SBB B JC WR2 MVI A,10H ; >16 JMP WR3 WR2: MOV A,C ; <16 ADI 11H WR3: ORA A RZ ; NEXT PUSH D ; USCHOVA HIGH ADR MOV E,A ; NASTAVENI CITACE XRA A ; SET PARAM. MOV B,A ; TYP CALL PBEG WR4: MOV A,M INX H CALL PBYTE ; STROJ. KOD DCR E JNZ WR4 XRA A SUB D CALL PBYTE ; KONTR. SOUCET POP D JMP WR1 ; PRECTE 2 ZNAKY, SESTAVI BYTE, TVORI KONTR. SOUCET RBYTE: CALL MREAD ; CTE ZNAK S MASKOU 7F CALL ASHEX ; PREVOD ASCII-HEX RLC RLC RLC RLC MOV C,A CALL MREAD CALL ASHEX ORA C ; SESTAVI BYTE MOV C,A ADD D ; KONTROLNI SOUCET MOV D,A MOV A,C RET ; END OF EXPRESSION TERM: CPI ',' RZ CPI HT RZ CPI ' ' RZ CPI CR RET ; PUNCH BEGIN OF RECORT PBEG: MOV D,A ; NULL CHECK SUM MVI C,CR CALL PO MVI C,LF CALL PO MVI C,':' CALL PO MOV A,E ; E .. POCET BYTE CALL PBYTE MOV A,H ; HL .. ADR CALL PBYTE MOV A,L CALL PBYTE MOV A,B ; TYP PBYTE: PUSH PSW CALL HBYTE POP PSW PUSH PSW CALL LBYTE POP PSW ADD D MOV D,A RET ; HBYTE: RRC RRC RRC RRC LBYTE: ANI 0FH CALL HXASC JMP PO ; ; READ CHARACTER AND MASK, ERROR IF CARRY MREAD: CALL RI JC ERROR ANI 7FH RET ; ; ; USER COMMAND LEVEL ; MICOS: CALL STOP MVI C,'_' CALL CO CALL ECHOCR CPI 'B' JZ BB ;MICRO-BASIC CODE CPI 'A' JZ APPEND CPI 'D' JZ DIR ;DIRECTORY CPI 'I' JZ INIT ; INIT NEW TAPE CPI 'O' JZ OPEN ;OPEN OUTPUT CPI 'C' JZ CLOSE ;CLOSE OUTPUT CPI 'F' JZ FIND ;FIND INPUT CPI 'S' JZ SAVE ;SAVE CPI 'L' JZ LOAD ;LOAD CPI 'M' ;MONITOR RNZ ; NO FIND ;------------------------------- ; MOTION MOTA: CALL START ;MOTA PASKY CALL DONE JMP STOP ; START: MVI A,38H GAPO: OUT UMODE MVI A,0FFH OUT USTAT ; CLEAR RET ; ; STARW: MVI A,30H JMP GAPO ; START WRITE ; ; APPEND NEW FILE ON TAPE ; APPEND: STA JOIN ; NO INPUT LHLD BNO ; SET FILE NUMBER XCHG JMP OPE50 ;--------------------------------- ;DIRECTORY CASSETE DIR: XRA A ; INPUT BUFFER STA JOIN CALL PLAY DIR0: CALL SEARCH ; HEADER CZ PHDR ; PRINT NAME CPI EOT@ JNZ DIR0 CALL CRLF ; PRINT: MOV A,D CALL DBYT ; FILE NUMBER MVI C,'-' CALL CO MOV A,E CALL DBYT ; BLOCK NUMBER JMP DIR0 ;---------------------------------- ;OPEN OUTPUT FILE OPEN: CALL PTP? LDA @OF1 ;DOUBLE ? ORA A JNZ ERROR CALL TXIMM DB CR,LF DB 'LAST' DB ' ' OR 80H MVI A,-1 ;FLAG CALL FINO JNZ OPE1 OPE01: CALL SEARCH ;EOT ? JZ OPE20 ;SOH CPI EOT@ JNZ OPE01 ;NEXT BLOCK OPE30: CALL OK? JZ OPE50 ;OPEN NOW OPE20: CALL CMPNM + 3 ; OK ? OPE1: CNZ CMPNM LDA BOUT-1 CPI CAN ;VOLUME JZ OPE50 ;IMMED. OPEN CALL SEARCH CPI EOT@ JNZ $ - 5 OPE50: MOV A,D INR A ;INCREM.FILE NUMBER DAA MOV H,A MVI L,0 SHLD BNO ;FILE&BLOCK NUMBER CALL RECOR CALL TXIMM DB CR,LF DB 'NEW',' ' OR 80H MVI A,SOH STA @OF1 JMP WRNAM ; ;---------------------------------------- ; FIND INPUT FILE AND OPEN FOR READ FIND: CALL PTR? XRA A ; FIND ONPUT FILE CALL FINO CALL CMPNM MVI E,1 XCHG SHLD BNI ;NUMBER FILE XCHG MVI A,SOH STA @IF1 JMP RIB ;--------------------------- ;CLOSE OUTPUT FILE CLOSE: CALL PTP? LDA @OF1 ;NO OPEN ORA A JZ ERROR MVI A,EOT@ ;CLOSE BLOK STA BOUT-1 CALL WOB XRA A STA @OF1 ;CLOSE CALL STARW ;GAP 2* MVI A,80 ; BOOMS CALL TIME JMP STOP ;--------------------- FINO: STA JOIN ;I/O FLAG CALL TXNAM LXI H,FNAME PUSH H MVI B,NAMLE CALL RNAME ;READ CALL PLAY POP H MOV A,M CPI '*' ;WILDCARDS ? RET CMPNM: CALL SEARCH ;COMPARE NAME JNZ CMPNM ;NO HDR LXI B,FNAME MVI E,NAMLE INX H ;NAME CMPN0: LDAX B CPI '*' JZ CMPN1 CALL TERM ;END OF NAME RZ CMP M JNZ CMPNM INX B DCR E JNZ CMPN0 - 1 RET ;O.K ; CMPN1: PUSH D CALL BUADR PUSH H CALL PHDR POP H POP D MOV A,H ; CTENI NEBO ZAPIS CPI (BIN-1) SHR 8 JNZ CMPN2 MOV A,M CPI CAN ; ':'... VOLUME BLOK JZ CMPNM CMPN2: CALL OK? JNZ CMPNM RET ; OK?: CALL TXIMM DB 7 DB '--(Y/N)','?' OR 80H CALL ECHO CPI 'Y' RET ;-------------------- ;INIT NEW CASSETTE INIT: CALL START CALL TXIMM DB 'BOT' DB ' ' OR 80H CALL RECOR CALL STOP CALL TXIMM DB ' VOLUME' DB ' ' OR 80H LXI H,0 ;0..FILE NUMBER SHLD BNO MVI A,CAN ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ; FILE NAME LEVEL WRNAM: PUSH PSW ;HDR-LABEL CALL TXNAM CALL NULBF CALL STOP POP PSW MOV M,A INX H MVI B,COMLE ;NAME+COMMENT PUSH H CALL RNAME POP H MVI B,NAMLE LXI D,WRNM ;OUTPUT AREA WRN1: MOV A,M ANI 3FH JNZ $+5 MVI A,' ' ;BLANK STAX D INX H INX D DCR B JNZ WRN1 CALL WOB MVI M,'A' ;DATA TYP JMP CRLF ; READ NAME <HL>..ADR,<B>..DELKA ;----------------------------------- RNAME: MOV E,L ;LOW-FIRST ADR RNAM1: MVI M,' ' CALL CI ANI 7FH CPI ETX JZ MICOS CPI CR JZ CRLF CPI DEL JZ RNAM10 CMP M ; ???? CPI 08H ;BS ???? DB 08H JNZ RNAM2 RNAM10: MOV A,E CMP L ;FIRST JZ RNAM1 DCX H INR B CALL TXIMM ;DELETE DB 08,20H,88H JMP RNAM1 RNAM2: MOV M,A INX H MOV C,A CALL CO DCR B JNZ RNAM1 JMP CRLF ; ;PRINT HEADER OF FILE ;-------------------- PHDR: CALL CRLF INX H MVI D,COMLE JMP TEXT ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ; POMOCNE PROGRAMY ; ; CT OR PUNCHER ? PTP?: PUSH H LXI H,3020H JMP $+7 ; ; CT OR READER ? PTR?: PUSH H LXI H,0C08H CALL IOCHK ANA H CMP L POP H RZ ; YES .. CT INX SP INX SP ; NESTING RET ; NO FINO ;TEXTY PRO OBSLUHU ;----------------- TXIMM: XTHL MOV A,M ANI 7FH MOV C,A CALL CO MOV A,M RLC INX H JNC TXIMM+1 XTHL RET ; TXNAM: CALL TXIMM DB ' NAME' DB CR,LF DB ':' OR 80H RET ; ;NULL OUTPUT BUFFER ;------------------ NULBF: LXI H,BOUT-1 PUSH H MVI A,LENGHT INX H MVI M,0 DCR A JNZ $-4 POP H ;(BLOCK TYP) ADRM RET BREAK: CALL CSTS RZ CALL CI JMP ETX? ;CTI A VYPIS ZNAK ECHO: CALL CINCR RZ ETX?: CPI ETX RNZ CALL STOP JMP NEXT ;BREAK=>C ;DISPLAY "PLAY" PLAY: CALL TXIMM DB 'PLAY' DB ' ' OR 80H RECO: CALL DONE JMP START ;DISPLAY "RECORD" RECOR: CALL TXIMM DB CR,LF DB 'RECORD' DB ' ' OR 80H ; DONE: CALL TXIMM DB ' DONE','?' OR 80H ECHOCR: CALL ECHO PUSH PSW CALL CRLF POP PSW RET ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ; FILE OPERATIONS LEVEL ; ;SERACH BLOCK IN TAPE ;-------------------- SEARCH: CALL BUADR SEAR1: MVI C,'#' ;ERROR CC CO CALL READF JC SEAR1 ; SERACH ERROR JMP RIB2 ; ; BUFFER ADR BUADR: LDA JOIN ;INPUT OR OUTPUT ? ORA A LXI H,BOUT-1 RNZ ;OUTPUT LXI H,BIN-1 RET ; ; READ INPUT BUFFER ;-------------------- RIB: PUSH D PUSH B LHLD BNI INX H SHLD BNI LXI H,BIN-1 CALL READ JC ERRD ;ERROR CALL NUFIL ; NUMBER O.K. ? JNZ ERRD ; BLOCK ERROR RIB1: POP B POP D RIB2: MOV A,M ;BLOCK TYP CPI CAN ;VOLUME NAME RZ CPI SOH ;FILE NAME RET ;(HL)..BLOCK TYP ;ERROR READ ERRD: CALL TXIMM DB ' ERROR/N' DB '?' OR 80H CALL ECHO ;CONTINUE CPI 'N' JZ ERRD1 CALL TXIMM DB ' BACK' DB ' ' OR 80H CALL PLAY ERRD0: LXI H,BIN-1 ;INPUT BUFFER CALL READF JC ERRD ;NEXT ERROR CALL NUFIL JNZ ERRD0 ;NEXT BLOCK ERRD1: CALL CRLF LXI H,BIN-1 JMP RIB1 ;WRITE OUTPUT BUFFER WOB: PUSH D LHLD BNO INX H SHLD BNO XCHG LXI H,BOUT-1 CALL WRBLO POP D RET ; ; NUMBER FILE O.K. ? ; NUFIL: LDA BNI CMP E RNZ ;NO LDA BNI+1 CMP D RET ; ;GET BYTE FROM CASSETTE ;---------------------- GET@: PUSH B PUSH D PUSH H LDA @IF1 ;WAS OPEN ? ORA A CZ FIND ;NO THEN FIND LHLD ADRI GET0: INX H MOV A,L ;WAS EMPTY CPI BIEND AND 0FFH MOV A,M SHLD ADRI JZ GET1 ;<A>..BYTE ORA A ;NCY JMP GETEX GET1: LDA BIN-1 CPI EOT@ ; "CLOSE" BLOK? JZ GET2 CALL RIB JNZ GET0 ;END OF FILE GET2: MVI A,SUBS STC GETEX: POP H POP D POP B RET ; ;PUT BYTE TO CASSETTE PUT@: PUSH B PUSH D PUSH H LDA @OF1 ; WAS OPEN ORA A PUSH B CZ OPEN ;IF NO THEN DO POP B LHLD ADRO INX H MOV M,C ;SAVE SHLD ADRO MOV A,L CPI (BOEND AND 0FFH) - 1 CZ WOB ;NEXT LDA BOUT-1 CPI 'B' ;BINAR DUMP? JZ PUTEX MOV A,C ;CLOSE CHAR.? CPI SUBS CZ CLOSE PUTEX: POP H POP D POP B MOV A,C ORA A ;NCY RET ; ; ; LOAD BINARY DATA FROM TAPE TO MEMORY ; LOAD: CALL FIND ;OPEN FILE MVI A,'B' ;BINAR STA BIN-1 CALL START LO1: CALL RICH ORA A ; BLANK? JZ LO1 SUI '<' JNZ ERROR MOV B,A ;SUM CALL RADR@ SHLD EADR ;LAST XCHG CALL RADR@ ;LAST SHLD SADR ; START ADR CALL RICH CPI '>' JNZ ERROR CALL CHECK MVI B,0 ;CLEAR LO2: CALL RICH MOV M,A CALL HILO JNC LO2 CALL CHECK STA SUM CLSTP: XRA A STA @IF1 ;SLOSE CALL STOP JMP CRLF ;OK ; CHECK SUM ? CHECK: MOV C,B CALL RICH CMP C JNZ ERROR RET ; RADR@: CALL RICH MOV L,A CALL RICH ;HL MOV H,A RET ; RICH: CALL RI ;READ & SUM JC ERROR PUSH PSW ADD B MOV B,A POP PSW RET ; ; SAVE BINARY DATA TO TAPE ; SAVE: MVI C,2 CALL EXPR ;FROM TO LDA @OF1 ORA A CZ OPEN MVI A,'B' ;BINAR STA BOUT-1 CALL STARW MVI A,80 ; 800MS CALL TIME MVI C,'<' ;START BYTE CALL POCH MVI B,0 ;ADR-SUM POP H ;START POP D ;LAST CALL PADR@ XCHG CALL PADR@ MVI C,'>' CALL POCH MOV C,B ;SUM OF ADR. CALL POCH ; MVI B,0 ;DATA-SUM SAV1: MOV C,M CALL POCH CALL HILO JNC SAV1 MOV C,B ;SUM CALL POCH MVI C,SUBS CALL POCH ;END MARK JMP CLOSE ; PADR@: MOV C,L CALL POCH MOV C,H ; POCH: MOV A,C ;PUNCHER AND SUM ADD B MOV B,A JMP PO ; SINC: IN UDATA SINC1: MVI A,1 ; 10 MS CALL TIME CALL BREAK IN USTAT RLC JC SINC ;WAIT IF READY DCR C JNZ SINC1 RET ; ; READ BLOCK (HL-BUF.ADR) ; OUT (DE-BLOCK &FILE COUNTER; CY=1 ERROR) ; READF: XRA A ;FIND MODE SET STA FND READ: RBLOK: PUSH B PUSH H CALL START ;MOTION RBLG: MVI C,1 ; WAIT 10MS NOT READY CALL SINC ; START BLOCK RBL2: MVI C,3 ; 3*PREAMBLE RBL3: CALL SERIN CPI PREAM JNZ RBLG ; GAP DCR C JNZ RBL3 MVI A,':' STA TVBEG LXI B,(LENGHT+1) AND 0FFH ;B=0,C=LENGHT CALL SERIM ;READ DATA MVI C,'*' LDA FND ;FIND MODE? ORA A JNZ RBL20 ;NO-READ MVI C,' ' RBL20: LXI H,TVBEG MOV M,C INX H MVI M,'"' INX H MVI C,NAMLE RBL33: CALL SERIM MVI M,'"' INX H MVI M,20H INX H CALL SERIN MOV E,A CALL HEXMEM ; REG 'E' -> MEM HEX CALL SERIN MOV D,A MVI A,' ' STA FND MOV M,A MOV C,B ;CHECK SUM CALL SERIN SUB C POP H POP B SHLD ADRI ;BEG. ADR PUSH PSW ;SAVE ZERO FLG CALL SERIN CPI 10H JZ RBLX1 INX SP INX SP PUSH PSW RBLX1: CALL 0F29H RBL5: POP PSW ;IF ZERO ..O.K RZ STC RET ;ELSE ...ERROR ; ;WRITE BLOCK (HL-ADR,DE-BLOCK &FILE NUMBER) ; WRBLO: PUSH B PUSH H PUSH D CALL STARW ;START WRITE MVI A,80 ; 800/100 MS CALL BTIME CALL SEROP CALL SEROP CALL SEROP ;PREAMBLE LXI B,(LENGHT+1) AND 0FFH CALL SEROM ;DATA LXI H,WRNM MVI C,NAMLE CALL SEROM ;NAME POP D MOV A,E CALL SEROUT ;BLOCK-NUMBER MOV A,D CALL SEROUT ;FILE-NUMBER MOV A,B CALL SEROUT ;CHECK SUM CALL SEROP XRA A CALL SEROUT ;SENTINEL LXI H,TVBEG CALL HEXMEM POP H POP B SHLD ADRO ;SET ADR MVI A,1 ; 10 MS CALL TIME STOP: MVI A,10H OUT UMODE RET ; ; ROUTINES ; ; 'E' REG HEX TO MEMORY, CLEAR TO END LINE HEXMEM: MOV A,E RRC RRC RRC RRC CALL HEXC MOV A,E CALL HEXC MVI A,39 ; LINE LENGTH-1 HEXM1: MVI M,' ' INX H CMP L ; END LINE ? JNC HEXM1 RET ; DISPLAY HEX CIFF. HEXC: ANI 0FH CALL HXASC ANI 3FH MOV M,A INX H RET ; SEROM: MOV A,M ;FROM MEMORY INX H CALL SEROUT ;TO:CT: DCR C JNZ SEROM RET ;ALL SEROP: MVI A,PREAM ;BLOCK-MARK SEROUT: PUSH PSW ADD B MOV B,A ;CHECK SUM CALL BREAK SERO: IN USTAT ADD A JP SERO POP PSW OUT UDATA RET ; SERIM: CALL SERIN ;READ TO MEMORY MOV M,A INX H DCR C JNZ SERIM RET SERIN: CALL BREAK IN USTAT RLC JNC SERIN IN UDATA PUSH PSW ADD B MOV B,A POP PSW RET ; ; TIME ROUTINES ; BTIME: MOV B,A ; * 10 MS MOV A,M ; 'B' ? CPI 'B' MOV A,B JNZ TIME RRC RRC RRC ; /8 TIME: PUSH B ; ACC*10MS (TCY=500NS) TIME1: LXI B,800+255 TIME2: DCX B ;( 5) INR B ;( 5) DCR B ;( 5) JNZ TIME2 ;(10) 10MS LOOP @ 12.5US DCR A JNZ TIME1 POP B RET ; ; MICRO-BASIC FORMAT ; BB: MVI C,1 ;1. ADR CALL EXPR CALL PLAY MVI C,50 ; 500MS GAP BB1: CALL SINC MVI C,'*' CALL CO CALL SERIN CPI 'B' ; BASIC RECORD? LXI B,10 ; 100MS & CLEAR SUM JNZ BB1 CALL SERIN ;NAME BB2: MOV C,A CALL CO CALL SERIN CPI CR JNZ BB2 CALL SERIN MOV E,A CALL SERIN MOV D,A LXI H,-40F0H ;OFFSET DAD D POP D DAD D XCHG ;DE-LAST ADR BB3: CALL SERIN MOV M,A CALL HILO JNC BB3 MOV C,B CALL SERIN CMP C JNZ ERROR ERSTP: JMP STOP @ENDPR EQU $ ; ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ORG @R@ ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ; SYSTEM RAM SAPI-1 M4 ; 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 JOIN: 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 ; CILOC: DS 3 COLOC: DS 3 R1LOC: DS 3 R2LOC: DS 3 P1LOC: DS 3 P2LOC: DS 3 LILOC: DS 3 CSLOC: DS 3 ;****************************** ;<< EXTERNE OVLADANE FLAGY: >> ;****************************** MODE: DS 1 ;CO-MODE @IF1: DS 1 @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 ;[P]
Ú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