From 372a1f8e55ddc6f157b6da47d674be66d23ecb33 Mon Sep 17 00:00:00 2001 From: Philip Smart Date: Fri, 24 Jul 2020 12:27:10 +0100 Subject: [PATCH] Bug fixes and changes to coexist with the tranZPUterSW v2.1 --- .gitignore | 5 + software/MZF/BASIC.MZF | Bin 12416 -> 13079 bytes software/MZF/BASIC80A.MZF | Bin 11392 -> 12416 bytes software/MZF/cpm22.MZF | Bin 7296 -> 7296 bytes software/asm/1Z-013A.asm | 3307 ++++++++++++++++++++ software/asm/BASIC.asm | 321 +- software/asm/IPL.asm | 901 ++++++ software/asm/cbios.asm | 66 +- software/asm/cpm22-bios.asm | 17 +- software/asm/include/BASIC_Definitions.asm | 8 +- software/asm/include/CPM_Definitions.asm | 7 +- software/asm/include/RFS_Definitions.asm | 716 +++-- software/asm/monitor_1Z-013A.asm | 7 + software/asm/monitor_80c_1Z-013A.asm | 7 + software/asm/rfs.asm | 78 +- software/asm/rfs_bank2.asm | 9 +- software/asm/rfs_bank6.asm | 6 +- software/asm/rfs_mrom.asm | 31 +- software/hdr/cpm22.HDR | Bin 128 -> 128 bytes software/roms/IPL.rom | Bin 0 -> 4096 bytes software/roms/MROM_256.bin | Bin 503040 -> 503040 bytes software/roms/USER_ROM_256.bin | Bin 576512 -> 576512 bytes software/roms/cbios.rom | Bin 4096 -> 4096 bytes software/roms/cbios_bank1.rom | Bin 2048 -> 2048 bytes software/roms/cbios_bank2.rom | Bin 2048 -> 2048 bytes software/roms/cbios_bank3.rom | Bin 2048 -> 2048 bytes software/roms/cbios_bank4.rom | Bin 2048 -> 2048 bytes software/roms/monitor_1Z-013A.rom | Bin 4096 -> 4096 bytes software/roms/monitor_80c_1Z-013A.rom | Bin 0 -> 4096 bytes software/roms/rfs.rom | Bin 16384 -> 16384 bytes software/roms/rfs_mrom.rom | Bin 4096 -> 4096 bytes software/tools/assemble_roms.sh | 2 +- software/tools/make_roms.sh | 6 +- 33 files changed, 4981 insertions(+), 513 deletions(-) create mode 100644 software/asm/1Z-013A.asm create mode 100644 software/asm/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/IPL.rom create mode 100644 software/roms/monitor_80c_1Z-013A.rom diff --git a/.gitignore b/.gitignore index 9a077eb..5bf54d5 100644 --- a/.gitignore +++ b/.gitignore @@ -55,4 +55,9 @@ software/asm/rfs_bank2.prewriteread software/roms/SHARP_MZ80A_RFS_CPM_IMAGE_1.img software/roms/SHARP_MZ80A_RFS_IMAGE_1.img software/roms/cmp +schematics/MZ80-ROMPG/ +software/MZF/BASIC.mzf +software/OriginalSA-1510.BIN +software/asm/.cbios.asm.swo +software/dump diff --git a/software/MZF/BASIC.MZF b/software/MZF/BASIC.MZF index 2077b2d58eb26ea6d066592ecbf41cdd16a32d11..68dc266e17979e7a009a852ac2d06117d817a03f 100644 GIT binary patch literal 13079 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 diff --git a/software/MZF/BASIC80A.MZF b/software/MZF/BASIC80A.MZF index 1e53f262c867361dbde10314c986172d638d0da8..2077b2d58eb26ea6d066592ecbf41cdd16a32d11 100644 GIT binary patch literal 12416 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 literal 11392 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�waf3^)ViZ(i@dW5jJc&eoksvZ@we9R^nSU)VN8Z_bSBt#u?oK=|+#G&c?ibK1Ai8rCAl=p4 z(Gezu{S4}CL%a}ikSKqZp|DC`W0kj{7w!Or(88iXuU`T?HtlKoC1f+alh^t0upMn6 z=P#&rwYUB|R@<(Yoxel^Qd|B7`B^EOw{6MH)UIj+ delta 48 vcmZp$Y_ODIbPn(}GBV~x00tR`1ssBt8^kgeHi&KBAhwisqJzQYP#J9i^eGF1 diff --git a/software/asm/1Z-013A.asm b/software/asm/1Z-013A.asm new file mode 100644 index 0000000..a0a99ca --- /dev/null +++ b/software/asm/1Z-013A.asm @@ -0,0 +1,3307 @@ + ; 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 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 + + ; 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/BASIC.asm b/software/asm/BASIC.asm index 48ab701..6a3f8f6 100644 --- a/software/asm/BASIC.asm +++ b/software/asm/BASIC.asm @@ -43,19 +43,21 @@ HEADER1: IF BUILD_MZ80A = 1 DW CODESTART ; Load address of program. DW CODESTART ; Exec address of program. ENDIF -HEADER2: IF BUILD_TZFS = 1 - IF BUILD_RFS = 1 + +HEADER2: IF BUILD_RFS = 1 DB "RFS BASIC V1.1" , 0DH, 0DH, 0DH ; Title/Name (17 bytes). DW (CODEEND - CODESTART) + (RELOCEND - RELOC) + (RELOCRFS2END - RELOCRFS2) ; Size of program. DW 01200H ; Load address of program. DW RELOCRFS ; Exec address of program. - ELSE + ENDIF + +HEADER3: IF BUILD_TZFS = 1 DB "TZFS BASIC V1.1", 0DH, 0DH ; Title/Name (17 bytes). DW (CODEEND - CODESTART) + (RELOCEND - RELOC) ; Size of program. DW 01200H ; Load address of program. DW RELOC ; Exec address of program. ENDIF - ENDIF + DB 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h ; Comment (104 bytes). DB 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h DB 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h @@ -6833,6 +6835,41 @@ MEMSW5: IF BUILD_TZFS+BUILD_RFS > 0 EI RET + ; A print string method but without memory mode change, for use when the hardware is already switched in and doesnt want to be changed. + ; +PRNTSTR: LD A,(DE) + OR A + JR Z,PRNTSTR6 + INC DE + ; + CALL CURSRSTR ; Restore char under cursor. + CP 00DH + JR NZ,PRNTSTR2 +PRNTSTR1: LD A,(DPRNT) + OR A + JR Z,PRNTSTR5 + LD A,0CDH + CALL DPCT + JR PRNTSTR5 +PRNTSTR2: CP 00AH + JR Z,PRNTSTR1 + CP 07FH + JR NZ,PRNTSTR4 +PRNTSTR3: LD A,0C7H + CALL DPCT + JR PRNTSTR5 +PRNTSTR4: CP BACKS + JR Z,PRNTSTR3 + PUSH BC + LD C,A + LD B,A + CALL PRT + LD A,B + POP BC +PRNTSTR5: CALL DSPXYTOADDR + JR PRNTSTR +PRNTSTR6: RET + ; ; Function to print out the contents of HL as 4 digit Hexadecimal. ; @@ -7431,7 +7468,7 @@ WRI1: CALL CKSUM CMIWRI1: DI CALL GAP CALL WTAPE -CMIWRI2: JP L0552 +CMIWRI2: JP RET2 ?WRD: DI @@ -7444,7 +7481,7 @@ CMIWRI2: JP L0552 LD HL,(DTADR) LD A,B OR C - JR Z,L04CB + JR Z,WTAP3 JR WRI1 WTAPE: PUSH DE @@ -7453,38 +7490,39 @@ WTAPE: PUSH DE LD D,002H LD A,0F0H LD (KEYPA),A -L048F: LD A,(HL) - CALL L0767 +WTAP1: LD A,(HL) + CALL WBYTE LD A,(KEYPB) AND 081H - JP NZ,L049E + JP NZ,WTAP2 SCF - JR L04CB -L049E: INC HL + JR WTAP3 +WTAP2: INC HL DEC BC LD A,B OR C - JP NZ,L048F + JP NZ,WTAP1 LD HL,(SUMDT) LD A,H - CALL L0767 + CALL WBYTE LD A,L - CALL L0767 - CALL L0D57 + CALL WBYTE + CALL LONG DEC D - JP NZ,L04BB + JP NZ,WTAP4 OR A - JP L04CB -L04BB: LD B,000H -L04BD: CALL L0D3E + JP WTAP3 + +WTAP4: LD B,000H +WTAP5: CALL SHORT DEC B - JP NZ,L04BD + JP NZ,WTAP5 POP HL POP BC PUSH BC PUSH HL - JP L048F -L04CB: POP HL + JP WTAP1 +WTAP3: POP HL POP BC POP DE RET @@ -7496,16 +7534,23 @@ L04CB: POP HL LD E,0CCH LD BC,00080H LD HL,IBUFE -L04DD: CALL MOTOR - JP C,L0570 +RD1: DI +MEMSWRT0: IF BUILD_TZFS+BUILD_RFS > 0 + LD (SPISRSAVE),SP ; Share the interrupt stack whilst accessing hardware as the BASIC stack goes out of scope. + LD SP,ISRSTACK ; Interrupts are disabled so we can safely use this stack. + LD A,TZMM_MZ700_0 ; We meed to be in memory mode 10 to access the tape hardware. + OUT (MMCFG),A + ENDIF + ; + CALL MOTOR + JP C,RTP6 DI CALL TMARK - JP C,L0570 - CALL L0505 - JP L0552 + JP C,RTP6 + CALL RTAPE + JP RET2 -?RDD: DI - PUSH DE +?RDD: PUSH DE PUSH BC PUSH HL LD D,0D2H @@ -7514,20 +7559,21 @@ L04DD: CALL MOTOR LD HL,(DTADR) LD A,B OR C - JP Z,L0552 - JR L04DD -L0505: PUSH DE + JP Z,RET2 + JR RD1 + +RTAPE: PUSH DE PUSH BC PUSH HL LD H,002H -L050A: LD BC,KEYPB +RTP1: LD BC,KEYPB LD DE,KEYPC -L0510: CALL EDGE - JP C,L0570 +RTP2: CALL EDGE + JP C,RTP6 CALL DLY3 LD A,(DE) AND 020H - JP Z,L0510 + JP Z,RTP2 LD D,H LD HL,00000H LD (SUMDT),HL @@ -7535,45 +7581,65 @@ L0510: CALL EDGE POP BC PUSH BC PUSH HL -L052A: CALL RBYTE - JP C,L0570 - LD (HL),A +RTP3: CALL RBYTE + JP C,RTP6 + ; For TZFS/RFS page in top bank of memory for potential data store. +MEMSWRT1: IF BUILD_TZFS+BUILD_RFS > 0 + EX AF,AF' + LD A,TZMM_MZ700_2 + OUT (MMCFG),A + EX AF,AF' + LD (HL),A ; Save the byte just read once memory has been paged in. + LD A,TZMM_MZ700_0 + OUT (MMCFG),A + ELSE + LD (HL),A ; Save the byte just read. + ENDIF + INC HL DEC BC LD A,B OR C - JP NZ,L052A + JP NZ,RTP3 LD HL,(SUMDT) CALL RBYTE - JP C,L0570 + JP C,RTP6 LD E,A CALL RBYTE - JP C,L0570 + JP C,RTP6 CP L - JP NZ,L0563 + JP NZ,RTP5 LD A,E CP H - JP NZ,L0563 -L0551: XOR A -L0552: POP HL + JP NZ,RTP5 +RTP8: XOR A +RET2: CALL MSTOP +MEMSWRT4: IF BUILD_TZFS+BUILD_RFS > 0 + EX AF,AF' + LD A,TZMM_MZ700_2 ; Return to the full 64K memory mode. + OUT (MMCFG),A + EX AF,AF' + LD SP,(SPISRSAVE) ; Restore the BASIC stack to exit. + ENDIF + ; + POP HL POP BC POP DE - CALL MSTOP PUSH AF EI POP AF RET -L0563: DEC D - JR Z,L056C +RTP5: DEC D + JR Z,RTP7 LD H,D CALL GAPCK - JR L050A -L056C: LD A,001H - JR L0572 -L0570: LD A,002H -L0572: SCF - JR L0552 + JR RTP1 +RTP7: LD A,001H + JR RTP9 +RTP6: LD A,002H +RTP9: SCF + JR RET2 ?VRFY: DI @@ -7586,14 +7652,14 @@ L0572: SCF LD E,053H LD A,B OR C - JR Z,L0552 + JR Z,RET2 CALL CKSUM CALL MOTOR - JR C,L0570 + JR C,RTP6 CALL TMARK - JP C,L0570 + JP C,RTP6 CALL TVRFY - JR L0552 + JR RET2 TVRFY: PUSH DE PUSH BC @@ -7602,7 +7668,7 @@ TVRFY: PUSH DE TVF1: LD BC,KEYPB LD DE,KEYPC TVF2: CALL EDGE - JP C,L0570 + JP C,RTP6 CALL DLY3 LD A,(DE) AND 020H @@ -7613,9 +7679,9 @@ TVF2: CALL EDGE PUSH BC PUSH HL TVF3: CALL RBYTE - JP C,L0570 + JP C,RTP6 CP (HL) - JP NZ,L056C + JP NZ,RTP7 INC HL DEC BC LD A,B @@ -7624,12 +7690,12 @@ TVF3: CALL RBYTE LD HL,(CSMDT) CALL RBYTE CP H - JR NZ,L056C + JR NZ,RTP7 CALL RBYTE CP L - JR NZ,L056C + JR NZ,RTP7 DEC D - JP Z,L0551 + JP Z,RTP8 LD H,D JR TVF1 @@ -7728,8 +7794,8 @@ MOT1: LD A,(KEYPC) AND 010H JR Z,MOT4 MOT2: LD B,0A6H -L06B1: CALL DLY12 - DJNZ L06B1 +MOT3: CALL DLY12 + DJNZ MOT3 XOR A MOT7: JR RET3 MOT4: LD A,006H @@ -7738,14 +7804,13 @@ MOT4: LD A,006H INC A LD (HL),A DJNZ MOT1 - CALL NL LD A,D CP 0D7H JR Z,MOT8 LD DE,MSGPLAY JR MOT9 MOT8: LD DE,MSGRECORD ; RECORD message. -MOT9: CALL MONPRTSTR +MOT9: CALL PRNTSTR MOT5: LD A,(KEYPC) AND 010H JR NZ,MOT2 @@ -7758,23 +7823,23 @@ MSTOP: PUSH AF PUSH BC PUSH DE LD B,00AH -L0705: LD A,(KEYPC) +MST1: LD A,(KEYPC) AND 010H - JR Z,L0717 - LD A,006H + JR Z,MST3 +MST2: LD A,006H LD (KEYPF),A INC A LD (KEYPF),A - DJNZ L0705 -L0717: JP RSTR1 + DJNZ MST1 +MST3: JP RSTR1 CKSUM: PUSH BC PUSH DE PUSH HL LD DE,00000H -L0720: LD A,B +CKS1: LD A,B OR C - JR NZ,L072F + JR NZ,CKS2 EX DE,HL LD (SUMDT),HL LD (CSMDT),HL @@ -7783,48 +7848,41 @@ L0720: LD A,B POP BC RET -L072F: LD A,(HL) +CKS2: LD A,(HL) PUSH BC LD B,008H -L0733: RLCA - JR NC,L0737 +CKS3: RLCA + JR NC,CKS4 INC DE -L0737: DJNZ L0733 +CKS4: DJNZ CKS3 POP BC INC HL DEC BC - JR L0720 -L073E: RLCA - RLCA - RLCA - LD C,A - LD A,E -L0743: DEC H - RRCA - JR NC,L0743 - LD A,H - ADD A,C - LD C,A - JP SWEP01 + JR CKS1 -L0759: LD A,00EH -L075B: DEC A - JP NZ,L075B +DLY1: LD A,00EH +DLY1A: DEC A + JP NZ,DLY1A RET -L0760: LD A,00DH -L0762: DEC A - JP NZ,L0762 +DLY2: LD A,00DH +DLY2A: DEC A + JP NZ,DLY2A RET -L0767: PUSH BC +DLY3: NEG + NEG + LD A,02AH + JP DLY2A + +WBYTE: PUSH BC LD B,008H - CALL L0D57 -L076D: RLCA - CALL C,L0D57 - CALL NC,L0D3E + CALL LONG +WBY1: RLCA + CALL C,LONG + CALL NC,SHORT DEC B - JP NZ,L076D + JP NZ,WBY1 POP BC RET @@ -7834,58 +7892,53 @@ GAP: PUSH BC LD BC,055F0H LD DE,02828H CP 0CCH - JP Z,L078E + JP Z,GAP1 LD BC,02AF8H LD DE,01414H -L078E: CALL L0D3E +GAP1: CALL SHORT DEC BC LD A,B OR C - JR NZ,L078E -L0796: CALL L0D57 + JR NZ,GAP1 +GAP2: CALL LONG DEC D - JR NZ,L0796 -L079C: CALL L0D3E + JR NZ,GAP2 +GAP3: CALL SHORT DEC E - JR NZ,L079C - CALL L0D57 + JR NZ,GAP3 + CALL LONG POP DE POP BC RET - -L0D3E: PUSH AF +SHORT: PUSH AF LD A,003H LD (KEYPF),A - CALL L0759 - CALL L0759 + CALL DLY1 + CALL DLY1 LD A,002H LD (KEYPF),A - CALL L0759 - CALL L0759 + CALL DLY1 + CALL DLY1 POP AF RET -L0D57: PUSH AF +LONG: PUSH AF LD A,003H LD (KEYPF),A - CALL L0759 - CALL L0759 - CALL L0759 - CALL L0759 + CALL DLY1 + CALL DLY1 + CALL DLY1 + CALL DLY1 LD A,002H LD (KEYPF),A - CALL L0759 - CALL L0759 - CALL L0759 - CALL L0760 + CALL DLY1 + CALL DLY1 + CALL DLY1 + CALL DLY2 POP AF RET -DLY3: NEG - NEG - LD A,02AH - JP L0762 L09AB: ADD A,C DJNZ L09AB POP BC @@ -8605,8 +8658,8 @@ SIGNON: DB "MZ-80A BASIC Ver 4.7b",CR,LF DB " 1978 by Microsoft",CR,LF,0,0 SVCRESPERR: DB "I/O Response Error, time out!", CR, NUL SVCIOERR: DB "I/O Error, time out!", CR, NUL -MSGRECORD: DB "Press RECORD+PLAY", CR, NUL -MSGPLAY: DB "Press PLAY", CR, NUL +MSGRECORD: DB CR, "Press RECORD+PLAY", CR, NUL +MSGPLAY: DB CR, "Press PLAY", CR, NUL MSGWRITING: DB "Writing \"", NUL MSGWRITING2:DB "\"", CR, NUL ANSIERR: DB "Bad value!", CR, NUL diff --git a/software/asm/IPL.asm b/software/asm/IPL.asm new file mode 100644 index 0000000..c7d51c6 --- /dev/null +++ b/software/asm/IPL.asm @@ -0,0 +1,901 @@ + 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) + + + ; Pad to 4K as this is the standard MROM Bank size. + DS 01000H - $ + +;---------------------------------------------------------- +; 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/cbios.asm b/software/asm/cbios.asm index 7835b6d..bbb96f7 100644 --- a/software/asm/cbios.asm +++ b/software/asm/cbios.asm @@ -251,8 +251,8 @@ BOOT_: DI ; Disab ; LD SP,BIOSSTACK ; Setup to use local stack until CPM takes over. ; - LD HL,VARSTART ; Start of variable area - LD BC,VAREND-VARSTART ; Size of variable area. + LD HL,CPMBIOS ; Start of CPM disk table and variable area + LD BC,VAREND-CPMBIOS ; Size of CPM disk table and variable area. XOR A LD D,A INIT1: LD (HL),D ; Clear variable memory including stack space. @@ -261,6 +261,7 @@ INIT1: LD (HL),D ; Clear LD A,B OR C JR NZ,INIT1 + ; LD HL,00000H LD BC,CBASE INIT2: LD (HL),D ; Clear TPA space. @@ -299,8 +300,8 @@ INIT3: LD A,(BNKCTRLRST) ; Setup keyboard rate control and set to CAPSLOCK mode. ; (0 = Off, 1 = CAPSLOCK, 2 = SHIFTLOCK). - LD HL,00002H ; Initialise key repeater. - LD (KEYRPT),HL + LD A,002H ; Initialise key repeater. + LD (KEYRPT),A LD A,001H LD (SFTLK),A ; Setup shift lock, default = off. @@ -333,7 +334,6 @@ INIT3: LD A,(BNKCTRLRST) ; CALL ?SDINIT LD A,0 ; No drives yet detected so zero available mask. - RES 2,A ; No SD Card is present. JR NZ,STRT2 SET 2,A ; Assume the SD Card is present. ; @@ -351,7 +351,7 @@ STRT2: LD (DRVAVAIL),A JP NZ,ROMFINDERR ; Failed to find CPM in the ROM! This shouldnt happen as we boot from ROM. LD (CPMROMLOC),BC - ; Locate the ROMFS CPM Disk Image to be mapped as drive D. + ; Locate the ROMFS CPM Disk Images. LD HL,0FFFFh LD (CPMROMDRV0),HL LD (CPMROMDRV1),HL @@ -529,9 +529,9 @@ CPMINIT1: LD A, 0C3H ; C3 IS LD (CDISK), A ; Save User/Disk WBTDSKOK2: CALL ?SETDRVMAP ; Refresh the map of physical floppies to CPM drive number. CALL ?SETDRVCFG - LD A,(DISKTYPE) - OR A - CALL Z,?SELDRIVE ; Select and start disk drive motor if floppy disk. + ; LD A,(DISKTYPE) + ; OR A + ; CALL Z,?SELDRIVE ; Select and start disk drive motor if floppy disk. ; LD A,05H ; Enable interrupts at hardware level. LD (KEYPF),A @@ -582,8 +582,10 @@ WBOOT_: DI CALL UROMLOAD LD A,ROMBANK9 ; Screen Bank. LD (BNKSELUSER),A - ; - JP CPMINIT ; Initialise CPM and run. + JP Z,CPMINIT ; Initialise CPM and run. + LD DE,NOBDOS + CALL MONPRTSTR +WBOOT2: JR WBOOT2 ; Nowhere to go! ;------------------------------------------------------------------------------- @@ -1577,7 +1579,15 @@ UROMLOAD: PUSH BC LD C,0 ADD HL,BC LD BC, MZFHDRNCSZ - LDIR +LROMLOAD0: LD A,(HL) ; Issues with LDIR and a signal artifact from the mainboard, so manual copy. + INC HL + LD (DE),A + INC DE + DEC BC + LD A,B + OR C + JR NZ,LROMLOAD0 + ;LDIR LD DE,MZFHDRSZ - MZFHDRNCSZ ; Account for the full MZF header (we only load the initial part to save RAM). ADD HL,DE POP DE @@ -1590,6 +1600,7 @@ LROMLOAD1: PUSH HL LD DE, (DTADR) LD HL, (SIZE) LD BC, RFSSECTSZ - MZFHDRSZ + OR A SBC HL, BC JR NC, LROMLOAD4 LD HL, (SIZE) @@ -1630,7 +1641,17 @@ LROMLOAD4: LD (TMPSIZE), HL ; HL co LD A, B ; Pre check to ensure BC is not zero. OR C JR Z, LROMLOAD8 - LDIR + +LROMLOAD9: LD A,(HL) ; Issues with LDIR and a signal artifact from the mainboard, so manual copy. + INC HL + LD (DE),A + INC DE + DEC BC + LD A,B + OR C + JR NZ,LROMLOAD9 + ;LDIR + LD BC, (TMPSIZE) LD A, B ; Post check to ensure we still have bytes OR C @@ -1641,7 +1662,7 @@ LROMLOAD4: LD (TMPSIZE), HL ; HL co LROMLOAD6: INC C LD A, C CP UROMSIZE/RFSSECTSZ ; Max blocks per page reached? - JR C, LROMLOAD7 + JR C, LROMLOAD3 LD C, 0 INC B ; @@ -1800,7 +1821,17 @@ ROMREAD14: LD (TMPSIZE), HL ; HL co LD A, B ; Pre check to ensure BC is not zero. OR C JR Z, ROMREAD16 - LDIR + +ROMREAD18: LD A,(HL) ; Issues with LDIR and a signal artifact from the mainboard, so manual copy. + INC HL + LD (DE),A + INC DE + DEC BC + LD A,B + OR C + JR NZ,ROMREAD18 + ;LDIR + LD BC, (TMPSIZE) LD A, B ; Post check to ensure we still have bytes OR C @@ -2609,10 +2640,11 @@ KTBLC: ; CTRL ON -CBIOSSIGNON:DB "** CBIOS v1.20, (C) P.D. Smart, 2020. Drives:", NUL +CBIOSSIGNON:DB "** CBIOS v1.22, (C) P.D. Smart, 2020. Drives:", NUL CBIOSIGNEND:DB " **", CR, NUL CPMSIGNON: DB "CP/M v2.23 (48K) COPYRIGHT(C) 1979, DIGITAL RESEARCH", CR, LF, NUL -CPMROMFNAME:DB "CPM223", NUL +NOBDOS: DB "Failed to load BDOS, aborting!", CR, LF, NUL +CPMROMFNAME:DB "CPM223RFS", NUL CPMRDRVFN0: DB "CPM22-DRV0", NUL CPMRDRVFN1: DB "CPM22-DRV1", NUL ROMLDERRMSG:DB "ROM LOAD ERR", CR, NUL diff --git a/software/asm/cpm22-bios.asm b/software/asm/cpm22-bios.asm index 254a608..03a91dc 100644 --- a/software/asm/cpm22-bios.asm +++ b/software/asm/cpm22-bios.asm @@ -31,6 +31,20 @@ ORG CPMBIOS + ; Boot strap code to setup the machine in order to run CPM and the CBIOS. + ; Previously this used to be in the comment field of the tape header but with the + ; advent of the SDCFS which doesnt store the comment, the bootstrap needs to be relocated. + ; This code will be overwritten with the DP Headers on cold boot. +BOOTLDR: LD B, 0x10 ; Need to read the same location 16 times to enable I/O operations. +BOOTLDR2: LD A, (BNKCTRLRST) + DJNZ BOOTLDR2 + LD A, 0x07 + LD (BNKCTRL), A ; Setup the User ROM Bank default. + LD A, (MEMSW) + LD A, 0x02 + LD (BNKSELMROM), A ; Setup the Monitor ROM bank default. + JP CBIOSSTART ; Cold start the CBIOS. + ;------------------------------------------------------------------------------------------------------------ ; DISK PARAMETER HEADER ; @@ -55,7 +69,7 @@ ; -ALV Address of a scratch pad area used by the BDOS to keep disk storage allocation information. ; This address is different for each DPH. ;------------------------------------------------------------------------------------------------------------ - ALIGN_NOPS DPBASE ; Space for 2xROM, 2xFD, 3xSD or upto 7 drives + ;ALIGN_NOPS DPBASE ; Space for 2xROM, 2xFD, 3xSD or upto 7 drives ; These entries are created dynamically based on hardware available. ; NB. The Disk Parameter Blocks are stored in CBIOS ROM to save RAM space. @@ -67,3 +81,4 @@ ALIGN_NOPS CSVALVMEM ALIGN_NOPS CSVALVEND ALIGN CBIOSDATA + diff --git a/software/asm/include/BASIC_Definitions.asm b/software/asm/include/BASIC_Definitions.asm index 61ecfd7..f9d9a6e 100644 --- a/software/asm/include/BASIC_Definitions.asm +++ b/software/asm/include/BASIC_Definitions.asm @@ -48,8 +48,8 @@ MODE80C: EQU 1 ; BIOS equates KEYBUFSIZE EQU 64 ; Ensure this is a power of 2, max size 256. -;MAXMEM EQU 10000H - TZSVCSIZE ; Top of RAM on the tranZPUter/ -MAXMEM EQU 0CFFFH ; Top of RAM on a standard Sharp MZ80A. +MAXMEM EQU 10000H - TZSVCSIZE ; Top of RAM on the tranZPUter/ +;MAXMEM EQU 0CFFFH ; Top of RAM on a standard Sharp MZ80A. ; Tape load/save modes. Used as a flag to enable common code. TAPELOAD EQU 1 @@ -58,8 +58,8 @@ TAPESAVE EQU 3 CTAPESAVE EQU 4 ; Build options. Set just one to '1' the rest to '0'. -BUILD_MZ80A EQU 1 ; Build for the standard Sharp MZ80A, no lower memory. Manually change MAXMEM above. -BUILD_RFS EQU 0 ; Build for RFS where the tranZPUter board is available without the K64F and running under RFS. +BUILD_MZ80A EQU 0 ; Build for the standard Sharp MZ80A, no lower memory. Manually change MAXMEM above. +BUILD_RFS EQU 1 ; Build for RFS where the tranZPUter board is available without the K64F and running under RFS. BUILD_TZFS EQU 0 ; Build for TZFS where extended memory is available. INCLUDE_ANSITERM EQU 1 ; Include the Ansi terminal emulation processor in the build. diff --git a/software/asm/include/CPM_Definitions.asm b/software/asm/include/CPM_Definitions.asm index 8a1989f..0456214 100644 --- a/software/asm/include/CPM_Definitions.asm +++ b/software/asm/include/CPM_Definitions.asm @@ -437,13 +437,12 @@ NAME: DS virtual 17 ; FILE SIZE: DS virtual 2 ; BYTESIZE DTADR: DS virtual 2 ; DATA ADDRESS EXADR: DS virtual 2 ; EXECUTION ADDRESS +COMNT: DS virtual 92 ; Comment / code area of CMT header. SWPW: DS virtual 10 ; SWEEP WORK KDATW: DS virtual 2 ; KEY WORK -;KANAF: DS virtual 1 ; KANA FLAG (01=GRAPHIC MODE) +KANAF: DS virtual 1 ; KANA FLAG (01=GRAPHIC MODE) DSPXY: DS virtual 2 ; DISPLAY COORDINATES ;DSPXYLST: DS virtual 2 ; Last known cursor position, to compare with DSPXY to detect changes. -FLASHCTL: DS virtual 1 ; CURSOR FLASH CONTROL. BIT 0 = Cursor On/Off, BIT 1 = Cursor displayed. -DSPXYADDR: DS virtual 2 ; Address of last known position. MANG: DS virtual 6 ; COLUMN MANAGEMENT MANGE: DS virtual 1 ; COLUMN MANAGEMENT END PBIAS: DS virtual 1 ; PAGE BIAS @@ -458,6 +457,8 @@ REVFLG: DS virtual 1 ; REVER FLSDT: DS virtual 1 ; CURSOR DATA STRGF: DS virtual 1 ; STRING FLAG DPRNT: DS virtual 1 ; TAB COUNTER +FLASHCTL: DS virtual 1 ; CURSOR FLASH CONTROL. BIT 0 = Cursor On/Off, BIT 1 = Cursor displayed. +DSPXYADDR: DS virtual 2 ; Address of last known position. ;AMPM: DS virtual 1 ; AMPM DATA ;TIMFG: DS virtual 1 ; TIME FLAG SWRK: DS virtual 1 ; KEY SOUND FLAG diff --git a/software/asm/include/RFS_Definitions.asm b/software/asm/include/RFS_Definitions.asm index f837db8..3327102 100644 --- a/software/asm/include/RFS_Definitions.asm +++ b/software/asm/include/RFS_Definitions.asm @@ -32,162 +32,205 @@ ;----------------------------------------------- ; Features. ;----------------------------------------------- -HW_SPI_ENA EQU 1 ; Set to 1 if hardware SPI is present on the RFS PCB v2 board. -SW_SPI_ENA EQU 0 ; Set to 1 if software SPI is present on the RFS PCB v2 board. -PP_SPI_ENA EQU 0 ; Set to 1 if using the SPI interface via the Parallel Port, ie. for RFS PCB v1 which doesnt have SPI onboard. +HW_SPI_ENA EQU 1 ; Set to 1 if hardware SPI is present on the RFS PCB v2 board. +SW_SPI_ENA EQU 0 ; Set to 1 if software SPI is present on the RFS PCB v2 board. +PP_SPI_ENA EQU 0 ; Set to 1 if using the SPI interface via the Parallel Port, ie. for RFS PCB v1 which doesnt have SPI onboard. ;----------------------------------------------- ; Entry/compilation start points. ;----------------------------------------------- -UROMADDR EQU 0E800H ; Start of User ROM Address space. -UROMBSTBL EQU UROMADDR + 020H ; Entry point to the bank switching table. -RFSJMPTABLE EQU UROMADDR + 00080H ; Start of jump table. -FDCROMADDR EQU 0F000H +UROMADDR EQU 0E800H ; Start of User ROM Address space. +UROMBSTBL EQU UROMADDR + 020H ; Entry point to the bank switching table. +RFSJMPTABLE EQU UROMADDR + 00080H ; Start of jump table. +FDCROMADDR EQU 0F000H ;------------------------------------------------------- ; Function entry points in the standard SA-1510 Monitor. ;------------------------------------------------------- -GETL: EQU 00003h -LETNL: EQU 00006h -NL: EQU 00009h -PRNTS: EQU 0000Ch -PRNT: EQU 00012h -MSG: EQU 00015h -MSGX: EQU 00018h -GETKY EQU 0001Bh -BRKEY EQU 0001Eh -?WRI EQU 00021h -?WRD EQU 00024h -?RDI EQU 00027h -?RDD EQU 0002Ah -?VRFY EQU 0002Dh -MELDY EQU 00030h -?TMST EQU 00033h -MONIT: EQU 00000h -SS: EQU 00089h -ST1: EQU 00095h -HLHEX EQU 00410h -_2HEX EQU 0041Fh -?MODE: EQU 0074DH -?KEY EQU 008CAh -PRNT3 EQU 0096Ch -?ADCN EQU 00BB9h -?DACN EQU 00BCEh -?DSP: EQU 00DB5H -?BLNK EQU 00DA6h -?DPCT EQU 00DDCh -PRTHL: EQU 003BAh -PRTHX: EQU 003C3h -HEX: EQU 003F9h -DPCT: EQU 00DDCh -DLY12: EQU 00DA7h -DLY12A: EQU 00DAAh -?RSTR1: EQU 00EE6h -MOTOR: EQU 006A3H -CKSUM: EQU 0071AH -GAP: EQU 0077AH -WTAPE: EQU 00485H -MSTOP: EQU 00700H +GETL: EQU 00003h +LETNL: EQU 00006h +NL: EQU 00009h +PRNTS: EQU 0000Ch +PRNT: EQU 00012h +MSG: EQU 00015h +MSGX: EQU 00018h +GETKY EQU 0001Bh +BRKEY EQU 0001Eh +?WRI EQU 00021h +?WRD EQU 00024h +?RDI EQU 00027h +?RDD EQU 0002Ah +?VRFY EQU 0002Dh +MELDY EQU 00030h +?TMST EQU 00033h +MONIT: EQU 00000h +SS: EQU 00089h +ST1: EQU 00095h +HLHEX EQU 00410h +_2HEX EQU 0041Fh +?MODE: EQU 0074DH +?KEY EQU 008CAh +PRNT3 EQU 0096Ch +?ADCN EQU 00BB9h +?DACN EQU 00BCEh +?DSP: EQU 00DB5H +?BLNK EQU 00DA6h +?DPCT EQU 00DDCh +PRTHL: EQU 003BAh +PRTHX: EQU 003C3h +HEX: EQU 003F9h +DPCT: EQU 00DDCh +DLY12: EQU 00DA7h +DLY12A: EQU 00DAAh +?RSTR1: EQU 00EE6h +MOTOR: EQU 006A3H +CKSUM: EQU 0071AH +GAP: EQU 0077AH +WTAPE: EQU 00485H +MSTOP: EQU 00700H ; Debugging -ENADEBUG EQU 0 ; Enable debugging logic, 1 = enable, 0 = disable +ENADEBUG EQU 0 ; Enable debugging logic, 1 = enable, 0 = disable ;----------------------------------------------- ; Memory mapped ports in hardware. ;----------------------------------------------- -SCRN: EQU 0D000H -ARAM: EQU 0D800H -DSPCTL: EQU 0DFFFH ; Screen 40/80 select register (bit 7) -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 -MEMSW: EQU 0E00CH -MEMSWR: EQU 0E010H -INVDSP: EQU 0E014H -NRMDSP: EQU 0E015H -SCLDSP: EQU 0E200H -SCLBASE: EQU 0E2H -BNKCTRLRST: EQU 0EFF8H ; Bank control reset, returns all registers to power up default. -BNKCTRLDIS: EQU 0EFF9H ; Disable bank control registers by resetting the coded latch. -HWSPIDATA: EQU 0EFFBH ; Hardware SPI Data register (read/write). -HWSPISTART: EQU 0EFFCH ; Start an SPI transfer. -BNKSELMROM: EQU 0EFFDh ; Select RFS Bank1 (MROM) -BNKSELUSER: EQU 0EFFEh ; Select RFS Bank2 (User ROM) -BNKCTRL: EQU 0EFFFH ; Bank Control register (read/write). +SCRN: EQU 0D000H +ARAM: EQU 0D800H +DSPCTL: EQU 0DFFFH ; Screen 40/80 select register (bit 7) +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 +MEMSW: EQU 0E00CH +MEMSWR: EQU 0E010H +INVDSP: EQU 0E014H +NRMDSP: EQU 0E015H +SCLDSP: EQU 0E200H +SCLBASE: EQU 0E2H +BNKCTRLRST: EQU 0EFF8H ; Bank control reset, returns all registers to power up default. +BNKCTRLDIS: EQU 0EFF9H ; Disable bank control registers by resetting the coded latch. +HWSPIDATA: EQU 0EFFBH ; Hardware SPI Data register (read/write). +HWSPISTART: EQU 0EFFCH ; Start an SPI transfer. +BNKSELMROM: EQU 0EFFDh ; Select RFS Bank1 (MROM) +BNKSELUSER: EQU 0EFFEh ; Select RFS Bank2 (User ROM) +BNKCTRL: EQU 0EFFFH ; Bank Control register (read/write). ; ; RFS v2 Control Register constants. ; -BBCLK EQU 1 ; BitBang SPI Clock. -SDCS EQU 2 ; SD Card Chip Select, active low. -BBMOSI EQU 4 ; BitBang MOSI (Master Out Serial In). -CDLTCH1 EQU 8 ; Coded latch up count bit 1 -CDLTCH2 EQU 16 ; Coded latch up count bit 2 -CDLTCH3 EQU 32 ; Coded latch up count bit 3 -BK2A19 EQU 64 ; User ROM Device Select Bit 0 (or Address bit 19). -BK2A20 EQU 128 ; User ROM Device Select Bit 1 (or Address bit 20). +BBCLK EQU 1 ; BitBang SPI Clock. +SDCS EQU 2 ; SD Card Chip Select, active low. +BBMOSI EQU 4 ; BitBang MOSI (Master Out Serial In). +CDLTCH1 EQU 8 ; Coded latch up count bit 1 +CDLTCH2 EQU 16 ; Coded latch up count bit 2 +CDLTCH3 EQU 32 ; Coded latch up count bit 3 +BK2A19 EQU 64 ; User ROM Device Select Bit 0 (or Address bit 19). +BK2A20 EQU 128 ; User ROM Device Select Bit 1 (or Address bit 20). ; BK2A20 : BK2A19 ; 0 0 = Flash RAM 0 (default). ; 0 1 = Flash RAM 1. ; 1 0 = Flasm RAM 2 or Static RAM 0. ; 1 1 = Reserved.` -BNKCTRLDEF EQU CDLTCH2+CDLTCH1+BBMOSI+SDCS+BBCLK ; Default on startup for the Bank Control register. +BNKCTRLDEF EQU BBMOSI+SDCS+BBCLK ; Default on startup for the Bank Control register. ;----------------------------------------------- ; IO ports in hardware and values. ;----------------------------------------------- -SPI_OUT EQU 0FFH -SPI_IN EQU 0FEH +SPI_OUT EQU 0FFH +SPI_IN EQU 0FEH ; -DOUT_LOW EQU 000H -DOUT_HIGH EQU 004H -DOUT_MASK EQU 004H -DIN_LOW EQU 000H -DIN_HIGH EQU 001H -CLOCK_LOW EQU 000H -CLOCK_HIGH EQU 002H -CLOCK_MASK EQU 0FDH -CS_LOW EQU 000H -CS_HIGH EQU 001H +DOUT_LOW EQU 000H +DOUT_HIGH EQU 004H +DOUT_MASK EQU 004H +DIN_LOW EQU 000H +DIN_HIGH EQU 001H +CLOCK_LOW EQU 000H +CLOCK_HIGH EQU 002H +CLOCK_MASK EQU 0FDH +CS_LOW EQU 000H +CS_HIGH EQU 001H +; +MMCFG EQU 060H ; Memory management configuration latch. +SETXMHZ EQU 062H ; Select the alternate clock frequency. +SET2MHZ EQU 064H ; Select the system 2MHz clock frequency. +CLKSELRD EQU 066H ; Read clock selected setting, 0 = 2MHz, 1 = XMHz +SVCREQ EQU 068H ; I/O Processor service request. +CPLDCFG EQU 06EH ; Version 2.1 CPLD configuration register. +CPLDSTATUS EQU 06EH ; Version 2.1 CPLD status register. +CPLDINFO EQU 06FH ; Version 2.1 CPLD version information register. + +;----------------------------------------------- +; CPLD Configuration constants. +;----------------------------------------------- +SET_MODE_MZ80A EQU 1 ; Set to original unmodified hardware. +SET_MODE_MZ700 EQU 2 ; Map keyboard and memory mode settings to MZ700 mode. + +;----------------------------------------------- +; tranZPUter SW Memory Management modes +;----------------------------------------------- +TZMM_ENIOWAIT EQU 020H ; Memory management IO Wait State enable - insert a wait state when an IO operation to E0-FF is executed. +TZMM_ORIG EQU 000H ; Original Sharp MZ80A mode, no tranZPUter features are selected except the I/O control registers (default: 0x60-063). +TZMM_BOOT EQU 001H ; Original mode but E800-EFFF is mapped to tranZPUter RAM so TZFS can be booted. +TZMM_TZFS EQU 002H + TZMM_ENIOWAIT ; TZFS main memory configuration. all memory is in tranZPUter RAM, E800-FFFF is used by TZFS, SA1510 is at 0000-1000 and RAM is 1000-CFFF, 64K Block 0 selected. +TZMM_TZFS2 EQU 003H + TZMM_ENIOWAIT ; TZFS main memory configuration. all memory is in tranZPUter RAM, E800-EFFF is used by TZFS, SA1510 is at 0000-1000 and RAM is 1000-CFFF, 64K Block 0 selected, F000-FFFF is in 64K Block 1. +TZMM_TZFS3 EQU 004H + TZMM_ENIOWAIT ; TZFS main memory configuration. all memory is in tranZPUter RAM, E800-EFFF is used by TZFS, SA1510 is at 0000-1000 and RAM is 1000-CFFF, 64K Block 0 selected, F000-FFFF is in 64K Block 2. +TZMM_TZFS4 EQU 005H + TZMM_ENIOWAIT ; TZFS main memory configuration. all memory is in tranZPUter RAM, E800-EFFF is used by TZFS, SA1510 is at 0000-1000 and RAM is 1000-CFFF, 64K Block 0 selected, F000-FFFF is in 64K Block 3. +TZMM_CPM EQU 006H + TZMM_ENIOWAIT ; CPM main memory configuration, all memory on the tranZPUter board, 64K block 4 selected. Special case for F3C0:F3FF & F7C0:F7FF (floppy disk paging vectors) which resides on the mainboard. +TZMM_CPM2 EQU 007H + TZMM_ENIOWAIT ; CPM main memory configuration, F000-FFFF are on the tranZPUter board in block 4, 0040-CFFF and E800-EFFF are in block 5, mainboard for D000-DFFF (video), E000-E800 (Memory control) selected. + ; Special case for 0000:003F (interrupt vectors) which resides in block 4, F3C0:F3FF & F7C0:F7FF (floppy disk paging vectors) which resides on the mainboard. +TZMM_COMPAT EQU 008H + TZMM_ENIOWAIT ; Original mode but with main DRAM in Bank 0 to allow bootstrapping of programs from other machines such as the MZ700. +TZMM_MZ700_0 EQU 00AH + TZMM_ENIOWAIT ; MZ700 Mode - 0000:0FFF is on the tranZPUter board in block 6, 1000:CFFF is on the tranZPUter board in block 0, D000:FFFF is on the mainboard. +TZMM_MZ700_1 EQU 00BH + TZMM_ENIOWAIT ; MZ700 Mode - 0000:0FFF is on the tranZPUter board in block 0, 1000:CFFF is on the tranZPUter board in block 0, D000:FFFF is on the tranZPUter in block 6. +TZMM_MZ700_2 EQU 00CH + TZMM_ENIOWAIT ; MZ700 Mode - 0000:0FFF is on the tranZPUter board in block 6, 1000:CFFF is on the tranZPUter board in block 0, D000:FFFF is on the tranZPUter in block 6. +TZMM_MZ700_3 EQU 00DH + TZMM_ENIOWAIT ; MZ700 Mode - 0000:0FFF is on the tranZPUter board in block 0, 1000:CFFF is on the tranZPUter board in block 0, D000:FFFF is inaccessible. +TZMM_MZ700_4 EQU 00EH + TZMM_ENIOWAIT ; MZ700 Mode - 0000:0FFF is on the tranZPUter board in block 6, 1000:CFFF is on the tranZPUter board in block 0, D000:FFFF is inaccessible. +TZMM_TZPU0 EQU 018H + TZMM_ENIOWAIT ; Everything is in tranZPUter domain, no access to underlying Sharp mainboard unless memory management mode is switched. tranZPUter RAM 64K block 0 is selected. +TZMM_TZPU1 EQU 019H + TZMM_ENIOWAIT ; Everything is in tranZPUter domain, no access to underlying Sharp mainboard unless memory management mode is switched. tranZPUter RAM 64K block 1 is selected. +TZMM_TZPU2 EQU 01AH + TZMM_ENIOWAIT ; Everything is in tranZPUter domain, no access to underlying Sharp mainboard unless memory management mode is switched. tranZPUter RAM 64K block 2 is selected. +TZMM_TZPU3 EQU 01BH + TZMM_ENIOWAIT ; Everything is in tranZPUter domain, no access to underlying Sharp mainboard unless memory management mode is switched. tranZPUter RAM 64K block 3 is selected. +TZMM_TZPU4 EQU 01CH + TZMM_ENIOWAIT ; Everything is in tranZPUter domain, no access to underlying Sharp mainboard unless memory management mode is switched. tranZPUter RAM 64K block 4 is selected. +TZMM_TZPU5 EQU 01DH + TZMM_ENIOWAIT ; Everything is in tranZPUter domain, no access to underlying Sharp mainboard unless memory management mode is switched. tranZPUter RAM 64K block 5 is selected. +TZMM_TZPU6 EQU 01EH + TZMM_ENIOWAIT ; Everything is in tranZPUter domain, no access to underlying Sharp mainboard unless memory management mode is switched. tranZPUter RAM 64K block 6 is selected. +TZMM_TZPU7 EQU 01FH + TZMM_ENIOWAIT ; Everything is in tranZPUter domain, no access to underlying Sharp mainboard unless memory management mode is switched. tranZPUter RAM 64K block 7 is selected. ;----------------------------------------------- ; Rom File System Header (MZF) ;----------------------------------------------- -RFS_ATRB: EQU 00000h ; Code Type, 01 = Machine Code. -RFS_NAME: EQU 00001h ; Title/Name (17 bytes). -RFS_SIZE: EQU 00012h ; Size of program. -RFS_DTADR: EQU 00014h ; Load address of program. -RFS_EXADR: EQU 00016h ; Exec address of program. -RFS_COMNT: EQU 00018h ; COMMENT +RFS_ATRB: EQU 00000h ; Code Type, 01 = Machine Code. +RFS_NAME: EQU 00001h ; Title/Name (17 bytes). +RFS_SIZE: EQU 00012h ; Size of program. +RFS_DTADR: EQU 00014h ; Load address of program. +RFS_EXADR: EQU 00016h ; Exec address of program. +RFS_COMNT: EQU 00018h ; COMMENT ;----------------------------------------------- ; Entry/compilation start points. ;----------------------------------------------- -TPSTART: EQU 010F0h -MEMSTART: EQU 01200h -MSTART: EQU 0E900h -MZFHDRSZ EQU 128 -RFSSECTSZ EQU 256 -MROMSIZE EQU 4096 -UROMSIZE EQU 2048 -FNSIZE EQU 17 +TPSTART: EQU 010F0h +MEMSTART: EQU 01200h +MSTART: EQU 0E900h +MZFHDRSZ EQU 128 +RFSSECTSZ EQU 256 +MROMSIZE EQU 4096 +UROMSIZE EQU 2048 +FNSIZE EQU 17 ; ; Monitor ROM Jump Table definitions. ; -MROMJMPTBL: EQU 00070H -DIRMROM: EQU MROMJMPTBL + 00000H -MFINDMZF: EQU MROMJMPTBL + 00003H -MROMLOAD: EQU MROMJMPTBL + 00006H +MROMJMPTBL: EQU 00070H +DIRMROM: EQU MROMJMPTBL + 00000H +MFINDMZF: EQU MROMJMPTBL + 00003H +MROMLOAD: EQU MROMJMPTBL + 00006H ;----------------------------------------------- ; ROM Banks, 0-7 are reserved for alternative @@ -198,115 +241,115 @@ MROMLOAD: EQU MROMJMPTBL + 00006H ; 8-15 are reserved for CPM code in ; the User ROM bank. ;----------------------------------------------- -MROMPAGES EQU 8 -USRROMPAGES EQU 12 ; Monitor ROM : User ROM -ROMBANK0 EQU 0 ; MROM SA1510 40 Char : RFS Bank 0 - Main RFS Entry point and functions. -ROMBANK1 EQU 1 ; MROM SA1510 80 Char : RFS Bank 1 - Floppy disk controller and utilities. -ROMBANK2 EQU 2 ; CPM 2.2 CBIOS : RFS Bank 2 - SD Card controller and utilities. -ROMBANK3 EQU 3 ; RFS Utilities : RFS Bank 3 - Cmdline tools (Memory, Printer, Help) -ROMBANK4 EQU 4 ; Free : RFS Bank 4 - CMT Utilities. -ROMBANK5 EQU 5 ; Free : RFS Bank 5 -ROMBANK6 EQU 6 ; Free : RFS Bank 6 -ROMBANK7 EQU 7 ; Free : RFS Bank 7 - Memory and timer test utilities. -ROMBANK8 EQU 8 ; : CBIOS Bank 1 - Utilities -ROMBANK9 EQU 9 ; : CBIOS Bank 2 - Screen / ANSI Terminal -ROMBANK10 EQU 10 ; : CBIOS Bank 3 - SD Card -ROMBANK11 EQU 11 ; : CBIOS Bank 4 - Floppy disk controller. +MROMPAGES EQU 8 +USRROMPAGES EQU 12 ; Monitor ROM : User ROM +ROMBANK0 EQU 0 ; MROM SA1510 40 Char : RFS Bank 0 - Main RFS Entry point and functions. +ROMBANK1 EQU 1 ; MROM SA1510 80 Char : RFS Bank 1 - Floppy disk controller and utilities. +ROMBANK2 EQU 2 ; CPM 2.2 CBIOS : RFS Bank 2 - SD Card controller and utilities. +ROMBANK3 EQU 3 ; RFS Utilities : RFS Bank 3 - Cmdline tools (Memory, Printer, Help) +ROMBANK4 EQU 4 ; MZ700 1Z-013A 40C : RFS Bank 4 - CMT Utilities. +ROMBANK5 EQU 5 ; MZ700-1Z-013A 80C : RFS Bank 5 +ROMBANK6 EQU 6 ; MZ-80B IPL : RFS Bank 6 +ROMBANK7 EQU 7 ; Free : RFS Bank 7 - Memory and timer test utilities. +ROMBANK8 EQU 8 ; : CBIOS Bank 1 - Utilities +ROMBANK9 EQU 9 ; : CBIOS Bank 2 - Screen / ANSI Terminal +ROMBANK10 EQU 10 ; : CBIOS Bank 3 - SD Card +ROMBANK11 EQU 11 ; : CBIOS Bank 4 - Floppy disk controller. -OBJCD EQU 001h +OBJCD EQU 001h ;----------------------------------------------- ; Common character definitions. ;----------------------------------------------- -SCROLL EQU 001H ; Set scrool direction UP. -BELL EQU 007H -SPACE EQU 020H -TAB EQU 009H ; TAB ACROSS (8 SPACES FOR SD-BOARD) -CR EQU 00DH -LF EQU 00AH -FF EQU 00CH -ESC EQU 01BH -DELETE EQU 07FH -BACKS EQU 008H -SOH EQU 1 ; For XModem etc. -EOT EQU 4 -ACK EQU 6 -NAK EQU 15H -NUL EQU 00H -NULL EQU 000H -CTRL_A EQU 001H -CTRL_B EQU 002H -CTRL_C EQU 003H -CTRL_D EQU 004H -CTRL_E EQU 005H -CTRL_F EQU 006H -CTRL_G EQU 007H -CTRL_H EQU 008H -CTRL_I EQU 009H -CTRL_J EQU 00AH -CTRL_K EQU 00BH -CTRL_L EQU 00CH -CTRL_M EQU 00DH -CTRL_N EQU 00EH -CTRL_O EQU 00FH -CTRL_P EQU 010H -CTRL_Q EQU 011H -CTRL_R EQU 012H -CTRL_S EQU 013H -CTRL_T EQU 014H -CTRL_U EQU 015H -CTRL_V EQU 016H -CTRL_W EQU 017H -CTRL_X EQU 018H -CTRL_Y EQU 019H -CTRL_Z EQU 01AH -CTRL_SLASH EQU 01CH -CTRL_RB EQU 01DH -CTRL_CAPPA EQU 01EH -CTRL_UNDSCR EQU 01FH -CTRL_AT EQU 000H -NOKEY EQU 0F0H -CURSRIGHT EQU 0F1H -CURSLEFT EQU 0F2H -CURSUP EQU 0F3H -CURSDOWN EQU 0F4H -DBLZERO EQU 0F5H -INSERT EQU 0F6H -CLRKEY EQU 0F7H -HOMEKEY EQU 0F8H -BREAKKEY EQU 0FBH +SCROLL EQU 001H ; Set scrool direction UP. +BELL EQU 007H +SPACE EQU 020H +TAB EQU 009H ; TAB ACROSS (8 SPACES FOR SD-BOARD) +CR EQU 00DH +LF EQU 00AH +FF EQU 00CH +ESC EQU 01BH +DELETE EQU 07FH +BACKS EQU 008H +SOH EQU 1 ; For XModem etc. +EOT EQU 4 +ACK EQU 6 +NAK EQU 15H +NUL EQU 00H +NULL EQU 000H +CTRL_A EQU 001H +CTRL_B EQU 002H +CTRL_C EQU 003H +CTRL_D EQU 004H +CTRL_E EQU 005H +CTRL_F EQU 006H +CTRL_G EQU 007H +CTRL_H EQU 008H +CTRL_I EQU 009H +CTRL_J EQU 00AH +CTRL_K EQU 00BH +CTRL_L EQU 00CH +CTRL_M EQU 00DH +CTRL_N EQU 00EH +CTRL_O EQU 00FH +CTRL_P EQU 010H +CTRL_Q EQU 011H +CTRL_R EQU 012H +CTRL_S EQU 013H +CTRL_T EQU 014H +CTRL_U EQU 015H +CTRL_V EQU 016H +CTRL_W EQU 017H +CTRL_X EQU 018H +CTRL_Y EQU 019H +CTRL_Z EQU 01AH +CTRL_SLASH EQU 01CH +CTRL_RB EQU 01DH +CTRL_CAPPA EQU 01EH +CTRL_UNDSCR EQU 01FH +CTRL_AT EQU 000H +NOKEY EQU 0F0H +CURSRIGHT EQU 0F1H +CURSLEFT EQU 0F2H +CURSUP EQU 0F3H +CURSDOWN EQU 0F4H +DBLZERO EQU 0F5H +INSERT EQU 0F6H +CLRKEY EQU 0F7H +HOMEKEY EQU 0F8H +BREAKKEY EQU 0FBH ; MMC/SD command (SPI mode) -CMD0 EQU 64 + 0 ; GO_IDLE_STATE -CMD1 EQU 64 + 1 ; SEND_OP_COND -ACMD41 EQU 0x40+41 ; SEND_OP_COND (SDC) -CMD8 EQU 64 + 8 ; SEND_IF_COND -CMD9 EQU 64 + 9 ; SEND_CSD -CMD10 EQU 64 + 10 ; SEND_CID -CMD12 EQU 64 + 12 ; STOP_TRANSMISSION -CMD13 EQU 64 + 13 ; SEND_STATUS -ACMD13 EQU 0x40+13 ; SD_STATUS (SDC) -CMD16 EQU 64 + 16 ; SET_BLOCKLEN -CMD17 EQU 64 + 17 ; READ_SINGLE_BLOCK -CMD18 EQU 64 + 18 ; READ_MULTIPLE_BLOCK -CMD23 EQU 64 + 23 ; SET_BLOCK_COUNT -ACMD23 EQU 0x40+23 ; SET_WR_BLK_ERASE_COUNT (SDC) -CMD24 EQU 64 + 24 ; WRITE_BLOCK -CMD25 EQU 64 + 25 ; WRITE_MULTIPLE_BLOCK -CMD32 EQU 64 + 32 ; ERASE_ER_BLK_START -CMD33 EQU 64 + 33 ; ERASE_ER_BLK_END -CMD38 EQU 64 + 38 ; ERASE -CMD55 EQU 64 + 55 ; APP_CMD -CMD58 EQU 64 + 58 ; READ_OCR -SD_SECSIZE EQU 512 ; Default size of an SD Sector +CMD0 EQU 64 + 0 ; GO_IDLE_STATE +CMD1 EQU 64 + 1 ; SEND_OP_COND +ACMD41 EQU 0x40+41 ; SEND_OP_COND (SDC) +CMD8 EQU 64 + 8 ; SEND_IF_COND +CMD9 EQU 64 + 9 ; SEND_CSD +CMD10 EQU 64 + 10 ; SEND_CID +CMD12 EQU 64 + 12 ; STOP_TRANSMISSION +CMD13 EQU 64 + 13 ; SEND_STATUS +ACMD13 EQU 0x40+13 ; SD_STATUS (SDC) +CMD16 EQU 64 + 16 ; SET_BLOCKLEN +CMD17 EQU 64 + 17 ; READ_SINGLE_BLOCK +CMD18 EQU 64 + 18 ; READ_MULTIPLE_BLOCK +CMD23 EQU 64 + 23 ; SET_BLOCK_COUNT +ACMD23 EQU 0x40+23 ; SET_WR_BLK_ERASE_COUNT (SDC) +CMD24 EQU 64 + 24 ; WRITE_BLOCK +CMD25 EQU 64 + 25 ; WRITE_MULTIPLE_BLOCK +CMD32 EQU 64 + 32 ; ERASE_ER_BLK_START +CMD33 EQU 64 + 33 ; ERASE_ER_BLK_END +CMD38 EQU 64 + 38 ; ERASE +CMD55 EQU 64 + 55 ; APP_CMD +CMD58 EQU 64 + 58 ; READ_OCR +SD_SECSIZE EQU 512 ; Default size of an SD Sector ; Card type flags (CardType) -CT_MMC EQU 001H ; MMC ver 3 -CT_SD1 EQU 002H ; SD ver 1 -CT_SD2 EQU 004H ; SD ver 2 -CT_SDC EQU CT_SD1|CT_SD2 ; SD -CT_BLOCK EQU 008H ; Block addressing +CT_MMC EQU 001H ; MMC ver 3 +CT_SD1 EQU 002H ; SD ver 1 +CT_SD2 EQU 004H ; SD ver 2 +CT_SDC EQU CT_SD1|CT_SD2 ; SD +CT_BLOCK EQU 008H ; Block addressing ; SD Card Directory structure. The directory entries are based on the MZF Header format and constraints. ; @@ -322,148 +365,149 @@ CT_BLOCK EQU 008H ; Block ; LOAD ADDR : Start address in memory where data should be loaded. ; EXEC ADDR : If a binary then this parameter specifies the location to auto execute once loaded. ; RESERVED : Not used at the moemnt. -SDDIR_FLAG1 EQU 000H -SDDIR_FLAG2 EQU 001H -SDDIR_FILEN EQU 002H -SDDIR_SSEC EQU 013H -SDDIR_SIZE EQU 015H -SDDIR_LOAD EQU 017H -SDDIR_EXEC EQU 019H -SDDIR_FNSZ EQU FNSIZE -SDDIR_ENTSZ EQU 32 +SDDIR_FLAG1 EQU 000H +SDDIR_FLAG2 EQU 001H +SDDIR_FILEN EQU 002H +SDDIR_SSEC EQU 013H +SDDIR_SIZE EQU 015H +SDDIR_LOAD EQU 017H +SDDIR_EXEC EQU 019H +SDDIR_FNSZ EQU FNSIZE +SDDIR_ENTSZ EQU 32 ; ; Rom Filing System constants for the SD Card. ; -SDDIR_DIRENT EQU 256 ; Directory entries in the RFS directory. -SDDIR_DIRENTSZ EQU 32 ; Size of a directory entry. -SDDIR_DIRSIZE EQU SDDIR_DIRENT * SDDIR_DIRENTSZ ; Total size of the directory. -SDDIR_BLOCKSZ EQU 65536 ; Size of a file block per directory entry. -SDDIR_IMGSZ EQU SDDIR_DIRSIZE + (SDDIR_DIRENT * SDDIR_BLOCKSZ) ; Total size of the RFS image. +SDDIR_DIRENT EQU 256 ; Directory entries in the RFS directory. +SDDIR_DIRENTSZ EQU 32 ; Size of a directory entry. +SDDIR_DIRSIZE EQU SDDIR_DIRENT * SDDIR_DIRENTSZ ; Total size of the directory. +SDDIR_BLOCKSZ EQU 65536 ; Size of a file block per directory entry. +SDDIR_IMGSZ EQU SDDIR_DIRSIZE + (SDDIR_DIRENT * SDDIR_BLOCKSZ) ; Total size of the RFS image. ;----------------------------------------------- ; SA-1510 MONITOR WORK AREA (MZ80A) ;----------------------------------------------- -STACK: EQU 010F0H +STACK: EQU 010F0H ; - ORG STACK + ORG STACK ; SPV: IBUFE: ; TAPE BUFFER (128 BYTES) -ATRB: DS virtual 1 ; ATTRIBUTE -NAME: DS virtual FNSIZE ; FILE NAME -SIZE: DS virtual 2 ; BYTESIZE -DTADR: DS virtual 2 ; DATA ADDRESS -EXADR: DS virtual 2 ; EXECUTION ADDRESS -COMNT: DS virtual 92 ; COMMENT -SWPW: DS virtual 10 ; SWEEP WORK -KDATW: DS virtual 2 ; KEY WORK -KANAF: DS virtual 1 ; KANA FLAG (01=GRAPHIC MODE) -DSPXY: DS virtual 2 ; DISPLAY COORDINATES -MANG: DS virtual 6 ; COLUMN MANAGEMENT -MANGE: DS virtual 1 ; COLUMN MANAGEMENT END -PBIAS: DS virtual 1 ; PAGE BIAS -ROLTOP: DS virtual 1 ; ROLL TOP BIAS -MGPNT: DS virtual 1 ; COLUMN MANAG. POINTER -PAGETP: DS virtual 2 ; PAGE TOP -ROLEND: DS virtual 1 ; ROLL END - DS virtual 14 ; BIAS -FLASH: DS virtual 1 ; FLASHING DATA -SFTLK: DS virtual 1 ; SHIFT LOCK -REVFLG: DS virtual 1 ; REVERSE FLAG -SPAGE: DS virtual 1 ; PAGE CHANGE -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 +ATRB: DS virtual 1 ; ATTRIBUTE +NAME: DS virtual FNSIZE ; FILE NAME +SIZE: DS virtual 2 ; BYTESIZE +DTADR: DS virtual 2 ; DATA ADDRESS +EXADR: DS virtual 2 ; EXECUTION ADDRESS +COMNT: DS virtual 92 ; COMMENT +SWPW: DS virtual 10 ; SWEEP WORK +KDATW: DS virtual 2 ; KEY WORK +KANAF: DS virtual 1 ; KANA FLAG (01=GRAPHIC MODE) +DSPXY: DS virtual 2 ; DISPLAY COORDINATES +MANG: DS virtual 6 ; COLUMN MANAGEMENT +MANGE: DS virtual 1 ; COLUMN MANAGEMENT END +PBIAS: DS virtual 1 ; PAGE BIAS +ROLTOP: DS virtual 1 ; ROLL TOP BIAS +MGPNT: DS virtual 1 ; COLUMN MANAG. POINTER +PAGETP: DS virtual 2 ; PAGE TOP +ROLEND: DS virtual 1 ; ROLL END + DS virtual 14 ; BIAS +FLASH: DS virtual 1 ; FLASHING DATA +SFTLK: DS virtual 1 ; SHIFT LOCK +REVFLG: DS virtual 1 ; REVERSE FLAG +SPAGE: DS virtual 1 ; PAGE CHANGE +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 ; Starting 1000H - Generally unused bytes not cleared by the monitor. -ROMBK1: EQU 01016H ; CURRENT MROM BANK -ROMBK2: EQU 01017H ; CURRENT USERROM BANK -WRKROMBK1: EQU 01018H ; WORKING MROM BANK -WRKROMBK2: EQU 01019H ; WORKING USERROM BANK -ROMCTL: EQU 0101AH ; Current Bank control register setting. -SCRNMODE: EQU 0101BH ; Mode of screen, 0 = 40 char, 1 = 80 char. -TMPADR: EQU 0101CH ; TEMPORARY ADDRESS STORAGE -TMPSIZE: EQU 0101EH ; TEMPORARY SIZE -TMPCNT: EQU 01020H ; TEMPORARY COUNTER -TMPLINECNT: EQU 01022H ; Temporary counter for displayed lines. -TMPSTACKP: EQU 01024H ; Temporary stack pointer save. -SDVER: EQU 01026H -SDCAP: EQU 01027H +ROMBK1: EQU 01016H ; CURRENT MROM BANK +ROMBK2: EQU 01017H ; CURRENT USERROM BANK +WRKROMBK1: EQU 01018H ; WORKING MROM BANK +WRKROMBK2: EQU 01019H ; WORKING USERROM BANK +ROMCTL: EQU 0101AH ; Current Bank control register setting. +SCRNMODE: EQU 0101BH ; Mode of screen, 0 = 40 char, 1 = 80 char. +TMPADR: EQU 0101CH ; TEMPORARY ADDRESS STORAGE +TMPSIZE: EQU 0101EH ; TEMPORARY SIZE +TMPCNT: EQU 01020H ; TEMPORARY COUNTER +TMPLINECNT: EQU 01022H ; Temporary counter for displayed lines. +TMPSTACKP: EQU 01024H ; Temporary stack pointer save. +SDVER: EQU 01026H +SDCAP: EQU 01027H +TZPU: EQU 01027H ; Tranzputer present flag (0 = not present, > 0 = present and version number). ; Variables sharing the BUFER buffer, normally the BUFER is only used to get keyboard input and so long as data in BUFER is processed ; before calling the CMT/SD commands and not inbetween there shouldnt be any issue. Also the space used is at the top end of the buffer which is not used so often. ; This frees up memory needed by the CMT and SD card. -SECTORBUF: EQU 0CE00H ; Working buffer to place an SD card sector. -SDSTARTSEC EQU BUFER+50+0 ; Starting sector of data to read/write from/to SD card. -SDLOADADDR EQU BUFER+50+4 ; Address to read/write data from/to SD card. -SDLOADSIZE EQU BUFER+50+6 ; Total remaining byte count data to read/write from/to SD card. -SDAUTOEXEC EQU BUFER+50+8 ; Flag to indicate if a loaded image should be executed (=0xFF) -SDBUF: EQU BUFER+50+9 ; SD Card command fram buffer for the command and response storage. -DIRSECBUF: EQU BUFER+50+20 ; Directory sector in cache. -DUMPADDR: EQU BUFER+50+22 ; Address used by the D(ump) command so that calls without parameters go onto the next block. -CMTLOLOAD: EQU BUFER+50+24 ; Flag to indicate that a tape program is loaded into hi memory then shifted to low memory after ROM pageout. -CMTCOPY: EQU BUFER+50+25 ; Flag to indicate that a CMT copy operation is taking place. -CMTAUTOEXEC:EQU BUFER+50+26 ; Auto execution flag, run CMT program when loaded if flag clear. -DTADRSTORE: EQU BUFER+50+27 ; Backup for load address if actual load shifts to lo memory or to 0x1200 for copy. -SDCOPY: EQU BUFER+50+29 ; Flag to indicate an SD copy is taking place, either CMT->SD or SD->CMT. -RESULT: EQU BUFER+50+30 ; Result variable needed for interbank calls when a result is needed. +SECTORBUF: EQU 0CE00H ; Working buffer to place an SD card sector. +SDSTARTSEC EQU BUFER+50+0 ; Starting sector of data to read/write from/to SD card. +SDLOADADDR EQU BUFER+50+4 ; Address to read/write data from/to SD card. +SDLOADSIZE EQU BUFER+50+6 ; Total remaining byte count data to read/write from/to SD card. +SDAUTOEXEC EQU BUFER+50+8 ; Flag to indicate if a loaded image should be executed (=0xFF) +SDBUF: EQU BUFER+50+9 ; SD Card command fram buffer for the command and response storage. +DIRSECBUF: EQU BUFER+50+20 ; Directory sector in cache. +DUMPADDR: EQU BUFER+50+22 ; Address used by the D(ump) command so that calls without parameters go onto the next block. +CMTLOLOAD: EQU BUFER+50+24 ; Flag to indicate that a tape program is loaded into hi memory then shifted to low memory after ROM pageout. +CMTCOPY: EQU BUFER+50+25 ; Flag to indicate that a CMT copy operation is taking place. +CMTAUTOEXEC: EQU BUFER+50+26 ; Auto execution flag, run CMT program when loaded if flag clear. +DTADRSTORE: EQU BUFER+50+27 ; Backup for load address if actual load shifts to lo memory or to 0x1200 for copy. +SDCOPY: EQU BUFER+50+29 ; Flag to indicate an SD copy is taking place, either CMT->SD or SD->CMT. +RESULT: EQU BUFER+50+30 ; Result variable needed for interbank calls when a result is needed. ; Quickdisk work area -;QDPA EQU 01130h ; QD code 1 -;QDPB EQU 01131h ; QD code 2 -;QDPC EQU 01132h ; QD header startaddress -;QDPE EQU 01134h ; QD header length -;QDCPA EQU 0113Bh ; QD error flag -;HDPT EQU 0113Ch ; QD new headpoint possition -;HDPT0 EQU 0113Dh ; QD actual headpoint possition -;FNUPS EQU 0113Eh -;FNUPF EQU 01140h -;FNA EQU 01141h ; File Number A (actual file number) -;FNB EQU 01142h ; File Number B (next file number) -;MTF EQU 01143h ; QD motor flag -;RTYF EQU 01144h -;SYNCF EQU 01146h ; SyncFlags -;RETSP EQU 01147h -;BUFER EQU 011A3h -;QDIRBF EQU 0CD90h +;QDPA EQU 01130h ; QD code 1 +;QDPB EQU 01131h ; QD code 2 +;QDPC EQU 01132h ; QD header startaddress +;QDPE EQU 01134h ; QD header length +;QDCPA EQU 0113Bh ; QD error flag +;HDPT EQU 0113Ch ; QD new headpoint possition +;HDPT0 EQU 0113Dh ; QD actual headpoint possition +;FNUPS EQU 0113Eh +;FNUPF EQU 01140h +;FNA EQU 01141h ; File Number A (actual file number) +;FNB EQU 01142h ; File Number B (next file number) +;MTF EQU 01143h ; QD motor flag +;RTYF EQU 01144h +;SYNCF EQU 01146h ; SyncFlags +;RETSP EQU 01147h +;BUFER EQU 011A3h +;QDIRBF EQU 0CD90h ;SPV: ;IBUFE: ; TAPE BUFFER (128 BYTES) -;ATRB: DS virtual 1 ; Code Type, 01 = Machine Code. -;NAME: DS virtual 17 ; Title/Name (17 bytes). -;SIZE: DS virtual 2 ; Size of program. -;DTADR: DS virtual 2 ; Load address of program. -;EXADR: DS virtual 2 ; Exec address of program. -;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 +;ATRB: DS virtual 1 ; Code Type, 01 = Machine Code. +;NAME: DS virtual 17 ; Title/Name (17 bytes). +;SIZE: DS virtual 2 ; Size of program. +;DTADR: DS virtual 2 ; Load address of program. +;EXADR: DS virtual 2 ; Exec address of program. +;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 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/rfs.asm b/software/asm/rfs.asm index 6103bed..d3ce094 100644 --- a/software/asm/rfs.asm +++ b/software/asm/rfs.asm @@ -162,7 +162,16 @@ ROMFS_3: LD (BNKSELMROM),A ; start ; ; Replacement command processor in place of the SA1510 command processor. ; -MONITOR: LD A, (ROMBK1) +MONITOR: IN A,(CPLDINFO) ; See if a tranZPUter board is present. + LD C,A + AND 0A0H ; First nibble needs to be an A if the device is present. + CP 0A0H + JR NZ,CHKTZ1 + LD A,C +CHKTZ1: AND 00FH + LD (TZPU), A ; Flag = 0 if no tranZPUter present otherwise contains version (1 - 15). + ; + LD A, (ROMBK1) CP 1 JR Z, SET80CHAR CP 0 @@ -186,8 +195,15 @@ SIGNON: LD A,0C4h ; Move SIGNON1: CALL DPCT DEC E JR NZ,SIGNON1 - LD DE,MSGSON ; Sign on message, - LD HL,PRINTMSG + ; + LD A,C + OR A + JR Z,SIGNON2 + LD DE,MSGSONTZ + JR SIGNON3 + ; +SIGNON2: LD DE,MSGSON ; Sign on message, +SIGNON3: LD HL,PRINTMSG CALL BKSW0to6 LD HL, SDINIT ; SD Card Initialisation @@ -276,6 +292,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 | 001H DB 'B' ; Bell. DW SGX @@ -420,6 +442,54 @@ SETMODE80: LD A, ROMBANK1 ; Switc LD (DSPCTL), A JP MONIT +NOTZPU: LD DE,MSGNOTZINST ; No tranZPUter installed. + LD HL,PRINTMSG + CALL BKSW0to6 + RET + + ; The RFS depends on variables stored in unused parts of the Monitor scratch area. + ; When switching into a compatibility mode the memory is switched and these variables go + ; out of scope. This routine clears the memory and sets any crucial variables after + ; memory switch so that a restart functions as expected. + ; +SETMODECLR: POP HL ; Get return address, will go OOS after memory mode change. + LD A,TZMM_COMPAT + OUT (MMCFG),A ; Set memory mode to compatibility. + XOR A ; Clear out the RFS variable area in the tranZPUter memory. + LD DE, 01000H + LD B, 030H +SETCLR_1: LD (DE),A + INC DE + DJNZ SETCLR_1 + JP (HL) ; Return to caller. + + ; Command to switch to the MZ700 compatibility mode with 80 column display. + ; +SETMODE7008:LD A,(TZPU) ; Check there is a tranZPUter card installed. + OR A + JR Z,NOTZPU + LD A, 128 ; Setup for 80char display. + LD (DSPCTL), A + CALL SETMODECLR ; Set memory mode and clear variable area. + LD A,ROMBANK5 ; Select the 80 column version of the 1Z-013A ROM. +SETMODE_2: LD (ROMBK1),A + LD (BNKSELMROM),A + LD A,SET_MODE_MZ700 ; Set the CPLD compatibility mode. +SETMODE_3: OUT (CPLDCFG),A + JP MONIT ; Cold start the monitor. + + ; Command to switch to the MZ700 compatibility mode with original 40 column display. + ; +SETMODE700: LD A,(TZPU) ; Check there is a tranZPUter card installed. + OR A + JR Z,NOTZPU + LD A, 0 ; Setup for 40char display. + LD (DSPCTL), A + CALL SETMODECLR ; Set memory mode and clear variable area. + LD A,ROMBANK4 ; Select the 40 column version of the 1Z-013A ROM. + JR SETMODE_2 + + ;==================================== ; ; ROM File System Commands @@ -597,7 +667,7 @@ DIRROM: DI ; Disab ; C = Block in page ; D = File sequence number. ; - LD B,MROMPAGES ; First 4 pages are reserved in MROM bank. + LD B,MROMPAGES ; First 8 pages are reserved in MROM bank. LD C,0 ; Block in page. LD D,0 ; File numbering start. ; diff --git a/software/asm/rfs_bank2.asm b/software/asm/rfs_bank2.asm index a750532..47ae7e1 100644 --- a/software/asm/rfs_bank2.asm +++ b/software/asm/rfs_bank2.asm @@ -1263,14 +1263,13 @@ LOADSD12: LD HL,(SDLOADADDR) JR NZ,LOADSD12A DEC HL INC (HL) -LOADSD12A: LD A,(SDLOADSIZE+1) - CP 002H - JR C,LOADSD14 ; If carry then the last read obtained the remaining bytes. - LD HL,(SDLOADSIZE) +LOADSD12A: LD HL,(SDLOADSIZE) LD DE,SD_SECSIZE OR A SBC HL,DE -LOADSD13: LD (SDLOADSIZE),HL + JR C,LOADSD14 + JR Z,LOADSD14 + LD (SDLOADSIZE),HL JR LOADSD11 LOADSD14: LD A,(SDAUTOEXEC) ; Autoexecute turned off? diff --git a/software/asm/rfs_bank6.asm b/software/asm/rfs_bank6.asm index db5b490..77c8d24 100644 --- a/software/asm/rfs_bank6.asm +++ b/software/asm/rfs_bank6.asm @@ -275,6 +275,8 @@ PRTSTRE: POP DE ; hence using upper case. HELPSCR: 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 - clear memory $1200-$D000.", 00DH DB "DXXXX[YYYY] - dump mem XXXX to YYYY.", 00DH @@ -440,7 +442,8 @@ ATBL: DB 0CCH ; NUL '\0' (null character) ; Message table ; ;-------------------------------------- -MSGSON: DB "+ RFS ", 0ABh, "2.0 **" ,00DH, 000H ; Version 2.0-> as we are now using the v2.x PCB with 4 devices on-board +MSGSON: DB "+ RFS ", 0ABh, "2.0 **" ,00DH, 000H ; Version 2.0-> as we are now using the v2.x PCB with 4 devices on-board +MSGSONTZ: DB "+ TZ+RFS ", 0ABh, "2.0 **" ,00DH, 000H ; Version 2.0 with version 2.1+ of tranZPUter board installed. MSGNOTFND: DB "Not Found", 00DH, 000H MSGRDIRLST: DB "ROM Directory:", 00DH, 000H MSGTRM: DB 00DH, 000H @@ -471,6 +474,7 @@ 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 +MSGNOTZINST:DB "No tranZPUter card installed.",00DH, 000H ALIGN 0EFFFh DB 0FFh diff --git a/software/asm/rfs_mrom.asm b/software/asm/rfs_mrom.asm index 7285a3c..be94deb 100644 --- a/software/asm/rfs_mrom.asm +++ b/software/asm/rfs_mrom.asm @@ -142,7 +142,7 @@ BK2A20 EQU 128 ; User ; 1 0 = Flasm RAM 2 or Static RAM 0. ; 1 1 = Reserved.` -BNKCTRLDEF EQU CDLTCH2+CDLTCH1+BBMOSI+SDCS+BBCLK ; Default on startup for the Bank Control register. +BNKCTRLDEF EQU BBMOSI+SDCS+BBCLK ; Default on startup for the Bank Control register. ;----------------------------------------------- ; Rom File System Header (MZF) @@ -554,12 +554,22 @@ _MROMLOAD: PUSH BC LD C,0 ADD HL,BC LD BC, MZFHDRSZ - LDIR + +LROMLOAD1: LD A,(HL) ; Issues with LDIR and a signal artifact from the mainboard, so manual copy. + INC HL + LD (DE),A + INC DE + DEC BC + LD A,B + OR C + JR NZ,LROMLOAD1 + ;LDIR PUSH HL LD DE, (DTADR) LD HL, (SIZE) LD BC, RFSSECTSZ - MZFHDRSZ + OR A SBC HL, BC JR NC, LROMLOAD4 LD HL, (SIZE) @@ -573,6 +583,8 @@ LROMLOAD2: LD A, B OR A ; Select the required user bank and Clear carry so that the control registers are disabled. CALL SELUSRBNK + ; LD (BNKCTRLDIS),A ; Disable the control registers, value of A is not important. + LROMLOAD3: PUSH BC LD HL, 0E800h LD A, C @@ -590,6 +602,7 @@ LROMLOAD3: PUSH BC LD DE, (TMPADR) LD HL, (TMPSIZE) LD BC, RFSSECTSZ + OR A SBC HL, BC JR NC, LROMLOAD4 LD BC, (TMPSIZE) @@ -600,7 +613,17 @@ LROMLOAD4: LD (TMPSIZE), HL ; HL co LD A, B ; Pre check to ensure BC is not zero. OR C JR Z, LROMLOAD8 - LDIR + +LROMLOAD9: LD A,(HL) ; Issues with LDIR and a signal artifact from the mainboard, so manual copy. + INC HL + LD (DE),A + INC DE + DEC BC + LD A,B + OR C + JR NZ,LROMLOAD9 + ;LDIR + LD BC, (TMPSIZE) LD A, B ; Post check to ensure we still have bytes OR C @@ -611,7 +634,7 @@ LROMLOAD4: LD (TMPSIZE), HL ; HL co LROMLOAD6: INC C LD A, C CP UROMSIZE/RFSSECTSZ ; Max blocks per page reached? - JR C, LROMLOAD7 + JR C, LROMLOAD3 ;LROMLOAD7 LD C, 0 INC B ; diff --git a/software/hdr/cpm22.HDR b/software/hdr/cpm22.HDR index 251dcf6ffa0d52e290cb27d4971c7a6a9660bd84..79aac98bc926763e4734c0ea12e13d34d11895f3 100644 GIT binary patch delta 32 icmZo*Y+#gNbPn(}GBOTw3+9Ca1{sD04BIA3WB>qVl?G`5 literal 128 ycmZQ{4)8THGUi191{sD09D-~DRzKbg{I+8^`v2aF=YbuQ(ckxn84fT|8vp<)at(_B diff --git a/software/roms/IPL.rom b/software/roms/IPL.rom new file mode 100644 index 0000000000000000000000000000000000000000..8c2e1b43d5c943b3c3322cfb027ca4264311095c GIT binary patch literal 4096 zcmeHH?Qc_67(e%|UAwJaVJnv*!`-32jm_;D22kRhDU)m^QmPV@T+Ra#_p2i0aN>!3AZxmXCR- z4DXmhcAJ+=BP_K`|x&~Fu)>dJ?FC8?8MIkc&j)%s9;-9XvguvR5)$eahld7p>sfM|@%iLJtAxi+Ti;z*e)4NPTc0uLc10T<9Y13J%n!1)M&{lUevlV;Dt((GGM za}p|}QEOyt4)Ap}?ACbAIy^xn=3Ex+)z$GsnAxy))TkddsOyA0zYfpSRR&Krz)E7o zTQDTa1~#1?dr5^0=fyY@-+MXVMdHv(HWqc$U&u$C4C7b5bgyT(w#TxDp$b zGVKm56pMC8l|rnGw><}NmCRDM6{nUFt(4RI3=}Ryi>lIr+RB%JRsbqh;v_M%;?P`d z2i7S!j~@1^gUmP*rw19kNxZ9U-qF92RiyyyLN=RNseGd4#TC*8n(yK!1u}UekyNb3 zd1Lw_Rf_uZ{@u7Ef{%s*?H$JtKi!2oVTa!ig>e9Pg+qtKfn$3Dok1K92HH>I<~^;u zmjE~z4u`_enEX5Uhl7y__G7>{`y2g7LtR~`aC=9jGZ>8qn;V-0kqBMkXrL>&Gu-iR z5bq5&VR>`ImJO{(AeDbzXYYrpS*MW|a|HBa?! zrh2!6-T~QLU!8dBPG&f&_AeI6gz62vAvBH|_TPWy8mEl;547PJ`BMN1Z#;WNPNkC| zi#agtlkOTOWQqH)5epyxNmY8aVUtx_xqaigZ}8))d4+*Dsw%78T9QaSL;&R21(l2l zF>Tm;*YM^I@3`Tepif!NDdqq1`|uv0{bk^wFqDJm>oPw%+yWu&zPap8bv2#>s|h)( zP`xV=n?B&ZL0xjGLb#dc>yZU)1G^Y_FNOP@pk(Sz7qef4mm2(KwcPfoL`zY)vh{o z2|vE6g6>A71wpJ$7mBF=H8dg#Cb2SI=&l3F%xepv!n4}KIj!L2Yp^~tj!IvNff55H U21*Q+7$`ANVxYvp|BHct0JS`sr~m)} literal 0 HcmV?d00001 diff --git a/software/roms/MROM_256.bin b/software/roms/MROM_256.bin index 88b9384df794cdc0fbe235fc204f1678150b652c..0f85a8d9d9e56e5fce282839f072bca41cf027f4 100644 GIT binary patch delta 10654 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 diff --git a/software/roms/cbios.rom b/software/roms/cbios.rom index ce782a4110620a7000141b77d657beb2fbf6c3a2..d895438ec2239463a0d5c579a76bca337200d224 100644 GIT binary patch delta 1887 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 C!f0jy diff --git a/software/roms/cbios_bank1.rom b/software/roms/cbios_bank1.rom index 72e181e71310ddffaec4931d62f6d0dc9b2db352..70b63403ad24e7ec5bb0be7de209b79cd36c107f 100644 GIT binary patch delta 106 zcmV-w0G0oM5P%SnO##J`PC5a_k%=!W#k@Tz11T8#BF4NS#k@8GE721gN9OSUFen3l z7zGn}<_~uvap{F`PCCPp<0JvblL!GT0mG9t0Z0nTyz3&%yv5-n&69=!AqvgB<-sb; Myz45-v#|kB2HEN@6951J delta 106 zcmV-w0G0oM5P%SnO#x_;PC5Z-k%=!WXuLfr11T8#B5AxKXuLK8E721gN9OSUFen3l z7zGn}<_~uvap{F`PC90h<0JuTlL!GT0cMjl0Z0mLyz3%vyv5-naFd1sAqsH3<-sa$ Myz44#v#|kB2Iada{Qv*} diff --git a/software/roms/cbios_bank2.rom b/software/roms/cbios_bank2.rom index f5690b9f26a662e5d896cd1111cb3e7c6da01f54..a9e94bad9bb5c3a5679d83c12ee36d923fb8ce9b 100644 GIT binary patch delta 915 zcmY*WUq};i9KXA{8%CH(+0EJ7ZE0he#wBYVb~+V|BDNmF2dme52<#yoLONftTi@GQt$X<0_w(ob{e6Gm?^x|v?L;Rj zO?K7SO(FIz(q_B_KZRnew|3dcRPBpY~Ck(~Jgj?6aUSDWwJYN!iwe zQ8Iok|58q8oINsvA$N6h*0X^4c@)ZLc3VQHg9JOXW;Gw4Q)!|)DLEI= zC^s)&A|Hf5qS07e$Zh7&Y%?bQ>~;d0m_mF6y%-#ICF^IC_EUQv3CSB-_8p39gZ&S+ zN6}ba{zHK?VA`&bZwdof2a1 z87Sty+Qj4yyJ({7IwX|v?-(fNHeF`Ev<8|Ef2+-eVYfmvv`tyxh3m4)Gd05#KUjiD z9H^PpVqW%0;$7+{DT%MC^Q81)jv6BCdvVNBGpyT|zU2gx>&1z5j`w1*w~BSPW8Mxb zY^owg|8_aOe+-#E&e;vn`T>Hw_zH+b+<)R#4e2*ly(9RkOE&f$t`1k1> z?GkD=Rs}Q}BuY83OCk6&KpT8ERgr-1(1hU@71~SruxPgMVF7b~%ynU|8w(cBhx77L zloK%T!^xErT!!tGh;blb?O^a14Qpk8R}pTNVRsRxix8S|HWr`Ih@l^N5>feyaZC3f D4lB-e delta 915 zcmY*W?@JSL7{9x@4I|8??B*!EEo}_bxMGaM?xrn_q_$p!FRUaG>P28L!Xc#dP54$h zBB);YA4~{5UwrwFZHb-punB5vF_&I?x|uV4CEa>%V`cZ^d(Y>`^L(H0^9)xHSC0y$ zFy^bR@gwFY%1w9(&X1(o+dGVJ>}gwlFOroRjq63N`nZ=`8mDs*OP_d!PAN^mkID8M zZ77M4p`J>MphT6bDaV@9VD2Ed7Js*oMs^^lkXkv zXo&3*FOd(!kI|6S5^|ZjGwZa8JG-8MCj5x=p;vuF&SdRm^1`WIw}9kDmFYy0Twm9t z+>=PME@@|o&o;+hlu5~l(~D|{GP&~{e1m!*UeJ^`nwQ!2kWLSgC}=>x)M=ONqC-IR zeFI6Zs||GCu!|V(UrG;8@-DkJj+ z5C_;e)?Ksdtln)L?`8|xL^R8H0}X%ovAc@ZVn!on_T<3Ql@L^kVX?)`gnekrYZ|2~ zo?v|lk~yf{9gk)eA=jZ7>M08e3mMjJtAjb7E?JIA0!TqG#RpgzAG>$Ekv^t1YP31*$y+@H8(>O-Y^(}sGDwtiV3&OGb--fqYU)@5x?>>>x2RY=)EXAeRxX^u>?US6FsowT%C6zO zd>COfm|MfinG&3a?UaZSAYkoa*en|6%l?fbTrNYk2-8If%{ZdPCqyyy15YB3eqXd9vBfSU(j4jgV1>hwL~;reP^|`y!ZI=fA9Z)MNiRlm?Z%y<$^O#NDP9BYiBQs zAuvyQrzGwKwyQ_%l-%^_w4fm5MTj}{L;%bbwM7VZ#a%Fv=ORjis}UQ;!89kOtDtrD zQAr1&!q*XJXO^dct6lDcCRa5(2{sU z;&vqFc>8hIig-UG!%lc9Jipddo4%&MGcCb35w?g>AOc0C-lB+I>QNVrBHDXWOSYM# zO>^8oDp?VtZr~x9&w50gBiWHZ;dxiM@W1em9C+N|P~Bkp8J&zOfwnA!7Wqv#h)51~ z@*h<;Zm?M+@mbA^h)o&TQ{=U!NU$E>2tV+`BfR4}TQMkZGz`Ug&Bof55HA0sr!G2f OTjb(d7`ADzg6$iTldD+( delta 426 zcmZvXF-QVo6vw~sJH0w6F>Giu?~E`f5o!?p(5);GBcc$RB4`R~$|9T!f*?7XsRz-s8vrz5oAZ-C6fxl2jm<^3LQTatju&UA#pA ztaIKe3Fm?B8UZIIcRdEp$OsJ}#3Un90V_rw0Ydx28Vsemh!XE=z(KJ$&PndZYhQhq z;}t0Jb;Oxgs)vi9T!X2UKy+G@uDwRcaA7MWI{6@CE9N@tlKahY8R!>#G~^e?gB_k0c=0BlTdU}mj&M(~g6PtnZbbYAQ?a65h)eMU1pk9j z@PoQI87WfbHUv{+9i_VHA~J~|bzsoJO7&J;yE=#SKIc8}Nyab#}&q2#TW*n-9`o@PnXzLI2f*_A6S zodp?M2nD#qHMbCIk|T-jwo0C|9Or<`Fo<737Q+6t(Hws6LqYw=e`uHV^?km(=(_xFrPj8+5Ps|OO!;+ z8SiG3no*abO1(}syXYtnfP?z4QkO{hFrU)wYg(H%6d9x0mo=?N*jUd9bB#j>-{VzI R6`MN3PobfMonhau_zr5BBe=)HLqm4zxtZ1pwLBvG=h(yFHk%}h% zq=uI!jgp;E(ozj=Q9-Ww9nFS(hBT6k1v_VB6Jc_|sMGPtRDXnc{u_A<&8rFGH z1bn|W3Q28>;k-7^Z~?_3b5o?HEEYNDJZk6amNUg`-ECF|uF)pw(&Y@5!VBPIzQLU5g+;^rkirL$J2x+E7W+jt?(|QK{&lw&dx;Xa9<-iz zsO~WtDjxw=jY3I|0!~1>*dr3&#V1wckyd971;(hxeO2odw&NLLsqr=45~y&B*wpFz MaK5HbhHFm6ALB{h@Bjb+ diff --git a/software/roms/monitor_1Z-013A.rom b/software/roms/monitor_1Z-013A.rom index dd666325a6d7180001e2c8f00faf8567125d329c..98ede23be9cb896f6d03fa3dd3e975ff515b3c4f 100644 GIT binary patch delta 45 xcmZorXi%6?$0)wB{sbGd8RN;#UhMzb7{w=h@!0~&4!$rTd7m!`NE-2<0{}}r4eS5_ delta 45 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 XZN*<9R7g?eE%5Y?nUI<6z3BK4)=r4X delta 843 zcmXw%Z%7ky7{`CV+ilLlNzC3y}vzwjk~pxNvxNr#hX~k5)4Y(y1;Bm3%9_il-I4g-he$ zCK$$C?a#EUCG<|i`z`5J;mCn#ui_6!E-7@l?Lc&Do(i|k%)?u}Ch#!hZ;y1UTzjWV zNA|Wya%y#iZ{O3UG)7ufeE7MFqwe%&aVMY4#&fD%1PxRZj8l_TQiGG08oUdxTY@aD zvlc(g*z6_9gL-*yo@_eFA#`D12`ZL%!57PV>Zt}Ux*oSc6J4=!Ovek%3a_wSz7Uho zquD#!=asvd7Maz|YvdBs(_{>;&_h*Ev<4f=sfkpw(m-{@aMn5XQI>Y6$2Hhst)gCQ z&}t32Uu#B`#qLU@zOKpOf*<^JV(bHl{Tg<{Eqe%W zhYxna=FfO7q*?M7FW9h8axfQZjNoc%sH#j)#a0#;u{SGX-p`0jyh@0s!I#qe&a-;K zMF|pu;j(&aR)fj1LwF2`$4?DsAX@GdUkaayu{3);BYbBJ%yK4?N(S`?nxssb(pxFA z(k2!Y5x+Kbf+jR&oU1dY<8RFi_r8!1A7Rjb_Y$BrK8% z)=DPwSbZ?;_2WArc@^9NcPkpH2_4>7ti`9Kr3#113l4S=KZcv^89WFSw~hL$gTQsv z|NcL6c_o8lX>;@pc~eLyeks6Hb6PwO6zMdS!=)pK;@@&Q^xjJPbVeX2J3g4f; zjb;(lViII*VA%fF$v_v#l+c*W%_L(1;mJ?89U{I11cv!JfLj$f2Bn}i1e;X_# zaFD0+ABV*rJ_eSGe+&w1CWkZG$xUO@-goig$+~|G8bAK=YJ4%5`1mjJ#=q(d*Az~k z-7$GHlZ*ZirhgF%jKWg?G&OAgDOy;ZJ;5|c`E;LSTOT3uvGkGP}nj#oyktFjY)go#fK;B{xN9$_{Xd9 z#a!a!zr-8=sxMqqIC*x( /tmp/mrom.rom" +echo "cat ${ROM_PATH}/monitor_SA1510.rom ${ROM_PATH}/monitor_80c_SA1510.rom ${ROM_PATH}/cbios.rom ${ROM_PATH}/rfs_mrom.rom ${ROM_PATH}/monitor_1Z-013A.rom ${ROM_PATH}/monitor_80c_1Z-013A.rom ${ROM_PATH}/IPL.rom ${ROM_PATH}/blank_mrom.rom > /tmp/mrom.rom" cat ${ROM_PATH}/monitor_SA1510.rom ${ROM_PATH}/monitor_80c_SA1510.rom \ ${ROM_PATH}/cbios.rom ${ROM_PATH}/rfs_mrom.rom \ - ${ROM_PATH}/blank_mrom.rom ${ROM_PATH}/blank_mrom.rom \ - ${ROM_PATH}/blank_mrom.rom ${ROM_PATH}/blank_mrom.rom \ + ${ROM_PATH}/monitor_1Z-013A.rom ${ROM_PATH}/monitor_80c_1Z-013A.rom \ + ${ROM_PATH}/IPL.rom ${ROM_PATH}/blank_mrom.rom \ > /tmp/mrom.rom GENROM=0