********************************************************* * JD-850M ASCII ROM : '80.08.30 MCI * ********************************************************* ; ROM: EQU 0F000H ; ROM TOP ADRS STACK: EQU 0E800H ; STACK ADRS RAMMAX: EQU 07FC0H ; 32K RAM-64(FOR INTERRUPT) IPL: EQU 01000H ; IPL ADRS CURSLX: EQU 0E7A0H ; CURSOL-X (HORIZONTAL) CURSLY: EQU 0E7A1H ; CURSOL-Y (VERTICAL) BUFADR: EQU 0E7A2H ; CURSOL ADRS KBFLG: EQU 0E7A4H ; KB INT.FLAG KEYCOD: EQU 0E7A5H ; KEY-IN CODE UNIT: EQU 0E7A6H ; LAST UNIT NUMBER ERCUNT: EQU 0E7A9H ; FD RETRY COUNTER FDSTAT: EQU 0E7AAH ; FD STATUS AREA FDFLG: EQU 0E7ABH ; FD INT.FLAG AREA RECTYP: EQU 0E7ACH ; RECORD TYPE AREA MASK: EQU 0E7ADH ; MASK SETTING AREA TRREF0: EQU 0E7AEH ; PORT #0 MASK AREA TRREF1: EQU 0E7AFH ; 1 TRREF2: EQU 0E7B0H ; 2 MODE0: EQU 0E7B2H ; PORT #0 MODE AREA MODE1: EQU 0E7B3H ; 1 MODE2: EQU 0E7B4H ; 2 SAVEC: EQU 0E7B5H ; PORT DATA SAVE AREA RWPARA: EQU 0E7B6H ; FD R/W PARA SAVE AREA SEEK: EQU 0E7B7H ; SEEK PARA SAVE AREA DNMODE: EQU 0E7C8H ; DENSITY MODE SAVE AREA HLADRS: EQU 0E7C9H ; R/W PARA. ADRS SAVE AREA TRK00: EQU 0E7CBH ; FD #0 TRACK ADRS TRK01: EQU 0E7CCH ; 1 RSCUNT: EQU 0E7CEH ; RESTORE COUNT DUMMY: EQU 0E7CFH ; DUMMY DELETE: EQU 0E7D0H ; DLT-REC PARA AREA CRTBUF: EQU 0E000H ; CRT BUFF. TOP ADRS CRTEND: EQU 0E780H ; CRT BUFF. END ADRS CRT1LN: EQU 00050H ; CRT 1 LINE MAX 80 CHARA. CRTENL: EQU 00017H ; CRT END LINE(23) CRTCHL: EQU 00780H ; MAX 1920 CHARA. CRTSCA: EQU 00730H ; CRTCHL-CRT1LN CRTLN1: EQU 0E050H ; CRTBUF+CRT1LN CRTLN2: EQU 0E730H ; CRTEND-CRT1LN CRTCMP: EQU 02000H ; CRT BUFF. TOP ADRS 2'S COMPLIMENT CRTECM: EQU 018D0H ; CRT BUFF. END LINE TOP 2'S COMPLIMENT CRTTCM: EQU 01FB0H ; CRT TOP+1 LINE 2'S COMPLIMENT CRTRAM: EQU 00800H ; CRT 2K RAM SETSP: EQU 00080H ; STACK POINTER SET ADRS KEYB: EQU 00000H ; READ KEY-IN DATA FD0CMD: EQU 10H ; FD #0 COMMAND/STATUS FD0TR: EQU 11H ; TRK SET FD0SE: EQU 12H ; SEC SET FD0DA: EQU 13H ; DATA SET FD1CMD: EQU 20H ; FD #1 COMMAND/STATUS FD1TR: EQU 21H ; TRK SET FD1SE: EQU 22H ; SEC SET FD1DA: EQU 23H ; DATA SET DMA0AD: EQU 30H ; DMA 0 FD TRANS.ADRS SET DMA0TC: EQU 31H ; BYTES SET DMA2AD: EQU 34H ; DMA 2 CRT TRANS. ADRS SET DMA2TC: EQU 35H ; BYTES SET DMA3AD: EQU 36H ; DMA 3 CRT TRANS. ADRS SET DMA3TC: EQU 37H ; BYTES SET DMAMOD: EQU 38H ; DMA MODE SET CRTPAR: EQU 40H ; CRT PARA SET CRTCOM: EQU 41H ; CRT COMMAND SET RS0DAT: EQU 60H ; PORT #0 DATA RS0CST: EQU 61H ; COMMAND/STATUS RS1DAT: EQU 70H ; PORT #1 DATA RS1CST: EQU 71H ; COMMAND/STATUS RS2DAT: EQU 50H ; RS232C #2 DATA RS2CST: EQU 51H ; COMMAND/STATUS BSFF: EQU 80H ; BANK SELECT F.F. DENSTY: EQU 90H ; DENSITY COMMAND FILTER: EQU 91H ; FILTER COMMAND SIDE: EQU 92H ; SIDE COMMAND ; ; [ ROM ENTRY TABLE ] ; ORG ROM ; ; JMP BOOT ; GO TO BOOT JMP FDSEEK ; FD RESTOR JMP DBL00 ; R/W (DOUBLE DENSITY) JMP KBST ; CHECK KEY-BOARD STATUS JMP KEYBOD ; READ KEY-IN CODE JMP CRTCLR ; CLEAR CRT JMP CRT ; PUT A CHARA TO CRT JMP CRTSET ; CRT PARTICULAR POSITION JMP SETCUR ; SET CURSOL POSITION JMP RS1RD ; READ A CHARA FROM PORT JMP RSREAD ; READ CHARA.S FROM PORT JMP RS1WT ; PUT A CHARA FROM PORT JMP RSWRIT ; PUT CHARA.S FROM PORT JMP RSMODE ; SET RS232C MODE JMP MASKON ; SET MASK ON JMP MASKOF ; SET MASK OFF JMP INT01 ; TYPE-1 STATUS (USE FORMAT) JMP INT03 ; WRITE STATUS (USE FORMAT) JMP CRTOUT ; MSG.DISPLAY (C=LNG. D.E=MSG.ADRS) JMP SNG00 ; R/W (SINGLE DENSITY) ; BOOT: OUT BSFF ; SELECT BANK DI ; MVI A,0D0H ; OUT FD0CMD ; RESET FD CONTROLLER LXI SP,STACK ; MVI A,55H ; LXI B,RAMMAX ; LXI H,40H ; AVOID INT. AREA CALL CHECK ; WT '55 IN 32K RAM & CHECK MVI A,0AAH ; LXI B,RAMMAX ; LXI H,40H ; CALL CHECK ; WT 'AA IN 32K RAM & CHECK LXI SP,IPL ; MVI A,55H ; LXI B,CRTRAM ; LXI H,CRTBUF ; CALL CHECK ; WT '55 IN CRT RAMA & CHECK MVI A,0AAH ; LXI B,CRTRAM ; LXI H,CRTBUF ; CALL CHECK ; WT 'AA IN CRT RAMA & CHECK CALL CRTC ; SET CRT CONTROLLER CALL CRTDMA ; SET CRT DMA ADDRESS CALL INTADR ; SET INT. ADRS CALL RESET ; RESET WORK AREA MVI A,1FH ; DB 30H ; RST 7.5 EI ; ; XRA A ; STA UNIT ; FD0RST: CALL SEEK00 ; FD #0 RESTORE ORA A ; JNZ FD0RST ; MVI A,1 ; STA UNIT ; FD1RST: CALL SEEK00 ; FD #1 RESTORE ORA A ; JNZ FD1RST ; ; IPL00: LXI H,IPLTAB ; H.L PARA TOP ADRS CALL SNG00 ; READ IPL SEC.(SNG) ORA A ; JZ IPL01 ; CALL DBL00 ; READ IPL SEC.(DBL) ORA A ; JNZ IPL02 ; IPL01: LXI H,IPL+3 ; CHECK FOR 'IPL' CHARA. MOV A,M ; CPI 'I' ; JNZ IPL03 ; INX H ; MOV A,M ; CPI 'P' ; JNZ IPL03 ; INX H ; MOV A,M ; CPI 'L' ; JNZ IPL03 ; JMP IPL ; GOTO IPL IPL02: CPI 2 ; TIME OUT ? MVI C,12 ; LXI D,TIMMSG ; JZ IPL04 ; IPL03: MVI C,23 ; IPL ERR LXI D,IPLMSG ; IPL04: CALL CRTOUT ; DISPLAY MSG. CALL KEYBOD ; WAIT KEY-IN CALL CRTCLR ; CLEAR CRT JMP IPL00 ; IPLTAB: DB 0 ; LOADING UNIT = #0 DB 0 ; TRK = 0 DB 1 ; SEC = 1 DW IPL ; DMA ADRS DB 0 ; READ PARA CHECK: PUSH A ; PUSH B ; PUSH H ; CALL CODETE ; POP H ; POP B ; POP A ; CHECK1: MOV D,A ; MOV A,C ; ORA B ; RZ ; ALL GOOD MOV A,D ; CMP M ; JNZ CHECK2 ; INX H ; DCX B ; JMP CHECK1 ; CHECK2: POP A ; RAM ERROR PUSH H ; CALL CRTC ; SET CRT CONTROLLER CALL CRTDMA ; SET CRT DMA ADRS MVI C,16 ; LXI D,RAMMSG ; CALL CRTOUT ; DISPLAY RAM ERROR POP H ; CALL HEXDSP ; JMP $ ; ; ; [ DISPLAY HEX CODE ] ; HEXDSP: MOV A,H ; PUSH H ; CALL HEX ; DISPLAY TWO HEX CODE POP H ; MOV A,L ; CALL HEX ; DISPLAY TWO HEX CODE RET ; HEX: PUSH A ; RRC ; RRC ; RRC ; RRC ; CALL HEXCHA ; POP A ; CALL HEXCHA ; RET ; HEXCHA: ANI 0FH ; CPI 0AH ; JC HEXCH0 ; ADI 7 ; HEXCH0: ADI 30H ; CHANGE FOR HEX CODE MOV C,A ; CALL CRT ; PUT A CHARA. ON CRT RET ; ; ; [ SET INT.ADRS ] ; INTADR: MVI A,0C3H ; JUMP INSTRUCTION STA 2CH ; RST 5.5 LXI H,KBINT ; KB INT.ADRS SHLD 2DH ; STA 34H ; RST 6.5 LXI H,RSINT ; PORT INT.ADRS SHLD 35H ; STA 3CH ; RST 7.5 LXI H,FDINT ; FD INT.ADRS SHLD 3DH ; STA 24H ; TRAP LXI H,ROM ; ROM TOP ADDRESS SHLD 25H ; RET ; ; ; [ INITIALIZE CRT BUFF & CONTROLLER ] ; CRTC: XRA A ; OUT CRTCOM ; RESET COMMAND LXI H,PARCRT ; H.L CRT CTRLR PARA ADRS MVI C,4 ; CALL PARSET ; SET FIRST THE FOURTH PARA. MVI A,0A0H ; OUT CRTCOM ; INTERRUPT ENABLE CALL CRTCLR ; CLEAR CRT MVI A,0E0H ; OUT CRTCOM ; COUNTER PRESET MVI A,33H ; OUT CRTCOM ; START THE CRT CTRLR RET ; ; ; [ START THE CRT DMA ] ; CRTDMA: MVI A,80H ; OUT DMAMOD ; CHANGE AUTO TO NORMAL CALL CRTDMB ; IN CRTCOM ; CRTDM0: IN CRTCOM ; CHECK OF THE SYNC. ANI 20H ; JZ CRTDM0 ; CALL CRTDMB ; MVI A,84H ; OUT DMAMOD ; CHANGE NORMAL TO AUTO RET ; CRTDMB: LXI H,DMAPAR ; H.L CRT DMA PARA ADRS MOV A,M ; OUT DMA2AD ; SET DMA ADRS OF THE CHANNEL 2 INX H ; MOV A,M ; OUT DMA2AD ; INX H ; MOV A,M ; OUT DMA2TC ; SET TRANSMIT BYTES INX H ; MOV A,M ; OUT DMA2TC ; RET ; ; ; [ SET CRT PARAMETOR ] ; PARSET: MOV A,M ; OUT CRTPAR ; INX H ; DCR C ; JNZ PARSET ; RET ; ; ; [ CRT PARAMETOR TABLE ] ; PARCRT: DB 4FH ; 1 LINE 80 CHARA. DB 57H ; VERTICAL SYNC. 2-LINE, 24-LINE/SCREEN DB 0BDH ; UNDER LINE 12-LINE DB 0DBH ; MODE DMAPAR: DW CRTBUF ; START ADRS OF THE CHANNEL-2 DW 877FH ; TRANSMIT BYTES ; ; [ CODE TRANSMITION ] ; CODETE: MOV D,A ; SAVE TRANSMITION CODE CODE00: MOV M,D ; SET CODE INX H ; DCX B ; MOV A,B ; ORA C ; END ? JNZ CODE00 ; RET ; ; ; [ RESET WORK AREA ] ; RESET: XRA A ; STA KBFLG ; KB INT. FLAG CLEAR MOV H,A ; MOV L,A ; SHLD TRREF0 ; PORT#0,#1 MASK AREA CLEAR STA TRREF2 ; PORT#2 SHLD TRK00 ; FD#0,#1 TRK NUMBER RESET STA DELETE ; DELETED RECORD PARA. OFF MVI A,0FH ; STA MASK ; MASK ALL DISENABLE RET ; ; ; [ KB STATUS READ ] ; KBST: XRA A ; STA KBFLG ; KB INT. FLAG OFF MVI B,0EH ; CALL MASKOF ; KB INT.ENABLE NOP ; NOP ; WAIT INTERRUPT NOP ; MVI B,1 ; CALL MASKON ; KB INT.DISENABLE LDA KBFLG ; LOAD INT FLAG RET ; 0=NO-INT, FF=INT ; ; [ KB 1 CHARA READ ] ; KEYBOD: LDA KBFLG ; INT. FLAG LOAD ORA A ; JNZ CHASET ; CHRA. SET MVI B,0EH ; CALL MASKOF ; KB INT.ENABLE JMP KEYBOD ; CHASET: MVI B,1 ; CALL MASKON ; KB INT DISENABLE XRA A ; STA KBFLG ; INT FLAG OFF LDA KEYCOD ; LOAD KEY-IN CODE RET ; ; ; [ KB INT.PROGRAM ] ; KBINT: DI ; DISENABLE INT. PUSH A ; IN KEYB ; KEY-IN CODE READ STA KEYCOD ; SAVE MVI A,0FFH ; STA KBFLG ; INT FLAG ON POP A ; EI ; ENABLE INT. RET ; ; ; [ R/W FLOPPY ] ; ***************************************** * A=0 : NORMAL RETURN * * A=1 : WT.PROTECT RETUTN * * A=2 : TIME OUT RETURN * * A=3 : RETRY ERR RETURN * * A=4 : NO RETRY ERR RETURN * * A=5 : RESTORE ERR RETURN * ***************************************** ; SNG00: XRA A ; R/W SINGLE DENSITY LXI D,1A08H ; D=SEEK,E=R/W-PARA JMP EXECRW ; DBL00: MVI A,1 ; R/W DOUBLE DENSITY LXI D,1C00H ; D=SEEK,E=R/W-PARA ; EXECRW: STA DNMODE ; SAVE DENSITY MODE OUT DENSTY ; XCHG ; SHLD RWPARA ; SAVE R/W & SEEK PARA XCHG ; PUSH H ; CALL FDIOX ; R/W 1 SEC. POP H ; RET ; ; FDIOX: MOV A,M ; GET UNIT NUMBER RRC ; ANI 1 ; CALL NEWDRV ; SET UNIT & TRK ADRS MOV A,M ; ANI 1 ; GET SIDE OUT SIDE ; INX H ; H.L TRK PARA ADRS SHLD HLADRS ; LDA DNMODE ; ORA A ; SINGLE DENSITY ? JZ FIL00 ; MOV A,M ; CPI 60 ; TRK > 59 ? MVI A,1 ; JNC FIL01 ; FIL00: XRA A ; FIL01: OUT FILTER ; SET FILTER ; MVI A,2 ; SET RESTORE COUNT STA RSCUNT ; RTY00: MVI A,5 ; SET RETRY COUNT STA ERCUNT ; RTY01: LHLD HLADRS ; H.L TRK PARA ADRS LDA UNIT ; ORA A ; UNIT 1 ? MOV B,M ; INX H ; H.L SEC PARA ADRS MOV A,M ; INX H ; H.L DMA PARA ADRS JNZ DRV01 ; ; DRV00: OUT FD0SE ; SET SEC IN FD0TR ; CMP B ; TRK EQU ? JZ DMA00 ; MOV A,B ; SET TRK OUT FD0DA ; LDA SEEK ; LOAD SEEK PARA OUT FD0CMD ; EXEC.SEEK CALL INT01 ; ORA A ; ERR ? JNZ ERCHK ; DMA00: CALL RWDMA ; SET DMA & R/W PARA OUT FD0CMD ; EXEC.R/W JMP RWCHK ; ; DRV01: OUT FD1SE ; SET SEC IN FD1TR ; CMP B ; TRK EQU ? JZ DMA01 ; MOV A,B ; SET TRK OUT FD1DA ; LDA SEEK ; LOAD SEEK PARA OUT FD1CMD ; EXEC.SEEK CALL INT01 ; ORA A ; ERR ? JNZ ERCHK ; DMA01: CALL RWDMA ; SET DMA & R/W PARA OUT FD1CMD ; EXEC.R/W ; RWCHK: ANI 20H ; WT MODE ? JNZ WTMODE ; RDMODE: CALL INT02 ; CHECK RD STATUS ORA A ; ERR ? JNZ ERCHK ; XRA A ; READ NORMAL RETURN RET ; WTMODE: CALL INT03 ; CHECK WT STATUS ORA A ; ERR ? JNZ ERCHK ; XRA A ; WRITE NORMAL RETURN RET ; ; ERCHK: CPI 3 ; RETRY ERR ? RNZ ; NO RETRY ERR.RETURN LXI H,ERCUNT ; DCR M ; RETRY COUNT DOWN JNZ RTY01 ; LXI H,RSCUNT ; DCR M ; RESTORE COUNT DOWN JZ RTYER ; CALL SEEK00 ; RESTORE ORA A ; ERR ? JZ RTY00 ; RTYER: MVI A,3 ; RETRY ERR RETURN RET ; ; RWDMA: MOV A,M ; H.L DMA ADRS (L) OUT DMA0AD ; INX H ; H.L DMA ADRS (H) MOV A,M ; OUT DMA0AD ; MVI A,0FFH ; TERMINAL COUNT (256 BYTE) OUT DMA0TC ; INX H ; H.L R/W PARA ADRS MOV A,M ; ORA A ; WT ? JNZ WTDMA ; ; RDDMA: MVI A,40H ; TERMINAL COUNT (H) OUT DMA0TC ; MVI A,0C5H ; DMA MODE OUT DMAMOD ; LDA RWPARA ; GET RD PARA ORI 80H ; RET ; ; WTDMA: MVI A,80H ; TERMINAL COUNT (H) OUT DMA0TC ; MVI A,0E5H ; DMA MODE OUT DMAMOD ; LDA RWPARA ; GET WT PARA ORI 0A0H ; LXI H,DELETE ; H.L DELETED REC.PARA ORA M ; RET ; ; INT01: CALL WAITFD ; CHECK TYPE-1 STATUS ORA A ; ERR ? RNZ ; MOV A,B ; ANI 81H ; N.RDY & BSY ? JNZ ERINT ; JMP INT04 ; ; INT02: CALL WAITFD ; CHECK TYPE-2 STATUS ORA A ; ERR ? RNZ ; MOV A,B ; ANI 0C7H ; N.RDY,L.DT,DRQ,BSY ? JNZ ERINT ; MOV A,B ; ANI 20H ; DELETED REC ? JZ INT04 ; LXI H,RECTYP ; DELETED REC RETURN INR M ; XRA A ; RET ; ; INT03: CALL WAITFD ; CHECK TYPE-3 STATUS ORA A ; RNZ ; MOV A,B ; ANI 0A7H ; N.RDY,W.FLT,L.DT,DRQ,BSY ? JNZ ERINT ; MOV A,B ; ANI 40H ; WT PROTECT ? JZ INT04 ; MVI A,1 ; WT PROTECT RETURN RET ; ; INT04: MOV A,B ; ANI 18H ; SEEK & CRC ? JNZ INT05 ; XRA A ; NORMAL RETURN RET ; ; INT05: MVI A,3 ; RETRY ERR RETURN RET ; ; ERINT: MVI A,4 ; NO RETRY ERR RETURN RET ; ; WAITFD: XRA A ; RESET FD-INT & DLT-REC FLAG STA FDFLG ; STA RECTYP ; MVI B,0BH ; FD MASK OFF CALL MASKOF ; ; MVI B,2 ; WAIT00: LXI D,0 ; SET SOFT TIMER WAIT01: LDA FDFLG ; ORA A ; FD INT ? JNZ INT00 ; DCX D ; TIMER DOWN MOV A,D ; ORA E ; JNZ WAIT01 ; DCR B ; TIME OUT ? JNZ WAIT00 ; ; TIMOUT: DI ; LDA UNIT ; ORA A ; MVI A,0D0H ; RESET FD JNZ TIME01 ; TIME00: OUT FD0CMD ; FD 1 JMP TIME02 ; TIME01: OUT FD1CMD ; FD 2 ; TIME02: MVI B,4 ; FD MASK ON CALL MASKON ; ORI 10H ; DB 30H ; SIM INSTRUCTION EI ; MVI A,2 ; TIME OUT RETURN RET ; ; INT00: MVI B,4 ; FD MASK ON CALL MASKON ; LDA FDSTAT ; LOAD FD STATUS MOV B,A ; XRA A ; NORMAL RETURN RET ; ; FDSEEK: CALL NEWDRV ; RESTORE FD-1 OR FD-2 SEEK00: LDA UNIT ; ORA A ; MVI A,0AH ; JNZ SEEK02 ; SEEK01: OUT FD0CMD ; FD-1 0 SEEK JMP SEEK03 ; SEEK02: OUT FD1CMD ; FD-2 0 SEEK SEEK03: CALL WAITFD ; ORA A ; ERR ? RNZ ; MOV A,B ; ANI 4 ; TRK-0 BIT ON ? JNZ WAIT15 ; MVI A,5 ; RESTORE ERR RETURN RET ; WAIT15: LXI D,0A00H ; WAIT 15 M.SEC CALL TIMER ; XRA A ; RET ; ; NEWDRV: PUSH H ; LXI H,UNIT ; H.L UNIT ADRS CMP M ; UNIT EQU ? JZ FDEQU ; MOV M,A ; SET NEW FD NUMBER LXI H,TRK00 ; H.L FD-1 TRK ADRS ORA A ; JNZ UNIT01 ; UNIT00: IN FD1TR ; READ FD-2 TRK ADRS STA TRK01 ; MOV A,M ; SET FD-1 TRK ADRS OUT FD0TR ; JMP WAIT50 ; UNIT01: IN FD0TR ; READ FD-1 TRK ADRS MOV M,A ; INX H ; H.L FD-2 TRK ADRS MOV A,M ; OUT FD1TR ; SET FD-2 TRK ADRS WAIT50: LXI D,2000H ; WAIT 50 M.SEC CALL TIMER ; FDEQU: POP H ; RET ; ; TIMER: DCX D ; SOFT TIMER MOV A,D ; ORA E ; TIME OUT ? JNZ TIMER ; RET ; ; STREAD: LDA UNIT ; READ FD STATUS ORA A ; JNZ READ01 ; READ00: IN FD0CMD ; READ FD#0 STATUS JMP READ02 ; READ01: IN FD1CMD ; READ FD#1 STATUS READ02: STA FDSTAT ; SAVE FD STATUS RET ; ; FDINT: DI ; FD INTERRUPT PUSH A ; PUSH H ; CALL STREAD ; READ FD STATUS LXI H,FDFLG ; FD INT-FLAG ON INR M ; POP H ; POP A ; EI ; NOP RET ; ; ; [ CLEAR CRT SCREEN ] ; CRTCLR: MVI A,20H ; LXI B,CRTCHL ; LXI H,CRTBUF ; CALL CODETE ; CLEAR CRT BUFF.(ALL SPACE) CALL CURHOM ; SET CURSOL HOME RET ; ; ; [ PUT CHARACTERS ON CRT ] ; CRTOUT: PUSH B ; C=CHARA.COUNT PUSH D ; D.E=CHARA.ADRS LDAX D ; MOV C,A ; CALL CRT ; PUT A CHARA. ON CRT POP D ; POP B ; INX D ; DCR C ; JNZ CRTOUT ; RET ; ; ; [ PUT A CHARA. ON CRT & SET CURSOL ] ; CRT: LHLD BUFADR ; H.L=CRT BUFF.ADRS MOV M,C ; PUT 1 CHARACTER CALL CSMOVE ; GET NEXT ADRS RET ; ; ; [ GET CURSOL POSITION ] ; CRTSET: CPI 8 ; A='8,'A...'F RC ; CPI 10H ; RNC ; SUI 8 ; RLC ; MOV E,A ; MVI D,0 ; LXI H,CRTTAB ; H.L=TABLE TOP ADRS DAD D ; MOV E,M ; INX H ; MOV D,M ; XCHG ; GET JUMP ADRS PCHL ; CRTTAB: DW CSLEFT ; '8=SET CURSOL TO LEFT DW NOCODE ; '9=NOTHING DW CSLF ; 'A=LINE FEED DW CSDOWN ; 'B=SET CURSOL TO DOWN DW CSRIGH ; 'C=SET CURSOL TO RIGHT DW LIHOME ; 'D=SET CURSOL TO LINEHOME DW CSUP ; 'E=SET CURSOL TO UPPER DW CURHOM ; 'F=SET CURSOL TO HOME NOCODE: RET ; ; ; [ SET CURSOL NEXT LINE OR SCROLL ] ; CSLF: CALL LIHOME ; GET CURRENT LINE TOP ADRS LDA CURSLY ; SUI CRTENL ; CRT END LINE ? JZ CSLF0 ; CALL CSDOWN ; SET CURSOL NEXT LINE RET ; CSLF0: CALL SCROLL ; 1 LINE SCROLL RET ; ; ; [ GET CORRENT LINE TOP ADRS ] ; LIHOME: LDA CURSLY ; LOAD CURRENT LINE CALL LIHDAD ; GET LINE TOP ADRS CALL CURSOL ; SET CURSOL RET ; ; ; [ GET NEXT STORED ADRS ] ; CSMOVE: LHLD BUFADR ; INX H ; BUFF.ADRS +1 UP LXI D,CRTEND ; D.E=CRT BUFF.END ADRS+1 MOV A,L ; SUB E ; JNZ CSMOV0 ; MOV A,H ; SUB D ; JNZ CSMOV0 ; CALL SCROLL ; CRT BUFF.FULL (SCROLL) LXI H,CRTLN2 ; H.L=CRT END LINE TOP ADRS CSMOV0: CALL CURSOL ; SET CURSOL RET ; ; ; [ CURSOL POSITION TO RIGHT ] ; CSRIGH: LHLD BUFADR ; INX H ; BUFF.ADRS +1 UP LXI D,CRTEND ; D.E=CRT BUFF.END ADRS +1 MOV A,L ; SUB E ; JNZ CSRI0 ; MOV A,H ; SUB D ; JNZ CSRI0 ; LXI H,CRTBUF ; H.L=CRT BUFF.TOP ADRS CSRI0: CALL CURSOL ; SET CURSOL RET ; ; ; [ CURSOL POSITION TO LEFT ] ; CSLEFT: LHLD BUFADR ; LXI D,CRTBUF ; D.E=CRT TOP ADRS MOV A,L ; SUB E ; JNZ CSLE0 ; MOV A,H ; SUB D ; JNZ CSLE0 ; LXI H,CRTEND ; H.L=CRT BUFF.END ADRS +1 CSLE0: DCX H ; CALL CURSOL ; SET CURSOL RET ; ; ; [ DOWN 1 LINE OF THE CURRENT LINE ] ; CSDOWN: LHLD BUFADR ; LXI D,CRTECM ; -CRTBUF+CRT1LN=-'E000+'50='18D0 DAD D ; JC CSDO0 ; LXI D,CRTCHL ; DAD D ; LINE NO. 0--22 TO 1--23 CSDO0: LXI D,CRTBUF ; D.E=CRT TOP ADRS DAD D ; CALL CURSOL ; SET CURSOL RET ; ; ; [ 1 LINE UP OF THE CURRENT LINE ] ; CSUP: LHLD BUFADR ; LXI D,CRTTCM ; -CRTBUF-CRT1LN=-'E000-'50='1FB0 DAD D ; JC CSUP0 ; LXI D,CRTCHL ; DAD D ; CSUP0: LXI D,CRTBUF ; D.E=CRT TOP ADRS DAD D ; CALL CURSOL ; SET CURSOL RET ; ; ; [ CURSOL POSITION TO HOME ] ; CURHOM: LXI H,CRTBUF ; H.L=CRT TOP ADRS CALL CURSOL ; RET ; ; ; [ SET CURSOL POSITION BY B,C REG.] ; SETCUR: MOV A,B ; STA CURSLX ; HORIZONTAL POSITION MOV A,C ; STA CURSLY ; VERTICAL POSITION CALL LIHDAD ; COMPUTE LINE TOP ADRS MVI D,0 ; LDA CURSLX ; MOV E,A ; DAD D ; CALL CURSOL ; RET ; ; ; [ GET CURRENT LINE TOP ADRS ] ; LIHDAD: LXI H,CRTBUF ; H.L=CRT TOP ADRS LXI D,CRT1LN ; D.E=1 LINE CHARA.S LIHD0: ORA A ; RZ ; DAD D ; DCR A ; DOWN CURRENT LINE COUNTER JMP LIHD0 ; ; ; [ LINE SCROLL ] ; SCROLL: LXI B,CRTSCA ; CRTCHL-CRT1LN=TRANSMITION BYTES LXI D,CRTLN1 ; CRTBUF+CRT1LN=SECOND LINE TOP ADRS LXI H,CRTBUF ; H.L=CRT TOP ADRS CALL FORTE ; SCROLL EACH CRT LINES MVI A,20H ; LXI B,CRT1LN ; LXI H,CRTLN2 ; CALL CODETE ; SPACING END LINE RET ; ; ; [ SET CURSOL ] ; CURSOL: CALL CURADR ; GET CURSOL ADRS CALL CURSET ; DISPLAY CURSOL RET ; ; ; [ GET CURSOL POSISION ] ; CURADR: SHLD BUFADR ; SET CRT BUFF.ADRS LXI D,CRTCMP ; D.E=-CRT BUFF.ADRS DAD D ; CRT RELATIVE ADRS (0 TO '7FF) MVI C,0 ; CLEAR LINE COUNTER LXI D,CRT1LN ; D.E=1 LINE CHARA.S CRRAD0: CALL SBHLDE ; H.L-D.E=H.L JMP CRRAD1 ; MINUS RETURN INR C ; INCREMENT LINE COUNTER JMP CRRAD0 ; CRRAD1: DAD D ; MOV A,L ; STA CURSLX ; SET CURSOL (HORIZONTAL) MOV A,C ; STA CURSLY ; SET CURSOL (VERTICAL) RET ; ; ; [ SET CURSOL ON CRT ] ; CURSET: MVI A,80H ; OUT CRTCOM ; CURSOL SETTING COMMAND LXI H,CURSLX ; MVI C,2 ; CALL PARSET ; SET CURSOL X,Y RET ; ; ; [ H.L-D.E=H.L ] ; SBHLDE: MOV A,L ; SUB E ; MOV L,A ; MOV A,H ; SBB D ; MOV H,A ; RC ; MINUS RETURN XTHL ; INX H ; INX H ; STACK +3 UP RETURN INX H ; XTHL ; RET ; ; ; [ CONTINUANCE TRANSMISION ] ; FORTE: LDAX D ; LOAD TRANSMISION DATA MOV M,A ; STORE INX D ; INX H ; DCX B ; DECREMENT TRANSMITION COUNTER MOV A,B ; ORA C ; JNZ FORTE ; END OF TRANSMITION ? RET ; ; ; [ CONTROL OF INTERRUPT MASK ] ; MASKOF: LDA MASK ; LOAD INTERRUPT MASK BYTE ANA B ; JMP MSKSET ; MASKON: LDA MASK ; ORA B ; MSKSET: STA MASK ; SET MASK CONDITION BYTE DB 30H ; SIM INSTRUCTION EI ; INTERRUPT ENABLE RET ; ; ; [ READ CHARA. FROM RS232C PORT ] ; RS1RD: LXI D,1 ; READ A CHARACTER LXI H,SAVEC ; H.L=CHARA.SAVE ADRS RSREAD: CPI 0 ; PORT#0 ? JZ REDPT0 ; READ FROM PORT#0 CPI 2 ; JC REDPT1 ; READ FROM PORT#1 JZ REDPT2 ; READ FROM PORT#2 RET ; ; ; [ PUT A CHARA. FROM RS232C PORT ] ; RS1WT: LXI D,1 ; PUT A CHARACTER LXI H,SAVEC ; MOV M,C ; SAVE PUT CHARACTER RSWRIT: CPI 0 ; PORT#0 ? JZ PRINT0 ; PUT FROM PORT#0 CPI 2 ; JC PRINT1 ; PUT FROM PORT#1 JZ PRINT2 ; PUT FROM PORT#2 RET ; ; ; [ PUT 1 CHARA. FROM PORT#0 ] ; PRINT0: DI ; MVI A,5 ; STA TRREF0 ; TRANSMISION FLAG ON XRA A ; OUT RS0CST ; OUT RS0CST ; OUT RS0CST ; MVI A,40H ; OUT RS0CST ; PUT RESET COMMAND LDA MODE0 ; OUT RS0CST ; SET PUT MODE MVI A,33H ; OUT RS0CST ; START TRANSMISION MSKOF1: MVI B,0DH ; CALL MASKOF ; PORT MASK OFF IN RS0CST ; READ STATUS ANI 1 ; TRANSMITION READY ? JZ MSKOF1 ; NOT READY MOV A,M ; OUT RS0DAT ; TRANSMIT 1 CHARACTER INX H ; DCX D ; MOV A,D ; ORA E ; JNZ MSKOF1 ; END PRINTING ? MSKOF2: MVI B,0DH ; CALL MASKOF ; PORT MASK OFF IN RS0CST ; READ STATUS ANI 4 ; END OF TRANSMITION ? JZ MSKOF2 ; NOT END XRA A ; STA TRREF0 ; TRANMISION FLAG OFF OUT RS0CST ; STOP COMMAND MVI B,2 ; CALL MASKON ; PORT MASK ON RET ; ; ; [ PUT 1 CHARA. FROM PORT#1 ] ; PRINT1: DI ; MVI A,5 ; STA TRREF1 ; TRANSMISION FLAG ON XRA A ; OUT RS1CST ; OUT RS1CST ; OUT RS1CST ; MVI A,40H ; OUT RS1CST ; PUT RESET COMMAND LDA MODE1 ; OUT RS1CST ; SET PUT MODE MVI A,33H ; OUT RS1CST ; START TRANSMISION MSKOF3: MVI B,0DH ; CALL MASKOF ; PORT MASK OFF IN RS1CST ; READ STATUS ANI 1 ; TRANSMITION READY ? JZ MSKOF3 ; NOT READY MOV A,M ; OUT RS1DAT ; TRANSMIT 1 CHARACTER INX H ; DCX D ; MOV A,D ; ORA E ; JNZ MSKOF3 ; END PRINTING ? MSKOF4: MVI B,0DH ; CALL MASKOF ; PORT MASK OFF IN RS1CST ; READ STATUS ANI 4 ; END OF TRANSMITION ? JZ MSKOF4 ; NOT END XRA A ; STA TRREF1 ; TRANMISION FLAG OFF OUT RS1CST ; STOP COMMAND MVI B,2 ; CALL MASKON ; PORT MASK ON RET ; ; ; [ PUT 1 CHARA. FROM PORT#2 ] ; PRINT2: DI ; MVI A,5 ; STA TRREF2 ; TRANSMISION FLAG ON XRA A ; OUT RS2CST ; OUT RS2CST ; OUT RS2CST ; MVI A,40H ; OUT RS2CST ; PUT RESET COMMAND LDA MODE2 ; OUT RS2CST ; SET PUT MODE MVI A,33H ; OUT RS2CST ; START TRANSMISION MSKOF5: MVI B,0DH ; CALL MASKOF ; PORT MASK OFF IN RS2CST ; READ STATUS ANI 1 ; TRANSMITION READY ? JZ MSKOF5 ; NOT READY MOV A,M ; OUT RS2DAT ; TRANSMIT 1 CHARACTER INX H ; DCX D ; MOV A,D ; ORA E ; JNZ MSKOF5 ; END PRINTING ? MSKOF6: MVI B,0DH ; CALL MASKOF ; PORT MASK OFF IN RS2CST ; READ STATUS ANI 4 ; END OF TRANSMITION ? JZ MSKOF6 ; NOT END XRA A ; STA TRREF2 ; TRANMISION FLAG OFF OUT RS2CST ; STOP COMMAND MVI B,2 ; CALL MASKON ; PORT MASK ON RET ; ; ; [ READ 1 CHARA. FROM PORT#0 ] ; REDPT0: DI ; MVI A,2 ; STA TRREF0 ; RECEIVE FLAG ON XRA A ; OUT RS0CST ; OUT RS0CST ; OUT RS0CST ; MVI A,40H ; OUT RS0CST ; PUT RESET COMMAND LDA MODE0 ; OUT RS0CST ; SET RECEIVE MODE IN RS0DAT ; DUMMY READ MVI A,36H ; OUT RS0CST ; START RECEIVE READ0: MVI B,0DH ; CALL MASKOF ; PORT MASK OFF IN RS0CST ; READ STATUS ANI 2 ; RECEIVE READY ? JZ READ0 ; IN RS0DAT ; RECEIVE 1 CHARACTER MOV M,A ; SAVE CHARACTER INX H ; DCX D ; MOV A,D ; ORA E ; JNZ READ0 ; READING END ? XRA A ; STA TRREF0 ; RECEIVE FLAG OFF OUT RS0CST ; STOP COMMAND MVI B,2 ; CALL MASKON ; PORT MASK ON DCX H ; MOV A,M ; LOAD END CHARACTER RET ; ; ; [ READ 1 CHARA. FROM PORT#1 ] ; REDPT1: DI ; MVI A,2 ; STA TRREF1 ; RECEIVE FLAG ON XRA A ; OUT RS1CST ; OUT RS1CST ; OUT RS1CST ; MVI A,40H ; OUT RS1CST ; PUT RESET COMMAND LDA MODE1 ; OUT RS1CST ; RECEIVE MODE SET IN RS1DAT ; DUMMY READ MVI A,36H ; OUT RS1CST ; START RECEIVE READ1: MVI B,0DH ; CALL MASKOF ; PORT MASK OFF IN RS1CST ; READ STATUS ANI 2 ; RECEIVE READY ? JZ READ1 ; IN RS1DAT ; RECEIVE 1 CHARACTER MOV M,A ; SAVE CHARACTER INX H ; DCX D ; MOV A,D ; ORA E ; JNZ READ1 ; READING END ? XRA A ; STA TRREF1 ; RECEIVE FLAG OFF OUT RS1CST ; STOP COMMAND MVI B,2 ; CALL MASKON ; PORT MASK ON DCX H ; MOV A,M ; LOAD END CHARACTER RET ; ; ; [ READ 1 CHARA. FROM PORT#2 ] ; REDPT2: DI ; MVI A,2 ; STA TRREF2 ; RECEIVE FLAG ON XRA A ; OUT RS2CST ; OUT RS2CST ; OUT RS2CST ; MVI A,40H ; OUT RS2CST ; PUT RESET COMMAND LDA MODE2 ; OUT RS2CST ; RECEIVE MODE SET IN RS2DAT ; DUMMY READ MVI A,36H ; OUT RS2CST ; START RECEIVE READ2: MVI B,0DH ; CALL MASKOF ; PORT MASK OFF IN RS2CST ; READ STATUS ANI 2 ; RECEIVE READY ? JZ READ2 ; IN RS2DAT ; RECEIVE 1 CHARACTER MOV M,A ; SAVE CHARACTER INX H ; DCX D ; MOV A,D ; ORA E ; JNZ READ2 ; READING END ? XRA A ; STA TRREF2 ; RECEIVE FLAG OFF OUT RS2CST ; STOP COMMAND MVI B,2 ; CALL MASKON ; PORT MASK ON DCX H ; MOV A,M ; LOAD END CHARACTER RET ; ; ; [ PORT INTERRUPT PROGRAM ] ; RSINT: DI ; DESNABLE INTERRUPT PUSH A ; PUSH B ; IN RS0CST ; PORT#0 STATUS READ MOV B,A ; LDA TRREF0 ; ANA B ; PORT#0 INTERRUPT ? JZ RSINT1 ; RSINT0: POP B ; POP A ; RET ; RSINT1: IN RS1CST ; PORT#1 STATUS READ MOV B,A ; LDA TRREF1 ; ANA B ; PORT#1 INTERRUPT ? JNZ RSINT0 ; IN RS2CST ; PORT#2 STATUS READ MOV B,A ; LDA TRREF2 ; ANA B ; PORT#2 INTERRUPT ? JNZ RSINT0 ; POP B ; POP A ; EI ; ENABLE INTERRUPT RET ; ; ; [ SET RS232C MODE ] ; RSMODE: CPI 3 ; RNC ; LXI H,MODE0 ; ORA A ; JZ RSMO1 ; RSMO0: INX H ; DCR A ; JNZ RSMO0 ; RSMO1: MOV M,C ; SET MODE INFORMATION RET ; ; ; [ ERROR MESSAGE ] ; RAMMSG: DB 'RAM ERR ADDRESS ' IPLMSG: DB 'IPL ERR CHANGE DISKETTE' TIMMSG: DB 'SET DISKETTE' ; END ;