; MONITOR PROGRAM 1Z-013A ; (MZ700) FOR PAL ; REV. 83.4.7 ; Tuesday, 02 of June 1998 at 10:02 PM ; Tuesday, 09 of June 1998 at 07:17 AM ; Configurable parameters. These are set in the wrapper file, ie monitor_SA1510.asm ; ;COLW: EQU 40 ; Width of the display screen (ie. columns). ;ROW: EQU 25 ; Number of rows on display screen. ;SCRNSZ: EQU COLW * ROW ; Total size, in bytes, of the screen display area. ORG 0000h ; 0000h Entrypoint MONIT: JP START ; MONITOR ON GETL: JP QGETL ; GET LINE (END "CR") LETNL: JP QLTNL ; NEW LINE NL: JP QNL ; PRNTS: JP QPRTS ; PRINT SPACE PRNTT: JP QPRTT ; PRINT TAB PRNT: JP QPRNT ; 1 CHARACTER PRINT MSG: JP QMSG ; 1 LINE PRINT (END "0DH") MSGX: JP QMSGX ; RST 18H GETKY: JP QGET ; GET KEY BRKEY: JP QBRK ; GET BREAK WRINF: JP QWRI ; WRITE INFORMATION WRDAT: JP QWRD ; WRITE DATA RDINF: JP QRDI ; READ INFORMATION RDDAT: JP QRDD ; READ DATA VERFY: JP QVRFY ; VERIFYING CMT MELDY: JP QMLDY ; RST 30H TIMST: JP QTMST ; TIME SET NOP NOP JP 1038H ; INTERRUPT ROUTINE (8253) TIMRD: JP QTMRD ; TIME READ BELL: JP QBEL ; BELL ON XTEMP: JP QTEMP ; TEMPO SET (1 - 7) MSTA: JP MLDST ; MELODY START MSTP: JP MLDSP ; MELODY STOP START: LD SP,SPV ; STACK SET (10F0H) IM 1 ; IM 1 SET CALL QMODE ; 8255 MODE SET CALL QBRK ; CTRL ? JR NC,ST0 CP 20H ; KEY IS CTRL KEY JR NZ,ST0 CMY0: OUT (0E1H),A ; D000-FFFFH IS DRAM LD DE,0FFF0H ; TRANS. ADR. LD HL,DMCP ; MEMORY CHANG PROGRAM LD BC,05H ; BYTE SIZE LDIR JP 0FFF0H ; JUMP $FFF0 DMCP: OUT (0E0H),A ; 0000H-0FFFH IS DRAM JP 0000H ST0: LD B,0FFH ; BUFFER CLEAR LD HL,NAME ; 10F1H-11F0H CLEAR CALL QCLER LD A,16H ; LASTER CLR. CALL PRNT IF MODE80C = 0 LD A,071H ; Black background, white characters. Bit 7 is clear as a write to bit 7 @ DFFFH selects 40Char mode. ELSE LD A,071H ; Blue background, white characters in colour mode. Bit 7 is set as a write to bit 7 @ DFFFH selects 80Char mode. ENDIF ; LD A,71H ; BACK:BLUE CHA.:WRITE LD HL,0D800H ; COLOR ADDRESS CALL NCLR8 LD HL,TIMIN ; INTERRUPT JUMP ROUTINE LD A,0C3H LD (1038H),A LD (1039H),HL LD A,04H ; NORMAL TEMPO LD (TEMPW),A CALL MLDSP ; MELODY STOP CALL NL LD DE,MSGQ3 ; ** MONITOR 1Z-013A ** RST 18H ; CALL MGX CALL QBEL SS: LD A,01H LD (SWRK),A ; KEY IN SILENT LD HL,0E800H ; USR ROM? LD (HL),A ; ROM CHECK JR FD2 ST1: CALL NL LD A,2AH ; "*" PRINT CALL PRNT LD DE,BUFER ; GET LINE WORK (11A3H) CALL GETL ST2: LD A,(DE) INC DE CP 0DH JR Z,ST1 CP 'J' ; JUMP JR Z,GOTO CP 'L' ; LOAD PROGRAM JR Z,LOAD CP 'F' ; FLOPPY ACCESS JR Z,FD CP 'B' ; KEY IN BELL JR Z,SG CP '#' ; CHANG MEMORY JR Z,CMY0 CP 'P' ; PRINTER TEST JR Z,PTEST CP 'M' ; MEMORY CORRECTION JP Z,MCOR CP 'S' ; SAVE DATA JP Z,SAVE CP 'V' ; VERIFYING DATA JP Z,VRFY CP 'D' ; DUMP DATA JP Z,DUMP NOP NOP NOP NOP JR ST2 ; NO COMMAND ; JUMP COMMAND GOTO: CALL HEXIY JP (HL) ; KEY SOUND ON/OFF SG: LD A,(SWRK) ; D0=SOUND WORK RRA CCF ; CHANGE MODE RLA JR SS+2 ; FLOPPY FD: LD HL,0F000H ; FLOPPY I/O CHECK FD2: LD A,(HL) OR A JR NZ,ST1 FD1: JP (HL) ; ERROR (LOADING) QER: CP 02H ; A=02H : BREAK IN JR Z,ST1 LD DE,MSGE1 ; CHECK SUM ERROR RST 18H ; CALL MSGX L010F: JR ST1 ; LOAD COMMAND LOAD: CALL QRDI JR C,QER LOA0: CALL NL LD DE,MSGQ2 ; LOADING RST 18H ; CALL MSGX LD DE,NAME ; FILE NAME RST 18H ; CALL MSGX CALL QRDD JR C,QER LD HL,(EXADR) ; EXECUTE ADDRESS LD A,H CP 12H ; EXECUTE CHECK JR C,L010F JP (HL) ; GETLINE AND BREAK IN CHECK ; ; EXIT BREAK IN THEN JUMP (ST1) ; ACC=TOP OF LINE DATA BGETL: EX (SP),HL POP BC ; STACK LOAD LD DE,BUFER ; MONITOR GETLINE BUFF CALL GETL LD A,(DE) CP 1BH ; BREAK CODE JR Z,L010F ; JP Z,ST1 JP (HL) ; ASCII TO HEX CONVERT ; INPUT (DE)=ASCII ; CY=1 THEN JUMP (ST1) HEXIY: EX (SP),IY POP AF CALL HLHEX JR C,L010F ; JP C,ST1 JP (IY) MSGE1: DB "CHECK SUM ER.\r" ; PLOTTER PRINTER TEST COMMAND ; (DPG23) ; &=CONTROL COMMANDS GROUP ; C=PEN CHANGE ; G=GRAPH MODE ; S=80 CHA. IN 1 LINE ; L=40 CHA. IN 1 LINE ; T=PLOTTER TEST ; IN (DE)=PRINT DATA PTEST: LD A,(DE) CP '&' JR NZ,PTST1 PTST0: INC DE LD A,(DE) CP 'L' ; 40 IN 1 LINE JR Z,PLPT CP 'S' ; 80 IN 1 LINE JR Z,PPLPT CP 'C' ; PEN CHANGE JR Z,PEN CP 'G' ; GRAPH MODE JR Z,PLOT CP 'T' ; TEST JR Z,PTRN PTST1: CALL PMSG ; PLOT MESSAGE JP ST1 PLPT: LD DE,LLPT ; 01-09-09-0B-0D JR PTST1 PPLPT: LD DE,SLPT ; 01-09-09-09-0D JR PTST1 PTRN: LD A,04H ; TEST PATTERN JR PLOT+2 PLOT: LD A,02H ; GRAPH CODE CALL LPRNT JR PTST0 PEN: LD A,1DH ; 1 CHANGE CODE (TEXT MODE) JR PLOT+2 ; 1CHA. PRINT TO $LPT ; IN: ACC PRINT DATA LPRNT: LD C,0 ; RDA TEST (READY? RDA=0) LD B,A ; PRINT DATA STORE CALL RDA LD A,B OUT (0FFH),A ; DATA OUT LD A,80H ; RDP HIGH OUT (0FEH),A LD C,01H ; RDA TEST CALL RDA XOR A ; RDP LOW OUT (0FEH),A RET ; $LPT MSG ; IN: DE DATA LOW ADDRESS ; 0DH MSG END PMSG: PUSH DE PUSH BC PUSH AF PMSG1: LD A,(DE) ; ACC=DATA CALL LPRNT LD A,(DE) INC DE CP 0DH ; END? JR NZ,PMSG1 POP AF POP BC POP DE RET ; RDA CHECK ; BRKEY IN TO MONITOR RETURN ; IN: C RDA CODE RDA: IN A,(0FEH) AND 0DH ; RDA ONLY CP C RET Z CALL BRKEY JR NZ,RDA LD SP,SPV JP ST1 ; MELODY ; DE=DATA LOW ADDRESS ; EXIT CF=1 BREAK ; CF=0 OK QMLDY: PUSH BC PUSH DE PUSH HL LD A,02H LD (OCTV),A LD B,01H MLD1: LD A,(DE) CP 0DH ; CR JR Z,MLD4 CP 0C8H ; END MARK JR Z,MLD4 CP 0CFH ; UNDER OCTAVE JR Z,MLD2 CP 2DH ; "-" JR Z,MLD2 CP 2BH ; "+" JR Z,MLD3 CP 0D7H ; UPPER OCTAVE JR Z,MLD3 CP 23H ; "#" HANON LD HL,MTBL JR NZ,L01F5 LD HL,MNTBL INC DE L01F5: CALL ONPU ; ONTYO SET JR C,MLD1 CALL RYTHM JR C,MLD5 CALL MLDST ; MELODY START LD B,C JR MLD1 MLD2: LD A,3 L0207: LD (OCTV),A INC DE JR MLD1 MLD3: LD A,01H JR L0207 MLD4: CALL RYTHM MLD5: PUSH AF CALL MLDSP POP AF JP RET3 ; ONPU TO RATIO CONV ; EXIT (RATIO)=RATIO VALUE ; C=ONTYO*TEMPO ONPU: PUSH BC LD B,8 ONP1: LD A,(DE) L0220: CP (HL) JR Z,ONP2 INC HL INC HL INC HL DJNZ L0220 SCF INC DE POP BC RET ONP2: INC HL PUSH DE LD E,(HL) INC HL LD D,(HL) EX DE,HL LD A,H OR A JR Z,L023F LD A,(OCTV) ; 11A0H OCTAVE WORK L0239: DEC A JR Z,L023F ADD HL,HL JR L0239 L023F: LD (RATIO),HL ; 11A1H ONPU RATIO LD HL,OCTV LD (HL),02H DEC HL POP DE INC DE LD A,(DE) LD B,A AND 0F0H ; ONTYO ? CP 30H JR Z,L0255 LD A,(HL) ; HL=ONTYO JR L025A L0255: INC DE LD A,B AND 0FH LD (HL),A ; HL=ONTYO L025A: LD HL,OPTBL ADD A,L LD L,A LD C,(HL) LD A,(TEMPW) LD B,A XOR A ONP3: ADD A,C DJNZ ONP3 POP BC LD C,A XOR A RET MTBL: DB "C" DW 0846H DB "D" DW 075FH DB "E" DW 0691H DB "F" DW 0633H DB "G" DW 0586H DB "A" DW 04ECH DB "B" DW 0464H DB "R" DW 0000H MNTBL: DB "C" ; #C DW 07CFH DB "D" ; #D DW 06F5H DB "E" ; #E DW 0633H DB "F" ; #F DW 05DAH DB "G" ; #G DW 0537H DB "A" ; #A DW 04A5H DB "B" ; #B DW 0423H DB "R" ; #R DW 0000H OPTBL: DB 01H DB 02H DB 03H DB 04H DB 06H DB 08H DB 0CH DB 10H DB 18H DB 20H ; INCREMENT DE REG. P4DE: INC DE INC DE INC DE INC DE RET ; MELODY START & STOP MLDST: LD HL,(RATIO) LD A,H OR A JR Z,MLDSP PUSH DE EX DE,HL LD HL,CONT0 LD (HL),E LD (HL),D LD A,01H POP DE JR MLDS1 MLDSP: LD A,36H ; MODE SET (8253 C0) LD (CONTF),A ; E007H XOR A MLDS1: LD (SUNDG),A ; E008H RET ; TEHRO SET ; RHYTHM ; B=COUNT DATA ; IN ; EXIT CF=1 BREAK ; CF=0 OK RYTHM: LD HL,KEYPA ; E000H LD (HL),0F8H INC HL LD A,(HL) AND 81H ; BREAK IN CHECK JR NZ,L02D5 SCF RET L02D5: LD A,(TEMP) ; E008H RRCA ; TEMPO OUT JR C,L02D5 L02DB: LD A,(TEMP) RRCA JR NC,L02DB DJNZ L02D5 XOR A RET ; TEMPO SET ; ACC=VALUE (1-7) QTEMP: PUSH AF PUSH BC AND 0FH LD B,A LD A,8 SUB B LD (TEMPW),A POP BC POP AF RET ; CRT MANAGEMENT ; EXIT HL:DSPXY H=Y,L=X ; DE:MANG ADR. (ON DSPXY) ; A :MANG DATA ; CY:MANG=1 PMANG: LD HL,MANG ; CRT MANG POINTER LD A,(1172H) ; DSPXY+1 ADD A,L LD L,A LD A,(HL) INC HL RL (HL) OR (HL) RR (HL) RRCA EX DE,HL LD HL,(DSPXY) RET ; TIME SET ; ACC=0 : AM ; =1 : PM ; DE=SEC: BINARY QTMST: DI PUSH BC PUSH DE PUSH HL LD (AMPM),A ; AMPM DATA LD A,0F0H LD (TIMFG),A ; TIME FLAG LD HL,0A8C0H ; 12 HOURS (43200 SECONDS) XOR A SBC HL,DE ; COUNT DATA = 12H-IN DATA PUSH HL NOP EX DE,HL LD HL,CONTF ; E007H LD (HL),74H ; C1 LD (HL),0B0H ; C2 DEC HL ; CONT2 LD (HL),E ; E006H LD (HL),D DEC HL ; CONT1 LD (HL),0AH ; E005H STROBE 640,6µSECONDS COUNT2 LD (HL),0 INC HL INC HL ; CONTF LD (HL),80H ; E007H DEC HL ; CONT2 QTMS1: LD C,(HL) ; E006H LD A,(HL) CP D JR NZ,QTMS1 LD A,C CP E JR NZ,QTMS1 DEC HL ; E005H NOP NOP NOP LD (HL),0FBH ; 1 SECOND (15611HZ) E005H LD (HL),3CH INC HL POP DE QTMS2: LD C,(HL) ; E006H LD A,(HL) CP D JR NZ,QTMS2 LD A,C CP E JR NZ,QTMS2 POP HL POP DE POP BC EI RET ; BELL DATA ; QBELD: DB 0D7H DB "A0" DB 0DH NOP NOP ; TIME READ ; EXIT ACC=0 :AM ; =1 :PM ; DE=SEC. BINARY QTMRD: PUSH HL LD HL,CONTF LD (HL),80H ; E007H C2 DEC HL ; CONT2 DI LD E,(HL) LD D,(HL) ; e006H C2 MODE0 EI L0363: LD A,E OR D JR Z,QTMR1 XOR A LD HL,0A8C0H ; 12 HOURS SBC HL,DE JR C,QTMR2 EX DE,HL LD A,(AMPM) POP HL RET QTMR1: LD DE,0A8C0H L0378: LD A,(AMPM) XOR 01H POP HL RET QTMR2: DI LD HL,CONT2 LD A,(HL) CPL LD E,A LD A,(HL) CPL LD D,A EI INC DE JR L0378 ; TIME INTERRUPT TIMIN: PUSH AF PUSH BC PUSH DE PUSH HL LD HL,AMPM LD A,(HL) XOR 01H LD (HL),A LD HL,CONTF LD (HL),80H ; CONT2 DEC HL PUSH HL LD E,(HL) LD D,(HL) LD HL,0A8C0H ADD HL,DE DEC HL DEC HL EX DE,HL POP HL LD (HL),E LD (HL),D POP HL POP DE POP BC POP AF EI RET ; SPACE PRINT AND DISP ACC ; INPUT:HL=DISP. ADR. SPHEX: CALL QPRTS ; SPACE PRINT LD A,(HL) CALL PRTHX ; DSP OF ACC (ASCII) LD A,(HL) RET ; (ASCII PRINT) FOR HL PRTHL: LD A,H CALL PRTHX LD A,L JR PRTHX NOP NOP ; (ASCII PRINT) FOR ACC PRTHX: PUSH AF RRCA RRCA RRCA RRCA CALL ASC CALL PRNT POP AF CALL ASC JP PRNT ; 80 CHA. 1 LINE CODE (DATA) SLPT: DB 01H ; TEXT MODE DB 09H DB 09H DB 09H DB 0DH ; HEXADECIMAL TO ASCII ; IN : ACC (D3-D0)=HEXADECIMAL ; EXIT: ACC = ASCII ASC: AND 0FH CP 0AH JR C,NOADD ADD A,07H NOADD: ADD A,30H RET ; ASCII TO HEXADECIMAL ; IN : ACC = ASCII ; EXIT: ACC = HEXADECIMAL ; CY = 1 ERROR HEXJ: SUB 30H RET C ; <0 CP 0AH CCF RET NC ; 0-9 SUB 07H CP 10H CCF RET C CP 0AH RET NOP NOP NOP NOP HEX: JR HEXJ ; PRESS PLAY MESSAGE MSGN1: DW 207FH MSGN2: DB "PLAY\r" MSGN3: DW 207FH DB "RECORD.\r" ; PRESS RECORD NOP NOP NOP NOP ; 4 ASCII TO (HL) ; IN DE=DATA LOW ADDRESS ; EXIT CF=0 : OK ; =1 : OUT HLHEX: PUSH DE CALL L2HEX JR C,L041D LD H,A CALL L2HEX JR C,L041D LD L,A L041D: POP DE RET ; 2 ASCII TO (ACC) ; IN DE=DATA LOW ADRRESS ; EXIT CF=0 : OK ; =1 : OUT L2HEX: PUSH BC LD A,(DE) INC DE CALL HEX JR C,L0434 RRCA RRCA RRCA RRCA LD C,A LD A,(DE) INC DE CALL HEX JR C,L0434 OR C L0434: POP BC RET ; WRITE INFORMATION QWRI: DI PUSH DE PUSH BC PUSH HL LD D,0D7H ; "W" LD E,0CCH ; "L" LD HL,IBUFE ; 10F0H LD BC,80H ; WRITE BYTE SIZE WRI1: CALL CKSUM ; CHECK SUM CALL MOTOR ; MOTOR ON JR C,WRI3 LD A,E CP 0CCH ; "L" JR NZ,WRI2 CALL NL PUSH DE LD DE,MSGN7 ; WRITING RST 18H ; CALL MSGX LD DE,NAME ; FILE NAME RST 18H ; CALL MSGX POP DE WRI2: CALL GAP CALL WTAPE WRI3: JP RET2 MSGN7: DB "WRITING \r" ; 40 CHA. IN 1 LINE CODE (DATA) LLPT: DB 01H ; TEXT MODE DB 09H DB 09H DB 0BH DB 0DH ; WRITE DATA ; EXIT CF=0 : OK ; =1 : BREAK QWRD: DI PUSH DE PUSH BC PUSH HL LD D,0D7H ; "W" LD E,53H ; "S" L047D: LD BC,(SIZE) ; WRITE DATA BYTE SIZE LD HL,(DTADR) ; WRITE DATA ADDRESS LD A,B OR C JR Z,RET1 JR WRI1 ; TAPE WRITE ; BC=BYTE SIZE ; HL=DATA LOW ADDRESS ; EXIT CF=0 : OK ; =1 : BREAK WTAPE: PUSH DE PUSH BC PUSH HL LD D,02H LD A,0F8H ; 88H WOULD BE BETTER!! LD (KEYPA),A ; E000H WTAP1: LD A,(HL) CALL WBYTE ; 1 BYTE WRITE LD A,(KEYPB) ; E001H AND 81H ; SHIFT & BREAK JP NZ,WTAP2 LD A,02H ; BREAK IN CODE SCF JR WTAP3 WTAP2: INC HL DEC BC LD A,B OR C JP NZ,WTAP1 LD HL,(SUMDT) ; SUM DATA SET LD A,H CALL WBYTE LD A,L CALL WBYTE CALL LONG DEC D JP NZ,L04C2 OR A JP WTAP3 L04C2: LD B,0 L04C4: CALL SHORT DEC B JP NZ,L04C4 POP HL POP BC PUSH BC PUSH HL JP WTAP1 WTAP3: RET1: POP HL POP BC POP DE RET DB 2FH DB 4EH ; READ INFORMATION (FROM $CMT) ; EXIT ACC=0: OK CF=0 ; =1: ER CF=1 ; =2: BREAK CF=1 QRDI: DI PUSH DE PUSH BC PUSH HL LD D,0D2H ; "R" LD E,0CCH ; "L" LD BC,80H LD HL,IBUFE RD1: CALL MOTOR JP C,RTP6 CALL TMARK JP C,RTP6 CALL RTAPE JP RTP4 ; READ DATA (FROM $CMT) ; EXIT SAME UP QRDD: DI PUSH DE PUSH BC PUSH HL LD D,0D2H ; "R" LD E,53H ; "S" LD BC,(SIZE) LD HL,(DTADR) LD A,B OR C JP Z,RTP4 JR RD1 ; READ TAPE ; IN BC=SIZE ; DE=LOAD ADDRESS ; EXIT ACC=0 : OK CF=0 ; =1 : ER =1 ; =2 : BREAK=1 RTAPE: PUSH DE PUSH BC PUSH HL LD H,02H ; TWICE WRITE RTP1: LD BC,KEYPB LD DE,CSTR RTP2: CALL EDGE ; 1-->0 EDGE DETECT JR C,RTP6 CALL DLY3 ; CALL DLY2*3 LD A,(DE) ; DATA (1 BIT) READ AND 20H JP Z,RTP2 LD D,H LD HL,0 LD (SUMDT),HL POP HL POP BC PUSH BC PUSH HL RTP3: CALL RBYTE ; 1 BYTE READ JR C,RTP6 LD (HL),A INC HL DEC BC LD A,B OR C JR NZ,RTP3 LD HL,(SUMDT) ; CHECK SUM CALL RBYTE ; CHECK SUM DATA JR C,RTP6 LD E,A CALL RBYTE ; CHECK SUM DATA JR C,RTP6 CP L JR NZ,RTP5 LD A,E CP H JR NZ,RTP5 RTP8: XOR A RTP4: RET2: POP HL POP BC POP DE CALL MSTOP PUSH AF LD A,(TIMFG) ; INT. CHECK CP 0F0H JR NZ,L0563 EI L0563: POP AF RET RTP5: DEC D JR Z,RTP7 LD H,D CALL GAPCK JR RTP1 RTP7: LD A,01H JR RTP9 RTP6: LD A,02H RTP9: SCF JR RTP4 ; BELL QBEL: PUSH DE LD DE,QBELD RST 30H ; CALL MELODY POP DE RET ; FLASHING AND KEYIN ; EXIT: ACC INPUT KEY DATA (DSP.CODE) ; H=F0H THEN NO KEYIN (Z FLAG) FLKEY: CALL QFLAS CALL QKEY CP 0F0H RET NOP ; VERIFY (FROM $CMT) ; EXIT ACC=0 : OK CF=0 ; =1 : ER CF=1 ; =2 : BREAK CF=1 QVRFY: DI PUSH DE PUSH BC PUSH HL LD BC,(SIZE) LD HL,(DTADR) LD D,0D2H ; "R" LD E,53H ; "S" LD A,B OR C JR Z,RTP4 ; END CALL CKSUM CALL MOTOR JR C,RTP6 ; BRK CALL TMARK ; TAPE MARK DETECT JR C,RTP6 ; BRK CALL TVRFY JR RTP4 ; DATA VERIFY ; BC=SIZE ; HL=DATA LOW ADDRESS ; CSMDT=CHECK SUM ; EXIT ACC=0 : OK CF=0 ; =1 : ER =1 ; =2 : BREAK =1 TVRFY: PUSH DE PUSH BC PUSH HL LD H,02H ; COMPARE TWICE TVF1: LD BC,KEYPB LD DE,CSTR TVF2: CALL EDGE JP C,RTP6 ; BRK CALL DLY3 ; CALL DLY2*3 LD A,(DE) AND 20H JP Z,TVF2 LD D,H POP HL POP BC PUSH BC PUSH HL ; COMPARE TAPE DATA AND STORAGE TVF3: CALL RBYTE JR C,RTP6 ; BRK CP (HL) JR NZ,RTP7 ; ERROR, NOT EQUAL INC HL ; STORAGE ADDRESS + 1 DEC BC ; SIZE - 1 LD A,B OR C JR NZ,TVF3 ; COMPARE CHECK SUM (1199H/CSMDT) AND TAPE LD HL,(CSMDT) CALL RBYTE CP H JR NZ,RTP7 ; ERROR, NOT EQUAL CALL RBYTE CP L JR NZ,RTP7 ; ERROR, NOT EQUAL DEC D ; NUMBER OF COMPARES (2) - 1 JP Z,RTP8 ; OK, 2 COMPARES LD H,D ; (-->05C7H), SAVE NUMBER OF COMPARES JR TVF1 ; NEXT COMPARE ; FLASHING DATA LOAD QLOAD: PUSH AF LD A,(FLASH) CALL QPONT LD (HL),A POP AF RET ; NEW LINE AND PRINT HL REG (ASCII) NLPHL: CALL NL CALL PRTHL RET ; EDGE (TAPE DATA EDGE DETECT) ; BC=KEYPB (E001H) ; DE=CSTR (E002H) ; EXIT CF=0 OK CF=1 BREAK EDGE: LD A,0F8H ; BREAK KEY IN (88H WOULD BE BETTER!!) LD (KEYPA),A NOP EDG1: LD A,(BC) AND 81H ; SHIFT & BREAK JR NZ,L060E SCF RET L060E: LD A,(DE) AND 20H JR NZ,EDG1 ; CSTR D5 = 0 EDG2: LD A,(BC) ; 8 AND 81H ; 9 JR NZ,L061A ; 10/14 SCF RET L061A: LD A,(DE) ; 8 AND 20H ; 9 JR Z,EDG2 ; CSTR D5 = 1 10/14 RET ; 11 NOP NOP NOP NOP ; 1 BYTE READ ; EXIT SUMDT=STORE ; CF=1 : BREAK ; CF=0 : DATA=ACC RBYTE: PUSH BC PUSH DE PUSH HL LD HL,0800H ; 8 BITS LD BC,KEYPB ; KEY DATA E001H LD DE,CSTR ; $TAPE DATA E002H RBY1: CALL EDGE ; 41 OR 101 JP C,RBY3 ; 13 (SHIFT & BREAK) CALL DLY3 ; 20+18*63+33 LD A,(DE) ; DATA READ :8 AND 20H JP Z,RBY2 ; 0 PUSH HL LD HL,(SUMDT) INC HL ; CHECK SUM ; COUNT HIGH BITS ON TAPE LD (SUMDT),HL POP HL SCF RBY2: LD A,L ; BUILD CHAR RLA LD L,A DEC H ; BITCOUNT-1 JP NZ,RBY1 CALL EDGE LD A,L ; CHAR READ RBY3: POP HL POP DE POP BC RET NOP NOP NOP ; TAPE MARK DETECT ; E=@L@ : INFORMATION ; =@S@ : DATA ; EXIT CF=0 OK ; =1 BREAK TMARK: CALL GAPCK PUSH BC PUSH DE PUSH HL LD HL,2828H LD A,E CP 0CCH ; "L" JR Z,L066C LD HL,1414H L066C: LD (TMCNT),HL LD BC,KEYPB LD DE,CSTR TM1: LD HL,(TMCNT) TM2: CALL EDGE JR C,TM4 CALL DLY3 ; CALL DLY2*3 LD A,(DE) AND 20H JR Z,TM1 DEC H JR NZ,TM2 TM3: CALL EDGE JR C,TM4 CALL DLY3 ; CALL DLY2*3 LD A,(DE) AND 20H JR NZ,TM1 DEC L JR NZ,TM3 CALL EDGE TM4: RET3: POP HL POP DE POP BC RET ; MOTOR ON ; IN D=@W@ :WRITE ; =@R@ :READ ; EXIT CF=0 OK ; =1 BREAK ; ; If the button is pressed, MOTOR: PUSH BC PUSH DE PUSH HL LD B,0AH ; Pulse motor upto 10 times if sense is low. Each pulse flips on->off or off->on MOT1: LD A,(CSTR) ; Check sense, if low then pulse motor to switch it on. AND 10H JR Z,MOT4 ; If NZ (bit PC4 is high), then wait a bit and return, motor running. ; If Z then pulse the motor on circuit. MOT2: LD B,0FFH ; 2 SEC DELAY L06AD: CALL DLY12 ; 7 MSEC DELAY JR L06B4 ; MOTOR ENTRY ADJUST JR MOTOR ; ORG 06B2H L06B4: DJNZ L06AD XOR A MOT7: JR RET3 MOT4: LD A,06H ; LD HL,CSTPT ; 8255 Control register LD (HL),A ; Set PC3 low INC A LD (HL),A ; Set PC3 high DJNZ MOT1 ; Check to see if sense now active. CALL NL ; Sense not active so play button hasnt been pressed. LD A,D ; Determine if we are Loading or Saving, display correct message. CP 0D7H ; "W" JR Z,MOT8 LD DE,MSGN1 ; PLAY MARK JR MOT9 MOT8: LD DE,MSGN3 ; "RECORD." RST 18H ; CALL MSGX LD DE,MSGN2 ; "PLAY" MOT9: RST 18H ; CALL MSGX MOT5: LD A,(CSTR) ; Check sense input and wait until it is high. AND 10H JR NZ,MOT2 CALL QBRK ; If sense is low, check for User Key Break entry. JR NZ,MOT5 SCF JR MOT7 ; INITIAL MESSAGE MSGQ3: DB "** MONITOR 1Z-013A **\r" NOP ; MOTOR STOP MSTOP: PUSH AF PUSH BC PUSH DE LD B,0AH MST1: LD A,(CSTR) AND 10H JR Z,MST3 LD A,06H LD (CSTPT),A INC A LD (CSTPT),A DJNZ MST1 MST3: JP QRSTR1 ; CHECK SUM ; IN BC=SIZE ; HL=DATA ADDRESS ; EXIT SUMDT=STORE ; CSMDT=STORE CKSUM: PUSH BC PUSH DE L071C: PUSH HL LD DE,0 CKS1: LD A,B OR C JR NZ,CKS2 EX DE,HL L0725: LD (SUMDT),HL ; NUMBER OF HIGHBITS IN DATA LD (CSMDT),HL POP HL POP DE POP BC RET CKS2: LD A,(HL) PUSH BC LD B,8 CKS3: RLCA JR NC,L0737 INC DE L0737: DJNZ CKS3 L0739: POP BC INC HL DEC BC JR CKS1 ; MODE SET OF KEYPORT QMODE: LD HL,KEYPF LD (HL),8AH ; 10001010 CTRL WORD MODE0 LD (HL),07H ; PC3=1 M-ON LD (HL),05H ; PC2=1 INTMSK LD (HL),01H ; TZ: Enable VGATE (2xNOP removed below to keep ROM consistency). RET ;NOP ;NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP ; 107 MICRO SEC DELAY DLY1: LD A,15H ; 18*21+20 L075B: DEC A JP NZ,L075B RET DLY2: LD A,13H ; 18*19+20 L0762: DEC A JP NZ,L0762 RET ; 1 BYTE WRITE WBYTE: PUSH BC LD B,8 CALL LONG WBY1: RLCA CALL C,LONG CALL NC,SHORT DEC B JP NZ,WBY1 POP BC RET ; GAP + TAPEMARK ; E=@L@ LONG GAP ; =@s@ SHORT GAP GAP: PUSH BC PUSH DE LD A,E LD BC,55F0H LD DE,2828H CP 0CCH ; "L" JP Z,GAP1 LD BC,2AF8H LD DE,1414H GAP1: CALL SHORT DEC BC LD A,B OR C JR NZ,GAP1 GAP2: CALL LONG DEC D JR NZ,GAP2 GAP3: CALL SHORT DEC E JR NZ,GAP3 CALL LONG POP DE POP BC RET ; MEMORY CORRECTION ; COMMAND "M" MCOR: CALL HEXIY ; CORRECTION ADDRESS MCR1: CALL NLPHL ; CORRECTION ADDRESS PRINT CALL SPHEX ; ACC-->ASCII DISP. CALL QPRTS ; SPACE PRINT CALL BGETL ; GET DATA & CHECK DATA CALL HLHEX ; HL<--ASCII(DE) JR C,MCR3 CALL P4DE ; (INC DE)*4 INC DE CALL L2HEX ; DATA CHECK JR C,MCR1 CP (HL) JR NZ,MCR1 INC DE LD A,(DE) CP 0DH ; NOT CORRECTION ? JR Z,MCR2 CALL L2HEX ; ACC<--HL(ASCII) JR C,MCR1 LD (HL),A ; DATA CORRECT MCR2: INC HL JR MCR1 MCR3: LD H,B ; MEMORY ADDRESS LD L,C JR MCR1 DB "(HL)" DB 0F1H DB 9EH DB "SUB (" ; GET 1 LINE STATEMENT * ; DE=DATA STORE LOW ADDRESS ; (END=CR) QGETL: PUSH AF PUSH BC PUSH HL PUSH DE GETL1: CALL QQKEY ; ENTRY KEY AUTO3: PUSH AF ; IN KEY DATA SAVE LD B,A LD A,(SWRK) ; BELL WORK RRCA CALL NC,QBEL ; ENTRY BELL LD A,B LD HL,KANAF ; KANA & GRAPH FLAGS AND 0F0H CP 0C0H POP DE ; EREG=FLAGREG LD A,B JR NZ,GETL2 ; NOT C0H CP 0CDH ; CR JR Z,GETL3 CP 0CBH ; BREAK JP Z,GETLC CP 0CFH ; NIKO MARK WH. JR Z,GETL2 CP 0C7H ; CRT EDITION JR NC,GETL5 ; <=C7H RR E ; >C7H & CFLAG, CY ? GRAPHIC MODE,CURS.DISPL. LD A,B JR NC,GETL5 GETL2: CALL QDSP ; DISPL. JR GETL1 GETL5: CALL QDPCT ; CRT CONTROL JR GETL1 ; BREAK IN GETLC: POP HL PUSH HL LD (HL),1BH ; BREAK CODE INC HL LD (HL),0DH JR GETLR ; GETLA GETLA: RRCA ; CY<--D7 JR NC,GETL6 JR GETLB ; DELAY 7 MSEC AND SWEP DSWEP: CALL DLY12 CALL QSWEP RET NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP GETL3: CALL PMANG ; CR LD B,COLW ; 1 LINE JR NC,GETLA DEC H ; BEFORE LINE GETLB: LD B,COLW*2 ; 2 LINE GETL6: LD L,0 CALL QPNT1 POP DE ; STORE TOP ADDRESS PUSH DE GETLZ: LD A,(HL) CALL QDACN LD (DE),A INC HL INC DE DJNZ GETLZ EX DE,HL GETLU: LD (HL),0DH DEC HL LD A,(HL) CP 20H ; SPACE THEN CR ; CR AND NEW LINE JR Z,GETLU ; NEW LINE RETURN GETLR: CALL QLTNL POP DE POP HL POP BC POP AF RET NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP ; MESSAGE PRINT ; DE PRINT DATA LOW ADDRESS ; END=CR QMSG: PUSH AF PUSH BC PUSH DE MSG1: LD A,(DE) CP 0DH ; CR JR Z,MSGX2 CALL QPRNT INC DE JR MSG1 ; ALL PRINT MESSAGE QMSGX: PUSH AF PUSH BC PUSH DE MSGX1: LD A,(DE) CP 0DH MSGX2: JP Z,QRSTR1 CALL QADCN CALL PRNT3 INC DE JR MSGX1 ; TOP OF KEYTBLS QKYSM: LD DE,KTBLS ; SHIFT ALSO JR QKY5 ; BREAK CODE IN NBRK: LD A,0CBH ; BREAK CODE OR A JR QKY1 ; GETKEY ; NO ECHO BACK ; EXIT ACC=ASCII CODE QGET: CALL QKEY ; KEY IN (DISPLAY CODE) SUB 0F0H ; NOT KEYIN CODE RET Z ADD A,0F0H JP QDACN ; DISPLAY TO ASCII CODE NOP NOP ; 1 KEY INPUT ; IN B=KEY MODE (SHIFT, CTRL, BREAK) ; C=KEY DATA (COLUMN & ROW) ; EXIT ACC=DISPLAY CODE ; IF NO KEY ACC=F0H ; IF CY=1 THEN ATTRIBUTE ON ; (SMALL, HIRAKANA) QKEY: PUSH BC PUSH DE PUSH HL CALL DSWEP ; DELAY AND KEY SWEP LD A,B RLCA JR C,QKY2 LD A,0F0H ; SHIFT OR CTRL HERE QKY1: POP HL POP DE POP BC RET QKY2: LD DE,KTBL ; NORMAL KEY TABLE LD A,B CP 88H ; BREAK IN (SHIFT & BRK) JR Z,NBRK LD H,0 ; HL=ROW & COLUMN LD L,C BIT 5,A ; CTRL CHECK JR NZ,L08F7 ; YES, CTRL LD A,(KANAF) ; 0=NR., 1=GRAPH RRCA JP C,QKYGRP ; GRAPH MODE LD A,B ; CTRL KEY CHECK RLA RLA JR C,QKYSM JR QKY5 L08F7: LD DE,KTBLC ; CONTROL KEY TABLE QKY5: ADD HL,DE ; TABLE QKY55: LD A,(HL) JR QKY1 QKYGRP: BIT 6,B JR Z,QKYGRS LD DE,KTBLG ADD HL,DE SCF JR QKY55 QKYGRS: LD DE,KTBLGS JR QKY5 ; NEWLINE QLTNL: XOR A LD (DPRNT),A ; ROW POINTER LD A,0CDH ; CR JR PRNT5 NOP NOP QNL: LD A,(DPRNT) OR A RET Z JR QLTNL NOP ; PRINT SPACE QPRTS: LD A,20H JR QPRNT ; PRINT TAB QPRTT: CALL PRNTS LD A,(DPRNT) OR A RET Z L092C: SUB 10 JR C,QPRTT JR NZ,L092C NOP NOP NOP ; PRINT ; IN ACC=PRINT DATA (ASCII) QPRNT: CP 0DH ; CR JR Z,QLTNL PUSH BC LD C,A LD B,A CALL QPRT LD A,B POP BC RET MSGOK: DB "OK!\r" ; PRINT ROUTINE ; 1 CHARACTER ; INPUT:C=ASCII DATA (QDSP+QDPCT) QPRT: LD A,C CALL QADCN ; ASCII TO DSPLAY LD C,A CP 0F0H RET Z ; ZERO=ILLEGAL DATA AND 0F0H ; MSD CHECK CP 0C0H LD A,C JR NZ,PRNT3 CP 0C7H JR NC,PRNT3 ; CRT EDITOR PRNT5: CALL QDPCT CP 0C3H ; "->" JR Z,PRNT4 CP 0C5H ; HOME JR Z,PRNT2 CP 0C6H ; CLR RET NZ PRNT2: XOR A L0968: LD (DPRNT),A RET PRNT3: CALL QDSP PRNT4: LD A,(DPRNT) ; TAB POINT+1 INC A CP COLW*2 JR C,L0968 SUB COLW*2 JR L0968 ; FLASHING BYPASS 1 FLAS1: LD A,(FLASH) JR FLAS2 ; BREAK SUBROUTINE BYPASS 1 ; CTRL OR NOT KEY QBRK2: BIT 5,A ; NOT OR CTRL JR Z,QBRK3 ; CTRL OR A ; NOTKEY A=7FH RET QBRK3: LD A,20H ; CTRL D5=1 OR A ; ZERO FLG CLR SCF RET MSGSV: DB "FILENAME? " DB 0DH ; DLY 7 MSEC DLY12: PUSH BC LD B,15H L0999: CALL DLY3 DJNZ L0999 POP BC RET ; LOADING MESSAGE MSGQ2: DB "LOADING \r" ; DELAY FOR LONG PULSE DLY4: LD A,59H ; 18*89+20 L09AB: DEC A JP NZ,L09AB RET NOP NOP NOP ; KEY BOARD SEARCH ; & DISPLAY CODE CONVERSION ; EXIT A=DISPLAY CODE ; CY=GRAPH MODE ; WITH CURSOR DISPLAY QQKEY: PUSH HL CALL QSAVE KSL1: CALL FLKEY ; KEY JR NZ,KSL1 ; KEY IN THEN JUMP KSL2: CALL FLKEY JR Z,KSL2 ; NOT KEY IN THEN JUMP LD H,A CALL DLY12 ; DELAY CHATTER CALL QKEY PUSH AF CP H ; CHATTER CHECK POP HL JR NZ,KSL2 PUSH HL POP AF ; IN KEY DATA CALL QLOAD ; FLASHING DATA LOAD POP HL RET ; CLEAR 2 NCLR08: XOR A ; CY FLAG NCLR8: LD BC,0800H CLEAR: PUSH DE ; BC=CLR BYTE SIZE, A=CLR DATA LD D,A CLEAR1: LD (HL),D INC HL DEC BC LD A,B OR C JR NZ,CLEAR1 POP DE RET ; FLASHING 2 QFLS: PUSH AF PUSH HL LD A,(KEYPC) RLCA RLCA JR C,FLAS1 LD A,(FLSDT) FLAS2: CALL QPONT ; DISPLAY POSITION LD (HL),A POP HL POP AF RET NOP NOP NOP NOP NOP NOP NOP NOP NOP QFLAS: JR QFLS ; SHORT AND LONG PULSE FOR 1 BIT WRITE SHORT: PUSH AF ; 12 LD A,03H ; 9 LD (CSTPT),A ; E003H PC3=1:16 CALL DLY1 ; 20+18*21+20 CALL DLY1 ; 20+18*21+20 LD A,02H ; 9 LD (CSTPT),A ; E003H PC3=0:16 CALL DLY1 ; 20+18*21+20 CALL DLY1 ; 20+18*21+20 POP AF ; 11 RET ; 11 LONG: PUSH AF ; 11 LD A,03H ; 9 LD (CSTPT),A ; 16 CALL DLY4 ; 20+18*89+20 LD A,02H ; 9 LD (CSTPT),A ; 16 CALL DLY4 ; 20+18*89+20 POP AF ; 11 RET ; 11 NOP NOP NOP NOP NOP ; BREAK KEY CHECK ; AND SHIFT, CTRL KEY CHECK ; EXIT BREAK ON : ZERO=1 ; OFF: ZERO=0 ; NO KEY : CY =0 ; KEY IN : CY =1 ; A D6=1 : SHIFT ON ; =0 : OFF ; D5=1 : CTRL ON ; =0 : OFF ; D4=1 : SHIFT+CNT ON ; =0 : OFF QBRK: LD A,0F8H ; LINE 8SWEEP LD (KEYPA),A NOP LD A,(KEYPB) OR A RRA JP C,QBRK2 ; SHIFT ? RLA RLA JR NC,QBRK1 ; BREAK ? LD A,40H ; SHIFT D6=1 SCF RET QBRK1: XOR A ; SHIFT ? RET ; 320 U SEC DELAY DLY3: LD A,3FH ; 18*63+33 JP L0762 ; JP DLY2+2 NOP ; KEY BOARD SWEEP ; EXIT B,D7=0 NO DATA ; =1 DATA ; D6=0 SHIFT OFF ; =1 SHIFT ON ; D5=0 CTRL OFF ; =1 CTRL ON ; D4=0 SHIFT+CTRL OFF ; =1 SHIFT+CTRL ON ; C = ROW & COLUMN ; 7 6 5 4 3 2 1 0 ; * * ^ ^ ^ < < < QSWEP: PUSH DE PUSH HL XOR A LD B,0F8H LD D,A CALL QBRK JR NZ,SWEP6 LD D,88H ; BREAK ON JR SWEP9 SWEP6: JR NC,SWEP0 LD D,A JR SWEP0 SWEP01: SET 7,D SWEP0: DEC B LD A,B LD (KEYPA),A CP 0EFH ; MAP SWEEP END ? JR NZ,SWEP3 CP 0F8H ; BREAK KEY ROW JR Z,SWEP0 SWEP9: LD B,D POP HL POP DE RET SWEP3: LD A,(KEYPB) CPL OR A JR Z,SWEP0 LD E,A SWEP2: LD H,8 LD A,B AND 0FH RLCA RLCA RLCA LD C,A LD A,E L0A89: DEC H RRCA JR NC,L0A89 LD A,H ADD A,C LD C,A JR SWEP01 ; ; ; ASCII TO DISPLAY CODE TABL ; ATBL: ; 00 - 0F DB 0F0H ; ^ @ DB 0F0H ; ^ A DB 0F0H ; ^ B DB 0F3H ; ^ C DB 0F0H ; ^ D DB 0F5H ; ^ E DB 0F0H ; ^ F DB 0F0H ; ^ G DB 0F0H ; ^ H DB 0F0H ; ^ I DB 0F0H ; ^ J DB 0F0H ; ^ K DB 0F0H ; ^ L DB 0F0H ; ^ M DB 0F0H ; ^ N DB 0F0H ; ^ O ; 10 - 1F DB 0F0H ; ^ P DB 0C1H ; ^ Q CUR. DOWN DB 0C2H ; ^ R CUR. UP DB 0C3H ; ^ S CUR. RIGHT DB 0C4H ; ^ T CUR. LEFT DB 0C5H ; ^ U HOME DB 0C6H ; ^ V CLEAR DB 0F0H ; ^ W DB 0F0H ; ^ X DB 0F0H ; ^ Y DB 0F0H ; ^ Z SEP. DB 0F0H ; ^ [ DB 0F0H ; ^ \ DB 0F0H ; ^ ] DB 0F0H ; ^ ^ DB 0F0H ; ^ - ; 20 - 2F DB 00H ; SPACE DB 61H ; ! DB 62H ; " DB 63H ; # DB 64H ; $ DB 65H ; % DB 66H ; & DB 67H ; ' DB 68H ; ( DB 69H ; ) DB 6BH ; * DB 6AH ; + DB 2FH ; , DB 2AH ; - DB 2EH ; . DB 2DH ; / ; 30 - 3F DB 20H ; 0 DB 21H ; 1 DB 22H ; 2 DB 23H ; 3 DB 24H ; 4 DB 25H ; 5 DB 26H ; 6 DB 27H ; 7 DB 28H ; 8 DB 29H ; 9 DB 4FH ; : DB 2CH ; ; DB 51H ; < DB 2BH ; = DB 57H ; > DB 49H ; ? ; 40 - 4F DB 55H ; @ DB 01H ; A DB 02H ; B DB 03H ; C DB 04H ; D DB 05H ; E DB 06H ; F DB 07H ; G DB 08H ; H DB 09H ; I DB 0AH ; J DB 0BH ; K DB 0CH ; L DB 0DH ; M DB 0EH ; N DB 0FH ; O ; 50 - 5F DB 10H ; P DB 11H ; Q DB 12H ; R DB 13H ; S DB 14H ; T DB 15H ; U DB 16H ; V DB 17H ; W DB 18H ; X DB 19H ; Y DB 1AH ; Z DB 52H ; [ DB 59H ; \ DB 54H ; ] DB 50H ; DB 45H ; ; 60 - 6F DB 0C7H ; UFO DB 0C8H DB 0C9H DB 0CAH DB 0CBH DB 0CCH DB 0CDH DB 0CEH DB 0CFH DB 0DFH DB 0E7H DB 0E8H DB 0E5H DB 0E9H DB 0ECH DB 0EDH ; 70 - 7F DB 0D0H DB 0D1H DB 0D2H DB 0D3H DB 0D4H DB 0D5H DB 0D6H DB 0D7H DB 0D8H DB 0D9H DB 0DAH DB 0DBH DB 0DCH DB 0DDH DB 0DEH DB 0C0H ; 80 - 8F DB 80H ; } DB 0BDH DB 9DH DB 0B1H DB 0B5H DB 0B9H DB 0B4H DB 9EH DB 0B2H DB 0B6H DB 0BAH DB 0BEH DB 9FH DB 0B3H DB 0B7H DB 0BBH ; 90 - 9F DB 0BFH ; _ DB 0A3H DB 85H DB 0A4H ; ` DB 0A5H ; ~ DB 0A6H DB 94H DB 87H DB 88H DB 9CH DB 82H DB 98H DB 84H DB 92H DB 90H DB 83H ; A0 - AF DB 91H DB 81H DB 9AH DB 97H DB 93H DB 95H DB 89H DB 0A1H DB 0AFH DB 8BH DB 86H DB 96H DB 0A2H DB 0ABH DB 0AAH DB 8AH ; B0 - BF DB 8EH DB 0B0H DB 0ADH DB 8DH DB 0A7H DB 0A8H DB 0A9H DB 8FH DB 8CH DB 0AEH DB 0ACH DB 9BH DB 0A0H DB 99H DB 0BCH ; { DB 0B8H ; C0 - CF DB 40H DB 3BH DB 3AH DB 70H DB 3CH DB 71H DB 5AH DB 3DH DB 43H DB 56H DB 3FH DB 1EH DB 4AH DB 1CH DB 5DH DB 3EH ; D0 - DF DB 5CH DB 1FH DB 5FH DB 5EH DB 37H DB 7BH DB 7FH DB 36H DB 7AH DB 7EH DB 33H DB 4BH DB 4CH DB 1DH DB 6CH DB 5BH ; E0 - EF DB 78H DB 41H DB 35H DB 34H DB 74H DB 30H DB 38H DB 75H DB 39H DB 4DH DB 6FH DB 6EH DB 32H DB 77H DB 76H DB 72H ; F0 - FF DB 73H DB 47H DB 7CH DB 53H DB 31H DB 4EH DB 6DH DB 48H DB 46H DB 7DH DB 44H DB 1BH DB 58H DB 79H DB 42H DB 60H ; FLASHING DATA SAVE QSAVE: LD HL,FLSDT LD (HL),0EFH ; NORMAL CURSOR LD A,(KANAF) RRCA JR C,L0BA0 ; GRAPH MODE RRCA JR NC,SV0 ; NORMAL MODE L0BA0: LD (HL),0FFH ; GRAPH CURSOR SV0: LD A,(HL) PUSH AF CALL QPONT ; FLASHING POSITION LD A,(HL) LD (FLASH),A POP AF LD (HL),A XOR A LD HL,KEYPA L0BB1: LD (HL),A CPL ; OH NO! UNUSED BITS WERE TOUCHED TOO!!! LD (HL),A RET SV1: LD (HL),43H ; KANA CURSOR JR SV0 ; ASCII TO DISPLAY CODE CONVERT ; IN ACC:ASCII ; EXIT ACC:DISPLAY CODE QADCN: PUSH BC PUSH HL LD HL,ATBL LD C,A LD B,0 ADD HL,BC LD A,(HL) JR DACN3 VRNS: DB "V1.0A\r" ; VERSION MANAGEMENT NOP NOP NOP ; DISPLAY CODE TO ASCII CONVERSION ; IN ACC=DISPLAY CODE ; EXIT ACC=ASCII QDACN: PUSH BC PUSH HL PUSH DE LD HL,ATBL LD D,H LD E,L LD BC,0100H CPIR JR Z,DACN1 LD A,0F0H DACN2: POP DE DACN3: POP HL POP BC RET DACN1: OR A DEC HL SBC HL,DE LD A,L JR DACN2 ; ; ; KEY MATRIX TO DISPLAY CODE TABL ; KTBL: ;S0 00 - 07 DB 0BFH ; SPARE DB 0CAH ; GRAPH DB 58H ; DB 0C9H ; ALPHA DB 0F0H ; NO DB 2CH ; ; DB 4FH ; : DB 0CDH ; CR ;S1 08 - 0F DB 19H ; Y DB 1AH ; Z DB 55H ; @ DB 52H ; [ DB 54H ; ] DB 0F0H ; NULL DB 0F0H ; NULL DB 0F0H ; NULL ;S2 10 - 17 DB 11H ; Q DB 12H ; R DB 13H ; S DB 14H ; T DB 15H ; U DB 16H ; V DB 17H ; W DB 18H ; X ;S3 18 - 1F DB 09H ; I DB 0AH ; J DB 0BH ; K DB 0CH ; L DB 0DH ; M DB 0EH ; N DB 0FH ; O DB 10H ; P ;S4 20 - 27 DB 01H ; A DB 02H ; B DB 03H ; C DB 04H ; D DB 05H ; E DB 06H ; F DB 07H ; G DB 08H ; H ;S5 28 - 2F DB 21H ; 1 DB 22H ; 2 DB 23H ; 3 DB 24H ; 4 DB 25H ; 5 DB 26H ; 6 DB 27H ; 7 DB 28H ; 8 ;S6 30 - 37 DB 59H ; \ DB 50H ; DB 2AH ; - DB 00H ; SPACE DB 20H ; 0 DB 29H ; 9 DB 2FH ; , DB 2EH ; . ;S7 38 - 3F DB 0C8H ; INST. DB 0C7H ; DEL. DB 0C2H ; CURSOR UP DB 0C1H ; CURSOR DOWN DB 0C3H ; CURSOR RIGHT DB 0C4H ; CURSOR LEFT DB 49H ; ? DB 2DH ; / ; ; ; KTBL SHIFT ON ; KTBLS: ;S0 00 - 07 DB 0BFH ; SPARE DB 0CAH ; GRAPH DB 1BH ; POND DB 0C9H ; ALPHA DB 0F0H ; NO DB 6AH ; + DB 6BH ; * DB 0CDH ; CR ;S1 08 - 0F DB 99H ; y DB 9AH ; z DB 0A4H ; ` DB 0BCH ; { DB 40H ; } DB 0F0H ; NULL DB 0F0H ; NULL DB 0F0H ; NULL ;S2 10 - 17 DB 91H ; q DB 92H ; r DB 93H ; s DB 94H ; t DB 95H ; u DB 96H ; v DB 97H ; w DB 98H ; x ;S3 18 - 1F DB 89H ; i DB 8AH ; j DB 8BH ; k DB 8CH ; l DB 8DH ; m DB 8EH ; n DB 8FH ; o DB 90H ; p ;S4 20 - 27 DB 81H ; a DB 82H ; b DB 83H ; c DB 84H ; d DB 85H ; e DB 86H ; f DB 87H ; g DB 88H ; h ;S5 28 - 2F DB 61H ; ! DB 62H ; " DB 63H ; # DB 64H ; $ DB 65H ; % DB 66H ; & DB 67H ; ' DB 68H ; ( ;S6 30 - 37 DB 80H ; \ DB 0A5H ; POND MARK DB 2BH ; YEN DB 00H ; SPACE DB 60H ; ¶ DB 69H ; ) DB 51H ; < DB 57H ; > ;S7 38 - 3F DB 0C6H ; CLR DB 0C5H ; HOME DB 0C2H ; CURSOR UP DB 0C1H ; CURSOR DOWN DB 0C3H ; CURSOR RIGHT DB 0C4H ; CURSOR LEFT DB 5AH ; DB 45H ; ; ; ; GRAPHIC ; KTBLGS: ;S0 00 - 07 DB 0BFH ; SPARE DB 0F0H ; GRAPH BUT NULL DB 0E5H ; # DB 0C9H ; ALPHA DB 0F0H ; NO DB 42H ; # ; DB 0B6H ; #: DB 0CDH ; CR ;S1 08 - 0F DB 75H ; #Y DB 76H ; #Z DB 0B2H ; #@ DB 0D8H ; #[ DB 4EH ; #] DB 0F0H ; #NULL DB 0F0H ; #NULL DB 0F0H ; #NULL ;S2 10 - 17 DB 3CH ; #Q DB 30H ; #R DB 44H ; #S DB 71H ; #T DB 79H ; #U DB 0DAH ; #V DB 38H ; #W DB 6DH ; #X ;S3 18 - 1F DB 7DH ; #I DB 5CH ; #J DB 5BH ; #K DB 0B4H ; #L DB 1CH ; #M DB 32H ; #N DB 0B0H ; #O DB 0D6H ; #P ;S4 20 - 27 DB 53H ; #A DB 6FH ; #B DB 0DEH ; #C DB 47H ; #D DB 34H ; #E DB 4AH ; #F DB 4BH ; #G DB 72H ; #H ;S5 28 - 2F DB 37H ; #1 DB 3EH ; #2 DB 7FH ; #3 DB 7BH ; #4 DB 3AH ; #5 DB 5EH ; #6 DB 1FH ; #7 DB 0BDH ; #8 ;S6 30 - 37 DB 0D4H ; #YEN DB 9EH ; #+ DB 0D2H ; #- DB 00H ; SPACE DB 9CH ; #0 DB 0A1H ; #9 DB 0CAH ; #, DB 0B8H ; #. ;S7 38 - 3F DB 0C8H ; INST DB 0C7H ; DEL. DB 0C2H ; CURSOR UP DB 0C1H ; CURSOR DOWN DB 0C3H ; CURSOR RIGHT DB 0C4H ; CURSOR LEFT DB 0BAH ; #? DB 0DBH ; #/ ; ; ; CONTROL CODE ; KTBLC: ;S0 00 - 07 DB 0F0H DB 0F0H DB 0F0H ; ^ DB 0F0H DB 0F0H DB 0F0H DB 0F0H DB 0F0H ;S1 08 - 0F DB 0F0H ; ^Y E3 DB 5AH ; ^Z E4 (CHECKER) DB 0F0H ; ^@ DB 0F0H ; ^[ EB/E5 DB 0F0H ; ^] EA/E7 DB 0F0H ; #NULL DB 0F0H ; #NULL DB 0F0H ; #NULL ;S2 10 - 17 DB 0C1H ; ^Q DB 0C2H ; ^R DB 0C3H ; ^S DB 0C4H ; ^T DB 0C5H ; ^U DB 0C6H ; ^V DB 0F0H ; ^W E1 DB 0F0H ; ^X E2 ;S3 18 - 1F DB 0F0H ; ^I F9 DB 0F0H ; ^J FA DB 0F0H ; ^K FB DB 0F0H ; ^L FC DB 0F0H ; ^M CD DB 0F0H ; ^N FE DB 0F0H ; ^O FF DB 0F0H ; ^P E0 ;S4 20 - 27 DB 0F0H ; ^A F1 DB 0F0H ; ^B F2 DB 0F0H ; ^C F3 DB 0F0H ; ^D F4 DB 0F0H ; ^E F5 DB 0F0H ; ^F F6 DB 0F0H ; ^G F7 DB 0F0H ; ^H F8 ;S5 28 - 2F DB 0F0H DB 0F0H DB 0F0H DB 0F0H DB 0F0H DB 0F0H DB 0F0H DB 0F0H ;S6 30 - 37 (ERROR? 7 VALUES ONLY!!) DB 0F0H ; ^YEN E6 DB 0F0H ; ^ EF DB 0F0H DB 0F0H DB 0F0H DB 0F0H ; ^, DB 0F0H ;S7 38 - 3F DB 0F0H DB 0F0H DB 0F0H DB 0F0H DB 0F0H DB 0F0H DB 0F0H DB 0F0H ; ^/ EE ; ; ; KANA ; KTBLG: ;S0 00 - 07 DB 0BFH ; SPARE DB 0F0H ; GRAPH BUT NULL DB 0CFH ; NIKO WH. DB 0C9H ; ALPHA DB 0F0H ; NO DB 0B5H ; MO DB 4DH ; DAKU TEN DB 0CDH ; CR ;S1 08 - 0F DB 35H ; HA DB 77H ; TA DB 0D7H ; WA DB 0B3H ; YO DB 0B7H ; HANDAKU DB 0F0H DB 0F0H DB 0F0H ;S2 10 - 17 DB 7CH ; KA DB 70H ; KE DB 41H ; SHI DB 31H ; KO DB 39H ; HI DB 0A6H ; TE DB 78H ; KI DB 0DDH ; CHI ;S3 18 - 1F DB 3DH ; FU DB 5DH ; MI DB 6CH ; MU DB 56H ; ME DB 1DH ; RHI DB 33H ; RA DB 0D5H ; HE DB 0B1H ; HO ;S4 20 - 27 DB 46H ; SA DB 6EH ; TO DB 0D9H ; THU DB 48H ; SU DB 74H ; KU DB 43H ; SE DB 4CH ; SO DB 73H ; MA ;S5 28 - 2F DB 3FH ; A DB 36H ; I DB 7EH ; U DB 3BH ; E DB 7AH ; O DB 1EH ; NA DB 5FH ; NI DB 0A2H ; NU ;S6 30 - 37 DB 0D3H ; YO DB 9FH ; YU DB 0D1H ; YA DB 00H ; SPACE DB 9DH ; NO DB 0A3H ; NE DB 0D0H ; RU DB 0B9H ; RE ;S7 38 - 3F DB 0C6H ; ?CLR DB 0C5H ; ?HOME DB 0C2H ; ?CURSOR UP DB 0C1H ; ?CURSOR DOWN DB 0C3H ; ?CURSOR RIGHT DB 0C4H ; ?CURSOR LEFT DB 0BBH ; DASH DB 0BEH ; RO ;KTBL: ; ;S0 00 - 07 ; DB 0BFH ; SPARE ; DB 0CAH ; GRAPH ; DB 58H ; ; DB 0C9H ; ALPHA ; DB 0F0H ; NO ; DB 2CH ; ; ; DB 4FH ; : ; DB 0CDH ; CR ; ;S1 08 - 0F ; DB 19H ; Y ; DB 1AH ; Z ; DB 55H ; @ ; DB 52H ; [ ; DB 54H ; ] ; DB 0F0H ; NULL ; DB 0F0H ; NULL ; DB 0F0H ; NULL ; ;S2 10 - 17 ; DB 11H ; Q ; DB 12H ; R ; DB 13H ; S ; DB 14H ; T ; DB 15H ; U ; DB 16H ; V ; DB 17H ; W ; DB 18H ; X ; ;S3 18 - 1F ; DB 09H ; I ; DB 0AH ; J ; DB 0BH ; K ; DB 0CH ; L ; DB 0DH ; M ; DB 0EH ; N ; DB 0FH ; O ; DB 10H ; P ; ;S4 20 - 27 ; DB 01H ; A ; DB 02H ; B ; DB 03H ; C ; DB 04H ; D ; DB 05H ; E ; DB 06H ; F ; DB 07H ; G ; DB 08H ; H ; ;S5 28 - 2F ; DB 21H ; 1 ; DB 22H ; 2 ; DB 23H ; 3 ; DB 24H ; 4 ; DB 25H ; 5 ; DB 26H ; 6 ; DB 27H ; 7 ; DB 28H ; 8 ; ;S6 30 - 37 ; DB 59H ; \ ; DB 50H ; ; DB 2AH ; - ; DB 00H ; SPACE ; DB 20H ; 0 ; DB 29H ; 9 ; DB 2FH ; , ; DB 2EH ; . ; ;S7 38 - 3F ; DB 0C8H ; INST. ; DB 0C7H ; DEL. ; DB 0C2H ; CURSOR UP ; DB 0C1H ; CURSOR DOWN ; DB 0C3H ; CURSOR RIGHT ; DB 0C4H ; CURSOR LEFT ; DB 49H ; ? ; DB 2DH ; / ; ; ; ; ; ; KTBL SHIFT ON ; ; ;KTBLS: ; ;S0 00 - 07 ; DB 0BFH ; SPARE ; DB 0CAH ; GRAPH ; DB 1BH ; POND ; DB 0C9H ; ALPHA ; DB 0F0H ; NO ; DB 6AH ; + ; DB 6BH ; * ; DB 0CDH ; CR ; ;S1 08 - 0F ; DB 99H ; y ; DB 9AH ; z ; DB 0A4H ; ` ; DB 0BCH ; { ; DB 40H ; } ; DB 0F0H ; NULL ; DB 0F0H ; NULL ; DB 0F0H ; NULL ; ;S2 10 - 17 ; DB 91H ; q ; DB 92H ; r ; DB 93H ; s ; DB 94H ; t ; DB 95H ; u ; DB 96H ; v ; DB 97H ; w ; DB 98H ; x ; ;S3 18 - 1F ; DB 89H ; i ; DB 8AH ; j ; DB 8BH ; k ; DB 8CH ; l ; DB 8DH ; m ; DB 8EH ; n ; DB 8FH ; o ; DB 90H ; p ; ;S4 20 - 27 ; DB 81H ; a ; DB 82H ; b ; DB 83H ; c ; DB 84H ; d ; DB 85H ; e ; DB 86H ; f ; DB 87H ; g ; DB 88H ; h ; ;S5 28 - 2F ; DB 61H ; ! ; DB 62H ; " ; DB 63H ; # ; DB 64H ; $ ; DB 65H ; % ; DB 66H ; & ; DB 67H ; ' ; DB 68H ; ( ; ;S6 30 - 37 ; DB 80H ; \ ; DB 0A5H ; POND MARK ; DB 2BH ; YEN ; DB 00H ; SPACE ; DB 60H ; ¶ ; DB 69H ; ) ; DB 51H ; < ; DB 57H ; > ; ;S7 38 - 3F ; DB 0C6H ; CLR ; DB 0C5H ; HOME ; DB 0C2H ; CURSOR UP ; DB 0C1H ; CURSOR DOWN ; DB 0C3H ; CURSOR RIGHT ; DB 0C4H ; CURSOR LEFT ; DB 5AH ; ; DB 45H ; ; ; ; ; ; ; GRAPHIC ; ; ;KTBLCL: ; ;S0 00 - 07 ; DB 0BFH ; SPARE ; DB 0F0H ; GRAPH BUT NULL ; DB 0E5H ; # ; DB 0C9H ; ALPHA ; DB 0F0H ; NO ; DB 42H ; # ; ; DB 0B6H ; #: ; DB 0CDH ; CR ; ;S1 08 - 0F ; DB 75H ; #Y ; DB 76H ; #Z ; DB 0B2H ; #@ ; DB 0D8H ; #[ ; DB 4EH ; #] ; DB 0F0H ; #NULL ; DB 0F0H ; #NULL ; DB 0F0H ; #NULL ; ;S2 10 - 17 ; DB 3CH ; #Q ; DB 30H ; #R ; DB 44H ; #S ; DB 71H ; #T ; DB 79H ; #U ; DB 0DAH ; #V ; DB 38H ; #W ; DB 6DH ; #X ; ;S3 18 - 1F ; DB 7DH ; #I ; DB 5CH ; #J ; DB 5BH ; #K ; DB 0B4H ; #L ; DB 1CH ; #M ; DB 32H ; #N ; DB 0B0H ; #O ; DB 0D6H ; #P ; ;S4 20 - 27 ; DB 53H ; #A ; DB 6FH ; #B ; DB 0DEH ; #C ; DB 47H ; #D ; DB 34H ; #E ; DB 4AH ; #F ; DB 4BH ; #G ; DB 72H ; #H ; ;S5 28 - 2F ; DB 37H ; #1 ; DB 3EH ; #2 ; DB 7FH ; #3 ; DB 7BH ; #4 ; DB 3AH ; #5 ; DB 5EH ; #6 ; DB 1FH ; #7 ; DB 0BDH ; #8 ; ;S6 30 - 37 ; DB 0D4H ; #YEN ; DB 9EH ; #+ ; DB 0D2H ; #- ; DB 00H ; SPACE ; DB 9CH ; #0 ; DB 0A1H ; #9 ; DB 0CAH ; #, ; DB 0B8H ; #. ; ;S7 38 - 3F ; DB 0C8H ; INST ; DB 0C7H ; DEL. ; DB 0C2H ; CURSOR UP ; DB 0C1H ; CURSOR DOWN ; DB 0C3H ; CURSOR RIGHT ; DB 0C4H ; CURSOR LEFT ; DB 0BAH ; #? ; DB 0DBH ; #/ ; ; ; ; ; ; CONTROL CODE ; ; ;KTBLC: ; ;S0 00 - 07 ; DB 0F0H ; DB 0F0H ; DB 0F0H ; ^ ; DB 0F0H ; DB 0F0H ; DB 0F0H ; DB 0F0H ; DB 0F0H ; ;S1 08 - 0F ; DB 0F0H ; ^Y E3 ; DB 5AH ; ^Z E4 (CHECKER) ; DB 0F0H ; ^@ ; DB 0F0H ; ^[ EB/E5 ; DB 0F0H ; ^] EA/E7 ; DB 0F0H ; #NULL ; DB 0F0H ; #NULL ; DB 0F0H ; #NULL ; ;S2 10 - 17 ; DB 0C1H ; ^Q ; DB 0C2H ; ^R ; DB 0C3H ; ^S ; DB 0C4H ; ^T ; DB 0C5H ; ^U ; DB 0C6H ; ^V ; DB 0F0H ; ^W E1 ; DB 0F0H ; ^X E2 ; ;S3 18 - 1F ; DB 0F0H ; ^I F9 ; DB 0F0H ; ^J FA ; DB 0F0H ; ^K FB ; DB 0F0H ; ^L FC ; DB 0F0H ; ^M CD ; DB 0F0H ; ^N FE ; DB 0F0H ; ^O FF ; DB 0F0H ; ^P E0 ; ;S4 20 - 27 ; DB 0F0H ; ^A F1 ; DB 0F0H ; ^B F2 ; DB 0F0H ; ^C F3 ; DB 0F0H ; ^D F4 ; DB 0F0H ; ^E F5 ; DB 0F0H ; ^F F6 ; DB 0F0H ; ^G F7 ; DB 0F0H ; ^H F8 ; ;S5 28 - 2F ; DB 0F0H ; DB 0F0H ; DB 0F0H ; DB 0F0H ; DB 0F0H ; DB 0F0H ; DB 0F0H ; DB 0F0H ; ;S6 30 - 37 (ERROR? 7 VALUES ONLY!!) ; DB 0F0H ; ^YEN E6 ; DB 0F0H ; ^ EF ; DB 0F0H ; DB 0F0H ; DB 0F0H ; DB 0F0H ; ^, ; DB 0F0H ; ;S7 38 - 3F ; DB 0F0H ; DB 0F0H ; DB 0F0H ; DB 0F0H ; DB 0F0H ; DB 0F0H ; DB 0F0H ; DB 0F0H ; ^/ EE ; ; ; ; ; ; KANA ; ; ;KTBLG: ; ;S0 00 - 07 ; DB 0BFH ; SPARE ; DB 0F0H ; GRAPH BUT NULL ; DB 0CFH ; NIKO WH. ; DB 0C9H ; ALPHA ; DB 0F0H ; NO ; DB 0B5H ; MO ; DB 4DH ; DAKU TEN ; DB 0CDH ; CR ; ;S1 08 - 0F ; DB 35H ; HA ; DB 77H ; TA ; DB 0D7H ; WA ; DB 0B3H ; YO ; DB 0B7H ; HANDAKU ; DB 0F0H ; DB 0F0H ; DB 0F0H ; ;S2 10 - 17 ; DB 7CH ; KA ; DB 70H ; KE ; DB 41H ; SHI ; DB 31H ; KO ; DB 39H ; HI ; DB 0A6H ; TE ; DB 78H ; KI ; DB 0DDH ; CHI ; ;S3 18 - 1F ; DB 3DH ; FU ; DB 5DH ; MI ; DB 6CH ; MU ; DB 56H ; ME ; DB 1DH ; RHI ; DB 33H ; RA ; DB 0D5H ; HE ; DB 0B1H ; HO ; ;S4 20 - 27 ; DB 46H ; SA ; DB 6EH ; TO ; DB 0D9H ; THU ; DB 48H ; SU ; DB 74H ; KU ; DB 43H ; SE ; DB 4CH ; SO ; DB 73H ; MA ; ;S5 28 - 2F ; DB 3FH ; A ; DB 36H ; I ; DB 7EH ; U ; DB 3BH ; E ; DB 7AH ; O ; DB 1EH ; NA ; DB 5FH ; NI ; DB 0A2H ; NU ; ;S6 30 - 37 ; DB 0D3H ; YO ; DB 9FH ; YU ; DB 0D1H ; YA ; DB 00H ; SPACE ; DB 9DH ; NO ; DB 0A3H ; NE ; DB 0D0H ; RU ; DB 0B9H ; RE ; ;S7 38 - 3F ; DB 0C6H ; ?CLR ; DB 0C5H ; ?HOME ; DB 0C2H ; ?CURSOR UP ; DB 0C1H ; ?CURSOR DOWN ; DB 0C3H ; ?CURSOR RIGHT ; DB 0C4H ; ?CURSOR LEFT ; DB 0BBH ; DASH ; DB 0BEH ; RO ; MEMORY DUMP COMMAND "D" DUMP: CALL HEXIY ; START ADDRESS CALL P4DE PUSH HL CALL HLHEX ; END ADDRESS POP DE JR C,DUM1 ; DATA ERROR THEN L0D36: EX DE,HL DUM3: LD B,08H ; DISPLAY 8 BYTES LD C,23 ; CHANGE PRINT BIAS CALL NLPHL ; NEWLINE PRINT DUM2: CALL SPHEX ; SPACE PRINT + ACC PRINT INC HL PUSH AF LD A,(DSPXY) ; DISPLAY POINT ADD A,C LD (DSPXY),A ; X AXIS=X+CREG POP AF CP 20H JR NC,L0D51 LD A,2EH ; "." L0D51: CALL QADCN ; ASCII TO DISPLAY CODE CALL PRNT3 LD A,(DSPXY) INC C SUB C ; ASCII DISPLAY POSITION LD (DSPXY),A DEC C DEC C DEC C PUSH HL SBC HL,DE POP HL JR Z,L0D85 LD A,0F8H LD (KEYPA),A NOP LD A,(KEYPB) CP 0FEH ; SHIFT KEY ? JR NZ,L0D78 CALL QBLNK ; 64MSEC DELAY L0D78: DJNZ DUM2 L0D7A: CALL QKEY ; STOP DISPLAY OR A JR Z,L0D7A ; SPACE KEY THEN STOP CALL QBRK ; BREAK IN ? JR NZ,DUM3 L0D85: JP ST1 ; COMMAND IN ! DUM1: LD HL,160 ; 20*8 BYTES ADD HL,DE JR L0D36 NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP ; V-BLANK CHECK QBLNK: PUSH AF L0DA7: LD A,(KEYPC) ; V-BLANK RLCA JR NC,L0DA7 L0DAD: LD A,(KEYPC) ; 64 RLCA ; JR C,L0DAD ; MSEC POP AF RET ; DISPLAY ON POINTER ; ACC=DISPLAY CODE ; EXCEPT F0H QDSP: PUSH AF PUSH BC PUSH DE PUSH HL DSP01: CALL QPONT ; DISPLAY POSITION LD (HL),A LD HL,(DSPXY) LD A,L CP COLW-1 JR NZ,DSP04 CALL PMANG JR C,DSP04 EX DE,HL LD (HL),1 ; LOGICAL 1ST COLUMN INC HL LD (HL),0 ; LOGICAL 2ND COLUMN DSP04: LD A,0C3H ; CURSL JR L0DE0 ; GRAPHIC STATUS CHECK GRSTAS: LD A,(KANAF) CP 01H LD A,0CAH RET ; DISPLAY CONTROL ; ACC=CONTROL CODE QDPCT: PUSH AF PUSH BC PUSH DE PUSH HL L0DE0: LD B,A AND 0F0H CP 0C0H JR NZ,CURS5 XOR B RLCA LD C,A LD B,0 LD HL,CTBL ; PAGE MODE1 ADD HL,BC LD E,(HL) INC HL LD D,(HL) LD HL,(DSPXY) EX DE,HL JP (HL) CURSD: EX DE,HL ; LD HL,(DSPXY) LD A,H CP 24 JR Z,CURS4 INC H CURS1: CURS3: LD (DSPXY),HL CURS5: JP QRSTR CURSU: EX DE,HL ; LD HL,(DSPXY) LD A,H OR A JR Z,CURS5 DEC H CURSU1: JR CURS3 CURSR: EX DE,HL ; LD HL,(DSPXY) LD A,L CP COLW-1 JR NC,CURS2 INC L JR CURS3 CURS2: LD L,0 INC H LD A,H CP 25 JR C,CURS1 LD H,24 LD (DSPXY),HL CURS4: JR SCROL CURSL: EX DE,HL ; LD HL,(DSPXY) LD A,L OR A JR Z,L0E2D DEC L JR CURS3 L0E2D: LD L,COLW-1 DEC H JP P,CURSU1 LD H,0 LD (DSPXY),HL JR CURS5 CLRS: LD HL,MANG LD B,27 CALL QCLER LD HL,0D000H ; SCRN TOP CALL NCLR08 IF MODE80C = 0 LD A,071H ; Black background, white characters. Bit 7 is clear as a write to bit 7 @ DFFFH selects 40Char mode. ELSE LD A,071H ; Blue background, white characters in colour mode. Bit 7 is set as a write to bit 7 @ DFFFH selects 80Char mode. ENDIF ;LD A,71H ; COLOR DATA CALL NCLR8 ; D800H-DFFFH CLEAR HOME: LD HL,0 ; DSPXY:0 X=0,Y=0 JR CURS3 NOP NOP NOP NOP NOP NOP NOP NOP ; CR CR: CALL PMANG RRCA JR NC,CURS2 LD L,0 INC H CP 24 JR Z,CR1 INC H JR CURS1 CR1: LD (DSPXY),HL ; SCROLL SCROL: LD BC,SCRNSZ - COLW LD DE,SCRN ; TOP OF $CRT ADDRESS LD HL,SCRN+COLW ; COLUMN PUSH BC ; 1000 STORE LDIR POP BC PUSH DE LD DE,SCRN + 800H ; COLOR RAM SCROLL LD HL,SCRN + 800H + COLW ; SCROLL TOP + 1 LINE LDIR LD B,COLW ; ONE LINE EX DE,HL IF MODE80C = 0 LD A,071H ; Black background, white characters. Bit 7 is clear as a write to bit 7 @ DFFFH selects 40Char mode. ELSE LD A,071H ; Blue background, white characters in colour mode. Bit 7 is set as a write to bit 7 @ DFFFH selects 80Char mode. ENDIF ;LD A,71H ; COLOR RAM INITIAL DATA CALL QDINT POP HL LD B,COLW CALL QCLER ; LAST LINE CLEAR LD BC,ROW + 1 ; ROW NUMBER+1 LD DE,MANG ; LOGICAL MANAGEMENT LD HL,MANG+1 LDIR LD (HL),0 LD A,(MANG) OR A JR Z,QRSTR LD HL,DSPXY+1 DEC (HL) JR SCROL ; CONTROL CODE TABLE CTBL: DW SCROL ; SCROLLING 10H DW CURSD ; CURSOR DOWN 11H DW CURSU ; CURSOR UP 12H DW CURSR ; CURSOR RIGHT 13H DW CURSL ; CURSOR LEFT 14H DW HOME ; 15H DW CLRS ; 16H DW DEL ; 17H DW INST ; 18H DW ALPHA ; 19H DW KANA ; GRAPHIC 1AH DW QRSTR ; 1BH DW QRSTR ; 1CH DW CR ; 1DH DW QRSTR ; 1EH DW QRSTR ; 1FH ; INST BYPASS INST2: SET 3,H ; COLOR RAM LD A,(HL) ; FROM INC HL LD (HL),A ; TO DEC HL ; ADDRESS ADJUST RES 3,H LDD ; CHANGE TRNS. LD A,C OR B ; BC=0 ? JR NZ,INST2 EX DE,HL LD (HL),0 SET 3,H ; COLOR RAM IF MODE80C = 0 LD (HL),071H ; Black background, white characters. Bit 7 is clear as a write to bit 7 @ DFFFH selects 40Char mode. ELSE LD (HL),071H ; Blue background, white characters in colour mode. Bit 7 is set as a write to bit 7 @ DFFFH selects 80Char mode. ENDIF ;LD (HL),71H JR QRSTR ALPHA: XOR A ALPH1: LD (KANAF),A ; RESTORE QRSTR: POP HL QRSTR1: POP DE POP BC POP AF RET NOP NOP NOP NOP KANA: CALL GRSTAS JP Z,DSP01 ; NOT GRAPH KEY THEN JUMP LD A,01H JR ALPH1 DEL: EX DE,HL ; LD HL,(DSPXY) LD A,H ; HOME ? OR L JR Z,QRSTR LD A,L OR A JR NZ,DEL1 ; LEFT SIDE ? CALL PMANG JR C,DEL1 CALL QPONT DEC HL LD (HL),0 JR L0F33 ; JUMP CURSL DEL1: CALL PMANG RRCA LD A,COLW JR NC,L0F17 RLCA ; ACC=80 L0F17: SUB L LD B,A ; TRNS. BYTE CALL QPONT DEL2: LD A,(HL) ; CHANGE FROM ADDRESS DEC HL LD (HL),A ; TO INC HL SET 3,H ; COLOR RAM LD A,(HL) DEC HL LD (HL),A RES 3,H ; CHANGE INC HL INC HL ; NEXT DJNZ DEL2 DEC HL ; ADDRESS ADJUST LD (HL),0 SET 3,H IF MODE80C = 0 LD HL,071H ; Black background, white characters. Bit 7 is clear as a write to bit 7 @ DFFFH selects 40Char mode. ELSE LD HL,071H ; Blue background, white characters in colour mode. Bit 7 is set as a write to bit 7 @ DFFFH selects 80Char mode. ENDIF ;LD HL,71H ; BLUE + WHITE L0F33: LD A,0C4H ; JP CURSL JP L0DE0 INST: CALL PMANG RRCA LD L,COLW - 1 LD A,L JR NC,L0F42 INC H L0F42: CALL QPNT1 PUSH HL LD HL,(DSPXY) JR NC,L0F4D LD A,(COLW*2) - 1 L0F4D: SUB L LD B,0 LD C,A POP DE JR Z,QRSTR LD A,(DE) OR A JR NZ,QRSTR LD H,D ; HL<-DE LD L,E DEC HL JP INST2 ; JUMP NEXT (BYPASS) ; PROGRAM SAVE ; COMMAND "S" SAVE: CALL HEXIY ; START ADDRESS LD (DTADR),HL ; DATA ADDRESS BUFFER LD B,H LD C,L CALL P4DE CALL HEXIY ; END ADDRESS SBC HL,BC ; BYTE SIZE INC HL LD (SIZE),HL ; BYTE SIZE BUFFER CALL P4DE CALL HEXIY ; EXECUTE ADDRESS LD (EXADR),HL ; BUFFER CALL NL LD DE,MSGSV ; SAVED FILENAME RST 18H ; CALL MSGX CALL BGETL ; FILENAME INPUT CALL P4DE CALL P4DE LD HL,NAME ; NAME BUFFER SAV1: INC DE LD A,(DE) LD (HL),A ; FILENAME TRANS. INC HL CP 0DH ; END CODE JR NZ,SAV1 LD A,01H ; ATTRIBUTE: OBJECT CODE LD (ATRB),A CALL QWRI JP C,QER ; WRITE ERROR CALL QWRD ; DATA JP C,QER CALL NL LD DE,MSGOK ; OK MESSAGE RST 18H ; CALL MSGX JP ST1 ; COMPUTE POINT ADDRESS ; HL=SCREEN COORDINATE ; EXIT HL=POINT ADDRESS ON SCREEN QPONT: LD HL,(DSPXY) QPNT1: PUSH AF PUSH BC PUSH DE PUSH HL POP BC LD DE,COLW ; 40 LD HL,SCRN-COLW QPNT2: ADD HL,DE DEC B JP P,QPNT2 LD B,0 ADD HL,BC POP DE POP BC POP AF RET ; VERIFYING COMMAND "V" VRFY: CALL QVRFY JP C,QER LD DE,MSGOK RST 18H JP ST1 ; CLER ; B=SIZE ; HL=LOW ADDRESS QCLER: XOR A JR QDINT QCLRFF: LD A,0FFH QDINT: LD (HL),A INC HL DJNZ QDINT RET ; GAP CHECK GAPCK: PUSH BC PUSH DE PUSH HL LD BC,KEYPB LD DE,CSTR GAPCK1: LD H,100 GAPCK2: CALL EDGE JR C,GAPCK3 CALL DLY3 ; CALL DLY2*3 LD A,(DE) AND 20H JR NZ,GAPCK1 DEC H JR NZ,GAPCK2 GAPCK3: JP RET3 ; MONITOR WORK AREA ; (MZ700) ORG 10F0H SPV: IBUFE: ; TAPE BUFFER (128 BYTES) ATRB: DS virtual 1 ; ATTRIBUTE NAME: DS virtual 17 ; FILE NAME SIZE: DS virtual 2 ; BYTESIZE DTADR: DS virtual 2 ; DATA ADDRESS EXADR: DS virtual 2 ; EXECUTION ADDRESS COMNT: DS virtual 104 ; COMMENT KANAF: DS virtual 1 ; KANA FLAG (01=GRAPHIC MODE) DSPXY: DS virtual 2 ; DISPLAY COORDINATES MANG: DS virtual 27 ; COLUMN MANAGEMENT FLASH: DS virtual 1 ; FLASHING DATA FLPST: DS virtual 2 ; FLASHING POSITION FLSST: DS virtual 1 ; FLASHING STATUS FLSDT: DS virtual 1 ; CURSOR DATA STRGF: DS virtual 1 ; STRING FLAG DPRNT: DS virtual 1 ; TAB COUNTER TMCNT: DS virtual 2 ; TAPE MARK COUNTER SUMDT: DS virtual 2 ; CHECK SUM DATA CSMDT: DS virtual 2 ; FOR COMPARE SUM DATA AMPM: DS virtual 1 ; AMPM DATA TIMFG: DS virtual 1 ; TIME FLAG SWRK: DS virtual 1 ; KEY SOUND FLAG TEMPW: DS virtual 1 ; TEMPO WORK ONTYO: DS virtual 1 ; ONTYO WORK OCTV: DS virtual 1 ; OCTAVE WORK RATIO: DS virtual 2 ; ONPU RATIO BUFER: DS virtual 81 ; GET LINE BUFFER ; EQU TABLE I/O REPORT KEYPA: EQU 0E000H KEYPB: EQU 0E001H KEYPC: EQU 0E002H KEYPF: EQU 0E003H CSTR: EQU 0E002H CSTPT: EQU 0E003H CONT0: EQU 0E004H CONT1: EQU 0E005H CONT2: EQU 0E006H CONTF: EQU 0E007H SUNDG: EQU 0E008H TEMP: EQU 0E008H ; MONITOR WORK AREA SCRN: EQU 0D000H KANST: EQU 0E003H ; KANA STATUS REPORT