From b85227bae0afd80da6772b305e46078ac65bb2a6 Mon Sep 17 00:00:00 2001 From: Philip Smart Date: Wed, 10 Jun 2020 21:50:39 +0100 Subject: [PATCH] Frequency change and MZ700 mode additions --- software/MZF/sharpmz-test.mzf | Bin 0 -> 3934 bytes software/asm/1Z-013A.asm | 3303 +++++++++++++++++++++ software/asm/MZ80AFI.asm | 2 +- software/asm/MZ80B_IPL.asm | 897 ++++++ software/asm/include/CPM_Definitions.asm | 5 + software/asm/include/TZFS_Definitions.asm | 8 +- software/asm/include/TZFS_Utilities.asm | 8 +- software/asm/monitor_1Z-013A.asm | 7 + software/asm/monitor_80c_1Z-013A.asm | 7 + software/asm/sa1510.asm | 637 ++-- software/asm/tzfs.asm | 52 + software/asm/tzfs_bank2.asm | 81 +- software/roms/MZ80B_IPL.rom | Bin 0 -> 1567 bytes software/roms/monitor_1Z-013A.rom | Bin 4096 -> 4096 bytes software/roms/monitor_80c_1Z-013A.rom | Bin 0 -> 4096 bytes software/roms/monitor_80c_SA1510.rom | Bin 4096 -> 4096 bytes software/roms/monitor_SA1510.rom | Bin 4096 -> 4096 bytes software/roms/tzfs.rom | Bin 18432 -> 18432 bytes software/tools/assemble_roms.sh | 4 +- 19 files changed, 4665 insertions(+), 346 deletions(-) create mode 100644 software/MZF/sharpmz-test.mzf create mode 100644 software/asm/1Z-013A.asm create mode 100644 software/asm/MZ80B_IPL.asm create mode 100644 software/asm/monitor_1Z-013A.asm create mode 100644 software/asm/monitor_80c_1Z-013A.asm create mode 100644 software/roms/MZ80B_IPL.rom create mode 100644 software/roms/monitor_80c_1Z-013A.rom diff --git a/software/MZF/sharpmz-test.mzf b/software/MZF/sharpmz-test.mzf new file mode 100644 index 0000000000000000000000000000000000000000..826d0baafc4b279a1362c832b9fe1f6d4cdf9422 GIT binary patch literal 3934 zcmcgvdq7jy89z6X$SX8Q0i#uVBI+V2NSwe>ZX4kiG6;!DfL2>{PF<~T-Lw-GMY^`@ z*2m_yT4!~(UAxwGb*S6w>MP_X0dCBlMNDn2kI)s`invfp>!geO&b{F+|Ll+DaqjuP z^F4p(`_4%id$G}GH7_L&&h8);S!#4S0XgCQe|ovsIa`}s{W{dZ+`5}Z)v0lt50kH2 zMS*ft>STV6%)W7YA-SG=4Hj7>PIj_Ubcm(Ho2>#{-s)p-wVr0lY* zR&<86GeH;Y{gBmWps|6@ASCetXB63wb13O{IaM)KIj6T@y?c_Tr=G1-MfX~&YhOWn zjL?=$n33r2JCNooXi$JkB(wR{BT#lqZ3|oHjbj;YY)lWVyk&1qj^@&=9yEQP4G<`R2b9vjv%XCHR20nvN+l^&LrTkca zl7EWddIE;}_CNrCNi&aZgPNw;(kW9dZQxq`z&#{FDnCPlLEg57!{w8iB>ni6Vvg6H zz{Bnxw9lZ+20t-$UuAdEv~FPYTU@HxJVmfWqmNa+E-v(F`s%e# zR;5!0s~1&k+CgG#_`E&}9~HDQ*hvcoze7h!hxkRTCST-e{k`4*njopHu+>vD!NeJuCs&e?T#xD*MG+lE@`_IWUHqrz2*nz|6Wa%}k?a z=(1!6s&-^F2c_BsF2q9-qOi@6U@MoytW~hjxp8uRk?xr!Vln1;7q>O7#bmujzzkFsc*pYI09*g4XPTjW+DX0Np;UYdBEfWou9E z)Qt~jAIg3-d!9}e+_*s(70iy!M!Ipq?D*^kXuEd0UI%Ms^ora=K0do9bu7o?=Z&}X9bpf154_t& zKwjH&oV-ktni}!iC&)Rb_f%E%)f~|$)B`qMwp>kT-d@}$;D!V6yw0=_hzz{U@{*Y|TWt3aU9gc-i?NV6j8<+a z+d&*AGiQ^uhVm;(rOo8vWNRapmXIaoCeXAHv!%@Bu-MdS=ucfRr!SaItQmH*(dHnA zd0Dw?WCB4l5V1r>f*k2+2eFnKA@&`_#uZp>g&Ar@MNDNyM2##ZYE)3n6_nV^&4jbr zz_+X~&u!d5jx=cS5AtRUgb2|V6_rBnGG%vItZGDM2o)lB2ZX9dMMf);%&ULzESizCewk7sxBNBVK1L{&@kG4$+ z{NosaNN*{bEyXRRI+{H~nzP+jx}PmWT?`;|wv3F72=s+UhmlegJSySf%H%EM2(a=X zR9VkqCiY^B%`uEqYAGukWMn~=!agrH!CuHph6UM!T60LH(d2-FkV6>smTOore^@0; zg-~HEE$2uUH9v$l4A6y^G7gN*k>LV1v6N(}vCSCiBIr14Ddzwg8c`krfyKtM5~`0B z(w{mBRk{(tVVFz)OMc_xfm31lvCP=f~|GpM3h+)y`{O*Z&pj{=Dal-Y>tp@$Z{`U;ih3>%V+B B5&HlD literal 0 HcmV?d00001 diff --git a/software/asm/1Z-013A.asm b/software/asm/1Z-013A.asm new file mode 100644 index 0000000..d644405 --- /dev/null +++ b/software/asm/1Z-013A.asm @@ -0,0 +1,3303 @@ + ; 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,017H ; Black background, white characters. Bit 7 is clear as a write to bit 7 @ DFFFH selects 40Char mode. + ELSE + LD A,017H ; 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 0F0H ; NULL + DB 0F0H ; NULL + DB 040H ; CURSOR DOWN + DB 0F0H ; NULL + DB 0F0H ; NULL + DB 04FH ; : + DB 02CH ; ; + DB 0CDH ; CR + ;S1 08 - 0F ; + DB 022H ; 2 + DB 021H ; 1 + DB 017H ; W + DB 011H ; Q + DB 001H ; A + DB 0C7H ; DEL + DB 000H ; NULL + DB 01AH ; Z + ;S2 10 - 17 ; + DB 024H ; 4 + DB 023H ; 3 + DB 012H ; R + DB 005H ; E + DB 004H ; D + DB 013H ; S + DB 018H ; X + DB 003H ; C + ;S3 18 - 1F ; + DB 026H ; 6 + DB 025H ; 5 + DB 019H ; Y + DB 014H ; T + DB 007H ; G + DB 006H ; F + DB 016H ; V + DB 002H ; B + ;S4 20 - 27 ; + DB 028H ; 8 + DB 027H ; 7 + DB 009H ; I + DB 015H ; U + DB 00AH ; J + DB 008H ; H + DB 00EH ; N + DB 000H ; SPACE + ;S5 28 - 2F ; + DB 020H ; 0 + DB 029H ; 9 + DB 010H ; P + DB 00FH ; O + DB 00CH ; L + DB 00BH ; K + DB 02FH ; , + DB 00DH ; M + ;S6 30 - 37 ; + DB 0BEH ; ^ + DB 02AH ; - + DB 052H ; [ + DB 055H ; @ + DB 04FH ; : + DB 02CH ; ; + DB 02DH ; / + DB 02EH ; . + ;S7 38 - 3F ; + DB 0C5H ; HOME + DB 059H ; \ + DB 0C3H ; CURSOR RIGHT + DB 0C2H ; CURSOR UP + DB 0CDH ; CR + DB 054H ; ] + DB 000H ; NULL + DB 049H ; ? + + ; + ; + ; KTBL SHIFT ON + ; +KTBLS: ;S0 00 - 07 + DB 0F0H ; NULL + DB 0F0H ; NULL + DB 040H ; CURSOR DOWN + DB 0F0H ; NULL + DB 0F0H ; NULL + DB 04FH ; : + DB 02CH ; ; + DB 0CDH ; CR + ;S1 08 - 0F + DB 062H ; " + DB 061H ; ! + DB 097H ; w + DB 091H ; q + DB 081H ; a + DB 0C8H ; INSERT + DB 000H ; NULL + DB 09AH ; z + ;S2 10 - 17 + DB 064H ; $ + DB 063H ; # + DB 092H ; r + DB 085H ; e + DB 084H ; d + DB 093H ; s + DB 098H ; x + DB 083H ; c + ;S3 18 - 1F ; + DB 066H ; & + DB 065H ; % + DB 099H ; y + DB 094H ; t + DB 087H ; g + DB 086H ; f + DB 096H ; v + DB 082H ; b + ;S4 20 - 27 + DB 068H ; ( + DB 067H ; ' + DB 089H ; i + DB 095H ; u + DB 08AH ; j + DB 088H ; h + DB 08EH ; n + DB 000H ; SPACE + ;S5 28 - 2F + DB 0BFH ; _ + DB 069H ; ) + DB 090H ; p + DB 08FH ; o + DB 08CH ; l + DB 08BH ; k + DB 051H ; < + DB 08DH ; m + ;S6 30 - 37 + DB 0A5H ; ~ + DB 02BH ; = + DB 0BCH ; ( + DB 0A4H ; ' + DB 06BH ; # + DB 06AH ; + + DB 045H ; <- + DB 057H ; > + ;S7 38 - 3F + DB 0C6H ; CLR + DB 080H ; | + DB 0C4H ; CURSOR LEFT + DB 0C1H ; CURSOR DOWN + DB 0CDH ; CR + DB 040H ; ) + DB 000H ; NULL + DB 050H ; UP^ + ; + ; + ; GRAPHIC + ; +KTBLG: ;S0 00 - 07 ; ;S0 00 - 07 + DB 03EH ; DB 0BFH ; SPARE + DB 037H ; DB 0F0H ; GRAPH BUT NULL + DB 038H ; DB 0E5H ; # + DB 03CH ; DB 0C9H ; ALPHA + DB 053H ; DB 0F0H ; NO + DB 0C7H ; DB 42H ; # ; + DB 000H ; DB 0B6H ; #: + DB 076H ; DB 0CDH ; CR + ;S1 08 - 0F ; ;S1 08 - 0F + DB 03EH ; #2 + DB 037H ; #1 + DB 038H ; #W + DB 03CH ; #Q + DB 053H ; #A + DB 0C7H ; #DEL + DB 000H ; #NULL + DB 076H ; #Z + ;S2 10 - 17 + DB 07BH ; #4 + DB 07FH ; #3 + DB 030H ; #R + DB 034H ; #E + DB 047H ; #D + DB 044H ; #S + DB 06DH ; #X + DB 0DEH ; #C + ;S3 18 - 1F + DB 05EH ; #6 + DB 03AH ; #5 + DB 075H ; #Y + DB 071H ; #T + DB 04BH ; #G + DB 04AH ; #F + DB 0DAH ; #V + DB 06FH ; #B + ;S4 20 - 27 + DB 0BDH ; #8 + DB 01FH ; #7 + DB 07DH ; #I + DB 079H ; #U + DB 05CH ; #J + DB 072H ; #H + DB 032H ; #N + DB 000H ; SPACE + ;S5 28 - 2F + DB 09CH ; #0 + DB 0A1H ; #9 + DB 0D6H ; #P + DB 0B0H ; #O + DB 0B4H ; #L + DB 05BH ; #K + DB 060H ; #, + DB 01CH ; #M + ;S6 30 - 37 + DB 09EH ; #^ + DB 0D2H ; #- + DB 0D8H ; #[ + DB 0B2H ; #@ + DB 0B6H ; ##: + DB 042H ; #; + DB 0DBH ; #/ + DB 0B8H ; #. + ;S7 38 - 3F + DB 0C5H ; HOME + DB 0D4H ; #\ + DB 0C3H ; CURSOR RIGHT + DB 0C2H ; CURSOR UP + DB 0CDH ; CR + DB 04EH ; #J + DB 000H ; NULL + DB 0BAH ; #? + ; + ; + ; CONTROL CODE + ; +KTBLGS: ;S0 00 - 07 ; ;S0 00 - 07 + DB 036H ; DB 0F0H + DB 03FH ; DB 0F0H + DB 078H ; DB 0F0H ; ^ + DB 07CH ; DB 0F0H + DB 046H ; DB 0F0H + DB 0C8H ; DB 0F0H + DB 000H ; DB 0F0H + DB 077H ; DB 0F0H + ;S1 08 - 0F ; ;S1 08 - 0F + DB 036H ; ?2 + DB 03FH ; ?1 + DB 078H ; ?W + DB 07CH ; ?Q + DB 046H ; ?A + DB 0C8H ; INST + DB 000H ; NULL + DB 077H ; ?Z + ;S2 10 - 17 + DB 03BH ; ?4 + DB 07EH ; ?3 + DB 070H ; ?R + DB 074H ; ?E + DB 048H ; ?D + DB 041H ; ?S + DB 0DDH ; ?X + DB 0D9H ; C + ;S3 18 - 1F + DB 01EH ; ?6 + DB 07AH ; ?5 + DB 035H ; ?Y + DB 031H ; ?T + DB 04CH ; ?G + DB 043H ; ?F + DB 0A6H ; ?V + DB 06EH ; ?B + ;S4 20 - 27 + DB 0A2H ; ?8 + DB 05FH ; ?7 + DB 03DH ; ?I + DB 039H ; ?U + DB 05DH ; ?J + DB 073H ; ?H + DB 033H ; ?N + DB 000H ; SPACE + ;S5 28 - 2F + DB 09DH ; ?0 + DB 0A3H ; ?9 + DB 0B1H ; ?P + DB 0D5H ; ?O + DB 056H ; ?L + DB 06CH ; ?K + DB 0D0H ; ?, + DB 01DH ; ?M + ;S6 30 - 37 + DB 09FH ; ?^ + DB 0D1H ; ?- + DB 0B3H ; ?[ + DB 0D7H ; ?@ + DB 04DH ; ?: + DB 0B5H ; ?; + DB 01BH ; ?/ + DB 0B9H ; ?. + ;S7 38 - 3F + DB 0C6H ; CLR + DB 0D3H ; ?\ + DB 0C4H ; CURSOR RIGHT + DB 0C1H ; CURSOR UP + DB 0CDH ; CR + DB 0B7H ; ?J + DB 000H ; NULL + DB 0BBH ; ?? + ; + ; KANA + ; +KTBLC: ;S0 00 - 07 ; ;S0 00 - 07 + DB 0F0H ; DB 0BFH ; SPARE + DB 0F0H ; DB 0F0H ; GRAPH BUT NULL + DB 0E2H ; DB 0CFH ; NIKO WH. + DB 0C1H ; DB 0C9H ; ALPHA + DB 0E0H ; DB 0F0H ; NO + DB 0F0H ; DB 0B5H ; MO + DB 000H ; DB 4DH ; DAKU TEN + DB 0E5H ; DB 0CDH ; CR + ;S1 08 - 0F ; ;S1 08 - 0F + DB 0F0H ; CODE 80H=NOT KEY + DB 0F0H ; + DB 0E2H ; CTRL + W + DB 0C1H ; CTRL + Q + DB 0E0H ; CTRL + A SHIFT LOCK + DB 0F0H ; + DB 000H ; + DB 0E5H ; CTRL + Z + ;S2 10 - 17 ; ;S2 10 - 17 + DB 0F0H ; + DB 0F0H ; + DB 0C2H ; CTRL + R + DB 0CFH ; CTRL + E ROLL DOWN + DB 0CEH ; CTRL + D ROLL UP + DB 0C3H ; CTRL + S + DB 0E3H ; CTRL + X + DB 0F3H ; CTRL + C + ;S3 18 - 1F ; ;S3 18 - 1F + DB 0F0H ; + DB 0F0H ; + DB 0E4H ; CTRL + Y + DB 0C4H ; CTRL + T + DB 0F7H ; CTRL + G + DB 0F6H ; CTRL + F + DB 0C6H ; CTRL + V CLR + DB 0F2H ; CTRL + B + ;S4 20 - 27 ; ;S4 20 - 27 + DB 0F0H ; + DB 0F0H ; + DB 0F9H ; CTRL + I + DB 0C5H ; CTRL + U HOME + DB 0FAH ; CTRL + J + DB 0F8H ; CTRL + H + DB 0FEH ; CTRL + N + DB 0F0H ; + ;S5 28 - 2F ; ;S5 28 - 2F + DB 0F0H ; + DB 0F0H ; + DB 0E1H ; CTRL + P + DB 0FFH ; CTRL + O + DB 0FCH ; CTRL + L + DB 0FBH ; CTRL + K + DB 0F0H ; + DB 0FDH ; CTRL + M + ;S6 30 - 37 ; ;S6 30 - 37 + DB 0EFH ; CTRL + ^ + DB 0F4H ; CTRL + - + DB 0E6H ; CTRL + [ + DB 0CCH ; CTRL + @ REVERSE + DB 0F0H ; + DB 0F0H ; + DB 0F0H ; + DB 0F0H ; + ;S7 38 - 3F ; ;S7 38 - 3F + DB 0F0H ; + DB 0EBH ; CTRL + \ + DB 0F0H ; + DB 0F0H ; + DB 0F0H ; + DB 0EEH ; CTRL + ] + DB 0F0H ; + + ; 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,017H ; Black background, white characters. Bit 7 is clear as a write to bit 7 @ DFFFH selects 40Char mode. + ELSE + LD A,017H ; 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,017H ; Black background, white characters. Bit 7 is clear as a write to bit 7 @ DFFFH selects 40Char mode. + ELSE + LD A,017H ; 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),17H ; Black background, white characters. Bit 7 is clear as a write to bit 7 @ DFFFH selects 40Char mode. + ELSE + LD (HL),17H ; 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,017H ; Black background, white characters. Bit 7 is clear as a write to bit 7 @ DFFFH selects 40Char mode. + ELSE + LD HL,017H ; 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 + + diff --git a/software/asm/MZ80AFI.asm b/software/asm/MZ80AFI.asm index 46b5c67..4a49f96 100644 --- a/software/asm/MZ80AFI.asm +++ b/software/asm/MZ80AFI.asm @@ -8,7 +8,7 @@ ; on Thursday, 06 of February 2020 at 01:38 PM ; i ; Bring in additional resources. - INCLUDE "RFS_Definitions.asm" + INCLUDE "TZFS_Definitions.asm" INCLUDE "Macros.asm" diff --git a/software/asm/MZ80B_IPL.asm b/software/asm/MZ80B_IPL.asm new file mode 100644 index 0000000..dacf307 --- /dev/null +++ b/software/asm/MZ80B_IPL.asm @@ -0,0 +1,897 @@ + ORG 0000H + ;**************************************************************** + ; + ; Personal Computer + ; MZ-80B + ; + ; Initial Program Loader + ;**************************************************************** + ; + JR START + ; + ; NST RESET + ; +NST: LD A,03H + OUT (PPICTL),A ;Set PC1 NST=1 + ; +START: LD A,82H ;8255 A=OUT B=IN C=OUT + OUT (PPICTL),A + LD A,0FH ;PIO A=OUT + OUT (PIOCTLA),A + LD A,0CFH ;PIO B=IN + OUT (PIOCTLB),A + LD A,0FFH + OUT (PIOCTLB),A + LD A,58H ;BST=1 NST=0 OPEN=1 WRITE=1 + OUT (PPIC),A + LD A,12H + OUT (PPIA),A + XOR A + OUT (GRPHCTL),A ;Set Graphics VRAM to default, input to GRPH I, no output. + LD SP,0FFE0H + LD HL,0D000H + LD A,0B3H + OUT (PIOA),A +CLEAR: LD (HL),00H ;DISPLAY CLEAR + INC HL + LD A,H + OR L + JR NZ,CLEAR + LD A,13H + OUT (PIOA),A + XOR A + LD (DRINO),A + LD (MTFG),A +KEYIN: CALL KEYS1 + BIT 3,A ;C - Cassette. + JR Z,CMT + BIT 0,A ;/ - Boot external rom. + JP Z,EXROMT + JR NKIN ;No selection, so standard startup, try FDC then CMT. + ; +KEYS1: LD B,14H ;Preserve A4-A7, set A4 to prevent all strobes low, the select line 5 (0-4). +KEYS: IN A,(PIOA) + AND 0F0H + OR B + OUT (PIOA),A + IN A,(PIOB) ;Read the strobed key. + RET + ; + ; +NKIN: CALL FDCC + JP Z,FD + JR CMT + ; +FDCC: LD A,0A5H + LD B,A + OUT (0D9H),A + CALL DLY80U + IN A,(0D9H) + CP B + RET + ; + ; ; + ; CMT CONTROL ; + ; ; + ; +CMT: CALL MSTOP + CALL DEL6 + CALL KYEMES + CALL ?RDI + JR C,ST1 + CALL LDMSG + LD HL,NAME + LD E,010H + LD C,010H + CALL DISP2 + LD A,(ATRB) + CP 01H + JR NZ,MISMCH + CALL ?RDD +ST1: PUSH AF + CALL DEL6 + CALL REW + POP AF + JP C,TRYAG + JP NST + ; +MISMCH: LD HL,MES16 + LD E,0AH + LD C,0FH + CALL DISP + CALL MSTOP + SCF + JR ST1 + ; + ;READ INFORMATION + ; CF=1:ERROR +RDINF: +?RDI: DI + LD D,04H + LD BC,0080H + LD HL,IBUFE +RD1: CALL MOTOR + JR C,STPEIR + CALL TMARK + JR C,STPEIR + CALL RTAPE + JR C,STPEIR +RET2S: BIT 3,D + JR Z,EIRTN +STPEIR: CALL MSTOP +EIRTN: EI + RET + ; + ; + ;READ DATA +RDDAT: +?RDD: DI + LD D,08H + LD BC,(SIZE) + LD HL,8000H + JR RD1 + ; + ; + ;READ TAPE + ; BC=SIZE + ; DE=LOAD ADDRSS +RTAPE: PUSH DE + PUSH BC + PUSH HL + LD H,02H +RTP2: CALL SPDIN + JR C,TRTN1 ;BREAK + JR Z,RTP2 + LD D,H + LD HL,0000H + LD (SUMDT),HL + POP HL + POP BC + PUSH BC + PUSH HL +RTP3: CALL RBYTE + JR C,TRTN1 + LD (HL),A + INC HL + DEC BC + LD A,B + OR C + JR NZ,RTP3 + LD HL,(SUMDT) + CALL RBYTE + JR C,TRTN1 + LD E,A + CALL RBYTE + JR C,TRTN1 + CP L + JR NZ,RTP5 + LD A,E + CP H + JR Z,TRTN1 +RTP5: DEC D + JR Z,RTP6 + LD H,D + JR RTP2 +RTP6: CALL BOOTER + SCF +TRTN1: POP HL + POP BC + POP DE + RET + ;EDGE +EDGE: IN A,(PPIB) + CPL + RLCA + RET C ;BREAK + RLCA + JR NC,EDGE ;WAIT ON LOW +EDGE1: IN A,(PPIB) + CPL + RLCA + RET C ;BREAK + RLCA + JR C,EDGE1 ;WAIT ON HIGH + RET + ; 1 BYTE READ + ; DATA=A + ; SUMDT STORE +RBYTE: PUSH HL + LD HL,0800H ; 8 BITS +RBY1: CALL SPDIN + JR C,RBY3 ;BREAK + JR Z,RBY2 ;BIT=0 + PUSH HL + LD HL,(SUMDT) ;CHECKSUM + INC HL + LD (SUMDT),HL + POP HL + SCF +RBY2: RL L + DEC H + JR NZ,RBY1 + CALL EDGE + LD A,L +RBY3: POP HL + RET + ;TAPE MARK DETECT + ; E=L:INFORMATION + ; E=S:DATA +TMARK: PUSH HL + LD HL,1414H + BIT 3,D + JR NZ,TM0 + ADD HL,HL +TM0: LD (TMCNT),HL +TM1: LD HL,(TMCNT) +TM2: CALL SPDIN + JR C,RBY3 + JR Z,TM1 + DEC H + JR NZ,TM2 +TM3: CALL SPDIN + JR C,RBY3 + JR NZ,TM1 + DEC L + JR NZ,TM3 + CALL EDGE + JR RBY3 + ;READ 1 BIT +SPDIN: CALL EDGE ;WAIT ON HIGH + RET C ;BREAK + + CALL DLY2 + IN A,(PPIB) ;READ BIT + AND 40H + RET + ; + ; + ;MOTOR ON +MOTOR: PUSH DE + PUSH BC + PUSH HL + IN A,(PPIB) + AND 20H + JR Z,MOTRD + LD HL,MES6 + LD E,0AH + LD C,0EH + CALL DISP + CALL OPEN +MOT1: IN A,(PIOB) + CPL + RLCA + JR C,MOTR + IN A,(PPIB) + AND 20H + JR NZ,MOT1 + CALL KYEMES + CALL DEL1M +MOTRD: CALL PLAY +MOTR: POP HL + POP BC + POP DE + RET + ; + ; + ;MOTOR STOP +MSTOP: LD A,0DH + OUT (PPICTL),A ;Set PC6 - READ MODE + LD A,1AH + OUT (PPIA),A + CALL DEL6 + JR BLK3 + ;EJECT +OPEN: LD A,08H ;Reset PC4 - EJECT activate + OUT (PPICTL),A + CALL DEL6 + LD A,09H + OUT (PPICTL),A ;Set PC4 - Deactivate EJECT + RET + ; + ; +KYEMES: LD HL,MES3 + LD E,04H + LD C,1CH + CALL DISP + RET + ; + ;PLAY +PLAY: CALL FR + CALL DEL6 + LD A,16H + OUT (PPIA),A + JR BLK3 +BLK1: CALL DEL6 + CALL BLK3 + LD A,13H +BLK2: OUT (PPIA),A +BLK3: LD A,12H + OUT (PPIA),A + RET + ; + ; +FR: LD A,12H +FR1: OUT (PPIA),A + CALL DEL6 + LD A,0BH + OUT (PPICTL),A ;Set PC5 + CALL DEL6 + LD A,0AH + OUT (PPICTL),A ;Reset PC5 + RET + +RRW: LD A,010H + JR FR1 + ;REWIND +REW: CALL RRW + JR BLK1 + ; + ;TIMING DEL +DM1: PUSH AF +L0211: XOR A +L0212: DEC A + JR NZ,L0212 + DEC BC + LD A,B + OR C + JR NZ,L0211 + POP AF + POP BC + RET + +DEL6: PUSH BC + LD BC,00E9H ;233D + JR DM1 +DEL1M: PUSH BC + LD BC,060FH ;1551D + JR DM1 + ; + ;TAPE DELAY TIMING + ; + ; +DLY2: LD A,31H +L022B: DEC A + JP NZ,L022B + RET + ; + ; + ; + ; + ; +LDMSG: LD HL,MES1 + LD E,00H + LD C,0EH + JR DISP + ; +DISP2: LD A,93H + OUT (PIOA),A + JR DISP1 + ; +BOOTER: LD HL,MES8 + LD E,0AH + LD C,0DH + ; +DISP: LD A,93H + OUT (PIOA),A + EXX + LD HL,0D000H +DISP3: LD (HL),00H + INC HL + LD A,H + OR L + JR NZ,DISP3 + EXX +DISP1: XOR A + LD B,A + LD D,0D0H + LDIR + LD A,13H + OUT (PIOA),A + RET + ; + ; +MES1: DB "IPL is loading" +MES3: DB "IPL is looking for a program" +MES6: DB "Make ready CMT" +MES8: DB "Loading error" +MES9: DB "Make ready FD" +MES10: DB "Press F or C" +MES11: DB "F:Floppy diskette" +MES12: DB "C:Cassette tape" +MES13: DB "Drive No? (1-4)" +MES14: DB "This diskette is not master" +MES15: DB "Pressing S key starts the CMT" +MES16: DB "File mode error" + ; +IPLMC: DB 01H + DB "IPLPRO" + ; + ; + ;FD +FD: LD IX,IBADR1 + XOR A + LD (0CF1EH),A + LD (0CF1FH),A + LD IY,0FFE0H + LD HL,0100H + LD (IY+2),L + LD (IY+3),H + CALL BREAD ;INFORMATION INPUT + LD HL,0CF00H ;MASTER CHECK + LD DE,IPLMC + LD B,06H +MCHECK: LD C,(HL) + LD A,(DE) + CP C + JP NZ,NMASTE + INC HL + INC DE + DJNZ MCHECK + CALL LDMSG + LD HL,0CF07H + LD E,010H + LD C,0AH + CALL DISP2 + LD IX,IBADR2 + LD HL,(0CF14H) + LD (IY+2),L + LD (IY+3),H + CALL BREAD + CALL MOFF + JP NST + ; + ; +NODISK: LD HL,MES9 + LD E,0AH + LD C,0DH + CALL DISP + JP ERR1 + ; + ; READY CHECK + ; +READY: LD A,(MTFG) + RRCA + CALL NC,MTON + LD A,(DRINO) ;DRIVE NO GET + OR 84H + OUT (DM),A ;DRIVE SELECT MOTON + XOR A + CALL DLY60M + LD HL,0000H +REDY0: DEC HL + LD A,H + OR L + JR Z,NODISK + IN A,(CR) ;STATUS GET + CPL + RLCA + JR C,REDY0 + LD A,(DRINO) + LD C,A + LD HL,CLBF0 + LD B,00H + ADD HL,BC + BIT 0,(HL) + RET NZ + CALL RCLB + SET 0,(HL) + RET + ; + ; MOTOR ON + ; +MTON: LD A,80H + OUT (DM),A + LD B,0AH ;1SEC DELAY +MTD1: LD HL,3C19H +MTD2: DEC HL + LD A,L + OR H + JR NZ,MTD2 + DJNZ MTD1 + LD A,01H + LD (MTFG),A + RET + ; + ;SEEK TREATMENT + ; +SEEK: LD A,1BH + CPL + OUT (CR),A + CALL BUSY + CALL DLY60M + IN A,(CR) + CPL + AND 99H + RET + ; + ;MOTOR OFF + ; +MOFF: CALL DLY1M + XOR A + OUT (DM),A + LD (CLBF0),A + LD (CLBF1),A + LD (CLBF2),A + LD (CLBF3),A + LD (MTFG),A + RET + ; + ;RECALIBRATION + ; +RCLB: PUSH HL + LD A,0BH + CPL + OUT (CR),A + CALL BUSY + CALL DLY60M + IN A,(CR) + CPL + AND 85H + XOR 04H + POP HL + RET Z + JP ERR + ; + ;BUSY AND WAIT + ; +BUSY: PUSH DE + PUSH HL + CALL DLY80U + LD E,07H +BUSY2: LD HL,0000H +BUSY0: DEC HL + LD A,H + OR L + JR Z,BUSY1 + IN A,(CR) + CPL + RRCA + JR C,BUSY0 + POP HL + POP DE + RET + ; +BUSY1: DEC E + JR NZ,BUSY2 + JP ERR + ; + ;DATA CHECK + ; +CONVRT: LD B,00H + LD DE,0010H + LD HL,(0CF1EH) + XOR A +TRANS: SBC HL,DE + JR C,TRANS1 + INC B + JR TRANS +TRANS1: ADD HL,DE + LD H,B + INC L + LD (IY+4),H + LD (IY+5),L +DCHK: LD A,(DRINO) + CP 04H + JR NC,DTCK1 + LD A,(IY+4) + CP 46H ;70D + JR NC,DTCK1 + LD A,(IY+5) + OR A + JR Z,DTCK1 + CP 11H ;17D + JR NC,DTCK1 + LD A,(IY+2) + OR (IY+3) + RET NZ +DTCK1: JP ERR + ; + ;SEQUENTIAL READ + ; +BREAD: DI + CALL CONVRT + LD A,0AH + LD (RETRY),A +READ1: CALL READY + LD D,(IY+3) + LD A,(IY+2) + OR A + JR Z,RE0 + INC D +RE0: LD A,(IY+5) + LD (IY+1),A + LD A,(IY+4) + LD (IY+0),A + PUSH IX + POP HL +RE8: SRL A + CPL + OUT (DR),A + JR NC,RE1 + LD A,01H + JR RE2 +RE1: LD A,00H +RE2: CPL + OUT (HS),A + CALL SEEK + JR NZ,REE + LD C,0DBH + LD A,(IY+0) + SRL A + CPL + OUT (TR),A + LD A,(IY+1) + CPL + OUT (SCR),A + EXX + LD HL,RE3 + PUSH HL + EXX + LD A,94H + CPL + OUT (CR),A + CALL WAIT +RE6: LD B,00H +RE4: IN A,(CR) + RRCA + RET C + RRCA + JR C,RE4 + INI + JR NZ,RE4 + INC (IY+1) + LD A,(IY+1) + CP 11H ;17D + JR Z,RETS + DEC D + JR NZ,RE6 + JR RE5 +RETS: DEC D +RE5: LD A,0D8H ;FORCE INTERRUPT + CPL + OUT (CR),A + CALL BUSY +RE3: IN A,(CR) + CPL + AND 0FFH + JR NZ,REE + EXX + POP HL + EXX + LD A,(IY+1) + CP 11H ;17D + JR NZ,REX + LD A,01H + LD (IY+1),A + INC (IY+0) +REX: LD A,D + OR A + JR NZ,RE7 + LD A,80H + OUT (DM),A + RET +RE7: LD A,(IY+0) + JR RE8 +REE: LD A,(RETRY) + DEC A + LD (RETRY),A + JR Z,ERR + CALL RCLB + JP READ1 + ; + ; WAIT AND BUSY OFF + ; +WAIT: PUSH DE + PUSH HL + CALL DLY80U + LD E,08H +WAIT2: LD HL,0000H +WAIT0: DEC HL + LD A,H + OR L + JR Z,WAIT1 + IN A,(CR) + CPL + RRCA + JR NC,WAIT0 + POP HL + POP DE + RET +WAIT1: DEC E + JR NZ,WAIT2 + JR ERR + ; +NMASTE: LD HL,MES14 + LD E,07H + LD C,1BH ;27D + CALL DISP + JR ERR1 + ; + ; ; + ; ERRROR OR BREAK ; + ; ; + ; +ERR: CALL BOOTER +ERR1: CALL MOFF +TRYAG2: LD SP,0FFE0H + ; + ;TRYAG + ; +TRYAG: CALL FDCC + JR NZ,TRYAG3 + LD HL,MES10 + LD E,5AH + LD C,0CH ;12D + CALL DISP2 + LD E,0ABH + LD C,11H ;17D + CALL DISP2 + LD E,0D3H + LD C,0FH ;15D + CALL DISP2 +TRYAG1: CALL KEYS1 + BIT 3,A + JP Z,CMT + BIT 6,A + JR Z,DNO + JR TRYAG1 +DNO: LD HL,MES13 ;DRIVE NO SELECT + LD E,0AH + LD C,0FH + CALL DISP +DNO10: LD D,12H + CALL DNO0 + JR NC,DNO3 + LD D,18H + CALL DNO0 + JR NC,DNO3 + JR DNO10 +DNO3: LD A,B + LD (DRINO),A + JP FD + ; +TRYAG3: LD HL,MES15 + LD E,54H + LD C,1DH ;29D + CALL DISP2 +TRYAG4: LD B,06H +TRYAG5: CALL KEYS + BIT 3,A + JP Z,CMT + JR TRYAG5 + ; +DNO0: IN A,(PIOA) + AND 0F0H + OR D + OUT (PIOA),A + IN A,(PIOB) + LD B,00H + LD C,04H + RRCA +DNO1: RRCA + RET NC + INC B + DEC C + JR NZ,DNO1 + RET + ; + ; TIME DELAY (1M &60M &80U ) + ; +DLY80U: PUSH DE + LD DE,000DH ;13D + JP DLYT +DLY1M: PUSH DE + LD DE,0082H ;130D + JP DLYT +DLY60M: PUSH DE + LD DE,1A2CH ;6700D +DLYT: DEC DE + LD A,E + OR D + JR NZ,DLYT + POP DE + RET + ; + ; + ; ; + ; INTRAM EXROM ; + ; ; + ; +EXROMT: LD HL,8000H + LD IX,EROM1 + JR SEROMA +EROM1: IN A,(0F9H) + CP 00H + JP NZ,NKIN + LD IX,EROM2 +ERMT1: JR SEROMA +EROM2: IN A,(0F9H) + LD (HL),A + INC HL + LD A,L + OR H + JR NZ,ERMT1 + OUT (0F8H),A + JP NST + ; +SEROMA: LD A,H + OUT (0F8H),A + LD A,L + OUT (0F9H),A + LD D,04H +SEROMD: DEC D + JR NZ,SEROMD + JP (IX) + +;---------------------------------------------------------- +; Variables/Work area +;---------------------------------------------------------- + +IBUFE: EQU 0CF00H +ATRB: EQU 0CF00H +NAME: EQU 0CF01H +SIZE: EQU 0CF12H +DTADR: EQU 0CF14H +SUMDT: EQU 0FFE0H +TMCNT: EQU 0FFE2H + ; + ; + ;INPUT BUFFER ADDRESS + ; +IBADR1: EQU 0CF00H +IBADR2: EQU 8000H + ; + ; SUBROUTINE WORK + ; +NTRACK: EQU 0FFE0H +NSECT: EQU 0FFE1H +BSIZE: EQU 0FFE2H +STTR: EQU 0FFE4H +STSE: EQU 0FFE5H +MTFG: EQU 0FFE6H +CLBF0: EQU 0FFE7H +CLBF1: EQU 0FFE8H +CLBF2: EQU 0FFE9H +CLBF3: EQU 0FFEAH +RETRY: EQU 0FFEBH +DRINO: EQU 0FFECH + + ; + ; + ; + ; + ; + ; MFM MINIFLOPPY CONTROL + ; + ; + ; + ; CASE OF DISK INITIALIZE + ; DRIVE NO=DRINO (0-3) + ; + ; CASE OF SEQUENTIAL READ + ; DRIVE NO=DRINO (0-3) + ; BYTE SIZE =IY+2,3 + ; ADDRESS =IX+0,1 + ; NEXT TRACK =IY+0 + ; NEXT SECTOR =IY+1 + ; START TRACK =IY+4 + ; START SECTOR =IY+5 + ; + ; + ; I/O PORT ADDRESS + ; +CR: EQU 0D8H ;STATUS/COMMAND PORT +TR: EQU 0D9H ;TRACK REG PORT +SCR: EQU 0DAH ;SECTOR REG PORT +DR: EQU 0DBH ;DATA REG PORT +DM: EQU 0DCH ;MOTOR/DRIVE PORT +HS: EQU 0DDH ;HEAD SIDE SELECT PORT +PPIA: EQU 0E0H +PPIB: EQU 0E1H +PPIC: EQU 0E2H +PPICTL: EQU 0E3H +PIOA: EQU 0E8H +PIOCTLA:EQU 0E9H +PIOB: EQU 0EAH +PIOCTLB:EQU 0EBH +GRPHCTL:EQU 0F4H diff --git a/software/asm/include/CPM_Definitions.asm b/software/asm/include/CPM_Definitions.asm index 64033b3..791068f 100644 --- a/software/asm/include/CPM_Definitions.asm +++ b/software/asm/include/CPM_Definitions.asm @@ -312,10 +312,15 @@ TZSVC_CMD_ERASEFILE: EQU 08H ; Servi TZSVC_CMD_CHANGEDIR: EQU 09H ; Service command to change the active directory on the SD card. TZSVC_CMD_LOAD40BIOS: EQU 20H ; Service command requesting that the 40 column version of the SA1510 BIOS is loaded. TZSVC_CMD_LOAD80BIOS: EQU 21H ; Service command requesting that the 80 column version of the SA1510 BIOS is loaded. +TZSVC_CMD_LOAD700BIOS40:EQU 22H ; Service command requesting that the MZ700 1Z-013A 40 column BIOS is loaded. +TZSVC_CMD_LOAD700BIOS80:EQU 23H ; Service command requesting that the MZ700 1Z-013A 80 column patched BIOS is loaded. TZSVC_CMD_LOADBDOS: EQU 30H ; Service command to reload CPM BDOS+CCP. TZSVC_CMD_ADDSDDRIVE: EQU 31H ; Service command to attach a CPM disk to a drive number. TZSVC_CMD_READSDDRIVE: EQU 32H ; Service command to read an attached SD file as a CPM disk drive. TZSVC_CMD_WRITESDDRIVE: EQU 33H ; Service command to write to a CPM disk drive which is an attached SD file. +TZSVC_CMD_CPU_BASEFREQ EQU 40H ; Service command to switch to the mainboard frequency. +TZSVC_CMD_CPU_ALTFREQ EQU 41H ; Service command to switch to the alternate frequency provided by the K64F. +TZSVC_CMD_CPU_CHGFREQ EQU 42H ; Service command to set the alternate frequency in hertz. TZSVC_STATUS_OK: EQU 000H ; Flag to indicate the K64F processing completed successfully. TZSVC_STATUS_REQUEST: EQU 0FEH ; Flag to indicate the Z80 has made a request to the K64F. TZSVC_STATUS_PROCESSING:EQU 0FFH ; Flag to indicate the K64F is processing a command. diff --git a/software/asm/include/TZFS_Definitions.asm b/software/asm/include/TZFS_Definitions.asm index be63a61..f345e76 100644 --- a/software/asm/include/TZFS_Definitions.asm +++ b/software/asm/include/TZFS_Definitions.asm @@ -355,12 +355,13 @@ TZSVCWAITCOUNT: EQU 65535 ; Wait TZSVCCMD: DS virtual 1 ; Service command. TZSVCRESULT: DS virtual 1 ; Service command result. TZSVCDIRSEC: DS virtual 1 ; Storage for the directory sector number. -TZSVC_FILE_SEC: EQU TZSVC_DIR_SEC ; Union of the file and directory sector as only one can be used at a time. +TZSVC_FILE_SEC: EQU TZSVCDIRSEC ; Union of the file and directory sector as only one can be used at a time. TZSVC_TRACK_NO: DS virtual 2 ; Storage for the virtual drive track number. TZSVC_SECTOR_NO: DS virtual 2 ; Storage for the virtual drive sector number. TZSVC_FILE_NO: DS virtual 1 ; File number to be opened in a file service command. TZSVC_LOADADDR: DS virtual 2 ; Dynamic load address for rom/images. TZSVC_LOADSIZE: DS virtual 2 ; Size of image to load. +TZSVC_CPU_FREQ: EQU TZSVC_LOADADDR ; Union of the load address and the cpu frequency change value, only one can be used at a time. TZSVC_DIRNAME: DS virtual TZSVCDIRSZ ; Service directory/file name. TZSVC_FILENAME: DS virtual TZSVCFILESZ ; Filename to be opened/created. TZSVCWILDC: DS virtual TZSVCWILDSZ ; Directory wildcard for file pattern matching. @@ -377,10 +378,15 @@ TZSVC_CMD_ERASEFILE: EQU 08H ; Servi TZSVC_CMD_CHANGEDIR: EQU 09H ; Service command to change the active directory on the SD card. TZSVC_CMD_LOAD40BIOS: EQU 20H ; Service command requesting that the 40 column version of the SA1510 BIOS is loaded. TZSVC_CMD_LOAD80BIOS: EQU 21H ; Service command requesting that the 80 column version of the SA1510 BIOS is loaded. +TZSVC_CMD_LOAD700BIOS40:EQU 22H ; Service command requesting that the MZ700 1Z-013A 40 column BIOS is loaded. +TZSVC_CMD_LOAD700BIOS80:EQU 23H ; Service command requesting that the MZ700 1Z-013A 80 column patched BIOS is loaded. TZSVC_CMD_LOADBDOS: EQU 30H ; Service command to reload CPM BDOS+CCP. TZSVC_CMD_ADDSDDRIVE: EQU 31H ; Service command to attach a CPM disk to a drive number. TZSVC_CMD_READSDDRIVE: EQU 32H ; Service command to read an attached SD file as a CPM disk drive. TZSVC_CMD_WRITESDDRIVE: EQU 33H ; Service command to write to a CPM disk drive which is an attached SD file. +TZSVC_CMD_CPU_BASEFREQ EQU 40H ; Service command to switch to the mainboard frequency. +TZSVC_CMD_CPU_ALTFREQ EQU 41H ; Service command to switch to the alternate frequency provided by the K64F. +TZSVC_CMD_CPU_CHGFREQ EQU 42H ; Service command to set the alternate frequency in hertz. TZSVC_STATUS_OK: EQU 000H ; Flag to indicate the K64F processing completed successfully. TZSVC_STATUS_REQUEST: EQU 0FEH ; Flag to indicate the Z80 has made a request to the K64F. TZSVC_STATUS_PROCESSING:EQU 0FFH ; Flag to indicate the K64F is processing a command. diff --git a/software/asm/include/TZFS_Utilities.asm b/software/asm/include/TZFS_Utilities.asm index 7452509..e1b3761 100644 --- a/software/asm/include/TZFS_Utilities.asm +++ b/software/asm/include/TZFS_Utilities.asm @@ -427,13 +427,13 @@ ConvertStringToNumber: IF USE_CNVSTRTONUM = 1 JR Z,@Char ;Yes, so its a character CP '"' ;Does string start with '"' ? JR Z,@Char ;Yes, so its a character -;; CALL IsCharNumeric ;Is first character '0' to '9' ? -;; JR NC,@Failure ;No, so invalid number +; CALL IsCharNumeric ;Is first character '0' to '9' ? +; JR NC,@Failure ;No, so invalid number ; CALL IsCharHex ;Is first character hexadecimal ? ; JR NC,@Failure ;No, so invalid hex character CP '0' ;Is first character '0' ? - JR NZ,@HexNext ;No, so default to hexadecimal -; JR NZ,@DecNext ;No, so default to decimal +; JR NZ,@HexNext ;No, so default to hexadecimal + JR NZ,@DecNext ;No, so default to decimal INC DE ;Point to next character in string LD A,(DE) ;Get character from string CALL ConvertCharToUCase diff --git a/software/asm/monitor_1Z-013A.asm b/software/asm/monitor_1Z-013A.asm new file mode 100644 index 0000000..7bb488b --- /dev/null +++ b/software/asm/monitor_1Z-013A.asm @@ -0,0 +1,7 @@ +; Configurable parameters. +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. +MODE80C:EQU 0 + + INCLUDE "1Z-013A.asm" diff --git a/software/asm/monitor_80c_1Z-013A.asm b/software/asm/monitor_80c_1Z-013A.asm new file mode 100644 index 0000000..3c1f57e --- /dev/null +++ b/software/asm/monitor_80c_1Z-013A.asm @@ -0,0 +1,7 @@ +; Configurable parameters. +COLW: EQU 80 ; 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. +MODE80C:EQU 1 + + INCLUDE "1Z-013A.asm" diff --git a/software/asm/sa1510.asm b/software/asm/sa1510.asm index 8364bbc..afae345 100644 --- a/software/asm/sa1510.asm +++ b/software/asm/sa1510.asm @@ -1966,307 +1966,344 @@ DACN1: OR A LD A,L JR DACN2 -KTBL: DB 022H - DB 021H - DB 017H - DB 011H - DB 001H - DB 0C7H - DB 000H - DB 01AH - DB 024H - DB 023H - DB 012H - DB 005H - DB 004H - DB 013H - DB 018H - DB 003H - DB 026H - DB 025H - DB 019H - DB 014H - DB 007H - DB 006H - DB 016H - DB 002H - DB 028H - DB 027H - DB 009H - DB 015H - DB 00AH - DB 008H - DB 00EH - DB 000H - DB 020H - DB 029H - DB 010H - DB 00FH - DB 00CH - DB 00BH - DB 02FH - DB 00DH - DB 0BEH - DB 02AH - DB 052H - DB 055H - DB 04FH - DB 02CH - DB 02DH - DB 02EH - DB 0C5H - DB 059H - DB 0C3H - DB 0C2H - DB 0CDH - DB 054H - DB 000H - DB 049H - DB 028H - DB 027H - DB 025H - DB 024H - DB 022H - DB 021H - DB 0E7H - DB 020H - DB 06AH - DB 029H - DB 02AH - DB 026H - DB 000H - DB 023H - DB 000H - DB 02EH +KTBL: ;S0 00 - 07 ; + DB 022H ; 2 + DB 021H ; 1 + DB 017H ; W + DB 011H ; Q + DB 001H ; A + DB 0C7H ; DEL + DB 000H ; NULL + DB 01AH ; Z + ;S1 08 - 0F ; + DB 024H ; 4 + DB 023H ; 3 + DB 012H ; R + DB 005H ; E + DB 004H ; D + DB 013H ; S + DB 018H ; X + DB 003H ; C + ;S2 10 - 17 ; + DB 026H ; 6 + DB 025H ; 5 + DB 019H ; Y + DB 014H ; T + DB 007H ; G + DB 006H ; F + DB 016H ; V + DB 002H ; B + ;S3 18 - 1F ; + DB 028H ; 8 + DB 027H ; 7 + DB 009H ; I + DB 015H ; U + DB 00AH ; J + DB 008H ; H + DB 00EH ; N + DB 000H ; SPACE + ;S4 20 - 27 ; + DB 020H ; 0 + DB 029H ; 9 + DB 010H ; P + DB 00FH ; O + DB 00CH ; L + DB 00BH ; K + DB 02FH ; , + DB 00DH ; M + ;S5 28 - 2F ; + DB 0BEH ; ^ + DB 02AH ; - + DB 052H ; [ + DB 055H ; @ + DB 04FH ; : + DB 02CH ; ; + DB 02DH ; / + DB 02EH ; . + ;S6 30 - 37 ; + DB 0C5H ; HOME + DB 059H ; \ + DB 0C3H ; CURSOR RIGHT + DB 0C2H ; CURSOR UP + DB 0CDH ; CR + DB 054H ; ] + DB 000H ; NULL + DB 049H ; ? + ;S7 38 - 3F ; + DB 028H ; 8 + DB 027H ; 7 + DB 025H ; 5 + DB 024H ; 4 + DB 022H ; 2 + DB 021H ; 1 + DB 0E7H ; 00 + DB 020H ; 0 + ; S8 ; + DB 06AH ; * + DB 029H ; 9 + DB 02AH ; - + DB 026H ; 6 + DB 000H ; NULL + DB 023H ; 3 + DB 000H ; NULL + DB 02EH ; , -KTBLS: DB 062H - DB 061H - DB 097H - DB 091H - DB 081H - DB 0C8H - DB 000H - DB 09AH - DB 064H - DB 063H - DB 092H - DB 085H - DB 084H - DB 093H - DB 098H - DB 083H - DB 066H - DB 065H - DB 099H - DB 094H - DB 087H - DB 086H - DB 096H - DB 082H - DB 068H - DB 067H - DB 089H - DB 095H - DB 08AH - DB 088H - DB 08EH - DB 000H - DB 0BFH - DB 069H - DB 090H - DB 08FH - DB 08CH - DB 08BH - DB 051H - DB 08DH - DB 0A5H - DB 02BH - DB 0BCH - DB 0A4H - DB 06BH - DB 06AH - DB 045H - DB 057H - DB 0C6H - DB 080H - DB 0C4H - DB 0C1H - DB 0CDH - DB 040H - DB 000H - DB 050H +KTBLS: ;S0 00 - 07 ; + DB 062H ; " + DB 061H ; ! + DB 097H ; w + DB 091H ; q + DB 081H ; a + DB 0C8H ; INSERT + DB 000H ; NULL + DB 09AH ; z + ;S1 08 - 0F ; + DB 064H ; $ + DB 063H ; # + DB 092H ; r + DB 085H ; e + DB 084H ; d + DB 093H ; s + DB 098H ; x + DB 083H ; c + ;S2 10 - 17 ; + DB 066H ; & + DB 065H ; % + DB 099H ; y + DB 094H ; t + DB 087H ; g + DB 086H ; f + DB 096H ; v + DB 082H ; b + ;S3 18 - 1F ; + DB 068H ; ( + DB 067H ; ' + DB 089H ; i + DB 095H ; u + DB 08AH ; j + DB 088H ; h + DB 08EH ; n + DB 000H ; SPACE + ;S4 20 - 27 ; + DB 0BFH ; _ + DB 069H ; ) + DB 090H ; p + DB 08FH ; o + DB 08CH ; l + DB 08BH ; k + DB 051H ; < + DB 08DH ; m + ;S5 28 - 2F ; + DB 0A5H ; ~ + DB 02BH ; = + DB 0BCH ; ( + DB 0A4H ; ' + DB 06BH ; # + DB 06AH ; + + DB 045H ; <- + DB 057H ; > + ;S6 30 - 37 ; + DB 0C6H ; CLR + DB 080H ; | + DB 0C4H ; CURSOR LEFT + DB 0C1H ; CURSOR DOWN + DB 0CDH ; CR + DB 040H ; ) + DB 000H ; NULL + DB 050H ; UP^ + ; +KTBLG: ;S0 00 - 07 ; + DB 03EH ; #2 + DB 037H ; #1 + DB 038H ; #W + DB 03CH ; #Q + DB 053H ; #A + DB 0C7H ; #DEL + DB 000H ; #NULL + DB 076H ; #Z + ;S1 08 - 0F ; + DB 07BH ; #4 + DB 07FH ; #3 + DB 030H ; #R + DB 034H ; #E + DB 047H ; #D + DB 044H ; #S + DB 06DH ; #X + DB 0DEH ; #C + ;S2 10 - 17 ; + DB 05EH ; #6 + DB 03AH ; #5 + DB 075H ; #Y + DB 071H ; #T + DB 04BH ; #G + DB 04AH ; #F + DB 0DAH ; #V + DB 06FH ; #B + ;S3 18 - 1F ; + DB 0BDH ; #8 + DB 01FH ; #7 + DB 07DH ; #I + DB 079H ; #U + DB 05CH ; #J + DB 072H ; #H + DB 032H ; #N + DB 000H ; SPACE + ;S4 20 - 27 ; + DB 09CH ; #0 + DB 0A1H ; #9 + DB 0D6H ; #P + DB 0B0H ; #O + DB 0B4H ; #L + DB 05BH ; #K + DB 060H ; #, + DB 01CH ; #M + ;S5 28 - 2F ; + DB 09EH ; #^ + DB 0D2H ; #- + DB 0D8H ; #[ + DB 0B2H ; #@ + DB 0B6H ; ##: + DB 042H ; #; + DB 0DBH ; #/ + DB 0B8H ; #. + ;S6 30 - 37 ; + DB 0C5H ; HOME + DB 0D4H ; #\ + DB 0C3H ; CURSOR RIGHT + DB 0C2H ; CURSOR UP + DB 0CDH ; CR + DB 04EH ; #J + DB 000H ; NULL + DB 0BAH ; #? + ; +KTBLGS: ;S0 00 - 07 ; + DB 036H ; ?2 + DB 03FH ; ?1 + DB 078H ; ?W + DB 07CH ; ?Q + DB 046H ; ?A + DB 0C8H ; INST + DB 000H ; NULL + DB 077H ; ?Z + ;S1 08 - 0F ; + DB 03BH ; ?4 + DB 07EH ; ?3 + DB 070H ; ?R + DB 074H ; ?E + DB 048H ; ?D + DB 041H ; ?S + DB 0DDH ; ?X + DB 0D9H ; C + ;S2 10 - 17 ; + DB 01EH ; ?6 + DB 07AH ; ?5 + DB 035H ; ?Y + DB 031H ; ?T + DB 04CH ; ?G + DB 043H ; ?F + DB 0A6H ; ?V + DB 06EH ; ?B + ;S3 18 - 1F ; + DB 0A2H ; ?8 + DB 05FH ; ?7 + DB 03DH ; ?I + DB 039H ; ?U + DB 05DH ; ?J + DB 073H ; ?H + DB 033H ; ?N + DB 000H ; SPACE + ;S4 20 - 27 ; + DB 09DH ; ?0 + DB 0A3H ; ?9 + DB 0B1H ; ?P + DB 0D5H ; ?O + DB 056H ; ?L + DB 06CH ; ?K + DB 0D0H ; ?, + DB 01DH ; ?M + ;S5 28 - 2F ; + DB 09FH ; ?^ + DB 0D1H ; ?- + DB 0B3H ; ?[ + DB 0D7H ; ?@ + DB 04DH ; ?: + DB 0B5H ; ?; + DB 01BH ; ?/ + DB 0B9H ; ?. + ;S6 30 - 37 ; + DB 0C6H ; CLR + DB 0D3H ; ?\ + DB 0C4H ; CURSOR RIGHT + DB 0C1H ; CURSOR UP + DB 0CDH ; CR + DB 0B7H ; ?J + DB 000H ; NULL + DB 0BBH ; ?? + ; +KTBLC: ;S0 00 - 07 ; + DB 0F0H ; CODE 80H=NOT KEY + DB 0F0H ; + DB 0E2H ; CTRL + W + DB 0C1H ; CTRL + Q + DB 0E0H ; CTRL + A SHIFT LOCK + DB 0F0H ; + DB 000H ; + DB 0E5H ; CTRL + Z + ;S1 08 - 0F ; + DB 0F0H ; + DB 0F0H ; + DB 0C2H ; CTRL + R + DB 0CFH ; CTRL + E ROLL DOWN + DB 0CEH ; CTRL + D ROLL UP + DB 0C3H ; CTRL + S + DB 0E3H ; CTRL + X + DB 0F3H ; CTRL + C + ;S2 10 - 17 ; + DB 0F0H ; + DB 0F0H ; + DB 0E4H ; CTRL + Y + DB 0C4H ; CTRL + T + DB 0F7H ; CTRL + G + DB 0F6H ; CTRL + F + DB 0C6H ; CTRL + V CLR + DB 0F2H ; CTRL + B + ;S3 18 - 1F ; + DB 0F0H ; + DB 0F0H ; + DB 0F9H ; CTRL + I + DB 0C5H ; CTRL + U HOME + DB 0FAH ; CTRL + J + DB 0F8H ; CTRL + H + DB 0FEH ; CTRL + N + DB 0F0H ; + ;S4 20 - 27 ; + DB 0F0H ; + DB 0F0H ; + DB 0E1H ; CTRL + P + DB 0FFH ; CTRL + O + DB 0FCH ; CTRL + L + DB 0FBH ; CTRL + K + DB 0F0H ; + DB 0FDH ; CTRL + M + ;S5 28 - 2F ; + DB 0EFH ; CTRL + ^ + DB 0F4H ; CTRL + - + DB 0E6H ; CTRL + [ + DB 0CCH ; CTRL + @ REVERSE + DB 0F0H ; + DB 0F0H ; + DB 0F0H ; + DB 0F0H ; + ;S6 30 - 37 ; + DB 0F0H ; + DB 0EBH ; CTRL + \ + DB 0F0H ; + DB 0F0H ; + DB 0F0H ; + DB 0EEH ; CTRL + ] + DB 0F0H ; -KTBLG: DB 03EH - DB 037H - DB 038H - DB 03CH - DB 053H - DB 0C7H - DB 000H - DB 076H - DB 07BH - DB 07FH - DB 030H - DB 034H - DB 047H - DB 044H - DB 06DH - DB 0DEH - DB 05EH - DB 03AH - DB 075H - DB 071H - DB 04BH - DB 04AH - DB 0DAH - DB 06FH - DB 0BDH - DB 01FH - DB 07DH - DB 079H - DB 05CH - DB 072H - DB 032H - DB 000H - DB 09CH - DB 0A1H - DB 0D6H - DB 0B0H - DB 0B4H - DB 05BH - DB 060H - DB 01CH - DB 09EH - DB 0D2H - DB 0D8H - DB 0B2H - DB 0B6H - DB 042H - DB 0DBH - DB 0B8H - DB 0C5H - DB 0D4H - DB 0C3H - DB 0C2H - DB 0CDH - DB 04EH - DB 000H - DB 0BAH - -KTBLGS: DB 036H - DB 03FH - DB 078H - DB 07CH - DB 046H - DB 0C8H - DB 000H - DB 077H - DB 03BH - DB 07EH - DB 070H - DB 074H - DB 048H - DB 041H - DB 0DDH - DB 0D9H - DB 01EH - DB 07AH - DB 035H - DB 031H - DB 04CH - DB 043H - DB 0A6H - DB 06EH - DB 0A2H - DB 05FH - DB 03DH - DB 039H - DB 05DH - DB 073H - DB 033H - DB 000H - DB 09DH - DB 0A3H - DB 0B1H - DB 0D5H - DB 056H - DB 06CH - DB 0D0H - DB 01DH - DB 09FH - DB 0D1H - DB 0B3H - DB 0D7H - DB 04DH - DB 0B5H - DB 01BH - DB 0B9H - DB 0C6H - DB 0D3H - DB 0C4H - DB 0C1H - DB 0CDH - DB 0B7H - DB 000H - DB 0BBH - -KTBLC: DB 0F0H - DB 0F0H - DB 0E2H - DB 0C1H - DB 0E0H - DB 0F0H - DB 000H - DB 0E5H - DB 0F0H - DB 0F0H - DB 0C2H - DB 0CFH - DB 0CEH - DB 0C3H - DB 0E3H - DB 0F3H - DB 0F0H - DB 0F0H - DB 0E4H - DB 0C4H - DB 0F7H - DB 0F6H - DB 0C6H - DB 0F2H - DB 0F0H - DB 0F0H - DB 0F9H - DB 0C5H - DB 0FAH - DB 0F8H - DB 0FEH - DB 0F0H - DB 0F0H - DB 0F0H - DB 0E1H - DB 0FFH - DB 0FCH - DB 0FBH - DB 0F0H - DB 0FDH - DB 0EFH - DB 0F4H - DB 0E6H - DB 0CCH - DB 0F0H - DB 0F0H - DB 0F0H - DB 0F0H - DB 0F0H - DB 0EBH - DB 0F0H - DB 0F0H - DB 0F0H - DB 0EEH - DB 0F0H - -?BRK: LD A,0F0H +?BRK: LD A,0F0H LD (KEYPA),A NOP LD A,(KEYPB) @@ -2468,7 +2505,7 @@ SCROL2: RES 3,H LD (HL),A INC HL DJNZ SCROL2 - LD A,(PBIAS) ; PBIAS is the offest for hardware scroll. + LD A,(PBIAS) ; PBIAS is the offest for hardare scroll. LD L,A LD H,SCLBASE ; Hardware scroll region, E2 LD A,(HL) diff --git a/software/asm/tzfs.asm b/software/asm/tzfs.asm index 85da94a..2b07a0a 100644 --- a/software/asm/tzfs.asm +++ b/software/asm/tzfs.asm @@ -196,6 +196,12 @@ CMDTABLE: DB 000H | 000H | 000H | 001H ; Bit 2 DB 000H | 000H | 000H | 001H DB '8' ; 80 Char screen mode. DW SETMODE80 + DB 000H | 000H | 000H | 004H + DB "7008" ; Switch to 80 column MZ700 mode. + DW SETMODE7008 + DB 000H | 000H | 000H | 003H + DB "700" ; Switch to 40 column MZ700 mode. + DW SETMODE700 DB 000H | 000H | 000H | 005H DB "BASIC" ; Load and run BASIC SA-5510. DW LOADBASIC @@ -214,6 +220,9 @@ CMDTABLE: DB 000H | 000H | 000H | 001H ; Bit 2 DB 000H | 000H | 000H | 002H DB "EC" ; Erase file. DW ERASESD + DB 000H | 000H | 000H | 004H + DB "FREQ" ; Set or change the CPU frequency. + DW SETFREQ DB 000H | 000H | 000H | 001H DB 'F' ; RFS Floppy boot code. DW FLOPPY @@ -518,6 +527,48 @@ SETMODE80: LD A, 128 LD A,TZSVC_CMD_LOAD80BIOS ; Request the I/O processor loads the SA1510 80column BIOS into memory. JR SETBIOS +SETMODE700: LD A, 0 + LD (DSPCTL), A + LD (SCRNMODE),A ; 0 = 40char mode on reset. + ; + LD A,TZSVC_CMD_LOAD700BIOS40 ; Request the I/O processor loads the MZ700 1Z-013A 40column BIOS into memory. + JR SETBIOS +SETMODE7008:LD A, 128 + LD (DSPCTL), A + LD A,1 + LD (SCRNMODE),A + LD A,TZSVC_CMD_LOAD700BIOS80 ; Request the I/O processor loads the SA1510 80column BIOS into memory. + JR SETBIOS + + + ; Method to enable/disable the alternate CPU frequency and change it's values. + ; +SETFREQ: CALL ConvertStringToNumber ; Convert the input into 0 (disable) or frequency in KHz. + JR NZ,BADNUMERR + LD (TZSVC_CPU_FREQ),HL ; Set the required frequency in the service structure. + LD A,H + CP L + JR NZ,SETFREQ1 + LD A, TZSVC_CMD_CPU_BASEFREQ ; Switch to the base frequency. + JR SETFREQ2 +SETFREQ1: LD A, TZSVC_CMD_CPU_ALTFREQ ; Switch to the base frequency. +SETFREQ2: CALL SVC_CMD + OR A + JR NZ,SETFREQERR + LD A,H + CP L + RET Z ; If we are disabling the alternate cpu frequency (ie. = 0) exit. + LD A, TZSVC_CMD_CPU_CHGFREQ ; Switch to the base frequency. + CALL SVC_CMD + OR A + JR NZ,SETFREQERR + RET + ; +SETFREQERR: LD DE,MSGFREQERR + JR BADNUM2 +BADNUMERR: LD DE,MSGBADNUM +BADNUM2: CALL ?PRINTMSG + RET ; ; Memory correction @@ -1450,6 +1501,7 @@ PRTDIR4: OR A RET + ; Method to request a sector full of directory entries from the I/O processor. ; ; Inputs: diff --git a/software/asm/tzfs_bank2.asm b/software/asm/tzfs_bank2.asm index cff71f7..100e20f 100644 --- a/software/asm/tzfs_bank2.asm +++ b/software/asm/tzfs_bank2.asm @@ -343,13 +343,17 @@ HELP: ;CALL NL ; Help text. Use of lower case, due to Sharp's non standard character set, is not easy, you have to manually code each byte ; hence using upper case. -HELPSCR: DB "4 - 40 col mode.", 00DH +HELPSCR: ; "--------- 40 column width -------------" + DB "4 - 40 col mode.", 00DH DB "8 - 80 col mode.", 00DH + DB "700 - Select MZ-700 Mode.", 00DH + DB "7008 - Select MZ-700 80 col Mode.", 00DH DB "B - toggle keyboard bell.", 00DH DB "C[b] - clear memory $1200-$D000.", 00DH DB "DXXXX[YYYY] - dump mem XXXX to YYYY.", 00DH DB "EC[fn]- erase file, fn=No or Filename", 00DH DB "F[x] - boot fd drive x.", 00DH + DB "FREQ[n]-set CPU to nKHz, 0 for default.", 00DH DB "H - this help screen.", 00DH DB "IC[wc]- SD dir listing, wc=wildcard.", 00DH DB "JXXXX - jump to location XXXX.", 00DH @@ -379,45 +383,46 @@ HELPSCR: DB "4 - 40 col mode.", 00DH ; Message table ; ;------------------------------------------------------------------------------- -MSGSON: DB "+ TZFS v1.0 **" ,00DH, 000H ; Version 1.0-> first split from RFS v2.0 -MSGNOTFND: DB "Not Found", 00DH, 000H -MSGBADCMD: DB "???", 00DH, 000H -MSGSDRERR: DB "SD Read error, Sec:",0FBH, 000H -MSGSVFAIL: DB "Save failed.", 00DH, 000H -MSGERAFAIL: DB "Erase failed.", 00DH, 000H -MSGCDFAIL: DB "Directory invalid.", 00DH, 000H -MSGERASEDIR:DB "Deleted dir entry:",0FBH, 000H -MSGCMTDATA: DB "Load:",0FEH,",Exec:",0FFH, ",Size:",0FBH, 00DH, 000H -MSGNOTBIN: DB "Not binary", 00DH, 000H -MSGLOAD: DB 00DH, "Loading ",'"',0FAH,'"', 00DH, 000H -MSGSAVE: DB 00DH, "Filename: ", 000H -MSGE1: DB 00DH, "Check sum error!", 00DH, 000H ; Check sum error. -MSGCMTWRITE:DB 00DH, "Writing ", '"',0FAH,'"', 00DH, 000H -MSGOK: DB 00DH, "OK!", 00DH, 000H -MSGSAVEOK: DB "Tape image saved.", 00DH, 000H -MSGBOOTDRV: DB 00DH, "Floppy boot drive ?", 000H -MSGLOADERR: DB 00DH, "Disk loading error", 00DH, 000H -MSGIPLLOAD: DB 00DH, "Disk loading ", 000H -MSGDSKNOTMST:DB 00DH, "This is not a boot disk",00Dh, 000H -MSGINITM: DB "Init memory", 00DH, 000H -MSGREAD4HEX:DB "Bad hex number", 00DH, 000H -MSGT2SDERR: DB "Copy from Tape to SD Failed", 00DH, 000H -MSGSD2TERR: DB "Copy from SD to Tape Failed", 00DH, 000H -MSGT2SDOK: DB "Success, Tape to SD done.", 00DH, 000H -MSGSD2TOK: DB "Success, SD to Tape done.", 00DH, 000H -MSGFAILBIOS:DB "Failed to load alternate BIOS!",00DH, 000H +MSGSON: DB "+ TZFS v1.0 **", 00DH, 000H ; Version 1.0-> first split from RFS v2.0 +MSGNOTFND: DB "Not Found", 00DH, 000H +MSGBADCMD: DB "???", 00DH, 000H +MSGSDRERR: DB "SD Read error, Sec:",0FBH, 000H +MSGSVFAIL: DB "Save failed.", 00DH, 000H +MSGERAFAIL: DB "Erase failed.", 00DH, 000H +MSGCDFAIL: DB "Directory invalid.", 00DH, 000H +MSGERASEDIR:DB "Deleted dir entry:",0FBH, 000H +MSGCMTDATA: DB "Load:",0FEH,",Exec:",0FFH, ",Size:", 0FBH, 00DH, 000H +MSGNOTBIN: DB "Not binary", 00DH, 000H +MSGLOAD: DB 00DH, "Loading ",'"',0FAH,'"', 00DH, 000H +MSGSAVE: DB 00DH, "Filename: ", 000H +MSGE1: DB 00DH, "Check sum error!", 00DH, 000H ; Check sum error. +MSGCMTWRITE:DB 00DH, "Writing ", '"',0FAH,'"', 00DH, 000H +MSGOK: DB 00DH, "OK!", 00DH, 000H +MSGSAVEOK: DB "Tape image saved.", 00DH, 000H +MSGBOOTDRV: DB 00DH, "Floppy boot drive ?", 000H +MSGLOADERR: DB 00DH, "Disk loading error", 00DH, 000H +MSGIPLLOAD: DB 00DH, "Disk loading ", 000H +MSGDSKNOTMST:DB 00DH, "This is not a boot disk", 00Dh, 000H +MSGINITM: DB "Init memory", 00DH, 000H +MSGREAD4HEX:DB "Bad hex number", 00DH, 000H +MSGT2SDERR: DB "Copy from Tape to SD Failed", 00DH, 000H +MSGSD2TERR: DB "Copy from SD to Tape Failed", 00DH, 000H +MSGT2SDOK: DB "Success, Tape to SD done.", 00DH, 000H +MSGSD2TOK: DB "Success, SD to Tape done.", 00DH, 000H +MSGFAILBIOS:DB "Failed to load alternate BIOS!", 00DH, 000H +MSGFREQERR: DB "Error, failed to change frequency!". 00DH, 000H +MSGBADNUM: DB "Error, bad number supplied!", 00DH, 000H ; -OKCHECK: DB ", CHECK: ", 00Dh, 000H -OKMSG: DB " OK.", 00Dh, 000H +OKCHECK: DB ", CHECK: ", 00Dh, 000H +OKMSG: DB " OK.", 00Dh, 000H DONEMSG: DB 11h - DB "RAM TEST COMPLETE.", 00Dh, 000H - -BITMSG: DB " BIT: ", 00Dh, 000H -BANKMSG: DB " BANK: ", 00Dh, 000H -MSG_TIMERTST:DB "8253 TIMER TEST", 00Dh, 000H -MSG_TIMERVAL:DB "READ VALUE 1: ", 00Dh, 000H -MSG_TIMERVAL2:DB "READ VALUE 2: ", 00Dh, 000H -MSG_TIMERVAL3:DB "READ DONE.", 00Dh, 000H + DB "RAM TEST COMPLETE.", 00Dh, 000H +BITMSG: DB " BIT: ", 00Dh, 000H +BANKMSG: DB " BANK: ", 00Dh, 000H +MSG_TIMERTST:DB "8253 TIMER TEST", 00Dh, 000H +MSG_TIMERVAL:DB "READ VALUE 1: ", 00Dh, 000H +MSG_TIMERVAL2:DB "READ VALUE 2: ", 00Dh, 000H +MSG_TIMERVAL3:DB "READ DONE.", 00Dh, 000H SVCRESPERR: DB "I/O Response Error, time out!",00DH, 000H SVCIOERR: DB "I/O Error, time out!", 00DH, 000H diff --git a/software/roms/MZ80B_IPL.rom b/software/roms/MZ80B_IPL.rom new file mode 100644 index 0000000000000000000000000000000000000000..f46fa390b97e569257647b2217f6c668710504ad GIT binary patch literal 1567 zcmY*ZZERCj7(Vx_UAwJaVJnv*QWx#*olW<%*Vn88w`}ii^r}Eg$pF7~Tnk z>_YJl`NeqKjR%5QWvWf*CmvqZ^64p+bf6pCIk8IlvQ0~o+d?|^y-Kb!WHn2EXUI3m zw}NY&B#X+l&$=20KUsEl`(A_R*aVVTeW2dd_9F*@>S8@K$kr&dD?VNJ0tn z3FEVo1B}l?(#Xfh56K*OJW=PI6|=jRB_z}@j*blH*0ba^vlV;CidG#%-ISEzJ zsCBY62lxgWc5A$D9iAc*b1n<^+S>Rb%xqXYZZwV?)OAWOtiuJm%ix(N*h!3d8>S@L zz^1bkuc$y3RxGcPK4sy-Hu~T}COzdg`|Q+!=V{s+SdwBWC#4$7Rj*|rS7MV=q1}az zV$trZQiyf&wif`dl6jhK#i?aPE6wQx1`3y17e>d)m;G>~HXV>w=&rYFkIN^6gVI06c;n3l5;Mkr(cMykzfzDI7bx-^5G5`m| z;ZXQFlYi&_a4-_Vehk=Ff3yE+sHf)??(B+m2cywoYjbNL5}`XB4fF(ehP&Pm;=Q33 zEN^bwvZ4J5Q2Ec5(mEcB;$wkGG#FlrN;$obyMw22BpL`uBRF~_NXhuSjt23uP-n1A zhk65cflU83KF(NC~?lq08kusB}gOs2i{KMcMmG%T+vP`#U}-mRc_ zK=wD*CZ4&IIgYCRtEFT@^@iROnkNkVAHQ+UGe+SfZ8S#y5N=_JTv0Sx=3 zdxi;F;{NNz!pDDBm40p1WR+HK-+1m@{G_I!Fz`oJWtCe?5{ZWhfSkCXk})Bsje74H z-n`+RG`v&vE2}xB@_&9G-{-Tx4jmLma`1g!=BJliAcWnwkiDg@#xr0wAx8~rbR}Z5 z2Yeha7FWK#NssdS2?6Mpc#o*}@g={bAh$ymyNf$wX}y<7?D+wTN@+e9DdK1*832(r1U<v=tI7oi;CxS;dz=1u}Zqny3Dp!P(6`@<^d&z)(L$Ow@Fu6 z*CAUK)ZO*9%|RCpdfGO2seRt)M)6*m75|q0q}8Xr&bf>X2p)@5qzfxPJPF-)Xgeoa zI9I!EH2_T}vIjaZK*a*>xtD3rH6a^sx8LNe@jvQ_qZ$q6g%QX3^0KLZ)tSrq$t@Lh rHzq9#Vtu+;LW6IhF-b6q)#+ky14yQzErJTqYK!NzqLZ(~`q<>ZXQG*? literal 0 HcmV?d00001 diff --git a/software/roms/monitor_1Z-013A.rom b/software/roms/monitor_1Z-013A.rom index dd666325a6d7180001e2c8f00faf8567125d329c..0ebd5619a4086d0de1d515b6152132d4959292ed 100644 GIT binary patch delta 397 zcmZorXi%6?$0)wB{sbGd8RN;#UhL}_gE&in0(Zi?9T!irOuqv-Zrf%BfWEKS4SVi{>%ye zJ>7x5OSShb$YTQmRl*4H2x`Gl9$GbP>s!R=i zoR{S-inq0lEjDJDyLjW(u$&9B^Dl0`?z>fb=dsH`2W)p_*!|(dqk|7VFg!)jht8in z{P^>S4^NJK|90%thYvrG{`&Fn!-o$K|Nr^@;qUt|&&~ijA3nSW;&&f5Yw{{EGKx?3 V;kTl{y2LL@dx^e&j delta 397 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