From 6bac0dd3be901e87bac862d6cab8608f2cdf1e20 Mon Sep 17 00:00:00 2001 From: Philip Smart Date: Sun, 4 Apr 2021 16:47:45 +0100 Subject: [PATCH] Updates and bug fixes --- FPGA/SW700/v1.3/coreMZ_pkg.vhd | 2 +- software/asm/5Z009-1B.asm | 25545 ++++++++++++++++++++ software/asm/include/CPM_Definitions.asm | 2 +- software/asm/include/TZFS_Definitions.asm | 12 +- 4 files changed, 25557 insertions(+), 4 deletions(-) create mode 100644 software/asm/5Z009-1B.asm diff --git a/FPGA/SW700/v1.3/coreMZ_pkg.vhd b/FPGA/SW700/v1.3/coreMZ_pkg.vhd index f1792c7..acf9e8d 100644 --- a/FPGA/SW700/v1.3/coreMZ_pkg.vhd +++ b/FPGA/SW700/v1.3/coreMZ_pkg.vhd @@ -64,7 +64,7 @@ package coreMZ_pkg is -- Soft CPU's to embed in the core. -- constant IMPL_SOFTCPU_Z80 : boolean := true; - constant IMPL_SOFTCPU_ZPUEVO : boolean := false; + constant IMPL_SOFTCPU_ZPUEVO : boolean := true; ------------------------------------------------------------ -- Function prototypes diff --git a/software/asm/5Z009-1B.asm b/software/asm/5Z009-1B.asm new file mode 100644 index 0000000..4ba943d --- /dev/null +++ b/software/asm/5Z009-1B.asm @@ -0,0 +1,25545 @@ +;***************************************************************************** +;* Sharp MZ-800 QD BASIC MZ-5Z009 v1.0B +;* +;* Listing edited by M. A. Hawes (for the Sharp Users Club) 30 January 2004 +;* +;* This ASM LISTING originates from 26 TELESYSTEMS.MAC 10D source modules +;* written by T. Miho for Sharp Electronics in Japan. +;* +;* These modules contain alternative sections of code that may be included or +;* excluded at assembly time, by means of 'IF'...'ENDIF' directives, to suit +;* the MZ-700, MZ-800 or MZ-1500. The differences between the 700 and 800 are +;* well known, but the MZ-1500 is a mystery, as it never appeared in Europe. +;* +;* The IF ENDIF sections of code suggest that MZ-1500 BASIC had 8 extra +;* keywords, 4 RS-232 channels, and a more sophisticated MUSIC system. These +;* sections of code, together with a few 'comments' in graphics characters, +;* have been left in this listing as an archive (the assumption being that, +;* on a Japanese machine, the graphics would appear Japanese characters). +;* +;* When the 26 modules were joined into one composite file and the IF ENDIF +;* sections were sorted out, it became clear that the listing represented +;* MZ-800 QDBASIC MZ-5Z009 v1.0A. The listing was then edited, to allow it +;* to be re-assembled by Flight Electronics' XASM.EXE on a 486 PC. +;* +;* The syntax of XASM.EXE differs from that of the Televideo Macro-Assembler, +;* and some global changes were therefore required to allow the composite +;* file to be re-assembled under XASM. For example, the pseudo-operation +;* 'ENT' was deleted, 'RST 3' was altered to 'RST 18H', the pseudo-operand +;* 'M' was replaced by '(HL)', and all HEX numbers starting with a letter +;* were prefixed by '0'. In addition, '*' was used in place of ';' to mark +;* the starts of all lines that were not to be assembled, pseudo-instructions +;* such as LD BC,DE were replaced by LD B,E/LD C,E; and all memory-setting +;* instructions such as DEFS 5 were changed to DB 0,0,0,0,0. +;* +;* Also, wherever a 1-byte ASCII code was denoted by a character inside +;* double quotes, these were changed to single quotes (e.g. LD A,':'). +;* +;* Finally, all references to Macros and Links were deleted, comments were +;* added to align this listing with the published German listing of Sharp's +;* equivalent FD Basic MZ-2Z046, and patches were added to convert this file +;* from v1.0A to v1.0B (these patches were not included in the original 26 +;* TELESYSTEMS.MAC modules, and they are labelled PATCH1 to PATCH8). +;* +;* The original combined file contained a few duplicate ROUTINES, several +;* JR's and DJNZ's to un-labelled destinations, and many duplicate EQUATES +;* and LABELS. To retain compatibility with versions of 5Z009 already in +;* circulation the duplicate routines were left in; but the offending JR's +;* and DJNZ's were labelled, duplicate EQUATES were commented out; and the +;* problems with duplicate LABELS were resolved by renaming one or both. +;* +;* In addition to these enforced changes, a few glaring spelling errors such +;* as 'scrool', 'tabel', and 'manegement' were corrected, and comments were +;* were added to mark the START and END of each original module. Otherwise, +;* the comments and labels of the original author have been left unchanged. +;* +;* This listing is particularly useful for its detailed comments on the tape- +;* handling routines in the 'CMT:' module, as these are typically 'Sharp' and +;* include precise timings, in both MZ-800 clock cycles and microseconds. +;* +;* The BINARY file produced by cross-assembling this listing under 'XASM' +;* on a 486 PC has been compared byte by byte with the code on an original +;* Sharp Master QD of MZ-5Z009 v1.0B, and it has been found that the two +;* sets of binary code are effectively identical (there are a few very minor +;* differences, but they all occur in transient storage areas). +;***************************************************************************** +;* Updates: TZFS, 2021-> +;* +;* I stumbled across this BASIC assembly source after I had given up on the +;* idea of an updated BASIC, other than the NASCOM v4.7 BASIC, for the +;* tranZPUter cards on the Sharp machines. The ability to modify the original +;* source to use tranZPUter SD services instead of QD/FD allows reuse of +;* a large collection of Sharp BASIC programs. +;* +;* I have converted the original LST files to ASM files referred to in the +;* above description and stored them with this source file for reference. +;* In addition, as Im using the Java based GLASS Z80 Assembler, this source +;* needed to be adapted to enable it to assemble. +;* +;* A typical assembly line would be: +;* java -jar glass-0.5.jar 5Z009-1B.ASM 5Z009-1B.obj 5Z009-1B.sym -I include +;* +;* Changes: +;* o Re-enabled the IF..ENDIF selective assembly statements as this code is +;* intended to work on the MZ-700, 800 and 1500. +;* o Comments start with semicolon in Glass. +;* o EI/DI/END/SET/NEG/SUB etc name clash. +;* o DEFB/DEFW/DEFM updated to DB,DW,DB +;* o A lot of syntax errors, Im guessing XASM is more tolerant. +;* o Had to revert to MONITN definition of -3 along with all the others as +;* Glass expects an 8 bit signed number not 16bit. +;***************************************************************************** + +; Build time variables, set one of these to 1, the others to 0, to build +; BASIC for the named machine. +; +B_MZ700 EQU 1 +B_MZ800 EQU 0 +B_MZ1500 EQU 0 + +;*----------------------------------------- +;* Variable RSYS to 1 for MZ-800, 0 for MZ-700, MZ-1500 +;* Variable SYS set to 1 for MZ-800 Sound system +;*----------------------------------------- + IF B_MZ700 = 1 +RSYS: EQU 0 ;0=700,1500, 1=800 +SYS: EQU 0 ;0 = MZ-1500; 1 = PLE + ENDIF + IF B_MZ800 = 1 +RSYS: EQU 1 ;0=700,1500, 1=800 +SYS: EQU 1 ;0 = MZ-1500; 1 = PLE + ENDIF + IF B_MZ1500 = 1 +RSYS: EQU 0 ;0=700,1500, 1=800 +SYS: EQU 1 ;0 = MZ-1500; 1 = PLE + ENDIF + + ORG 10F0H + IF B_MZ700 = 1 + DB 01h ; Code Type, 01 = Machine Code. + DB "BASIC 5Z009-700", 0Dh, 00h ; Title/Name (17 bytes). + DW BASICEND - BASICSTART ; Size of program. + DW BASICSTART ; Load address of program. + DW BASICSTART ; Exec address of program. + DS 104 ; COMMENT + ENDIF + IF B_MZ800 = 1 + DB 01h ; Code Type, 01 = Machine Code. + DB "BASIC 5Z009-800", 0Dh, 00h ; Title/Name (17 bytes). + DW BASICEND - BASICSTART ; Size of program. + DW BASICSTART ; Load address of program. + DW BASICSTART ; Exec address of program. + DS 104 ; COMMENT + ENDIF + IF B_MZ1500 = 1 + DB 01h ; Code Type, 01 = Machine Code. + DB "BASIC 5Z009-1500", 00h ; Title/Name (17 bytes). + DW BASICEND - BASICSTART ; Size of program. + DW BASICSTART ; Load address of program. + DW BASICSTART ; Exec address of program. + DS 104 ; COMMENT + ENDIF + + +;*=========================================================================== +;* START of original module MON1.ASM +;*---------------------------- +;* MZ-800 crt port define +;* FI:CRTEQU ver 1.0 7.26.84 +;*---------------------------- + +;*------------------ +;* custom lsi ports +;*------------------ + +LSPAL: EQU 0F0H ;pallet +LSFC: EQU 0FCH +LSE0: EQU 0E0H +LSE1: EQU 0E1H +LSE2: EQU 0E2H +LSE3: EQU 0E3H +LSE4: EQU 0E4H +LSE5: EQU 0E5H +LSE6: EQU 0E6H +LSD0: EQU 0D0H +LSD1: EQU 0D1H +LSD2: EQU 0D2H +LSD3: EQU 0D3H +;* +LSWF: EQU 0CCH +LSRF: EQU 0CDH +LSDMD: EQU 0CEH +LSSCR: EQU 0CFH + +;*------------- +;* work areas +;*------------- + +KEYBF: EQU 11A4H ;Keyboard Input Buffer +;*TEXTBF: EQU 2000H ;defined later +BITBUF: EQU 8000H +FONTBF: EQU 1000H +ERRTXT: EQU 0FDA0H + +;*----------------------------- +;* MZ-800 Monitor part 1 +;* FI:PL1 ver 1.0 7.30.84 +;*----------------------------- + + ORG 0 + +BASICSTART: + + JP STARTP + JP GETL + JP CR1 + JP CR2 + JP CRT1S + JP PRNTT + JP CRT1C + JP CRTMSG +.IOSVC: JP IOSVC ;RST3 superviser call entry + JP INKEY0 +BRKCHK: JP BRKEY + JP SVCMT1 + JP SVCMT2 + JP LDCMT1 + JP LDCMT2 + JP CHKTAP + JP .RET ;RST6 + JP TIMST + + DB 0,0 ;was DEFS 2 + + JP .RET ;RST7 debugger reserve + + JP TIMRD +BEEPM: JP CTRLG + +ATEMPO: JP QTEMP + JP MLDSP + JP MLDSP + JP GETL + +SYSSTA: DW BSTART +ERRORP: DB 0,0 ;was DEFS 2 + JP CRTMSG ;org 51H + + DB 0,0,0,0 ;was DEFS 4 + JP INKEY$ ;org 58H + +;*--------------------------------- +;* crt driver control code table +;*--------------------------------- +CONTTB: DW .RET ;@ 00 + DW .RET ;A 01 + DW .RET ;B 02 + DW CTR.M ;C 03 + DW .RET ;D 04 + DW CTR.E ;E 05 sft lock + DW CTR.F ;F 06 sft normal + DW .RET ;G 07 beep + DW .RET ;H 08 + DW CTAB ;I 09 + DW .RET ;J 0A + DW .RET ;K 0B + DW .RET ;L 0C + DW CTR.M ;M 0D cr + DW SPLSW ;N 0E spool exec/stop + DW .RET ;O 0F + DW DEL ;P 10 del + DW CDOWN ;Q 11 cursor down + DW CUP ;R 12 cursor up + DW CRIGHT ;S 13 cursor right + DW CLEFT ;T 14 cursor left + DW HOME ;U 15 home + DW HCLSW ;V 16 clr + DW CTR.W ;W 17 graph + DW INST ;X 18 inst + DW CTR.Y ;Y 19 alpha + DW .RET ;Z 1A + DW CTR.M ;[ 1B esc + DW .RET ;\ 1C + DW .RET ;] 1D + DW .RET ;^ 1E + DW .RET ;_ 1F + +CTRLJB: ADD A,A + LD HL,CONTTB + CALL ADDHLA + CALL INDRCT + JP (HL) + +.NOP: NOP +.HL: JP (HL) + +DINT: EI + PUSH AF + CALL MWAIT + CALL SPLOFF + POP AF + DI +.RET: RET + + +EINT: PUSH AF + CALL SPLON + POP AF + EI + RET + +;*-------------------------------- +;* register all push programs +;* +;* PUSHRA : PUSH IX,HL,BC,DE,AF +;* PUSHR : PUSH IX,HL,BC,DE +;* Destroy IX +;*---------------------------------- +PUSHRA: EX (SP),IX + PUSH HL + PUSH BC + PUSH DE + PUSH AF + PUSH HL + LD HL,POPRA + EX (SP),HL + JP (IX) +PUSHR: EX (SP),IX + PUSH HL + PUSH BC + PUSH DE + PUSH HL + LD HL,POPR + EX (SP),HL + JP (IX) + +POPRA: POP AF +POPR: POP DE + POP BC + POP HL + POP IX + RET + +;*--------------------------------- +;* cold startup routine +;*--------------------------------- + ORG 0DAH ;ensure routine is where expected + +COLDST: DI + LD SP,0000H + IM 2 + OUT (LSE1),A + LD HL,(SYSSTA) + JP (HL) ;system entry jump + +;*------------------------- +;* BREAK, can't continue +;*------------------------- +BREAKX: XOR A + DB 21H +;*----------------------- +;* BREAK, can continue +;*----------------------- +BREAKZ: LD A,80H + DB 21H +;*------------- +;* I/O error +;*------------- +IOERR: OR 80H +;*--------------- +;* Error occur +;*--------------- +ERRORJ: PUSH AF + CALL MLDSP + POP AF + LD HL,(ERRORP) + JP (HL) ;error jump +;* +;*----------------------------- +;* B = String bytes (till 00H) +;*----------------------------- +COUNT: PUSH DE + LD B,0 +COUNT2: LD A,(DE) + OR A + JR Z,COUNT9 + INC DE + INC B + JR NZ,COUNT2 + DEC B +COUNT9: POP DE + RET + +;*-------------------------- +;* IOOUT +;* +;* Ent. HL=I/O data table +;* B =counter +;*-------------------------- +IOOUT: LD A,(HL) + INC HL + LD C,(HL) + INC HL + OUT (C),A + DJNZ IOOUT + RET +;* +DEVASC: RST 18H + DB .DEASC + LD A,D + OR A + JP NZ,ER03M + LD A,E + CP B + RET C + JP ER03M + NOP ; make spare byte 00H + +;*---------------------- + ORG 011BH ; ensure start of CKCACC matches MZ-700 BASIC +;* Syntax of CHECK ACC +;* CALL CHKACC +;* DB N +;* DB X1 +;* DB X2 +;* : : +;* DB XN +;*---------------------- +CHKACC: EX (SP),HL + PUSH BC + LD B,(HL) +CHACC1: INC HL + CP (HL) + JR Z,CHACC2 + DJNZ CHACC1 + INC HL + JR CHACC9 + +CHACC2: INC HL + DJNZ CHACC2 +CHACC9: POP BC + EX (SP),HL + RET + +;*------------- +;* LD DE,(HL+) +;*------------- +LDDEMI: LD E,(HL) + INC HL + LD D,(HL) + INC HL + RET + +;*------------- +;* LD DE,(HL) +;*------------- +LDDEMD: LD E,(HL) + INC HL + LD D,(HL) + DEC HL + RET + +;*-------------------------- +;* Clear B bytes, start (HL) +;*-------------------------- +QCLRHL: XOR A +;*------------------------ +;* Set B bytes, start (HL) +;*------------------------ +QSETHL: LD (HL),A + INC HL + DJNZ QSETHL + RET + +;*-------------------------- +;* Clear B bytes, start (DE) +;*-------------------------- +QCLRDE: XOR A +;*------------------------ +;* Set B bytes, start (DE) +;*------------------------ +QSETDE: LD (DE),A + INC DE + DJNZ QSETDE + RET + +;*----------------------- +;* LD (DE),(HL) B bytes +;*----------------------- +LDDEHL: LD A,(HL) + LD (DE),A + INC HL + INC DE + DJNZ LDDEHL + RET + +;*----------------------- +;* LD (HL),(DE) B bytes +;*----------------------- +LDHLDE: LD A,(DE) + LD (HL),A + INC HL + INC DE + DJNZ LDHLDE + RET + +;*------------ +;* LD HL,(HL) +;*------------ +INDRCT: PUSH AF + LD A,(HL) + INC HL + LD H,(HL) + LD L,A + POP AF + RET + +;*---------- +;* ADD HL,A +;*---------- +ADDHLA: ADD A,L + LD L,A + RET NC + INC H + RET + +;*------------------ +;* Fetch subroutines +;*------------------ +INCHLF: INC HL +HLFTCH: LD A,(HL) + CP 20H + JR Z,INCHLF + RET + +;*----------------------- +;* TEST1 "x" ;test 1 char +;*----------------------- +TEST1: CALL HLFTCH + EX (SP),HL + CP (HL) + INC HL + EX (SP),HL + RET NZ + INC HL + RET + +;*-------------------------- +;* TESTX "x" ;check 1 char +;*-------------------------- +TESTX: CALL HLFTCH + EX (SP),HL + CP (HL) + INC HL + EX (SP),HL + INC HL + RET Z ;OK + LD A,1 + JP ERRORJ ;Syntax error +;* +;*-------------------- +;* SVC (RST 18H) table +;*-------------------- +IOSVCT: +.MONOP: EQU 00H + DW MONOP +.CR1: EQU 01H + DW CR1 +.CR2: EQU 02H + DW CR2 +.CRT1C: EQU 03H + DW CRT1C +.CRT1X: EQU 04H + DW CRT1CX +.CRTMS: EQU 05H + DW CRTSIMU +.LPTOT: EQU 06H + DW LPTOUT +.LPT1C: EQU 07H + DW LPT1C +DHCR: EQU 08H + DW HCR +DH1C: EQU 09H + DW H1C +DH1CX: EQU 0AH + DW H1CX +DHMSG: EQU 0BH + DW HMSG +.GETL: EQU 0CH + DW GETL +.INKEY: EQU 0DH + DW INKEY$ +.BREAK: EQU 0EH + DW BRKEY +.HALT: EQU 0FH + DW HALTP +.DI: EQU 10H + DW DINT +.EI: EQU 11H + DW EINT +.CURMV: EQU 12H + DW CURMOV +.DEASC: EQU 13H + DW DEASC +.DEHEX: EQU 14H + DW DEHEX +.CKHEX: EQU 15H + DW CKHEX +.ASCHL: EQU 16H + DW ASCHL +.COUNT: EQU 17H + DW COUNT +.ADDP0: EQU 18H + DW ADDP0 +.ADDP1: EQU 19H + DW ADDP1 +.ADDP2: EQU 1AH + DW ADDP2 +.ERRX: EQU 1BH + DW ERRX +DQDACN: EQU 1CH + DW QDACN +DQADCN: EQU 1DH + DW QADCN +.STICK: EQU 1EH + DW STICK +.STRIG: EQU 1FH + DW STRIG +.BELL: EQU 20H + DW CTRLG +.PLAY: EQU 21H + DW PLAY +.SOUND: EQU 22H + DW MSOUND +.MCTRL: EQU 23H + DW MCTRL +.IOOUT: EQU 24H + DW IOOUT +.TIMRD: EQU 25H + DW TIMRD +.TIMST: EQU 26H + DW TIMST +.INP1C: EQU 27H + DW INP1C0 +.CLRIO: EQU 28H + DW CLRIO +.SEGAD: EQU 29H + DW SEGADR +.OPSEG: EQU 2AH + DW OPSEG +.DLSEG: EQU 2BH + DW DELSEG +.DEVNM: EQU 2CH + DW DEV +.DEVFN: EQU 2DH + DW DEV.FN +.LUCHK: EQU 2EH + DW LUCHK +.LOPEN: EQU 2FH + DW LOPEN +.LOADF: EQU 30H + DW LOADFL +.SAVEF: EQU 31H + DW SAVEFL +.VRFYF: EQU 32H + DW VRFYFL +.RWOPN: EQU 33H + DW RWOPEN +.INSTT: EQU 34H + DW INPSTRT +.INMSG: EQU 35H + DW INPMSG +.INDAT: EQU 36H + DW INPDT +.PRSTR: EQU 37H + DW PRTSTR +.CLKL: EQU 38H + DW CLKL +.DIR: EQU 39H + DW FDIR +.SETDF: EQU 3AH + DW SETDFL +.LSALL: EQU 3BH + DW LSALL +.FINIT: EQU 3CH + DW FINIT +.DELET: EQU 3DH + DW FDELET +.RENAM: EQU 3EH + DW FRENAM +.LOCK: EQU 3FH + DW FLOCK +.RECST: EQU 40H + DW RECST +.INREC: EQU 41H + DW INREC +.PRREC: EQU 42H + DW PRREC +.ERCVR: EQU 43H + DW ERRCVR +.SWAP: EQU 44H + DW FSWAP +.CLS: EQU 45H + DW HCLS +.POSCK: EQU 46H + DW POSCK +.POSSV: EQU 47H + DW POSSV +.PSET: EQU 48H + DW PSET +.LINE: EQU 49H + DW WLINE +.PATTR: EQU 4AH + DW CHARW +.BOX: EQU 4BH + DW WBOX +.PAINT: EQU 4CH + DW WPAINT +.CIRCL: EQU 4DH + DW WCIRCL +.POINT: EQU 4EH + DW QPOINT +.HCPY: EQU 4FH + DW HCPY +.DSMOD: EQU 50H + DW DSMODE +.DPLBK: EQU 51H + DW DPALBK +.DPLST: EQU 52H + DW DPALST +.DWIND: EQU 53H + DW DWIND +.DCOL: EQU 54H + DW DCOLOR +.DGCOL: EQU 55H + DW DGCOL +.ICRT: EQU 56H + DW ICRT +.SYMBL: EQU 57H + DW SYMBOL + +;*---------------------- +;* SVC handler (RST 18H) +;*---------------------- +IOSVC: EX (SP),HL + PUSH AF + LD A,(HL) + INC HL + PUSH HL + LD HL,IOSVCT + ADD A,A + ADD A,L + JR NC,IOSVC1 + INC H +IOSVC1: LD L,A + LD A,(HL) + INC HL + LD H,(HL) + LD L,A + LD (IOSVCX+1),HL + POP HL + POP AF + EX (SP),HL +IOSVCX: JP 0 ;xxx + +;*------------------------ +;* I/O device call (RST5) +;*------------------------ +IOCALL: PUSH HL + PUSH DE + LD (IOCALX+1),IX + LD IX,IOERR + OR A +IOCALX: CALL 0 ;xxx + POP DE + POP HL + RET NC + OR A + SCF + RET Z + JP IOERR + +;*--------------------------------- +;* Convert BINARY(HL) to ASCII(DE) +;*--------------------------------- +ASCHL: PUSH HL + PUSH BC + PUSH DE + LD DE,10000 + CALL NEWLAB + LD DE,1000 + CALL NEWLAB + LD DE,100 + CALL NEWLAB + LD DE,10 + CALL NEWLAB + LD A,L + POP DE + OR 30H + LD (DE),A + INC DE + XOR A + LD (DE),A + POP BC + POP HL + RET + +NEWLAB: LD A,0FFH +ASCHL4: INC A + OR A + SBC HL,DE + JR NC,ASCHL4 + ADD HL,DE + OR A + JR NZ,ASCHL6 + OR B + RET Z ;Zero sup. + XOR A +ASCHL6: LD B,1 + OR 30H + POP DE + EX (SP),HL + LD (HL),A + INC HL + EX (SP),HL + PUSH DE + RET + +;*--------------------------------- +;* Convert ASCII(HL) to BINARY(DE) +;*--------------------------------- +DEASC: CALL TEST1 + DB '$' + JR Z,DEHEX + LD DE,0 +DEASC2: CALL HLFTCH + SUB 30H + CP 10 + RET NC + INC HL + PUSH HL + LD H,D + LD L,E + ADD HL,HL ;2 + JR C,ER02A + ADD HL,HL ;4 + JR C,ER02A + ADD HL,DE ;5 + JR C,ER02A + ADD HL,HL ;10 + JR C,ER02A + LD E,A + LD D,0 + ADD HL,DE + JR C,ER02A + EX DE,HL + POP HL + JR DEASC2 + +ER02A: LD A,2 + JP ERRORJ + +;*------------------------------ +;* Convert HEX(HL) to BINARY(DE) +;*------------------------------ +DEHEX: LD DE,0 +DEHEX2: LD A,(HL) + CALL CKHEX + RET C + INC HL + EX DE,HL + ADD HL,HL ;2 + JR C,ER02A + ADD HL,HL ;4 + JR C,ER02A + ADD HL,HL ;8 + JR C,ER02A + ADD HL,HL ;16 + JR C,ER02A + ADD A,L + LD L,A + EX DE,HL + JR DEHEX2 + +;*---------- +;* Check hex +;*---------- +CKHEX: SUB 30H + CP 10 + CCF + RET NC + SUB 17 + CP 6 + CCF + RET C + ADD A,10 + RET + +;*------------------------------ +;* SVC .HALT ;Halt if SPACE, +;* ;and break check +;*------------------------------ +HALTP CALL HALTSB + CP 20H + RET NZ +HALT1: CALL HALTSB + OR A + JR Z,HALT1 + RET + + +HALTSB: RST 18H + DB .BREAK + JR Z,HALTBR + LD A,0FFH + RST 18H + DB .INKEY + CP 1BH + RET NZ +HALTBR: JP BREAKZ + RET + +;*------------------------- +;* SVC .SETDF ;set default +;* ent DE:equipment table +;* A: channel +;*------------------------- +SETDFL: LD (DDEV),DE + LD (DCHAN),A + RET + +;*--------------- +;* Pointer update +;*--------------- +ADDP0: LD HL,(POOL) + ADD HL,DE + LD (POOL),HL +ADDP1: LD HL,(VARST) + ADD HL,DE + LD (VARST),HL +ADDP2: LD HL,(STRST) + ADD HL,DE + LD (STRST),HL + LD HL,(VARED) + ADD HL,DE + LD (VARED),HL + LD HL,(TMPEND) + ADD HL,DE + LD (TMPEND),HL + RET + +;*-------------------------------- +;* SVC .ERRX ;Print error message +;*-------------------------------- +ERRX: LD C,A + RST 18H + DB .BELL + RST 18H + DB .CR2 + BIT 7,C + JR Z,ERRX1 + LD HL,KEYBUF + PUSH HL + CALL SETDNM + POP DE + RST 18H + DB .CRTMS ;device name +ERRX1: LD A,C + AND 7FH + LD C,A + RST 18H + DB .DI + OUT (LSE3),A ;bank change + JR ERRX0 + +ERRXU: LD C,69 +ERRX0: LD DE,ERRTXT +ERRX2: DEC C + JR Z,ERRX4 +ERRX3: LD A,(DE) + INC DE + OR A + JP P,ERRX3 + JR Z,ERRXU + JR ERRX2 +;* +ERRX4: LD A,(DE) + CP 80H + JR Z,ERRXU + EX DE,HL + LD DE,KEYBUF +ERRX6: LD A,(HL) + OR A + JP M,ERRX8 + LDI + JR ERRX6 + +ERRX8: AND 7FH + LD (DE),A + OUT (LSE1),A ;bank change + RST 18H + DB .EI + INC DE + LD HL,MESER + LD B,8 + CALL LDDEHL + LD DE,KEYBUF + RST 18H + DB .CRTMS + RET + +SETDNM: LD DE,(ZEQT) + INC DE + INC DE + RST 18H + DB .COUNT + CALL LDHLDE + LD A,(ZCH) + ADD A,'1' + LD (HL),A ;ch# + LD A,(ZFLAG2) + AND 0FH ;max ch# + JR Z,SETDN2 + INC HL +SETDN2: LD (HL),':' + INC HL + LD (HL),0 + RET + +MESER: DB " ERROR" + DB 0 + +;*----------------------------------- +;* display mode +;* ent. acc mode colors dmd +;* 1 320*200 4 0 +;* 2 320*200 16 2 +;* 3 640*200 2 4 +;* 4 640*200 4 6 +;*----------------------------------- +DSMODE: CALL PUSHR + LD B,A + LD A,(MEMOP) ;option vram exist ? + OR A + LD A,B + JR NZ,DSM0 + CP 2 + JR Z,CERR + CP 4 + JR Z,CERR +DSM0: PUSH AF + DEC A + LD D,0FFH + LD HL,PAL4T + LD BC,0403H + JR Z,DSM00 ;skip if 320*200 4 colors + DEC A + LD HL,PAL16T + LD BC,100FH + JR Z,DSM00 ;skip if 320*200 16 colors + DEC A + LD HL,PAL2T + LD BC,0201H + JR Z,DSM00 ;skip if 640*200 2 colors + LD HL,PAL4T ; 640 *200 4 colors + LD BC,0805H + LD D,0FDH +DSM00: LD (CPLANE),BC ;c cplane + LD A,D + LD (PMASK),A ;plane mask + LD (PALAD),HL + CALL PALOFF + POP AF + DEC A + RLCA + LD (DMD),A + OUT (LSDMD),A + AND 4 ;bit 2 only + CALL DWIDTH ;acc=0 -->40 chr + CALL CONPCI ;(YS,YE)=0,24 palint + OR A + RET + +CERR: SCF + RET + +;*-------------------------------- +;* console & palette & color init +;*-------------------------------- +CONPCI: LD HL,1800H ;(ys,ye)=(0,24) + CALL DWIND +;* +;* JR PALINT ;commented out in original module +;* +PALINT: LD A,(CPLANE) + LD (CMODE),A + XOR A + CALL DPALBK ;init palette block reg. + LD HL,PALAD + LD E,(HL) + INC HL + LD D,(HL) + EX DE,HL + LD DE,PALTBL ;init palette reg. + PUSH DE + LD BC,4 + LDIR + POP HL +PALOUT: LD B,4 + LD C,LSPAL + OTIR + RET + +;*------------------ +;* Palette all clr +;*------------------ +PALOFF: PUSH BC + XOR A + LD B,5 + LD C,LSPAL +PALOF1: OUT (C),A + ADD A,10H + DJNZ PALOF1 + POP BC + RET + +;*------------------------------- +;* pallet block register set +;* ent acc=pal block number +;*------------------------------- +DPALBK: CALL PUSHR + LD (PALBK),A + LD E,A + LD A,(DMD) + CP 2 + JR NZ,PALBK1 ;skip if not 320*200 16 col + LD A,E + RLCA ;*2 + RLCA ;*4 + LD HL,PALTBL + LD B,4 + PUSH HL +PALBK0: LD (HL),A + ADD A,11H + INC HL + DJNZ PALBK0 + POP HL + CALL PALOUT +PALBK1: LD A,E + OR 40H + OUT (LSPAL),A + RET + +;*---------------------------------- +;* pallet register set +;* ent acc=pal register number +;* b =pal color code +;*---------------------------------- +DPALST: CALL PUSHR + LD HL,PALTBL + LD D,0 + LD E,A ;pallet register number + ADD HL,DE + OR A + RLCA + RLCA + RLCA + RLCA + OR B ;pallet color code + LD (HL),A + OUT (LSPAL),A + RET + +;*---------------------------------- +;* display color set +;* acc=col code +;*---------------------------------- +DCOLOR: PUSH AF + CALL COLS + LD (CMODE),A + POP AF + RET + + +DGCOL: PUSH AF + CALL COLS + LD (GMODE),A + POP AF + RET + +COLS: PUSH BC + LD B,A + LD A,(DMD) + CP 6 + LD A,B + JR NZ,COLS1 ;skip if not 640*200 4 + CP 2 + JR C,COLS1 + ADD A,2 ;2 or 3 only +COLS1: POP BC + RET + +;*--------------------- +;* display window set +;*--------------------- +DWIND: CALL PUSHR + LD (YS),HL ;save YS,YE + LD A,H + SUB L + INC A + LD (YW),A ;YW=YE-YS+1 :lines + LD B,A + ADD A,A + ADD A,A + ADD A,B + LD (SW),A ;SW=YW*5 + EX DE,HL + LD H,0 + LD L,A + ADD HL,HL ;*2 + ADD HL,HL ;*4 + ADD HL,HL ;*8 + LD (SSW),HL + EX DE,HL + INC H + LD A,H + ADD A,A + ADD A,A + ADD A,H + LD (SEA),A ;SEA=(YE+1)*5 + LD A,L + ADD A,A + ADD A,A + ADD A,L + LD (SSA),A ;SSA=YS*5 + LD HL,0 + LD (SOF),HL ;SOF=0 + LD HL,SEA + LD BC,6CFH ;B counter C scroll reg + OTDR + CALL HCLS + JP HOME + +;*------------------------------ +;* display chracter size change +;* if acc=1 then 640 chr +;* if acc=0 then 320 chr +;*------------------------------ +DWIDTH: CALL PUSHR + OR A + LD A,40 + LD DE,2300H + JR Z,DWID1 + ADD A,A ;80 chr + LD DE,0023H +DWID1: LD (CWIDTH),A + LD H,0 + LD L,A + ADD HL,HL ;*2 + ADD HL,HL ;*4 + ADD HL,HL ;*8 + LD (CSIZE),HL + DEC A + LD (XE),A + LD A,D + LD (PTW0),A + LD (PTW0+1),A + LD (PTB0),A + LD A,E + LD (PTW1),A + LD (PTW1+1),A + LD (PTB1),A + LD BC,0B07H ;patch counter + LD HL,CHTBL ;patch table addr + CALL PATCH + CALL CHGRPH ;mon-grph + JP HCLS + +;*------------ +;* word patch +;*------------ +PATCH: +PATCHW: LD E,(HL) ;addr read + INC HL + LD D,(HL) + INC HL +PTW0: INC HL ;nop + INC HL ;nop + LD A,(HL) ;data read + INC HL + LD (DE),A + INC DE + LD A,(HL) + INC HL + LD (DE),A +PTW1: NOP ;inc hl + NOP ;inc hl + DJNZ PATCHW +;*-------------- +;* byte patch +;*-------------- + LD B,C +PATCHB: LD E,(HL) ;addr read + INC HL + LD D,(HL) + INC HL +PTB0: INC HL ;nop + LD A,(HL) + INC HL + LD (DE),A +PTB1: NOP ;inc hl + DJNZ PATCHB + RET + +;*-------------------------------- +;* PL-EX crt driver patch table +;*-------------------------------- +;*------------ +;* word patch +;*------------ +CHTBL: DW XPD1+1 ;ld de,xxxxh + DW 80 + DW 40 + DW XPC1 ;sla c + DW 21CBH + DW 0 ;nop + DW XPC2+1 ;ld bc,xxxxh + DW 400 + DW 200 + DW XPC3+1 ;ld hl,xxxxh + DW BITBUF+16000 + DW BITBUF+8000 + DW XPDE3+1 ;ld de,xxxxh + DW 80 + DW 40 + DW XPDE4+1 ;ld bc,xxxxh + DW 560 + DW 280 + DW XPIN2+1 ;ld de,xxxxh + DW 80 + DW 40 + DW XPIN3+1 ;ld de,xxxxh + DW 0FFB0H + DW 0FFD8H + DW XPIN4+1 ;ld bc,xxxxh + DW 0FDD0H + DW 0FEE8H + DW XPLI2+1 ;ld de,xxxxh + DW 80 + DW 40 + DW XPSC2+1 ;ld bc,xxxxh + DW 639 + DW 319 +;*---------- +;*byte patch +;*---------- + DW XPDE1+1 ;ld l,xxh + DB 79 + DB 39 + DW XPDE2+1 ;ld c,xxh + DB 79 + DB 39 + DW XPIN1+1 ;ld c,xxh + DB 79 + DB 39 + DW XPLI1+1 ;ld a,xxh + DB 79 + DB 39 + DW XPSC1+1 ;ld c,xxh + DB 80 + DB 40 + DW XPCU1 ;add hl,hl + DB 29H + DB 0 ;nop + DW XPCU2 ;add hl,hl + DB 29H + DB 0 ;nop + +;*--------------------------- +;* crt 1 character display +;* acc=ascii code +;*--------------------------- +ACCDI: CALL PUSHRA + LD HL,(POSADR) + LD C,A + CP 20H ;convert space + JR NZ,ACCDI0 + XOR A +ACCDI0: LD (HL),A + LD HL,(BITADR) + LD A,C + CALL BITMAP + XOR A ;patch cursor + LD (CDOWN2+2),A + CALL CRIGHT + LD A,7 + LD (CDOWN2+2),A + RET + +;*----------------------- +;* bitmap extension +;* ent Acc:ascii code +;* HL :bitadr +;*----------------------- +BITMAP: RST 18H ;ascii->display + DB DQADCN + DI + EXX + PUSH HL + LD H,0 + LD L,A ;display code + LD A,(CMODE) + OR 80H ;replace mode + OUT (LSWF),A + ADD HL,HL ;*2 + ADD HL,HL ;*4 + ADD HL,HL ;*8 + SET 4,H ;offset fontbuf $1000 + EXX + LD B,8 +XPD1: LD DE,40 ;cwidth 80<--80 chr + IN A,(LSE0) ;bank change !! +BITM1: EXX + LD A,(HL) ;font pattern read + INC HL ;next pointer + EXX + LD (HL),A ;font pattern write + ADD HL,DE ;next laster + DJNZ BITM1 + IN A,(LSE1) ; bank reset !! + EI + EXX + POP HL + EXX + RET + +;*------------------------- +;* management utility +;* exit D=begin line +;* E=end line+1 +;*------------------------- +LBOUND: CALL TBCALC +LBOUN1: LD A,(HL) + OR A + JR Z,LBOUN2 + DEC HL + DEC E + LD A,(YS) + CP E + JR C,LBOUN1 +LBOUN2: LD D,E +LBOUN3: INC E + INC HL + LD A,(HL) + OR A + RET Z + LD A,(YE) + CP E + JR NC,LBOUN3 + RET + +TBCALC: LD E,H + LD D,0 + LD HL,SCRNT0 + ADD HL,DE + RET + +;*------------------- +;* clear window +;*------------------- +HCLSW: CALL PUSHR + LD A,(YS) + LD H,A + CALL TBCALC + LD A,(YW) ;YW=YE-YS+1 + LD B,A ;lines + LD E,A ;store YW + CALL QCLRHL ;mangement buf clr +CLSWT: LD C,E ;restore YW + LD A,(YE) + +;* JR CLSLT ;commented out in the original module + +;*------------------------ +;* clear line +;* C=lines Acc=line no. +;*------------------------ +CLSLT: INC A + LD L,0 + LD H,A + PUSH HL ;start pos x,y + CALL PONT + LD B,0 +XPC1: NOP ;40 SLA C<--80 + NOP + PUSH BC + CALL PUSHW + POP HL ;pop counter + ADD HL,HL ;*2 + ADD HL,HL ;*4 + ADD HL,HL ;*8 + LD C,L + LD B,H + POP HL ;start pos x,y + CALL PONTB + CALL PUSHW + JR CLRSCR + +;*------------------ +;* clear screen +;*------------------ +HCLS: CALL PUSHRA +CLST: LD HL,TEXTBF+2000 + LD BC,50 + CALL PUSHW + LD B,25 + LD HL,SCRNT0 + CALL QCLRHL ;management buf clr +;*------------ +;* color mode +;*------------ +CLSB: +XPC2: LD BC,200 ;or 400 +XPC3: LD HL,BITBUF+8000 ;or +16000 + CALL PUSHW + JR CLRSCR + +;*----------------------- +;* PUSH Write +;* Ent:HL=cls point addr +;* BC=counts *40 +;*----------------------- +PUSHW: LD (PUSHW1+1),SP + LD (PUSHW2+1),HL + LD HL,0 + LD A,(CPLANE) ;display active plane + OR 80H ;replace mode + OUT (LSWF),A +PUSHW0: DI +PUSHW2: LD SP,0 ;xx + IN A,(LSE0) ;bank + PUSH HL + PUSH HL + PUSH HL + PUSH HL + PUSH HL ;10 + PUSH HL + PUSH HL + PUSH HL + PUSH HL + PUSH HL ;20 + PUSH HL + PUSH HL + PUSH HL + PUSH HL + PUSH HL ;30 + PUSH HL + PUSH HL + PUSH HL + PUSH HL + PUSH HL ;40 + IN A,(LSE1) ;bank + LD (PUSHW2+1),SP +PUSHW1: LD SP,0 ;xxx + EI + DEC BC + LD A,C + OR B + JR NZ,PUSHW0 + RET + +;*---------------------------- +;* scroll parameter initial +;*---------------------------- +CLRSCR: LD HL,0 + LD (SOF),HL + LD B,2 + LD C,LSSCR ;lsi scroll register + OUT (C),H + DEC B + OUT (C),L + JP HOME + +;*--------------------- +;* delete character +;*--------------------- +DEL: EXX + PUSH HL + PUSH DE + PUSH BC + EXX + CALL DEL0 + EXX + POP BC + POP DE + POP HL + EXX + RET + + +DEL0: LD HL,(CURXY) + DEC L + JP P,DEL1 + CALL TBCALC + LD A,(HL) + LD H,E + LD L,0 + OR A + JR Z,DEL1 + LD A,(YS) + CP H + JR Z,DEL1 + DEC H +XPDE1: LD L,39 ;XE 39 or 79 +DEL1: LD (CURXY),HL + CALL LINCAL +;*BC lines HL' counts HL last curxy + CALL PONTC + PUSH BC ;lines store + LD D,H + LD E,L + INC HL + EXX + PUSH HL ;HL' counts + EXX + POP BC + LDIR + XOR A + LD (DE),A ;last addr space + POP BC ;lines pop + LD HL,(CURXY) + INC HL + CALL PONTB ;bitmap addr +DELB11: EXX + LD D,9 ;laster set + LD HL,(MAXCF) + DEC D + EXX + JR DELB2 ;line first time only + +;*---------------------------------- +;* DELB +;* ent. +;* BC lines +;* HL start address +;*---------------------------------- +DELB: +XPDE2: LD C,39 ;79 xe + DEC B ;last line ? + JR Z,DELB0 ;skip if end of func. + INC DE ;next addr calc + INC DE + LD H,D + LD L,E + JR DELB11 + +DELB1: LD HL,(MAXCF) ; + DEC D ;last laster ? + EXX + JR Z,DELB ;skip if next line +XPDE3: LD DE,40 ;cwidth 80 + ADD HL,DE +DELB2: EXX ;next plane ? + RRC L + JR C,DELB1 + LD A,L + AND H ;pmask + EXX + JR Z,DELB2 ;skip if warp + DI + PUSH HL + PUSH BC + OUT (LSRF),A ;read plane + OUT (LSWF),A ;write plane + IN A,(LSE0) ;bank change + OUT (LSE0),A ;cg off + LD D,H + LD E,L + DEC DE + LD A,C + OR A + JR Z,XPDE4 + LD A,B ;line counter + LD B,0 + LDIR + DEC A + JR Z,DELB3 ;skip if last counter +XPDE4: LD BC,280 ; 560 + ADD HL,BC + LD A,(HL) + LD (DE),A +DELB3: IN A,(LSE1) ;bank off + EI + POP BC + POP HL + JP DELB2 + +DELB0: EX DE,HL + INC C + LD E,C + LD D,B + LD B,8 + DI + IN A,(LSE0) ;bank change + OUT (LSE0),A ;cg off + LD A,(CPLANE) + OR 80H ;replace mode + OUT (LSWF),A +DELB01: XOR A + LD (HL),A ;space fill + SBC HL,DE + DJNZ DELB01 + IN A,(LSE1) ;bank off + EI + LD HL,(CURXY) + JP CURMOV + +;*--------------------- +;* insert character +;*--------------------- +INST: EXX + PUSH HL + PUSH DE + PUSH BC + EXX + CALL INST0 + EXX + POP BC + POP DE + POP HL + EXX + RET + +INST0: LD HL,(CURXY) + CALL LINCAL +;*BC lines HL' counts HL last curxy + PUSH HL ;store last-next pos x,y + CALL PONT + DEC HL ;last addr + LD A,(HL) + OR A + JR NZ,INSTE ;no insert space + PUSH BC ;lines store + LD D,H + LD E,L + DEC HL + EXX + PUSH HL ;HL' counts + EXX + POP BC + LDDR + XOR A + LD (DE),A ;last addr space + POP BC ;lines pop + POP HL + CALL PONTB ;bitmap addr + DEC HL + LD A,C + LD (LASTC+1),A + DEC B + JR Z,INSEF ;first time ended + JR INSB1 + +INSTE: POP HL + RET + +;*---------------------------------- +;* insert operation +;* <> +;* ent. B =line counter +;*---------------------------------- +INSB: DEC B ;last line ? + JR Z,INSEND ;skip if end of func. +INSB1: +XPIN1: LD C,39 ;79 xe + CALL INSLIN + JR INSB + +;*--------------------------------- +;* insert operation +;* <> +;*--------------------------------- +INSEND: +LASTC: LD C,0 ;patch +INSEF: CALL INSLIN + CALL PONTCB +XPIN2: LD DE,40 ;cwidth 80 + LD B,8 + DI + LD A,(CPLANE) + OR 80H ;replace mode + OUT (LSWF),A + IN A,(LSE0) ;bank change + OUT (LSE0),A ;cg off +INSB01: XOR A + LD (HL),A ;space fill + ADD HL,DE + DJNZ INSB01 + IN A,(LSE1) ;bank off + EI + RET + +;*---------------------------------- +;* insert operation +;* 1 line only +;* ent. +;* HL=first destination addr +;* C =bytes +;*---------------------------------- +INSLIN: EXX + LD D,9 ;laster counter set +INSL1: LD HL,(MAXCF) ; + DEC D ;last laster ? + EXX + RET Z + CALL INSLAS +XPIN3: LD DE,0FFD8H ;0FFB0H<--80 + ADD HL,DE + EXX + JR INSL1 + +;*--------------------------------- +;* insert operation +;* 1 laster only +;* ent. E'=plane data(maxcf) +;* HL=first destination addr +;* C=bytes +;*--------------------------------- +INSLAS: EXX ;next plane ? + RRC L + LD A,L + EXX + RET C ;next laster + EXX + AND H ;pmask + EXX + JR Z,INSLAS ;skip if warp + PUSH HL + PUSH BC + DI + OUT (LSRF),A ;read plane + OUT (LSWF),A ;write plane + IN A,(LSE0) ;bank change + OUT (LSE0),A ;cg off + LD D,H + LD E,L + DEC HL + LD A,C + OR A + JR Z,XPIN4 + LD A,B ;line counter + LD B,0 + LDDR + OR A + JR Z,INSLA1 ;skip if last line +XPIN4: LD BC,0FEE8H ;FDD0H <--80 + ADD HL,BC + LD A,(HL) + LD (DE),A +INSLA1: IN A,(LSE1) ;bank off + EI + POP BC + POP HL + JP INSLAS + +;*------------------ +;* line cal +;*------------------ + +LINCAL: LD B,1 +XPLI1: LD A,39 ;xe 39 or 79 + SUB L + LD C,A + EXX +XPLI2: LD DE,40 ;cwidth 80 + LD H,0 + LD L,A + EXX +LINC1: INC H ;next line check + LD A,(YE) + CP H + JR C,LINC2 ;scroll end check + CALL TBCALC + LD A,(HL) + OR A + LD H,E + JR Z,LINC2 ;management check + INC B + EXX + ADD HL,DE + EXX + JR LINC1 + +LINC2: LD L,0 + RET + +;*--------------------- +;* scroll main logic +;*-------------------- +SCROLL: CALL PUSHRA +;*----------------------- +;* text buf scroll & clr +;*----------------------- +SCRTX: LD A,(YS) + LD H,A + LD L,0 + CALL PONT ;start addr cal + LD D,H + LD E,L ;DE destination addr + LD B,0 +XPSC1: LD C,40 ;cwidth 80 + ADD HL,BC ;HL source addr + LD A,(YW) ;scroll lines + DEC A + JR Z,SCR0 ;skip if 1 line mode + PUSH BC + PUSH HL + LD HL,0 +SCR1: ADD HL,BC + DEC A + JR NZ,SCR1 + LD B,H ;scroll bytes + LD C,L + POP HL ;pop source addr + LDIR + POP BC +SCR0: LD B,C + CALL QCLRDE ;last line clr +;*--------------------------- +;* manager buf scroll & clr +;*--------------------------- + LD A,(YS) + LD H,A + CALL TBCALC ;exit HL maneger addr + LD A,(YW) ;scroll lines + DEC A ;1 line mode check + LD B,A + LD (HL),0 + INC HL + LD D,H + LD E,L + INC DE + CALL NZ,LDHLDE ;(hl)<--(de) + LD (HL),0 ;last line manegement +;*---------------------- +;* calculation xferad +;*---------------------- +SCRCAL: LD A,(YE) + LD H,A + LD L,0 ;HL=(0,YE) + CALL PONTB + LD (XFERAD+1),HL ;xferad data +;*---------------------- +;* scroll offset calc +;*---------------------- +SCXFER: LD DE,40 + LD HL,(SOF) ;lsi scroll offset + ADD HL,DE + PUSH HL + LD DE,(SSW) ;lsi scroll width + OR A + SBC HL,DE + POP HL + JR NZ,SCXF1 ;sof> graphic ram +;*-------------------------------- + IN A,(LSE0) ; bank change + OUT (LSE0),A ; cg off +XFERAD: LD HL,0 ; LD HL,xxxxh + LD (HL),0 + LD D,H + LD E,L + INC DE +XPSC2: LD BC,319 ;xfer bytes + LDIR + IN A,(LSE1) ; bank reset + EI +;*----------------------------- +;* scroll operation ended +;* cursor window end pos +;*----------------------------- +BOS: LD A,(YE) + LD H,A + LD L,0 + JP CURMOV + +;*--------------------- +;* cursor routines +;*--------------------- +CURSM: CALL PUSHRA +;*cursor data pattern + EXX + PUSH HL ;push hl' + LD HL,CURDT1 + LD A,(CURMAK) + OR A + JR Z,CURS0 + LD HL,CURDT2 + DEC A + JR Z,CURS0 + LD HL,CURDT3 +CURS0: EXX + DI + LD A,(CURFLG) + XOR 1 + LD (CURFLG),A + LD HL,(BITADR) + LD D,0 + LD A,(CWIDTH) + LD E,A + LD B,8 ;counter + LD A,(CMODE) + OR 20H ;xor mode + OUT (LSWF),A ;wf + IN A,(LSE0) ;bank change + OUT (LSE0),A ;cg off +CURS1: EXX + LD A,(HL) + INC HL + EXX + LD (HL),A + ADD HL,DE + DJNZ CURS1 + IN A,(LSE1) ;bank reset + EXX + POP HL ;pop hl' + EXX + EI + RET + +HCURON: CALL PUSHRA + XOR A + OUT (LSD0),A ;reset 556 + CPL + OUT (LSD0),A + LD A,(CURFLG) + OR A + RET NZ + JR CURSM + +HCUROF: CALL PUSHRA + LD A,(CURFLG) + OR A + RET Z + JR CURSM + +FLASH: IN A,(LSD2) ;bit 6 + RLCA + RLCA + JR NC,HCURON + JR HCUROF + +;*-------------------------- +;* cursor move +;* ent HL x,y +;*-------------------------- +CURMOV: CALL PUSHR + LD (CURXY),HL + CALL PONT ;cursor addr cal + LD (POSADR),HL + CALL PONTCB ;bitmap cursor pos cal + LD (BITADR),HL + RET +;* +;*-------------------------- +;* pointer calc +;* ent hl=curxy +;* hl=text addr +;*-------------------------- +PONTC: LD HL,(CURXY) +PONT: PUSH DE + PUSH AF + LD D,20H ;offset textbuf + LD E,L + LD A,H + ADD A,A ;2 + ADD A,A ;4 + ADD A,H ;5 + LD L,A + LD H,0 + ADD HL,HL ;10 + ADD HL,HL ;20 + ADD HL,HL ;40 +XPCU1: NOP ;ADD HL,HL *80 + ADD HL,DE + POP AF + POP DE + RET + +;*--------------------------- +;* pointer cal +;* ent hl=curxy +;* hl=bitmap addr +;*--------------------------- +PONTCB: LD HL,(CURXY) +PONTB: PUSH DE + PUSH AF + LD D,H + LD E,0 ;de=h*256 + LD A,L + LD L,H ;l=curx + LD H,E ;h=0 + ADD HL,HL ;*2 + ADD HL,HL ;*4 + ADD HL,HL ;*8 + ADD HL,HL ;*16 + ADD HL,HL ;*32 + ADD HL,HL ;*64 + ADD HL,DE ;*320 +XPCU2: NOP ;ADD HL,HL *640 + CALL ADDHLA + SET 7,H ;offset bitmap addr + POP AF + POP DE + RET + +;*------------------------------ +;* cursor left,right,down,up +;*------------------------------ +HOME: LD L,0 + LD A,(YS) + LD H,A + JP CSET +;* +CR2: CALL PUSHR + LD HL,(CURXY) + LD A,L + OR A + JR NZ,CR1 + CALL TBCALC + LD A,(HL) + OR A + RET Z +CR1: LD A,0DH + JP CRT1C + +CTR.M: XOR A + LD (CRTSFG+1),A ;sft mode reset + LD HL,(CURXY) + PUSH HL + INC H + CALL TBCALC + LD A,(YE) + LD D,A +CTR.ML: LD A,(HL) + OR A + JR Z,CTR.M4 + INC HL + INC E + LD A,D + CP E + JR NC,CTR.ML +CTR.M4: DEC E + POP HL + LD H,E + JR CTR.M2 + +CDOWN: LD HL,(CURXY) + JR CDOWN2 + +CRIGHT: LD HL,(CURXY) + INC L + LD A,(XE) + CP L + JR NC,CSET +CTR.M2: LD L,0 +CDOWN2: INC H + JR CDOWN3 ;patch + PUSH HL + CALL TBCALC + LD (HL),1 + POP HL +CDOWN3: LD A,(YE) + CP H + JR NC,CSET + LD H,A + PUSH HL + CALL SCROLL + POP HL +CSET: JP CURMOV + +CUP: LD HL,(CURXY) + JR CUP2 + +CLEFT: LD HL,(CURXY) + LD A,L + OR A + JR NZ,CSET2 + LD A,(XE) + LD L,A +CUP2: LD A,(YS) + CP H + JR C,CSET3 + LD A,(YS) + LD H,A + DB 3EH +CSET2: DEC L + DB 3EH +CSET3: DEC H + JR CSET + +CTR.F: +CTR.Y: XOR A ;ALPHA + DB 21H +CTR.E: LD A,1 ;Shift lock + DB 21H +CTR.W: LD A,2 ;GRAPH + LD (CURMAK),A + RET + +;*----------------- +;* tab function +;*----------------- +CTAB: LD B,0 ;tab + LD HL,(CURXY) + INC L + LD A,L +CTAB1: INC B + SUB 10 + JR NC,CTAB1 + XOR A +CTAB2: ADD A,10 + DJNZ CTAB2 + LD L,A + LD A,(XE) ;border check + CP L + RET C + PUSH HL + LD A,(INPFLG) + OR A + JR Z,CTAB4 + LD A,(CURX) + LD H,A + LD A,L + SUB H + JR Z,CTAB4 + LD B,A +CTAB3: PUSH BC + LD A,20H ;space + CALL PLTOUT + POP BC + DJNZ CTAB3 +CTAB4: POP HL + JP CURMOV + +;*------------------- +;* tab print function +;*------------------- +PRNTT: CALL CRT1S + LD A,(CURX) +PRNTT1: SUB 10 + JR NC,PRNTT1 + ADD A,10 + RET Z + JR PRNTT + +;*------------------------------ +;* GET LINE V0.1A +;* '84.7.11 +;*------------------------------ +BINPUT: PUSH HL + LD HL,(CURXY) + PUSH HL + PUSH DE + CALL TBCALC + POP DE + LD (HL),0 + POP HL + CALL GETL + JR C,BINERT + LD A,L + OR A + JR Z,BINERT + LD H,0 + ADD HL,DE + EX DE,HL + OR A +BINERT: POP HL + RET + +GETL: PUSH BC + PUSH HL + PUSH DE +LINP02: CALL INKEY1 + CP 0DH ;CR? + JP Z,GCRT + CP 1BH ;Break? + JR Z,LINP.B + PUSH AF + LD A,(CURMAK) + CP 2 ;Graph mode? + JR NZ,LINP10 + POP AF + CP 17H + JR NC,LINP11 + CP 11H + JR C,LINP11 + LD HL,(CTRSFT) + BIT 6,L ;Ctrl? + JR Z,LINP11 +LINP32: RST 18H + DB .CRT1X + JR LINP02 + +LINP10: POP AF +LINP11: RST 18H + DB .CRT1C + JR LINP02 + +LINP.B: SCF ;break key on +LINP80: RST 18H + DB .CR1 + POP DE + POP HL + POP BC + RET + +GCRT: LD HL,(CURXY) + CALL LBOUND ;begin end search + LD A,E + SUB D + LD E,A ;E:Y.length + LD H,D ;H:line count + LD L,0 + CALL PONT ;calc start address + LD A,(CWIDTH) ;X size + LD D,A + POP BC ;store address set + PUSH BC + EXX + PUSH HL + LD HL,(LINLIM) ;L:line inp limit + EXX +GCRT10: LD A,(HL) ;A<--ascii code +GCRT36: INC HL + LD (BC),A ;(BC)<--ascii code + INC BC + EXX + DEC L + JR Z,GCRT40 ;line limit? + EXX + DEC D + JR NZ,GCRT10 ;X right end ? + LD A,(CWIDTH) + LD D,A + DEC E + JR NZ,GCRT10 ;line count=0 ? + EXX +GCRT40: POP HL + EXX + XOR A + LD (BC),A ;end address=0 + LD L,C + LD H,B + POP DE + PUSH DE + PUSH HL + OR A + SBC HL,DE + LD B,L + POP HL + LD A,20H ;clschr? + LD D,A + JP Z,LINP80 + DEC HL +GCRT50: LD A,(HL) + OR A + JR Z,GCRT52 + CP D + JR NZ,GCRT54 + LD (HL),0 +GCRT52: DEC HL + DJNZ GCRT50 + JR GCRT56 + +GCRT54: LD A,(HL) + OR A + JR NZ,GCRT55 + LD (HL),20H +GCRT55: DEC HL + DJNZ GCRT54 +GCRT56: OR A + JP LINP80 + +;*----------------------------------------------------- +;* Top of p.69 in German Listing of MZ-2Z046 Disk Basic +;*----------------------------------------------------- +;*----------------------------- +;* KEY V0.1A +;* '84.7.11 +;* INKEY$[(ACC)] +;* A=FF : INKEY$ =GET +;* A=0 : INKEY$(0)=KEY DATA +;* A>0 : INKEY$(1)=FLASH GET +;*----------------------------- +INKEY$: INC A + JR Z,INKEYFF + DEC A + JP Z,INKEY0 +INKEY1: CALL KBFCHR + CALL PUSHR + CALL HCURON + EX AF,AF' + PUSH AF + CALL KEYSNS + LD A,(REPTF) +QKEY10: EX AF,AF' +QKEY12: LD B,16 ;chattering +QKEY14: CALL FLASH + CALL KEYSNS + BIT 1,A + JR NZ,QKEY12 ;same key ? + DJNZ QKEY14 + BIT 0,A + JR Z,QKEY20 ;key on ? + BIT 2,A + JR NZ,QKEY24 ;new key ? + EX AF,AF' + DEC A + JR NZ,QKEY10 + LD A,6 ;Repeat step time + JR QKEY26 +QKEY20: PUSH HL + PUSH DE + PUSH BC + LD HL,KYDTB2 + LD DE,KYDTB1 + LD BC,10 + LDIR ;(KYDTB1)<--(KYDTB2) + POP BC + POP DE + POP HL +QKEY24: LD A,40H ;Repeat init time +QKEY26: LD (REPTF),A +QKEY28: CALL FLASH + CALL KEYGET + OR A + JR Z,QKEY29 + LD (KEYDAT),A + LD C,A + CALL HCUROF + POP AF + EX AF,AF' + LD A,C + RET + +QKEY29: PUSH HL + PUSH BC + LD B,10 + LD HL,KYDTB1 +QKEY30: LD (HL),0FFH + INC HL + DJNZ QKEY30 + POP BC + POP HL + JR QKEY28 + +INKEYFF: CALL KBFCHR + PUSH HL + CALL KEYGET + LD HL,KEYDAT + OR A + JR Z,INKEY9 + CP (HL) + JR NZ,INKEY9 + POP HL + XOR A + RET + +INKEY9: LD (HL),A + POP HL + RET + +INKEY0: CALL KBFCHR + CALL KEYGET + LD (KEYDAT),A + RET + +KBFCHR: PUSH HL ;function key buffer + LD HL,(INBUFC) + LD A,L ;INBUFC + CP H ;INBUFL + POP HL + RET Z + EX (SP),HL + INC A + LD (INBUFC),A + LD HL,INBUFL ;INBUF-1 + CALL ADDHLA + LD A,(HL) + POP HL + RET + +KEYSNS: CALL PUSHR + LD DE,KYDTB2 + LD HL,KYDTB1 + LD BC,0A00H + DI +KEYSN0: LD A,B + ADD A,0EFH + OUT (0D0H),A + CP 0F8H ;special strobe + IN A,(0D1H) + JR NZ,KEYSN1 + OR 7FH +KEYSN1: CP 0FFH + JR Z,KEYSN2 + SET 0,C ;bit 0=key on +KEYSN2: EX DE,HL + CP (HL) + LD (HL),A + EX DE,HL + JR Z,KEYSN3 + SET 1,C ;bit 1=not same key +KEYSN3: CPL + AND (HL) + JR Z,KEYSN4 + SET 2,C ;bit 2=new key +KEYSN4: INC HL + INC DE + DJNZ KEYSN0 + LD A,C +KEYSNE: EI + RET + +KEYGET: CALL PUSHR + LD HL,KYDTB1 + LD DE,KYDTB2 + PUSH HL + PUSH DE + LD BC,10 + LDIR ;(KYDTB2)<--(KYDTB1) + POP HL + POP DE + LD BC,0AF9H + DI + LD A,C + OUT (0D0H),A + NOP + IN A,(0D1H) + LD (DE),A +KEYGL1: LD A,C + OUT (0D0H),A + CP 0F8H ;special strobe + IN A,(0D1H) + LD (DE),A + JR Z,KEYG13 + CPL + AND (HL) ;same--->Acc=0 +KEYGL3: LD (HL),A + INC DE + INC HL + DEC C + DJNZ KEYGL1 + EI + LD BC,0A00H +KYSTCK: DEC HL + LD A,(HL) + OR A + JR NZ,KEYGIN ;not same-->KEYGIN + INC C + DJNZ KYSTCK + LD B,10 +KEYGL2: DEC DE + LD A,(DE) + CP 0FFH + JR NZ,REPKIN +REPKI3: DJNZ KEYGL2 +KEYNUL: XOR A + JR KEYSNE + +KEYG13: XOR A + JR KEYGL3 + +REPKIN: LD A,B + CP 2 + JR NZ,REPKI2 + LD A,(DE) + AND 81H + JR NZ,REPKI3 + LD A,1BH ;break key + JR KEYSNE + +REPKI2: CP 1 + JR Z,KEYNUL + LD A,(REPCD1) + CP B + JR NZ,REPKI3 + LD A,(DE) + PUSH DE + LD D,A + LD A,(REPCD2) + AND D + POP DE + JR NZ,REPKI3 + LD A,(KEYDAT) + JR KEYSNE + +KEYGIN: PUSH AF + LD A,B + LD (REPCD1),A + LD A,(HL) + LD (REPCD2),A + POP AF + DEC B + JR NZ,KEYGI6 + CALL ABITB ;function key + LD A,(CTRSFT) + BIT 6,A + JR Z,KEYNUL + BIT 0,A + LD A,B + JR NZ,KEYG14 + ADD A,5 +KEYG14: CP 10 + JR NC,KEYNUL + LD L,A + LD H,0 + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + LD BC,FUNBUF + ADD HL,BC + LD A,(HL) + OR A + JR Z,KEYNUL + LD DE,INBUFC + LD A,1 + LD (DE),A + INC DE + LD BC,16 + LDIR + LD A,(INBUF) + JP KEYSNE + +KEYGI6: CALL ABITB + LD A,C + ADD A,A + ADD A,A + ADD A,A + ADD A,B + LD L,A + LD H,0 + LD A,(CTRSFT) + BIT 6,A ;ctrl key + LD BC,NOMALB + JR Z,CTRLIN + PUSH AF + LD A,(CURMAK) + CP 1 ;shift+lock + JR NZ,SFTLKL + POP AF + XOR 1 + PUSH AF +SFTLKL: POP AF + BIT 0,A ;shift key + JR NZ,KEYG17 + LD BC,SHIFTB +KEYG17: LD A,(CURMAK) + CP 2 ;graph + JR NZ,CHRSET + LD BC,GRPHB + LD A,(CTRSFT) + BIT 0,A + JR Z,CHRSET + LD BC,GRPHS +CHRSET: CALL QKYTBL + LD A,C + JP KEYSNE + +CTRLIN: CALL QKYTBL + LD A,C + CP 20H + JP C,KEYSNE + LD HL,CTKYTB + LD B,5 +KEYG18: CP (HL) + JR Z,CTRLC1 + INC HL + DJNZ KEYG18 + CP 40H + JP C,KEYNUL + CP 5BH + JP NC,KEYNUL + SUB 40H + JP KEYSNE + +CTRLC1: LD A,32 + SUB B + JP KEYSNE + +ABITB: LD B,8 +KEYG19: RRCA + JR C,ABITB2 + DJNZ KEYG19 + RET + +ABITB2: DEC B + RET + +BRKEY: LD A,0E8H + OUT (0D0H),A + NOP + IN A,(0D1H) + AND 81H + RET Z + RLCA + RET C + JR BRKEY + +KYDTB1: DB 0 ;was DEFS 1 +CTRSFT: DB 0,0,0,0,0,0,0,0,0 ;was DEFS 9 + + +KYDTB2: DB 0,0,0,0,0,0,0,0,0,0 ;was DEFS 10 + + +REPTF: DB 0 +REPCD1: DB 0 +REPCD2: DB 1 + +NOMALB: DW 0BEAH + DW 1790H + DW 19FCH + DW 3B09H + DW 0D3AH + DW 1018H + DW 1112H + DW 1413H + DW 2F3FH + +SHIFTB: DW 0C2AH + DW 1790H + DW 05FBH + DW 2B09H + DW 0D2AH + DW 1516H + DW 1112H + DW 1413H + DW 5FC6H + +GRPHB: DW 0CE9H + DW 1790H + DW 0568H + DW 8409H + DW 0DE9H + DW 1516H + DW 1112H + DW 1413H + DW 8B8FH + +GRPHS: DW 0C6AH + DW 1790H + DW 196CH + DW 0FE09H + DW 0D89H + DW 1516H + DW 1112H + DW 1413H + DW 7B8AH + +CTKYTB: DB 5BH ; [ + DB 5CH ; \ + DB 5DH ; ] + DB 5EH ; ^ + DB 2FH ; / + +;*----------------------------------- +;* CRT message out +;* 05H,06H simulated +;* ent. DE=msg top addr +;* eof is NULL +;* mode code 05h,06h +;* CR is reset mode +;*----------------------------------- +CRTSIMU: CALL PUSHR +CRTSI2: LD A,(DE) ;get msg data + INC DE ;next pointer + OR A + RET Z ;eof code is NULL + LD C,A + CP 05H ;sft lock in + JR Z,CRTSIE ;CTR.E + CP 06H ;normal mode + JR Z,CRTSIF ;CTR.F + SUB 'A' + CP 26 + JR NC,CRTSI4 ;skip not if code A-Z +CRTSFG: LD A,0 ;xxx + OR A + JR Z,CRTSI4 + LD HL,SMLTBL-'A' ;sftlock code trans. + LD B,0 + ADD HL,BC + LD C,(HL) +CRTSI4: LD A,C + RST 18H + DB .CRT1C + CP 0DH + JR NZ,CRTSI2 +CRTSIF: XOR A +CRTSIE: LD (CRTSFG+1),A + JR CRTSI2 + +;*---------------------------------------------------- +;* Table of 'Sharp ASCII' codes for lower-case letters +;*---------------------------------------------------- +SMLTBL: DB 0A1H ;a + DB 09AH ;b + DB 09FH ;c + DB 09CH ;d + DB 092H ;e + DB 0AAH ;f + DB 097H ;g + DB 098H ;h + DB 0A6H ;i + DB 0AFH ;j + DB 0A9H ;k + DB 0B8H ;l + DB 0B3H ;m + DB 0B0H ;n + DB 0B7H ;o + DB 09EH ;p + DB 0A0H ;q + DB 09DH ;r + DB 0A4H ;s + DB 096H ;t + DB 0A5H ;u + DB 0ABH ;v + DB 0A3H ;w + DB 09BH ;x + DB 0BDH ;y + DB 0A2H ;z + +;*------------------------- +;* CRT and KB device tables +;*------------------------- +EQTBL: +SCRT: DW SKB ;address of next table in chain (SKB) + DB "CRT" ;name of THIS table + DB 0 + DB 8AH ;Stream, O1C, W + DW 0 + DW CRTINI + DW .RET ;ROPEN + DW .RET ;WOPEN + DW .RET ;CLOSE + DW .RET ;KILL + DW CRTIN + DW CRTOUT + DW CRTPOS + +SKB: DW SLPT ;address of next table in chain (SLPT); + DB "KB" ;name of THIS table + DW 0 + DB 81H ;Stream, R + DW 0 + DW .RET ;INIT + DW .RET ;ROPEN + DW .RET ;WOPEN + DW .RET ;CLOSE + DW .RET ;KILL + DW CRTIN + DW .RET + DW .RET + +CRTIN: RST 18H + DB .GETL + LD A,80H ;BREAKZ + RET C + RST 18H + DB .COUNT + RET + +CRTOUT: EX AF,AF' + LD HL,CRT1C + LD A,(DISPX) ;0=msg/1=msgx + OR A + JR Z,CRTOU2 + LD HL,CRT1CX +CRTOU2: EX AF,AF' + JP (HL) + +CRTPOS: LD A,(CURX) + RET + +;*---------------------------------- +;* CRT(LPT) routine +;* CRT1C H1C +;* CRT1CX H1CX +;* CRTMSG HMSG +;* HCR +;*--------------------------------- +HCR: LD A,0DH +H1C: PUSH AF + LD A,(FILOUT) ;0=crt/1=lpt + OR A + JR NZ,H1CL + POP AF + JR CRT1C +H1CL: POP AF + JP LPT1C + +H1CX: PUSH AF + LD A,(FILOUT) ;0=crt/1=lpt + OR A + JR NZ,H1CXL + POP AF + JR CRT1CX +H1CXL: POP AF + JP LPT1CX + +HMSG: CALL PUSHR + LD HL,H1C + JR CRTMS2 + +CRTMSG: CALL PUSHR + LD HL,CRT1C +CRTMS2: LD A,(DE) + OR A + RET Z + CALL .HL + INC DE + JR CRTMS2 + +CRT1S: LD A,20H +CRT1C: CALL PUSHRA +CRT1C0: LD C,A + LD A,(INPFLG) ;plot on/off + OR A + JR Z,CRT1C9 ;skip if plot off + LD A,C + CP 20H + JR NC,CRT1C4 ;skip if normal ascii + LD DE,(CURXY) ;control code only + LD HL,(XS) + CP 14H + JR Z,CRT1C1 ;skip if left code + CP 12H + JR NZ,CRT1C2 ; + LD HL,(YS) ;skip if up code + LD E,D +CRT1C1: LD A,L + CP E + JP NC,BEEPM ;error range +CRT1C2: LD HL,PLTCOD ;plotter code trans. + LD B,0 + ADD HL,BC + LD A,(HL) + INC A + JR Z,CRT1C9 ; no operation when ffh + DEC A + JP Z,BEEPM ;beep when null code +CRT1C4: CALL PLTOUT +CRT1C9: LD A,C + CP 20H + JP C,CTRLJB ;control code trans. + JP ACCDI ;1 byte disply ent.=acc + +CRT1CX: CALL PUSHRA + LD C,A + CP 0DH + JR Z,CRT1C0 + CALL ACCDI + LD A,(INPFLG) ;plot on/off + OR A + RET Z + LD A,C + +;* JR PLTOTX ;commented out in original module + +PLTOTX: CP 11H + JR C,PLT2E + CP 17H + JR C,PLTOK + CP 20H + JR C,PLT2E +PLTOUT: CP 60H + JR C,PLTOK + CP 70H + JR C,PLT2E + CP 0C1H + JR C,PLTOK + CALL CHKACC + DB 3 + DW 0CFD7H + DB 0FFH + JR Z,PLTOK +PLT2E: LD A,2EH +PLTOK: JP LPTOUT + +PLTCOD: DB 0 ;00 + DB 0 ;01 + DB 0 ;02 + DB 0 ;03 + DB 0FFH ;04 CTR.D + DB 0FFH ;05 CTR.E + DB 0FFH ;06 CTR.F + DB 1DH ;07 + DB 0 ;08 + DB 0FFH ;09 CTAB + DB 0 ;0A + DB 0 ;0B + DB 0 ;0C + DB 0DH ;0D + DB 0 ;0E + DB 0 ;0F + DB 0 ;10 DEL + DB 0AH ;11 DOWN + DB 03H ;12 UP + DB 20H ;13 RIGHT + DB 0EH ;14 LEFT + DB 0 ;15 HOME + DB 0 ;16 CLR + DB 0FFH ;17 GRAPH + DB 0 ;18 INST + DB 0FFH ;19 ALPHA + DB 0FFH ;1A KANA + DB 0DH ;1B + DB 0FFH ;1C hirakana + DB 0 ;1D + DB 0 ;1E + DB 0 ;1F + +;*------------------- +;* Monitor hot start +;*------------------- +STARTP: DI + XOR A + OUT (LSDMD),A ;mz-800 320*200 4col + LD (INPFLG),A ;plot on/off + LD (FILOUT),A ;0=crt/1=lpt + LD SP,0000H ;stack pointer set + IM 2 ;interruptt mode 2 + LD A,4 + OUT (LSD3),A ;8253 int disable + OUT (LSE0),A ;bank dram + OUT (LSE1),A ;bank dram + CALL PALOFF ;palette all off + LD A,0FH ;interrupt vector + LD I,A + LD A,0FEH ;interrupt addrs + OUT (0FDH),A ;PIO int vector set + LD A,0FH + OUT (0FDH),A ;PIO mode 0 + PUSH BC + CALL CRTPWR ;CRT power on init + CALL PSGPWR ;PSG power on init + CALL EMMPWR ;EMM power on init + POP BC +STRTP2: DB 21H ;dummy byte + JR STRTP9 + XOR A + LD (STRTP2),A + LD D,A + LD E,A + RST 18H + DB .TIMST + LD DE,SCMT + LD A,B + OR A + JR Z,STRTP4 + DEC A + JR Z,STRTP4 + LD DE,SFD + DEC A + JR Z,STRTP4 + LD DE,SQD +STRTP4: LD A,C + RST 18H + DB .SETDF +STRTP9: JP COLDST + +;*--------------------- +;* check vram option ? +;*--------------------- +CRTPWR: DI + XOR A + OUT (LSDMD),A ;320*200 4 color + LD A,14H + OUT (LSRF),A + LD A,94H + OUT (LSWF),A + IN A,(LSE0) + OUT (LSE0),A ;cg off + LD HL,9FFFH + LD A,(HL) ;read + LD C,A + CPL + LD (HL),A ;write + CP (HL) ;verify + LD (HL),C ;pop mem + LD A,0 + JR NZ,CRTPW0 + INC A +CRTPW0: LD (MEMOP),A + IN A,(LSE1) + EI + LD A,1 ;window (0,24) + CALL DSMODE ;320*200 4 color +;*-------------------- +;* data free area init +;*-------------------- + XOR A + LD (CURFLG),A ;cursor off + LD (CURMAK),A ;nomal char + RET + +;*------------------------------ +;* MZ-2Z009 USR I/O driver +;* FI:MON-USR ver 1.0A 03.17.84 +;*------------------------------ +SUSR: DW 0 ;last table in chain so no address here + DB "USR" ;name of THIS table + DB 0 + DB 9FH ;STRM, FNM, W1C, R1C, W, R + DW 0 + DW .RET ;INIT + DW USRRO ;ROPEN + DW USRWO ;WOPEN + DW .RET ;CLOSE + DW .RET ;KILL + DW USRIN ;INP + DW USROUT ;OUT + DW .RET ;POS + +USRRO: +USRWO: LD HL,ELMD1 + RST 18H + DB .DEASC + LD A,D + OR E + JP Z,ER60M + LD (ZWRK1),DE + RET + +USRIN: +USROUT: LD HL,(ZWRK1) + JP (HL) + DB 0,0,0,0,0,0,0,0,0,0 ;was DEFS 69 + DB 0,0,0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0,0 + +;* END of original module MON1.ASM +;*=========================================================================== +;* START of original module MON2.ASM +;*-------------------------- +;* MZ-800 monitor Work area +;* FI:MON2 ver 1.0A 9.05.84 +;*-------------------------- +;*------------------- +;* Interrupt vectors +;*------------------- + ORG 0FF0H ;kept to ensure match with existing versions + DB 0,0,0,0,0,0,0,0 ;was DEFS 12 + DB 0,0,0,0 + + ORG 0FFCH ;kept to ensure match with existing versions + DW PSGINT ;PSG (MUSIC) interrupt + DW LPTINT ;Printer interrupt + +;*-------------------------------- +;* Directory entry (1000H - 103FH) +;*-------------------------------- + ORG 1000H ;kept to ensure match with existing versions +ELMD: DB 0 ;file mode (was DEFS 1) +ELMD1: DB 0,0,0,0,0,0,0,0 ;file name (was DEFS 17) + DB 0,0,0,0,0,0,0,0 + DB 0 +ELMD18: DB 0,0 ;protection, type (was DEFS 2) +ELMD20: DB 0,0 ;size (was DEFS 2) +ELMD22: DB 0,0 ;adrs (was DEFS 2) +ELMD24: DB 0,0 ;exec (was DEFS 2) +ELMD26: DB 0,0,0,0 ;(was DEFS 4) +ELMD30: DB 0,0 ;(was DEFS 2) +ELMD32: DB 0,0,0,0,0,0,0,0 ;(was DEFS 32) + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + + +;*---------------- +;* LU table entry +;*---------------- +ZTOP: DW 2 ;LU block top +ZLOG: DB 0 ;LU# +ZRWX: DB 0 ;1:R, 2:W, 3:X +ZEQT: DW 0 ;Address of EQTBL +ZCH: DB 0 ;CH# +ZEOF: DB 0 ;EOF? +ZWRK1: DB 0 ;Work 1 +ZWRK2: DB 0 ;Work 2 + +;*---------------- +;* EQT table entry +;*---------------- +ZNXT: DW 0 ;STRM SQR RND +ZDEVNM: DB 0,0,0,0 ;device name +ZFLAG1: DB 1 ;flag 1 +ZFLAG2: DB 0 ;flag 2 +ZDIRMX: DB 0 ;max DIR +ZINIT: DW 0 ;initialise + +ZRO: +ZMAPS: DW 0 ;ROPEN RDINF Map.start + +ZWO: +ZMAPB: DW 0 ;WOPEN WRFIL Map.bytes + +ZCL: +ZSTRT: +ZDIRS: DW 0 ;CLOSE START Dir.start + +ZKL: +ZBLK: DW 0 ;KILL - Block/Byte - + +ZINP: DW 0 ;INP RDDAT BREAD +ZOUT: DW 0 ;OUT WRDAT BWRIT + +ZPOS: +ZDELT: DW 0 ;Posn. DELETE + +ZWDIR: DW 0 ; WR DIR +ZFREE: DW 0 ; - free bytes - + +ZBYTES: EQU ZFREE+2-ZNXT ;Z-area bytes + + DB 0,0 ;(was DEFS 2) + +DCHAN: DB 0 ;default channel (was DEFS 1) +DDEV: DB 0,0 ;default device (was DEFS 2) + +DSCRT: DW SCRT +DSLPT: DW SLPT + +;*------------------------------------ +;* Work area pointers (1070H - 1081H) +;*------------------------------------ +TEXTST: DB 0,0 ;Text start (was DEFS 2) + +TEXTED: +POOL: DB 0,0 ;I/O work (was DEFS 2) + +POOLED: +VARST: DB 0,0 ;Variable start (was DEFS 2) + +STRST: DB 0,0 ;String start (was DEFS 2) +VARED: DB 0,0 ;Var & String end (was DEFS 2) +TMPEND: DB 0,0 ;Temp end (was DEFS 2) +INTFAC: DB 0,0 ;Init FAC (was DEFS 2) +MEMLMT: DB 0,0 ;LIMIT (was DEFS 2) +MEMMAX: DW 0FF00H ;highest available MEM + +;*----------------------------------------- +;* cursor / position work (1082H - 108DH +;*----------------------------------------- +CURXY: +CURX: DB 0 ;cursor position +CURY: DB 0 + +POSADR: DW 2000H ;Textbuff addr. +BITADR: DW 8000H ;Bitmap addr. +POINTX: DB 0,0 ;X co-ord (was DEFS 2) +POINTY: DB 0,0 ;Y co-ord (was DEFS 2) +CURFLG: DB 0 ;0=OFF 1=ON +CURMAK: DB 0 ;0=normal 1=shftlock 2=graph + +;*----------------------------- +;* CRT/LPT work (108EH - 1097H) +;*----------------------------- +CMTMSG: DB 0 ;if =0 disp cmt-msg (was DEFS 1) +INPFLG: DB 0 ;0=plot off 1=plot on +DISPX: DB 0 ;0=MSG 1=MSGX (was DEFS 1) +FILOUT: DB 0 ;0=CRT 1=LPT +PSEL: DB 1 ;Printer select +PCRLF: DB 0DH ;LPT CRLF CODE +LPT.TM: DB 14 ;LPT wait time +LPOSB: DB 0 ;LPT posn. +PSMAL: DB 0 ;LPT sml/cap +PNMODE: DB 1 ;LPT mode 1..text, 2..graph + +;*---------------------------------- +;* crt dispmode work (1098H -109FH) +;*---------------------------------- +DMD: DB 0 ;disp mode 0=320 4 col 4=640 2 col +;* ; 2=320 16 col 6=640 4 col +MEMOP: DB 0 ;option mem exit 0= off 1= on +PWMODE: DB 0 ;graph mode +CMODE: DB 3 ;colour mode +CPLANE: DB 3 ;current active plane +MAXCF: DB 4 ;max plane data +PMASK: DB 0FFH ;mask plane data +GMODE: DB 3 ;graphic colour mode + +;*----------------------------------- +;* Monitor stack area (10A0H - 10EFH) +;*----------------------------------- + DB 0,0,0,0,0,0,0,0 ;(was DEFS 80) + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + +;*------------------------------ +;* CMT work area (10F0H - 116FH) +;*------------------------------ + +IBUFE: DB 0,0,0,0,0,0,0,0 ;(was DEFS 128) + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + +;*---------------------------------------- +;* MZ-700-compatible flags (1170H - 1191H) +;*---------------------------------------- + DB 0,0,0,0,0,0,0,0 ;(was DEFS 34) + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0 + +;*------------------------------------ +;* General Basic flags (1192H - 11A3H) +;*------------------------------------ + DB 0EFH ;FLSDT (current character at cursor) + DB 0,0 ;STRFG, DPRNT (was DEFS 2) +TMCNT: DB 0,0 ;was DEFS 2 +SUMDT: DB 0,0 ;SUMDT (was DEFS 2) +CSMDT: DB 0,0 ;CSMDT (was DEFS 2) + DB 0,0 ;AMPM, TIMFG (was DEFS 2) + DB 1 ;SWRK +TEMPW: DB 4 ;TEMPW + DB 5 ;ONTYO + DB 0,0,0 ;OCTV, RATIO (was DEFS 3) +KEYBM1: DB 0 ;(was DEFS 1) + +;*-------------------------------------------------- +;* Keyboard Input and General Buffer (11A4H - 12A9H) +;*-------------------------------------------------- +KEYBUF: DB 0,0,0,0,0,0,0,0 ;(was DEFS 262) + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0 + +KEY262: DB 0,0 ;(was DEFS 2) +KEY264: DB 0,0 ;(was DEFS 2) +KEY266: DB 0,0,0,0 ;(was DEFS 4) + +FUNBUF: DB 7 +FNB1S: DB "RUN " + DB 0DH +FNB1E: DB 0,0,0,0,0,0,0,0 ;(was DEFS 8) + DB 5 +FNB2S: DB "LIST " +FNB2E: DB 0,0,0,0,0,0,0,0,0,0 ;(was DEFS 10) + DB 5 +FNB3S: DB "AUTO " +FNB3E: DB 0,0,0,0,0,0,0,0,0,0 ;(was DEFS 10) + DB 6 +FNB4S: DB "RENUM " +FNB4E: DB 0,0,0,0,0,0,0,0,0 ;(was DEFS 9) + DB 6 ;QD FD ->"DIR" +FNB5S: DB "COLOR " +FNB5E: DB 0,0,0,0,0,0,0,0,0 ;(was DEFS 9) + DB 5 +FNB6S: DB "CHR$(" +FNB6E: DB 0,0,0,0,0,0,0,0,0,0 ;(was DEFS 10) + DB 8 +FNB7S: DB "DEF KEY(" +FNB7E: DB 0,0,0,0,0,0,0 ;(was DEFS 7) + DB 4 +FNB8S: DB "CONT" +FNB8E: DB 0,0,0,0,0,0,0,0,0,0,0 ;(was DEFS 11) + DB 6 +FNB9S: DB "SAVE " +FNB9E: DB 0,0,0,0,0,0,0,0,0 ;(was DEFS 9) + DB 6 +FNB10S: DB "LOAD " +FNB10E: DB 0,0,0,0,0,0,0,0,0 ;(was DEFS 9) +INBUFC: DB 0 ;INBUF counter +INBUFL: DB 0 ;INBUF length +INBUF: DB 0,0,0,0,0,0,0,0 ;DEF KEY buffer (was DEFS 16) + DB 0,0,0,0,0,0,0,0 +LINLIM: DB 255 ;getline buffer limit +KEYDAT: DB 0 + +;*-------------- +;* timer work +;*--------------- +AMPM: DB 0 +SECD: DW 0 + +;*--------------- +;* scroll work +;*--------------- +XS: DB 0 ;console X start const=0 +XE: DB 39 ;console X end +CWIDTH: DW 40 ;console width (cwidth=xe+1) +CSIZE: DW 320 ;csize=cwidth*8 +YS: DB 0 ;console Y start +YE: DB 24 ;console Y end +YW: DB 25 ;console Y width (yw=ye-ys+1) + +;*---------------------- +;* scroll custom data +;*---------------------- +SOF: DW 0 ;scroll offset +SW: DB 7DH ;scroll width (sw = yw*5) +SSA: DB 0 ;scroll start (ssa = ys*5) +SEA: DB 7DH ;scroll end (sea =(ye+1)*5) +SSW: DW 3E8H ;scroll offset lilmit (ssw = sw*8) + +;*--------------------- +;* crt work (Basic) +;*--------------------- +CRTMD1: DB 1 ;crt bit data +CRTMD2: DB 1 ;crt mode no. +SELCOL: DB 3 ;default colour +PAIWED: DW 0 ;paint stack end + +;*----------------- +;* palette work +;*----------------- +PALBK: DB 0 ;palette block no. +PALAD: DW PAL4T ;palette init addr. +PALTBL: DB 0,0,0,0 ;pallette data table (was DEFS 4) + +;*---------------------------- +;* palette init data table +;*---------------------------- +PAL2T: DB 00H ;PAL 0 black + DB 1FH ;PAL 1 white + DB 2FH ;PAL 2 white + DB 3FH ;PAL 3 white +;* +PAL4T: DB 00H ;PAL 0 black + DB 11H ;PAL 1 blue + DB 22H ;PAL 2 red + DB 3FH ;PAL 3 white +;* +PAL16T: DB 00H ;PAL 0 black + DB 11H ;PAL 1 blue + DB 22H ;PAL 2 red + DB 33H ;PAL 3 purple + +;*---------------------------- +;* cursor init data table +;*---------------------------- +CURDT1: DB 0FFH ;0 NORMAL cursor + DB 0FFH ;1 + DB 0FFH ;2 + DB 0FFH ;3 + DB 0FFH ;4 + DB 0FFH ;5 + DB 0FFH ;6 + DB 0FFH ;7 +;* +CURDT2: DB 7EH ;0 SHIFTLOCK cursor + DB 0FFH ;1 + DB 0FFH ;2 + DB 0FFH ;3 + DB 0FFH ;4 + DB 0FFH ;5 + DB 0FFH ;6 + DB 7EH ;7 +;* +CURDT3: DB 00H ;0 GRAPH cursor + DB 00H ;1 + DB 00H ;2 + DB 00H ;3 + DB 00H ;4 + DB 00H ;5 + DB 00H ;6 + DB 0FFH ;7 + +;*--------------------------- +;* screen management buffer +;*--------------------------- +SCRNT0: DB 0,0,0,0,0,0,0,0 ;(was DEFS 25) + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0 +SCRNTE: DB 0 + +;*------------------ +;* emm (E-RAM) work +;*------------------ +EMFLG: DB 0 ;(was DEFS 1) +EMPTR: DB 0,0 ;(was DEFS 2) +EMWP0: DB 0,0 ;(was DEFS 2) +EMWP1: DB 0,0 ;(was DEFS 2) + +;*---------- +;* lpt work +;*---------- +WPULSE: DB 0 +WSTROB: DB 0 +PBCMAW: DW 3FF0H +PBCN: DW 0 ; +PBCIP: DW 0C000H ;FIFO inp pointer +PBCOP: DW 0C000H ;FIFO out pointer +PBCTOP: DW 0C000H ;buffer top +SPLFLG: DB 0 ;spool on/stop/off +OUTIMF: DB 0 ;output image flag +HPCOUN: DB 4 ;printer counter +HERRF: DB 0 ;ROM error flag + +;*-------------------------------- +;* code translation table +;* 'Sharp ASCII' <> Standard ASCII +;*-------------------------------- + +CTABLE: DW CTABL1 ;table address +CTABL1: DB 39 ;number in table + DB 023H ;# + DB 023H + DB 040H ;@ + DB 040H + DB 05BH ;[ + DB 05BH + DB 05CH ;\ + DB 05CH + DB 05DH ;] + DB 05DH + DB 08BH ;^ + DB 05EH + DB 090H ;under_ + DB 05FH + DB 093H ;' + DB 060H + DB 0A1H ;a + DB 061H + DB 09AH ;b + DB 062H + DB 09FH ;c + DB 063H + DB 09CH ;d + DB 064H + DB 092H ;e + DB 065H + DB 0AAH ;f + DB 066H + DB 097H ;g + DB 067H + DB 098H ;h + DB 068H + DB 0A6H ;i + DB 069H + DB 0AFH ;j + DB 06AH + DB 0A9H ;k + DB 06BH + DB 0B8H ;l + DB 6CH + DB 0B3H ;m + DB 6DH + DB 0B0H ;n + DB 6EH + DB 0B7H ;o + DB 6FH + DB 09EH ;p + DB 70H + DB 0A0H ;q + DB 71H + DB 09DH ;r + DB 72H + DB 0A4H ;s + DB 73H + DB 096H ;t + DB 74H + DB 0A5H ;u + DB 75H + DB 0ABH ;v + DB 76H + DB 0A3H ;w + DB 77H + DB 09BH ;x + DB 78H + DB 0BDH ;y + DB 79H + DB 0A2H ;z + DB 7AH + DB 0BEH ;{ + DB 7BH + DB 0C0H ;| + DB 7CH + DB 080H ;} + DB 7DH + DB 094H ;~ + DB 7EH + DB 07FH ; + DB 7FH + +;* END of original module MON2.ASM +;*============================================================================ +;* START of original module MON3.ASM + +;*--------------------------------- +;* XMON-ROM 8.30.84 +;* JISX MZ-800 --> ASC +;* ent A :data +;* IX :output sub +;* (HL) :tab counter +;* E :DISPX +;*--------------------------------- + +JISX: CP 0DH + JR Z,JISXCR + CP 0AH + JR Z,JISXCR + CALL AJISX ;code change + CP 20H + JR NC,JPIX + BIT 0,E ;print/p ? + JR Z,JPIX ;no + LD A,20H +JPIX: JP (IX) + +JISXCR: CALL JPIX + LD (HL),0 + RET + +AJISX: PUSH BC + LD C,0 + CALL AJISX1 + POP BC + RET + +AJISX1: CALL PUSHR + LD HL,(CTABLE) + LD B,(HL) ;code counter set + INC HL ;HL=MZ-800 + LD D,H ;DE=JIS + LD E,L + INC DE + BIT 0,C ;MZ-800 --> JIS ? + JR Z,AJISX2 ;yes + EX DE,HL +AJISX2: CP (HL) + JR Z,AJISX3 ;code match + INC HL + INC HL + INC DE + INC DE + DJNZ AJISX2 + RET + +AJISX3: LD A,(DE) + RET + +;*--------------------------------- +;* JISR ASC --> MZ-800 +;* ent (A) :data +;* IX :input sub +;*--------------------------------- +JISR: CALL JPIX ;input sub :A set + RET C + PUSH BC + LD C,1 + CALL AJISX1 + POP BC + OR A + RET + +;*----------------- +;* LPT device table +;*----------------- +SLPT: DW SCMT ;address of next table in chain (SCMT) + DB "LPT" ;name of THIS table + DB 0 + DB 8AH ;Stream, O1C, W + DW 0 + DW LPTINI + DW ER59M ;ROPEN + DW .RET ;WOPEN + DW .RET ;CLOSE + DW .RET ;KILL + DW 0 ;INP + DW LPT1CQ + DW LPTPOS + +;*PIO.AC: EQU 0FCH ;Port-A control LABEL NOT USED +;*PIO.AD: EQU 0FEH ;Port-A data ditto +;*PIO.BC: EQU 0FDH ;Port-B control ditto +;*PIO.BD: EQU 0FFH ;Port-B data ditto + +P.PLT: EQU 0 ;1P01, 1P09 +P.KP5: EQU 1 ;KP5 +P.JIS: EQU 2 ;JIS code +P.THRU: EQU 3 ;thrue + +LPTPOS: LD A,(INPFLG) + OR A + LD A,(LPOSB) + RET Z + LD A,(CURX) + RET + +;*--------------------------- +;* PL ROM CALLS (MZ-800 ROM) +;*--------------------------- +ROMST: EQU 03H ;F403H +ROMST1: EQU 0F400H + +TIMST: CALL ROMJP2 + DB ROMST + +TIMRD: CALL ROMJP2 + DB ROMST+3 + +STICK: CALL ROMJP2 + DB ROMST+6 + +STRIG: CALL ROMJP2 + DB ROMST+9 + +HCPY: CALL ROMJP + DB ROMST+12 + +LPT1CQ: LD HL,DISPX + BIT 0,(HL) + JR NZ,LPT1CX + +LPT1C: PUSH IY + EX AF,AF' + LD A,3+15 ;F003+15 + LD (APL1CD),A + LD A,.CRT1C +APL1CF: LD (APL1CE),A + EX AF,AF' + CALL APL1C + POP IY + PUSH BC + LD B,A + LD A,(INPFLG) + OR A + LD A,B + POP BC + RET Z + RST 18H +APL1CE: DB .CRT1C + RET + +APL1C: LD IY,JISX + CALL ROMJP + +APL1CD: DB ROMST+15 +LPT1CX: PUSH IY + EX AF,AF' + LD A,3+18 ;F003+18 + LD (APL1CD),A + LD A,.CRT1X ;was LD A, .CRT1CX (a mistake !) + JR APL1CF + +LPTINI: CALL ROMJP + DB ROMST+21 + +LPTOUT: CALL ROMJP + DB ROMST+24 + +PBCCLR: CALL ROMJP + DB ROMST+27 + +SPLOFF: CALL ROMJP + DB ROMST+30 + +SPLON: CALL ROMJP + DB ROMST+33 + +SPLSW: CALL ROMJP + DB ROMST+36 + +LPTM02: CALL ROMJP + DB ROMST+39 + +;*--------------------- +;* ROM-calling routines +;*--------------------- +ROMJP: EX AF,AF' + LD A,(PSEL) + BIT P.KP5,A + JR Z,ROMJP1 + + PUSH BC + LD B,3 + RST 18H + DB .MCTRL + POP BC + +ROMJP1: EX AF,AF' +ROMJP2: EX AF,AF' + XOR A + LD (KEY266),HL + LD (HERRF),A + EX AF,AF' + DI + LD (KEY264),SP + EX (SP),HL ;HL=call stored address + LD SP,HL ; + POP HL ;HL=call address + OUT (LSE3),A + LD SP,KEY262 + CALL HLJP + OUT (LSE1),A + LD SP,(KEY264) + EX (SP),HL + INC SP + INC SP + EI + EX AF,AF' + LD A,(HERRF) + OR A + JR NZ,ROMERR + EX AF,AF' + RET + +HLJP: LD H,0F4H ;HL=F4??H + JP (HL) + +ROMERR: LD B,A ;B=0 + EX AF,AF' + DEC B ;B=1 + JP Z,BREAKZ + DEC B ;B=2 + JP NZ,ERRORJ +ROMER1: LD HL,(PBCN) ;INIT M2 + LD A,H + OR L + JR Z,LPTM02 + CALL SPLON + RST 18H + DB .BREAK + JP Z,BREAKZ + JR ROMER1 + +LPTINT: DI + PUSH AF + PUSH HL + PUSH BC + LD (WKLINT),SP + LD SP,WKLINT + OUT (LSE3),A + CALL ROMST1 ;F400H + OUT (LSE1),A + LD SP,(WKLINT) + POP BC + POP HL + POP AF + EI + RETI + + DB 0,0,0,0,0,0,0,0 ;(was DEFS 8) + +WKLINT: DW 0 + +;*---------------------------- +;* MZ-800 Monitor command +;* FI:MONOP ver 1.0A 8.04.84 +;*---------------------------- +MONOP: PUSH HL + LD DE,(ERRORP) + PUSH DE + LD DE,MONERR + LD (ERRORP),DE ;error ret adr set + LD A,(LINLIM) + PUSH AF + LD A,100 ;getline max set + LD (LINLIM),A + LD (MONSP+1),SP ;stack pointer push + XOR A + LD (FILOUT),A ;crt mode +MONCLD: LD SP,0000H ;stack initize +MONHOT: LD BC,MONHOT + PUSH BC ;last return addrs set + RST 18H ;linefeed & cr + DB .CR2 + LD A,'*' ;prompt disp + RST 18H + DB .CRT1C +MONEDQ: CALL MONEDT ;memory correction ? + JR NC,MONEDQ + LD A,(DE) + CP '*' + RET NZ ;prompt check + INC DE + LD A,(DE) ;acc=next interpret data + INC DE ;next interpret data addr +;*--------------------------- +;* monitor commands handler +;*--------------------------- + EXX ;parameter push + LD HL,MNCMTB + LD B,10 ;commands counter +MNCMCP: CP (HL) + INC HL + JR Z,MNCMOK ;skip if just command + INC HL ;next search + INC HL + DJNZ MNCMCP + EXX + RET + +MONERR: LD C,A + AND 7FH + JR Z,MONCLD ;Break + LD A,C ;acc=errcode + RST 18H ;display error messege + DB .ERRX + RST 18H ;error recover fd/qd + DB .ERCVR + JR MONCLD + +MNCMOK: LD E,(HL) + INC HL + LD D,(HL) + PUSH DE ;command addr set + EXX ;parameter pop + RET + +;*------------------------------------ +;* table of monitor commands/addresses +;*------------------------------------ +MNCMTB: DB 'D' + DW MONDMP + DB 'M' + DW MONSET + DB 'P' + DW MONPRT + DB 'G' + DW MONGOT + DB 'F' + DW MONSCH + DB 'R' + DW MONSP + DB 'S' + DW MONSAV + DB 'L' + DW MONLOD + DB 'V' + DW MONVRY + DB 'T' + DW MONTRN + +;*--------------------------------- +;* monitor P(rint) command (toggle) +;*--------------------------------- +MONPRT: LD A,(FILOUT) ;lpt/crt + XOR 1 + LD (FILOUT),A + RET + +;*----------------------- +;* monitor S(ave) command +;*----------------------- +MONSAV: CALL SAVTRN ;set addrs + RET C + EXX + CALL FNMST ;file name set + EXX + LD (ELMD20),BC ;bytes + LD (ELMD22),DE ;data adrs + LD (ELMD24),HL ;exec adrs + RST 18H ;save file + DB .SAVEF + RET + +;*----------------------- +;* monitor L(oad) command +;*----------------------- +MONLOD: CALL HLSET ;load addr set + PUSH HL ;hl=load addrs + PUSH AF + CALL LOAVRY ;filename set & open + POP AF + POP HL + JR NC,MONLD2 ;user load addr set ?? + LD HL,(ELMD22) +MONLD2: RST 18H ;load file + DB .LOADF + RET + +;*-------------------- +;* filename set & open +;*-------------------- +LOAVRY: CALL FNMST ;file name set + RST 18H + DB .LOPEN ;ROPEN + CP 1 + RET Z + JP ER61M ;File mode error + +;*------------------------- +;* monitor V(erify) command +;*------------------------- +MONVRY: CALL LOAVRY ;filename set + LD HL,(ELMD22) + RST 18H ;file verify + DB .VRFYF + RET + +;*------------------------- +;* monitor R(eturn) command +;* (to BASIC) +;*------------------------- +MONSP: LD SP,0000H + POP AF + LD (LINLIM),A + POP HL + LD (ERRORP),HL + POP HL + RET + +;*---------------------- +;* monitor operation +;*---------------------- +MONEDT: LD DE,0FF00H ;monitor work + RST 18H + DB .GETL + JR C,MONEDE +;*------------------ +;* check ':xxxx=' +;*------------------ + LD A,(DE) + CP ':' ;mem correct ?? + SCF + RET NZ + INC DE + CALL HLSET ;addrs input ? + RET C + LD A,(DE) + INC DE + XOR 3DH ;'=' + RET NZ +NEXTAC: CALL ACSET ;data read + CCF + RET NC + LD (HL),A ;mem correction ! + INC HL ;next pointer + JR NEXTAC + +MONEDE: LD (DE),A ;error + RET + +;*---------------------------------- +;* 4 ascii to binary (word) +;* ent. de=ascii data pointer +;* ext hl=xxxxH +;*---------------------------------- +HLSET: PUSH HL + CALL SPCTAC ;separater search + PUSH DE + CALL ACSETH ;2 ascii to binary + JR C,HLSETE + LD H,A + CALL ACSETH ;2 ascii to binary + JR C,HLSETE + LD L,A + POP AF + POP AF + XOR A + RET + +HLSETE: POP DE + POP HL + SCF + RET + +;*---------------- +;* space search +;*---------------- +SPCTA2: INC DE +SPCTAC: LD A,(DE) + CP 20H + JR Z,SPCTA2 + RET + +;*--------------------------------- +;* 1 ascii to binary (nible) +;* +;* ent. de=ascii data pointer +;* ext acc= 0xH +;*--------------------------------- +ACSETS: LD A,(DE) + RST 18H ;0-9 a-f check + DB .CKHEX + INC DE ;set pointer to next + RET + +;*--------------------------------- +;* 2 ascii to binary (byte) +;* ent. de=ascii data pointer +;* ext acc= xxH +;*--------------------------------- +ACSET: CALL SPCTAC ;skip spaces + CP ';' + JR Z,SEMIOK ;skip if ascii input +ACSETH: PUSH BC + PUSH DE + CALL ACSETS ;1 ascii to binary(nible) + JR C,ACSTER + LD C,A ;high nible + CALL ACSETS ;1 ascii to binary(nible) + JR C,ACSTER + LD B,A ;low nible + LD A,C + RLCA + RLCA + RLCA + RLCA + ADD A,B + LD C,A + LD A,C + POP BC + POP BC + OR A + RET + +ACSTER: POP DE + POP BC + SCF + RET + +;*-------------------------- +;* ascii code input mode +;*-------------------------- +SEMIOK: INC DE + LD A,(DE) + INC DE + OR A ;ئئJR ACSETO + RET ;ئئ + +;*------------------------------------------------------ +;* Top of p.123 in German Listing of MZ-2Z046 Disk Basic +;*------------------------------------------------------ +;*----------------------- +;* Monitor G(oto) Command +;*----------------------- +MONGOT: CALL HLSET + RET C + JP (HL) + +;*----------------------- +;* Monitor D(ump) command +;*----------------------- +MONDMP: CALL HLSET ;top addrs set + JR C,MONDP1 ;skip if 'd' only + PUSH HL + CALL HLSET ;end addrs set + JR C,MONDP2 ;skip if top addrs only + POP DE + EX DE,HL + JR MONDP3 + +MONDP2: POP HL ; +MONDP1: EX DE,HL + LD HL,80H + ADD HL,DE ;last addrs calc + EX DE,HL +MONDP3: LD C,8 ;counter set + CALL MONDPS ;dump list disp + RET C + PUSH HL + SBC HL,DE ;dump end calc + POP HL + RET NC + JR MONDP3 + +MONDPS: CALL HLHXPR ;addrs disp + LD B,C + PUSH HL +MONDP4: LD A,(HL) ;data read + CALL ACHXPR ;1 byte disp + INC HL + LD A,20H ;space disp + RST 18H + DB DH1C + DJNZ MONDP4 + POP HL + LD A,'/' ;separator disp + RST 18H + DB DH1C + LD B,C +MONDP5: LD A,(HL) ;data read + CP 20H ;control code ? + JR NC,MONDP6 + LD A,'.' ;yes, control code +MONDP6: RST 18H + DB DH1C + INC HL ;next pointer + DJNZ MONDP5 + RST 18H + DB DHCR + RST 18H ;break & stop + DB .HALT + OR A + RET + +;*---------------------- +;* disp addrs +;* ent. hl=addrs +;* ':xxxx=' +;*---------------------- +HLHXPR: LD A,':' + RST 18H + DB DH1C + LD A,H + CALL ACHXPR ;acc disp + LD A,L + CALL ACHXPR ;acc disp + LD A,'=' + RST 18H + DB DH1C + RET + +;*-------------------------------- +;* acc disp +;* ent. acc = disp data +;*-------------------------------- +ACHXPR: PUSH AF + RLCA + RLCA + RLCA + RLCA + CALL AC1HXP ;nibble disp + POP AF +AC1HXP: AND 0FH ;ascii trans + ADD A,30H + CP ':' + JR C,AC2HXP + ADD A,7 +AC2HXP: RST 18H ;disp acc(nible) + DB DH1C + RET + +;*------------------------------ +;* monitor M(emory edit) command +;*------------------------------ +MONSET: CALL HLSET ; + LD A,(FILOUT) ;lpt/crt switch + PUSH AF + XOR A + LD (FILOUT),A ;crt mode +MONSTL: RST 18H + DB .CR2 + CALL HLHXPR ;addrs disp + LD A,(HL) ;data read + CALL ACHXPR ;data disp + LD A,20 ;back space + RST 18H + DB .CRT1C + RST 18H + DB .CRT1C + CALL MONEDT ;monitor operation + JR NC,MONSTL + POP AF + LD (FILOUT),A + RET + +;*------------------------- +;* monitor S(earch) command +;*------------------------- +MONSCH: CALL HLSET ;start addrs + RET C + PUSH HL + CALL HLSET ;end addrs + POP BC + RET C + PUSH HL ;hl end addr + PUSH BC ;bc start addr + LD HL,0FF00H ;check data read + CALL NEXTAC ;(hl)<--data + LD DE,0FF00H + OR A + SBC HL,DE ;check data bytes + LD C,L + POP HL + PUSH HL + EXX + POP HL ;hl start addr + POP DE ;de end addr + EXX + RET Z +MNSHLP: CALL HLDECK ;de=FF00h + JR NZ,SKPSCH ;de check databuf + CALL MONDPS ;data disp + RET C +SKPSCH: RST 18H + DB .BREAK + RET Z + EXX + INC HL ;next check pointer + PUSH HL + SCF + SBC HL,DE ;end check ? + POP HL + RET NC + PUSH HL + EXX + POP HL ;next check pointer + JR MNSHLP + +;*---------------------------------- +;* 3 pointer data interpret +;* ent de=ascii data top addr +;* ext de=first data +;* bc=(second-first) data +;* hl=last data +;* used save,xfer command +;* command : save : xfer +;* de : start: source +;* bc : bytes: bytes +;* hl : end : destination +;*---------------------------------- +SAVTRN: CALL HLSET ;first + PUSH HL + CALL NC,HLSET ;second + POP BC ;first + RET C + SBC HL,BC ;calc bytes + INC HL + PUSH HL ;bytes + PUSH BC ;first + CALL HLSET ;last + PUSH HL ;last + EXX + POP HL ;last + POP DE ;first + POP BC ;bytes + RET + +;*--------------------------- +;* monitor T(ransfer) command +;*--------------------------- +MONTRN: CALL SAVTRN + RET C + EX DE,HL + PUSH HL + SBC HL,DE ;direction check + POP HL + JR C,LDDRTR + LDIR + RET + +LDDRTR: ADD HL,BC ;last addrs calc + DEC HL + EX DE,HL + ADD HL,BC + DEC HL + EX DE,HL + LDDR + RET + +;*----------------- +;* filename set +;*----------------- +FNMST: LD A,(DE) + OR A + JR Z,FNMST2 + INC DE + CP ':' ;demiliter seach + JR NZ,FNMST +FNMST2: RST 18H ;count string length + DB .COUNT + RST 18H ;interpret dev. file name + DB .DEVFN + LD A,1 + LD (ELMD),A ;.OBJ atribut + RET + +;*--------------------------------- +;* check (de) (hl) ? +;* hl,de check data point +;* c counter +;*--------------------------------- + +;*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +HLDECK: LD A,(DE) ;this routine is duplicated at HLDECH: !! + CP (HL) ;but has been left in for compatibility + RET NZ + PUSH BC + PUSH DE + PUSH HL + LD B,C +HLDEC1: LD A,(DE) + CP (HL) + JR NZ,HLDEC2 + INC DE + INC HL + DJNZ HLDEC1 + XOR A +HLDEC2: POP HL + POP DE + POP BC + RET + +;*--------------------------------------------------------------------------- + + DB 0,0,0,0,0,0,0,0 ;22 bytes spare at 17EAH -17FFH + + DB 0,0,0,0,0,0,0,0 + + DB 0,0,0,0,0,0 + + +;* END of original module MON3.ASM +;*=========================================================================== +;* START of original module MON-IOCS.ASM +;*------------------------------ +;* Lx-monitor IOCS-part +;* FI:MON-IOCS ver 1.01 5.24.84 +;*------------------------------ + + ORG 1800H + +SIOCS: JP BSTART ;5800H in this version + +;*------------------------------------------------------------ +;* NOTE - FLAGS 1, 2 and ZWRX below appear in 'Device Tables' +;*------------------------------------------------------------ +;*---------------------- +;* FLAG1 bit definitions +;*---------------------- +ROPENA: EQU 0 ;ROPEN enable +WOPENA: EQU 1 ;WOPEN enable +READ1: EQU 2 ;Read at 1 char +WRITE1: EQU 3 ;Write at 1 char +QNAME: EQU 4 ;File name exist +RAND: EQU 5 ;FD +SEQU: EQU 6 ;CMT, QD, RAM +STREM: EQU 7 ;CRT, KB, LPT, RS, USR + +;*---------------------- +;* FLAG2 bit definitions +;*---------------------- +GNAME: EQU 7 ;Disp filename +ROPN1: EQU 6 ;1 file only open +WOPN1: EQU 5 ;1 file only wopen +DOEOF: EQU 4 ;select EOF process +;* bit 3 not used +;* bit 0,1,2 ;max channel + +;*--------------------- +;* ZRWX bit definitions +;*--------------------- +ROPNAA: EQU 0 ;R.opened +WOPNAA: EQU 1 ;W.opened +XOPNAA: EQU 2 ;X.opened +LOPNAA: EQU 3 ;L.opened +EOFAA: EQU 7 ;End of file + +;*----------- +;* DIR offset +;*----------- +SIZEAA: EQU 20 +PTRAA: EQU 64 ;BSD block pointer +BLOCAA: EQU 64+16-2 ;BSD block number +;* +CMTLU: EQU 80H +CRTLU: EQU 88H +LPTLU: EQU 89H + +;*--------------------------------------------------------------------------- +CRTLUQ: LD A,(ZLOG) ;This routine is duplicatedin a later module + CP CRTLU ;but both are left in, for compatibility. + RET ;The duplicate routine is renamed CRTDUP: +;*--------------------------------------------------------------------------- + +ZMODE: DW 0 ;File mode +ZBUFF: DW 0 ;Buffer adrs +ZBUFE: DW 0 ;Buffer end + +;*------------------------------------ +;* SVC .PRSTR ;print string into file +;* ent DE:adrs +;* B: length +;*------------------------------------ +PRTSTR: CALL IO.RDY + CALL PRTST0 +IO.OK: XOR A + LD (QSEG),A + RET + +IO.RDY: LD A,(ZLOG) + LD (QSEG),A + RET + +PRTST0: CALL PUSHR + LD A,(ZFLAG1) + BIT STREM,A + LD HL,PRT1C + JR Z,PRTST2 + BIT WRITE1,A ;Output at + LD HL,.ZOUT + JR NZ,PRTST2 ; 1 char +.ZOUT: LD IX,(ZOUT) ; 1 line + CALL IOCALL + RET + +PRTST2: LD A,B ;SEQ/RND + OR A + RET Z + LD A,(DE) +PRTST4: CALL .HL ;PRT1C or .ZOUT + INC DE + DEC B + JR PRTST2 + +PRT1C: CALL PUSHR + LD E,(IY+PTRAA) + LD D,(IY+PTRAA+1) + LD HL,(ZBUFF) + ADD HL,DE + LD (HL),A + INC DE + LD HL,(ZBLK) + OR A + SBC HL,DE + CALL Z,PRT1B ;Buffer full + LD (IY+PTRAA),E + LD (IY+PTRAA+1),D + INC (IY+SIZEAA) + RET NZ + INC (IY+SIZEAA+1) + RET NZ + JP ER55 ;too long file + +PRT1B: PUSH BC ;Output 1 block + LD B,02H ;F# not update, blocked +PRT1B0: CALL QRND + LD IX,.ZOUT + JR Z,PRT1B1 + LD IX,PRX1B +PRT1B1: LD A,B + CALL SEQSET + CALL JPIX +PRT1B9: INC (IY+BLOCAA) + LD DE,0 + POP BC + RET + +;*--------------------------------------------------------------------------- +JIXDUP: JP (IX) ;Duplicate JP (IX) left in for compatibility +;*--------------------------------------------------------------------------- + +PRT1BX: LD A,1AH ;Output last block + LD E,(IY+PTRAA) + LD D,(IY+PTRAA+1) +PRT1X2: LD HL,(ZBUFF) + ADD HL,DE + LD (HL),A + INC DE + LD HL,(ZBLK) + XOR A + SBC HL,DE + JR NZ,PRT1X2 + PUSH BC + LD HL,(ZBUFF) + DEC HL + LD (HL),0FFH ;EOF mark + DEC HL + LD (HL),0FFH + LD B,06H ;F# update, blocked + JR PRT1B0 + +SEQSET: LD BC,(ZBLK) + INC BC + INC BC + LD HL,(ZBUFF) + DEC HL + DEC HL + LD DE,(ZMODE) + RET + +.ZEND: DB 0F6H +.ZSTRT: XOR A + LD IX,(ZSTRT) + CALL IOCALL + RET + +;*--------------------------------- +;* SVC .INSTT ;INPUT command start +;*--------------------------------- +INPSTRT: CALL CRTLUQ ;input start + RET NZ + PUSH DE + LD DE,KEYBUF + CALL BINPUT + LD (INPKB+1),DE + POP DE + RET NC + JP BREAKZ + +;*----------------------------- +;* SVC .INMSG ;input from file +;* ent DE:adrs +;* ext B: length +;*----------------------------- +INPMSG: PUSH HL + PUSH DE + CALL IO.RDY + LD HL,(ZTOP) + INC HL + BIT EOFAA,(HL) + PUSH HL + LD B,0 + SCF + CALL Z,INPMS0 + POP HL + CALL C,INEOF + POP DE + PUSH AF + CALL IO.OK + LD L,B + LD H,0 + ADD HL,DE + LD (HL),0 + POP AF + POP HL + RET + +INEOF: SET EOFAA,(HL) + LD HL,ZFLAG2 + BIT DOEOF,(HL) + RET Z ;normally + JP ER63 ;old method + +INPMS0: CALL CRTLUQ ;input 1 record + JR Z,INPKB + LD A,(ZFLAG1) + BIT STREM,A + LD HL,INP1C + JR Z,INPMC + BIT READ1,A + LD HL,.ZINP + JR NZ,INPMC +.ZINP: LD IX,(ZINP) + CALL IOCALL + RET + +INPKB0: LD A,'?' + RST 18H + DB .CRT1C + LD A,20H + RST 18H + DB .CRT1C + RST 18H + DB .INSTT +INPKB: LD HL,0 ;xxx + CALL HLFTCH + OR A + JR Z,INPKB0 + LD C,0 + RST 18H + DB .INDAT ; was .INDATA (a mistake !) + LD (INPKB+1),HL + RET + +;*---------------------------------------- +;* SVC .INDAT ;read 1 item from buffer +;* ent HL:data pointer +;* DE:input buffer +;* C: separator(normally 00H or ":") +;* ext B: length +;* HL:data pointer +;*---------------------------------------- +INPDT: LD B,0 + CALL TEST1 + DB '"' + JR NZ,INPDT6 +INPDT2: LD A,(HL) + OR A + RET Z + INC HL + CP '"' + JR Z,INPDT4 + LD (DE),A + INC DE + INC B + JR INPDT2 +INPDT4: CALL TEST1 + DB ',' + OR A ;Reset CF + RET + +INPDT6: LD A,(HL) + OR A + RET Z + CP C + RET Z + INC HL + CP ',' + RET Z + LD (DE),A + INC DE + INC B + JR INPDT6 + +INPMC: LD (INPMC2+1),HL ;input by chr + LD B,0 +INPMC2: CALL 0 ;INP1C or (ZINP) + RET C + CP 0DH + RET Z + LD (DE),A + INC DE + INC B + JR NZ,INPMC2 + JP ER41 ;I/O error + +INP1C0: LD A,(ZFLAG1) + BIT STREM,A + JP NZ,ER59M ;STRM ommit +INP1C: CALL PUSHR + LD E,(IY+PTRAA) + LD D,(IY+PTRAA+1) + LD HL,(ZBLK) + OR A + SBC HL,DE + CALL Z,INP1B + RET C + LD L,(IY+BLOCAA) + LD H,(IY+BLOCAA+1) + XOR A + SBC HL,DE + SCF + RET Z ;EOF + LD HL,(ZBUFF) + ADD HL,DE + LD A,(HL) + INC DE + LD (IY+PTRAA),E + LD (IY+PTRAA+1),D + RET + +INP1B: CALL QRND + JP NZ,INX1B + DB 0F6H ;not first block +INP1B0: XOR A ;first block + CALL SEQSET + CALL .ZINP + RET C + LD A,(HL) + INC HL + AND (HL) + LD (HL),0FFH + INC A + LD DE,0 + RET NZ ;Nomal block + PUSH HL ;EOF block + LD HL,(ZBUFE) + LD BC,(ZBLK) +INP1B2: DEC HL + DEC BC + LD A,(HL) + OR A + JR Z,INP1B2 + POP HL + LD (HL),B ;Block length + DEC HL + LD (HL),C + RET + +;*----------------------------------- +;* SVC .LUCHK ;check lu & set Z-area +;* ent A: lu +;* ext A: 1:R, 2:W +;* if CF then not-found +;*----------------------------------- +LUCHK: CALL PUSHR + LD HL,CRTTBL + CP CRTLU + JR Z,LUCHK4 + LD HL,LPTTBL + CP LPTLU + JR Z,LUCHK4 + RST 18H + DB .SEGAD + RET C ;LU# not found +LUCHK4: LD (ZTOP),HL + LD DE,ZLOG + LD BC,8 + LDIR + LD (ZMODE),HL + PUSH HL + POP IY + LD DE,ELMD + CALL LDIR64 + PUSH HL + LD HL,(ZEQT) + LD DE,ZNXT + LD BC,ZBYTES + LDIR + POP HL + LD BC,16 + ADD HL,BC + LD (ZBUFF),HL + LD BC,(ZBLK) + ADD HL,BC + LD (ZBUFE),HL + LD A,(ZRWX) + AND 0FH + RET + +CRTTBL: DB CRTLU + DB 3 ;W R + DW SCRT + DW 0 + DW 0 + +LPTTBL: DB LPTLU + DB 2 ;W + DW SLPT + DW 0 + DW 0 + +;*------------------------------ +;* SVC .DEVNM ;Interp. dev name +;* ent DE:device name pointer +;* ext DE:equipment table +;* HL:file name pointer +;* A: channel +;*------------------------------ +DEV: LD HL,KEYBUF + PUSH HL + LD A,B + OR A + CALL NZ,LDHLDE + LD (HL),0 + LD HL,EQTBL + JR DEV1A + +DEV1: LD HL,0 ;xxx +DEV1A: LD A,L + OR H + JR Z,DEV8 ;Not found + LD (DEV7+1),HL + CALL LDDEMI + LD (DEV1+1),DE + LD DE,KEYBUF + EX DE,HL +DEV2: LD A,(DE) + OR A + JR Z,DEV4 + CP (HL) + JR NZ,DEV1 ;Mismatch + INC HL + INC DE + JR DEV2 +DEV4: LD A,(HL) + INC HL + CP ':' + LD C,0 + JR Z,DEV5 ;Match + SUB 31H + CP 9 + JR NC,DEV1 ;Mismatch + LD C,A + LD A,(HL) + INC HL + CP 3AH + JR NZ,DEV1 ;Mismatch +DEV5: EX (SP),HL ;Found +DEV7: LD HL,0 ;xxx + LD A,C + JR DEV9 + +DEV8: POP HL ;Not found + PUSH HL +DEV82: LD A,(HL) + INC HL + CP ':' + JP Z,ER58M ;Dev name err + OR A + JR NZ,DEV82 + LD HL,(DDEV) + LD A,(DCHAN) +DEV9: LD (ZEQT),HL + PUSH HL + LD (ZCH),A + LD DE,ZNXT + LD BC,ZBYTES + LDIR + LD B,A + LD A,(ZFLAG2) + AND 07H ;bit 0,1,2 + CP B + JP C,ER58M ;Dev name err (CH#) + LD A,B + POP DE + POP HL + RET + +;*----------------------------------- +;* SVC .DEVFN ;Interp. dev&file name +;* ent DE:pointer +;* B: length +;*----------------------------------- +DEV.FN: CALL PUSHR + RST 18H + DB .DEVNM + EX DE,HL + LD HL,ELMD1 + LD B,31 + CALL QCLRHL + LD HL,ELMD + RST 18H + DB .COUNT + CALL SETFNAM + LD HL,ZFLAG1 + BIT QNAME,(HL) + RET Z + INC HL + BIT GNAME,(HL) + RET NZ + LD A,(ELMD1) ;except CMT + CP 0DH ;no filename + JP Z,ER60M ;error 60. + RET + +;*----------------- +;*ROPEN/WOPEN/XOPEN +;*----------------- +RWOPEN: CALL PUSHR + CALL OPEN00 + LD B,0 + CALL TYPECK + JP DUST + +OPEN00: LD A,(ZLOG) + RST 18H + DB .SEGAD + JP NC,ER43 ;LU already opened + CALL QOPEND ;Check already opened + LD HL,8+64+16+5 ;LU, DIR and work + LD A,(ZFLAG1) + LD DE,(ZBLK) + INC DE + INC DE + BIT STREM,A + JR NZ,OPEN10 + ADD HL,DE ;SEQ,RND +OPEN10: LD A,(ZRWX) + BIT 2,A + JR Z,OPEN11 + ADD HL,DE ;XO +OPEN11: EX DE,HL + LD A,(ZLOG) + RST 18H ;open segment + DB .OPSEG + LD (QSEG),A + LD (ZTOP),HL + EX DE,HL + LD HL,ZLOG + LD BC,8 + LDIR ;xfer ZLOG to seg + LD (ZMODE),DE + PUSH DE + POP IY + LD HL,ELMD + CALL LDIR64 ;xfer ELMD to seg + LD HL,16 + ADD HL,DE + LD (ZBUFF),HL + LD DE,(ZBLK) + ADD HL,DE + LD (ZBUFE),HL + CALL QRND + JP NZ,OPX ;RND + LD A,(ZRWX) ;SEQ/STRM + BIT XOPNAA,A + JP NZ,ER59M + BIT WOPNAA,A + LD IX,(ZWO) + JR NZ,OPEN20 + LD A,(ZFLAG1) + BIT STREM,A + JR Z,OPEN30 + LD IX,(ZRO) ;STRM RO +OPEN20: LD HL,ELMD ;SEQ/STRM WO + JP IOCALL + +OPEN30: LD B,(IY+0) ;SEQ RO + CALL SERFLR + LD A,(ELMD) + CP B + JP NZ,ER61M + JP INP1B0 ;First call + +;*----------------------------- +;* SVC .LOPEN ;Search for LOAD +;*----------------------------- +LOPEN: CALL PUSHR + LD IY,0100H ;(ZLOG)=0 + LD (ZLOG),IY ;(ZRWX)=1 ;R + LD IY,ELMD + CALL QRND + LD HL,LOPX + JR NZ,LOPEN1 + LD HL,SERFLR +LOPEN1: CALL .HL + LD B,80H + CALL TYPECK + LD A,(ELMD) + RET + +;*------------------------------------ +;* type check (chained or contiguous) +;*------------------------------------ +TYPECK: LD A,(ELMD) + CP 5 + RET C + LD A,(ELMD18) + AND 80H + CP B + RET Z + JP ER61M + +;*----------------------------------- +;* SVC .CLKL ;CLOSE/KILL +;* ent A: lu, if A=0 then all-files +;* B: B=0:KILL, B<>0:CLOSE +;*----------------------------------- +CLKL: CALL PUSHR ;CLOSE/KILL file + OR A + JR Z,CLKLA + CALL CL1F + JP DUST + +CL1F: RST 18H + DB .LUCHK + RET C ;LU# not found + CALL IO.RDY + PUSH AF + CALL QRND + JR NZ,CL1FR + BIT STREM,A + LD A,B + JR Z,CL1FB + OR A ;Stream I/O + LD IX,(ZKL) + JR Z,CL1FA + LD IX,(ZCL) +CL1FA: CALL IOCALL + JR CL1F8 + +CL1FB: OR A ;SEQ I/O + JR Z,CL1F8 + LD A,(ZRWX) + BIT WOPNAA,A + CALL NZ,PRT1BX + JR CL1F8 + +CL1FR: CALL CLX ;RND I/O +CL1F8: POP AF + RST 18H + DB .DLSEG + RET + +;*--------------------------- +;* SVC .CLRIO ;clear all i/o +;*--------------------------- +CLRIO: CALL PUSHR + LD B,0 +CLKLA: LD C,8EH ;all files +CLKLA2: LD A,C + PUSH BC + RST 18H + DB .SEGAD + CALL NC,CL1F + POP BC + DEC C + JR NZ,CLKLA2 + JP ERRCVR + +;*-------------------------- +;* search file (SEQ device) +;*-------------------------- +SERFIL: CALL PUSHR ;Search file + LD A,(ZFLAG1) + BIT SEQU,A + JP Z,ER59M ;SEQ only ok + CALL .ZSTRT + LD A,(ZDIRMX) + LD B,A +SERFL2: LD HL,KEYBUF + PUSH BC + LD IX,(ZRO) ;RDINF + CALL IOCALL + POP BC + SET 0,A ;A<>0 + RET C ;Not found + PUSH IY + POP DE + CALL FNMTCH + LD A,(HL) + RET Z + DJNZ SERFL2 + XOR A ;end of dir + SCF + RET + +;*---------------------------- +;* search file for WOPEN, SAVE +;* (SEQ device) +;*---------------------------- +SERFLW: CALL QOPEND + CALL SERFIL + JP NC,ER42 ;already exist + OR A + JP Z,ER51 ;too many files + RET + +;*---------------------- +;* search file for ROPEN +;* (SEQ device) +;*---------------------- +SERFLR: CALL QOPEND + CALL SERFIL + JP C,ER40 ;not found + CALL PUSHR + LD HL,KEYBUF + PUSH IY + POP DE + PUSH HL + CALL LDIR64 + POP HL + LD DE,ELMD + LD A,(HL) +LDIR64: LD BC,64 + LDIR + OR A + RET + +;*----------------------------------- +;* CALL QOPEND ; Check already opened +;*----------------------------------- +QOPEND: LD IX,QOPCKX +QOPEN0: LD (QOPEN6+1),IX + CALL PUSHR + LD A,(ZLOG) + LD C,A + LD HL,(POOL) + PUSH HL +QOPEN2: POP HL + LD A,(HL) + OR A + RET Z + LD B,A + INC HL + CALL LDDEMI + PUSH HL + ADD HL,DE + EX (SP),HL + CP 8FH + JR NC,QOPEN2 ;non i/o seg. + CP C + JR Z,QOPEN2 ;same lu + INC HL ;ZRWX + LD A,(HL) + EX AF,AF' + INC HL + LD DE,ZEQT + PUSH BC + LD BC,300H +QOPEN4: LD A,(DE) + SUB (HL) + OR C + LD C,A + INC DE + INC HL + DJNZ QOPEN4 + POP BC + JR NZ,QOPEN2 ;Diff. device + LD A,B +QOPEN6: CALL 0 ;xxx + JR QOPEN2 + +QOPCKX: LD A,(ZFLAG2) ;Same device + BIT ROPN1,A ;1 file only ? + JP NZ,ER43 ; Yes, already open + BIT WOPN1,A ;1 file only W ? + RET Z ; No, ok + EX AF,AF' + LD B,A + LD A,(ZRWX) + AND B + BIT WOPNAA,A + RET Z + JP ER43 + +;*------------------------------------------------------ +;* Top of p.152 in German Listing of MZ-2Z046 Disk Basic +;*------------------------------------------------------ +;*------------------------------- +;* SVC .LOADFL +;* ent HL:loaging adrs +;* call after .DEVFN and .LOPEN +;*------------------------------- +LOADFL: CALL QRND + JP NZ,LDX + LD BC,(ELMD20) + PUSH BC + XOR A ;first block + LD IX,(ZINP) + CALL IOCALL + POP BC + RET + +;*---------------------------- +;* SVC .VRFYF ;verify file +;* ent HL:adrs +;* call after .DEVFN, .LOPEN +;*---------------------------- +VRFYFL: LD A,(ZFLAG2) + BIT GNAME,A + JP Z,ER59M + LD BC,(ELMD20) + JP CMTVRF + +;*------------------------ +;* SVC .SAVEF ;save file +;* ent DE:adrs +;* call after .DEVFN +;*------------------------ +SAVEFL: LD A,(ELMD) + CP 5 + JR C,SAVEF2 + LD A,80H + LD (ELMD18),A ;contiguas flag +SAVEF2: CALL QRND + JP NZ,SVX + BIT STREM,A + JP NZ,ER59M + PUSH DE + LD HL,0200H + LD (ZLOG),HL + CALL QOPEND + LD HL,ELMD + PUSH HL + POP IY + LD IX,(ZWO) + CALL IOCALL + LD BC,(ELMD20) + POP HL + LD A,04H ;F# update,unblocked + LD IX,(ZOUT) + CALL IOCALL + RET + +QRND: LD A,(ZFLAG1) + BIT RAND,A + RET + +;*------------------------- +;* SVC .DIR +;* ent A=0 ... read dir +;* A>0 ... output dir +;*------------------------- +FDIR: CALL PUSHR + OR A + JR NZ,FDIR3 + LD HL,100H + LD (ZLOG),HL + CALL QOPEND + LD HL,ZFLAG1 + BIT STREM,(HL) + JP NZ,ER59M ;Stream i/o omit + BIT RAND,(HL) + JP NZ,LD.DIR ;RND + INC HL ;SEQ + BIT GNAME,(HL) + JP NZ,ER59M ;CMT ommit + CALL MWAIT ;MUSIC WAIT + LD HL,DIRARE + LD BC,8 ;clear 0800H bytes +FDIR1: CALL QCLRHL + DEC C + JR NZ,FDIR1 + CALL .ZSTRT + LD A,(ZDIRMX) + LD B,A + LD HL,DIRARE +FDIR2: PUSH BC + LD IX,(ZRO) ;read information + CALL IOCALL + PUSH AF + LD BC,32 + ADD HL,BC + LD (HL),0 + POP AF + POP BC + JR C,FDIRX + DJNZ FDIR2 +FDIRX: JP .ZEND + +FDIR3: LD (FDIROT+1),A + XOR A + LD (DISPX),A + LD HL,KEYBUF + PUSH HL + LD DE,DIRM1 + LD B,DIRM2-DIRM1 + CALL LDHLDE + CALL SETDNM ;set device name + LD (HL),20H + INC HL + LD (HL),20H + INC HL + EX DE,HL + CALL QRND + LD IX,(ZFREE) ;SEQ + JR Z,FDIR3A + LD IX,FREEX ;RND +FDIR3A: CALL IOCALL + JR C,FDIR4 + LD H,B + LD L,C + LD B,0 + RST 18H + DB .ASCHL + LD HL,DIRM2 + LD B,DIRM3-DIRM2 + CALL LDDEHL +FDIR4: EX DE,HL + LD (HL),0DH + INC HL + LD (HL),0 + POP DE + CALL FDIROT ;DIR OF (dd: xxx) KB FREE + + LD B,64 ;max dir + LD HL,DIRARE +FDIR6: CALL FDIRS ;mod "name" + LD DE,32 + ADD HL,DE + DJNZ FDIR6 + JP DUST + +FDIRS: CALL PUSHR + LD A,(HL) + OR A + RET Z + RET M + LD DE,KEYBUF + PUSH DE + LD A,20H + LD B,38 + CALL QSETDE + LD A,(HL) + CP MAXMOD+1 + JR C,FDIRJ1 + LD A,MAXMOD+1 +FDIRJ1: PUSH HL + POP IY + POP DE + PUSH DE + INC DE + LD HL,DIRM3-3 + LD BC,3 +FDIRJ2: ADD HL,BC + DEC A + JR NZ,FDIRJ2 + LDIR + EX DE,HL + BIT 0,(IY+18) + JR Z,FDIRJ3 + LD (HL),'*' +FDIRJ3: INC HL + INC HL + LD (HL),'"' + INC HL +FDIRS2: LD A,(IY+1) + CP 0DH + JR Z,FDIRS4 + LD (HL),A + INC IY + INC HL + JR FDIRS2 +FDIRS4: LD (HL),'"' + INC HL + LD (HL),0DH + INC HL + LD (HL),0 + POP DE +FDIROT: LD A,0 ;xxx output lu + RST 18H + DB .LUCHK + RST 18H + DB .COUNT + RST 18H + DB .PRSTR + RST 18H + DB .HALT + RET + +DIRM1: DB 0DH + DB "DIRECTORY OF " + + + +DIRM2: DB " KB FREE." + + +DIRM3: DB "OBJ" ;1 + DB "BTX" ;2 + DB "BSD" ;3 + DB "BRD" ;4 + DB "RB " ;5 + DB " ? " ;6 + DB "LIB" ;7 + DB " ? " ;8 + DB " ? " ;9 + DB "SYS" ;10 + DB "GR " ;11 + DB " ? " ;12 +MAXMOD: EQU 11 + +;*-------------------- +;* INIT "dev:command" +;*-------------------- +FINIT: PUSH HL +FINIT2: XOR A + LD (ZLOG),A + LD IX,QOPCKY + LD (QOPCKY+1),SP + CALL QOPEN0 + POP HL + LD IX,(ZINIT) + CALL IOCALL + RET + +QOPCKY: LD SP,0 + LD B,0 + RST 18H ;KILL + DB .CLKL + JR FINIT2 + +;*----------- +;* Ask Y or N +;*----------- +OKYN: CALL TEST1 + DB 'Y' + RET Z + LD DE,OKQMSG + RST 18H + DB .CRTMS + LD A,1 + RST 18H + DB .INKEY + CP 'Y' + RET Z + JP BREAKZ + +OKQMSG: DB "OK ? [Y/N]" + + + DB 19H ;alpha + DB 0 + +;*--------------- +;* Filename check +;*--------------- +CKFIL: LD DE,ELMD +FNMTCH: CALL PUSHR + INC HL + INC DE + LD A,(DE) + CP 0DH + RET Z + LD B,17 +FNMTLP: LD A,(DE) + CP (HL) + RET NZ + CP 0DH + RET Z + INC HL + INC DE + DJNZ FNMTLP + OR A + RET + +SETFNAM: INC HL + LD C,16 +SETFN2: LD A,B + OR A + JR Z,SETFN4 + LD A,(DE) + INC DE + DEC B + OR A + JR Z,SETFN4 + CP '"' + JR Z,SETFN2 + CP ':' + JP Z,ER60M ;file name err + LD (HL),A + INC HL + DEC C + JR NZ,SETFN2 +SETFN4: LD (HL),0DH + INC HL +SETFN6: LD A,C + OR A + RET Z + LD (HL),20H + INC HL + DEC C + JR SETFN6 + +;*------------------------------ +;* SVC .SEGAD ;get segment adrs +;* ent A .... Seg No. +;* ext HL ... Buffer adrs +;*------------------------------ +SEGADR: LD HL,(POOL) +SEGAD2: INC (HL) + DEC (HL) + SCF + RET Z ;not found + CP (HL) + INC HL + JR Z,SEGAD9 + PUSH DE + CALL LDDEMI + ADD HL,DE + POP DE + JR SEGAD2 +SEGAD9: INC HL + INC HL + RET + +;*--------------------------- +;* SVC .DLSEG ;delete segment +;* ent A .... Seg No. +;*--------------------------- +DELSEG: CALL PUSHR + RST 18H + DB .SEGAD + RET C ;Not exist + DEC HL + LD B,(HL) + DEC HL + LD C,(HL) ;BC = length + DEC HL ;HL = del start + LD D,H + LD E,L ;DE = del start + INC BC + INC BC + INC BC ;BC = del size + PUSH BC + ADD HL,BC ;HL = del end + PUSH HL + LD B,H + LD C,L + LD HL,(TMPEND) + OR A + SBC HL,BC + LD B,H + LD C,L ;BC = Move bytes + POP HL ;HL = del end + LDIR + POP DE ;DE = del size + LD HL,0 + OR A + SBC HL,DE + EX DE,HL ;DE= - delete size + RST 18H + DB .ADDP1 + OR A + RET + +;*--------------------------- +;* SVC .OPSEG ;open segment +;* ent A .... Seg No. +;* DE ... Buffer length +;* ext HL ... Buffer adrs +;*--------------------------- +OPSEG: PUSH AF + PUSH BC + PUSH DE + PUSH DE + INC DE + INC DE + INC DE + LD HL,(TMPEND) + EX DE,HL ; + ADD HL,DE ; ADD DE,HL + EX DE,HL ; DE = new TMPEND + JP C,ER06M + PUSH HL + LD HL,-512 + ADD HL,SP + SBC HL,DE + JR C,ER06M + LD HL,(MEMLMT) + DEC H + DEC H + SBC HL,DE + JR C,ER06M + POP HL + PUSH HL ;old TMPEND + LD BC,(VARST) ;POOL END + OR A + SBC HL,BC + LD B,H + LD C,L ;BC = move bytes + POP HL ;HL = old TMPEND + INC BC + LDDR + POP DE ;Buffer length + LD (HL),A ;Seg No. + INC HL + LD (HL),E ;Size + INC HL + LD (HL),D + INC HL + PUSH HL + INC DE ;LEN+1 + PUSH DE +OPSEG2: LD (HL),0 + INC HL + DEC DE + LD A,D + OR E + JR NZ,OPSEG2 + POP DE ;LEN+1 + INC DE + INC DE ;LEN+3 + RST 18H + DB .ADDP1 + POP HL + POP DE + POP BC + POP AF + RET + +;*------------------------------------------------------------------------- +;*MONITOR ERROR EXITS (THOSE SUFFIXED 'M' ARE DUPLICATED IN A LATER MODULE) +;*------------------------------------------------------------------------- +ER03M: LD A,03 + DB 21H +ER06M: LD A,06 + DB 21H +ER28: LD A,28+80H + DB 21H +ER40: LD A,40+80H + DB 21H +ER41: LD A,41+80H + DB 21H +ER42: LD A,42+80H + DB 21H +ER43: LD A,43+80H + DB 21H +ER46: LD A,46+80H + DB 21H +ER50: LD A,50+80H + DB 21H +ER51: LD A,51+80H + DB 21H +ER52: LD A,52+80H + DB 21H +ER53: LD A,53+80H + DB 21H +ER54: LD A,54+80H + DB 21H +ER55: LD A,55+80H + DB 21H +ER58M: LD A,58 + DB 21H +ER59M: LD A,59+80H + DB 21H +ER60M: LD A,60+80H + DB 21H +ER61M: LD A,61+80H + DB 21H +ER63: LD A,63+80H + DB 21H +ER64M: LD A,64 ;not used but left in to keep code aligned + DB 21H +ER68: LD A,68+80H + JP ERRORJ +;*----------------------- +;* Error recover routine +;*----------------------- +ERRCVR: LD A,(QSEG) + OR A + LD B,0 + CALL NZ,CLKL ;KILL + CALL FLOFF ;FD motor off + CALL QDOFF ;QD motor off + XOR A + LD (QSEG),A + JP DUST ;I/O open check + +;* JP MLDSP ;commented out in the original module + + DB 0,0,0 ;(was DEFS 3) +QSEG: DB 0 +;*--------------------------------------------------------------------------- + DB 0,0,0,0,0,0,0,0 ;38 bytes spare at 1FDAH - 1FFFH + + DB 0,0,0,0,0,0,0,0 + + DB 0,0,0,0,0,0,0,0 + + DB 0,0,0,0,0,0,0,0 + + DB 0,0,0,0,0,0 + + +;* END of original module MON-IOCS.ASM +;*=========================================================================== +;* START of original module XWORK.ASM + + ORG 2000H + +TEXTBF: DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;TXTBUF (was DEFS 2000) + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + +DIRARE: DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;DIR area (was DEFS 800H) + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + +;* END of original module XWORK.ASM +;*=========================================================================== +;* START of original module H-QD.ASM + +;*-------------------------- +;* MZ-800 Monitor QD driver +;* FI:M-QD ver 0.2A 9.5.84 +;*-------------------------- + + ORG 2FD0H +;*--------------------- +;* DEVICE TABLE FOR QD: +;*--------------------- +SQD: DW SUSR ;address of next table in chain (SUSR) + DB "QD" ;name of THIS table + DW 0 + DB 5FH ;Seq, W, R + DB 40H ;1OPN + DB 32 ;Max dir + DW Q.INI + DW Q.RINF + DW Q.WINF + DW Q.ON + DW 1024 + DW Q.RDAT + DW Q.WDAT + DW 0 ;DELETE + DW 0 ;WRDIR + DW Q.FREE + +Q.FREE: XOR A + SCF + RET + +Q.INI: RET C + CALL TEST1 + DB 'Y' + JR Z,Q.INI2 + OR A + JP NZ,ER03M + CALL OKYN +Q.INI2: CALL Q.RDY + RET C + RST 18H + DB .DI + LD C,2 + JR QDIOX + +;*------------------ +;* Dir search start +;*------------------ +Q.ON: OR A + JR NZ,QDOFF + RST 18H + DB .DI + XOR A + LD (FNUPS),A ;KILL # + LD C,5 + CALL QDIOR + LD BC,1 + +QDIOR: LD (QDPC),HL + LD (QDPE),DE + LD HL,QDPB + LD (HL),B + DEC HL + LD (HL),C + JR QDIO + +QDOFF: CALL PUSHR + LD C,6 + JR QDIOX + +;*------------------ +;* Read information +;* ent HL:adrs +;*------------------ +Q.RINF: LD BC,3 + LD DE,64 + CALL QDIOR + RET NC + CP 40 ;not found + SCF + RET NZ + LD A,0 + RET + +;*----------------------- +;* Read data +;* ent HL:buffer address +;* BC:byte size +;*----------------------- +Q.RDAT: RST 18H + DB .DI + LD D,B + LD E,C + LD BC,0103H +QDIOX: CALL QDIOR + RST 18H + DB .EI + RET + +;*------------------ +;* Write information +;*------------------ +Q.WINF: LD A,37H ;SCF + LD (Q.WD1),A +Q.RDY: LD BC,0101H + JR QDIOR + +;*------------------ +;* Write data +;*------------------ +Q.WDAT: PUSH AF + RST 18H + DB .DI +Q.WD1: XOR A ;XOR A / SCF + JR NC,Q.WD2 + LD A,0AFH ;XOR A + LD (Q.WD1),A + CALL SERFLW ;First time only + LD (QDPG),HL + LD HL,ELMD + LD DE,64 + POP AF + JR Q.WD3 + +Q.WD2: LD (QDPG),HL + POP AF + SET 0,A +Q.WD3: LD (QDPI),BC + LD B,A + LD C,4 + JR QDIOX + +;*------- +;*QD WORK +;*------- +QDTBL: +QDPA: DB 0 +QDPB: DB 0 +QDPC: DW 0 +QDPE: DW 0 +QDPG: DW 0 +QDPI: DW 0 +HDPT: DB 0 +HDPT0: DB 0 +FNUPS: DB 0 +FNUPS1: DB 0 +FNUPF: DB 0 +FNA: DB 0 +FNB: DB 0 +MTF: DB 0 +RTYF: DB 0 +SYNCF: DB 0 +RETSP: DW 0 +FMS: EQU 0EFFFH +;* +;*------- +;* QD I/O +;*------- +QDIO: LD A,5 ;Retry 5 + LD (RTYF),A +RTY: DI + CALL QMEIN + EI + RET NC + PUSH AF + CP 40 + JR Z,RTY4 + CALL MTOF + LD A,(QDPA) + CP 4 ;Write ? + JR NZ,RTY3 + LD A,(FNUPF) + OR A + JR Z,RTY5 + XOR A ;FNUPF CLR + LD (FNUPF),A + LD A,(FNA) + PUSH HL ;RETSP <= SP-2 + LD (RETSP),SP + POP HL + DI + CALL QDSVFN + EI + JR C,RTY2 + CALL MTOF +RTY3: CP 3 ;Read ? + JR NZ,RTY5 + LD HL,HDPT + DEC (HL) +RTY5: POP AF + PUSH AF + CP 41 + JR NZ,RTY2 + LD HL,RTYF + DEC (HL) + JR Z,RTY2 + POP AF + LD A,(FNUPS1) + LD (FNUPS),A + JR RTY + +RTY2: CALL WRCAN + CALL QDHPC +RTY4: POP AF + RET + +QMEIN: LD (RETSP),SP + LD A,(QDPA) + DEC A + JR Z,QDRC ;Ready Check + DEC A + JR Z,QDFM ;Format + DEC A + JR Z,QDRD ;Read + DEC A + JP Z,QDWR ;Write + DEC A + JR Z,QDHPC ;Head Point Clear + JR MTOFX ;Motor Off +;* +;*----------------- +;* Head Point Clear +;*----------------- +QDHPC: PUSH AF + XOR A + LD (HDPT),A + POP AF + RET + +;*--------------- +;* QD Ready Check +;*--------------- +QDRC: LD A,(QDPB) + JP QREDY + +;*---------- +;* QD Format +;*---------- + +QDFM: XOR A + CALL QDSVFN + CALL SYNCS2 + LD BC,FMS + LD A,0AAH +QDFM1: CPL + LD D,A + CALL TRANS + DEC BC + LD A,B + OR C + JR Z,QDFM2 + LD A,D + JR QDFM1 + +QDFM2: CALL EOM + CALL MTOF + CALL MTON + LD A,(FNB) + DEC A + JR NZ,FMERR + CALL SYNCL2 + LD BC,FMS + LD E,55H +QDFM3: CP E + JR NZ,FMERR + DEC BC + LD A,B + OR C + JR Z,QDFM4 + LD A,E + CPL + LD E,A + CALL RDATA + JR QDFM3 + +QDFM4: CALL RDCRC +MTOFX: JP MTOF + +FMERR: LD A,41 ;Hard Err + SCF + RET + + +;*-------- +;* QD Read +;*-------- + +QDRD: LD A,(MTF) + OR A + CALL Z,MTON + CALL HPS + RET C + CALL BRKC + CALL RDATA + LD C,A + CALL RDATA + LD B,A + OR C ;Byte size zero check + JP Z,QDWE1 + LD HL,(QDPE) ;Byte size check + SBC HL,BC + JP C,QDWE1 + LD HL,(QDPC) +;*--------------- +;*Block Data Read +;*--------------- +BDR: CALL RDATA + LD (HL),A + INC HL + DEC BC + LD A,B + OR C + JR NZ,BDR + CALL RDCRC + LD A,(QDPB) + BIT 0,A + JR NZ,MTOFX + RET + +;*----------------- +;*Head Point Search +;*----------------- +HPS: LD HL,FNB + DEC (HL) + JR Z,HPNFE ;Not Found + CALL SYNCL2 + LD C,A ;BLKFLG => C reg + LD A,(HDPT) + LD HL,HDPT0 + CP (HL) ;Search ok ? + JR NZ,HPS1 + INC A ;HDPT count up + LD (HDPT),A + LD (HL),A ;HDPT0 count up + LD A,(QDPB) + XOR C + RRA + RET NC ;= + +;*---------- +;*Dummy read +;*---------- +DMR: CALL RDATA + LD C,A + CALL RDATA + LD B,A +DMR1: CALL RDATA + DEC BC + LD A,B + OR C + JR NZ,DMR1 + CALL RDCRC + JR HPS ;next +;* +HPS1: INC (HL) + JR DMR +;* +HPNFE: LD A,40 ;Not Found + SCF + RET + + +;*--------- +;* QD Write +;*--------- + +QDWR: LD A,(FNUPS) + LD (FNUPS1),A + LD A,(MTF) + OR A + JR NZ,QDWR1 + CALL MTON + LD A,(FNUPS) + LD HL,FNB + ADD A,(HL) + LD (FNB),A + INC A + LD (HDPT),A + CALL HPS + JP NC,QDWE1 ;Hard err +QDWR1: LD A,(QDPB) + LD B,A + AND 1 + JR NZ,QDWR2 + LD DE,QDPC + LD A,B + RES 2,A + CALL BDW + CALL BRKC +QDWR2: LD DE,QDPG + LD A,(QDPB) + SET 0,A + CALL BDW + CALL MTOF + CALL BRKC + LD A,(QDPB) + AND 4 + JR Z,NFNUP + LD A,(FNA) + LD HL,FNUPS + ADD A,(HL) + CALL QDSVFN + LD A,1 + LD (FNUPF),A +QDWR4: LD A,(FNA) + LD HL,FNUPS1 + ADD A,(HL) + INC A + LD (FNB),A + INC A + LD (HDPT),A + CALL HPS + JR NC,QDWE1 + LD A,(QDPB) + AND 1 + JR NZ,QDWR3 + LD DE,QDPC + CALL BDV + RET C +QDWR3: LD DE,QDPG + CALL BDV + RET C + LD A,(FNUPF) + OR A + JR Z,QDWR5 +WRCAN: XOR A + LD (FNUPS),A + LD (FNUPF),A +QDWR5: JP MTOF + +QDWE1: LD A,41 + SCF + RET + +NFNUP: CALL MTON + JR QDWR4 + +;*---------------- +;*Block Data Write +;*---------------- +BDW: PUSH AF + LD HL,FNUPS + INC (HL) + CALL SYNCS2 + POP AF + CALL TRANS + CALL RSET + LD A,C + CALL TRANS + LD A,B + CALL TRANS +BDW1: LD A,(HL) + CALL TRANS + INC HL + DEC BC + LD A,B + OR C + JR NZ,BDW1 + JP EOM + +;*--------- +;*HL,BC SET +;*--------- +RSET: EX DE,HL + LD E,(HL) + INC HL + LD D,(HL) + INC HL + LD C,(HL) + INC HL + LD B,(HL) + EX DE,HL + RET + +;*----------------- +;*Block Data Verify +;*----------------- +BDV: CALL SYNCL2 + CALL RSET + CALL RDATA + CP C + JR NZ,QDWE1 + CALL RDATA + CP B + JR NZ,QDWE1 +BDV1: CALL RDATA + CP (HL) + JR NZ,QDWE1 + INC HL + DEC BC + LD A,B + OR C + JR NZ,BDV1 + JP RDCRC + +;*-------------------------- +;* i/o port addresses for QD +;*-------------------------- +SIOAD: EQU 0F4H ; sio A data +SIOBD: EQU 0F5H ; sio B data +SIOAC: EQU 0F6H ; sio A control +SIOBC: EQU 0F7H ; sio B control + +;*------------------------------- +;* Ready & Write protect +;* Acc = '0' : Ready check +;* Acc = '1' : & Write Protect +;*------------------------------- +QREDY: LD B,A + LD A,02H ;SIO hard check + OUT (SIOBC),A + LD A,81H + OUT (SIOBC),A + LD A,02H + OUT (SIOBC),A + IN A,(SIOBC) + AND 81H + CP 81H + JP NZ,IOE50 ;Not ready + LD A,10H + OUT (SIOAC),A + IN A,(SIOAC) + LD C,A + AND 08H + JP Z,IOE50 ;Not ready + LD A,B + OR A + RET Z ;No err + LD A,C + AND 20H + RET NZ ;No err + JP IOE46 ;Write protect + +;*--------- +;* Write FN +;*--------- +QDSVFN: PUSH AF + LD HL,SIOSD + LD B,09H + CALL LSINT ;save init +SREDY: LD A,10H + OUT (SIOAC),A + IN A,(SIOAC) + AND 8 + JP Z,IOE50 ;Not ready + LD A,10H + OUT (SIOBC),A + IN A,(SIOBC) + AND 8 + JR Z,SREDY + LD BC,00E9H ;Wait 160ms + CALL TIMW + CALL SBRK ;Send Break + CALL SYNCS1 ;FN Only SYNC + POP AF + CALL TRANS ;FN=A + CALL EOM ;CRC FLAG(7EH) + JR FNEND + +;*----------------------------- +;* MTON -- QD MOTOR ON +;* READ FILE NUMBER +;* READ &CHECK CRC,FLAG +;*----------------------------- +MTON: LD HL,SIOLD + LD B,0BH + CALL LSINT ;load init +LREDY: LD A,10H + OUT (SIOAC),A + IN A,(SIOAC) + AND 8 + JP Z,IOE50 ;Not ready + CALL BRKC + LD A,10H + OUT (SIOBC),A + IN A,(SIOBC) + AND 8 + JR Z,LREDY + LD BC,00E9H ;Wait 160ms + CALL TIMW + CALL SYNCL1 ;LOAD SYNC + LD (FNA),A + INC A + LD (FNB),A + CALL RDCRC +FNEND: LD HL,SYNCF + SET 3,(HL) + XOR A + LD (HDPT0),A + RET + +;*--------------- +;* sio initial +;*--------------- +LSINT: LD C,SIOAC + OTIR + LD A,05H + LD (MTF),A + OUT (SIOBC),A + LD A,80H + OUT (SIOBC),A + RET + +;*------------- +;* QD Motor off +;*------------- +MTOF: PUSH AF + LD A,05H + OUT (SIOAC),A + LD A,60H + OUT (SIOAC),A ;WRGT OFF,TRANS DISABLE + LD A,05H + OUT (SIOBC),A + XOR A + LD (MTF),A + OUT (SIOBC),A + POP AF + RET + +;*---------------------------------- +;* SYNCL1 -- LOAD F.N SYNC ONLY +;* (SEND BREAK 110ms) +;* SYNCL2 -- LOAD FIRST FILE SYNC +;* (SEND BREAK 110ms) +;* SYNCL3 -- LOAD FILES SYNC +;* (SEND BREAK 002ms) +;*---------------------------------- +SYNCL2: LD A,58H + LD B,0BH + LD HL,SIOLD + CALL SYNCA + LD HL,SYNCF + BIT 3,(HL) + LD BC,3 ;WAIT 2ms + JR Z,TMLPL + RES 3,(HL) +SYNCL1: LD BC,00A0H ;WAIT 110ms +TMLPL: CALL TIMW + LD A,05H + OUT (SIOBC),A + LD A,82H + OUT (SIOBC),A + LD A,03H + OUT (SIOAC),A + LD A,0D3H + OUT (SIOAC),A + LD BC,2CC0H ;loop 220ms +SYNCW0: LD A,10H + OUT (SIOAC),A + IN A,(SIOAC) + AND 10H + JR Z,SYNCW1 + DEC BC + LD A,B + OR C + JR NZ,SYNCW0 + JP IOE54 ;Un format +;* +SYNCW1: LD A,03H + OUT (SIOAC),A + LD A,0C3H + OUT (SIOAC),A + LD B,9FH ;loop 3ms +SYNCW2: LD A,10H + OUT (SIOAC),A + IN A,(SIOAC) + AND 01H + JR NZ,SYNCW3 + DEC B + JR NZ,SYNCW2 + JP IOE54 ;Un format +;* +SYNCW3: LD A,03H + OUT (SIOAC),A + LD A,0C9H + OUT (SIOAC),A + CALL RDATA + JP RDATA +;* +;*---------------------------------- +;* SYNCS1 -- SAVE F.N SYNC +;* (SEND BREAK 220ms) +;* SYNCS2 -- SAVE FIRST FILE SYNC +;* (SEND BREAK 220ms) +;* SYNCS3 -- SAVE FILES SYNC +;* (SEND BREAK 020ms) +;*---------------------------------- +SYNCS2: LD A,98H + LD B,09H + LD HL,SIOSD + CALL SYNCA + CALL SBRK + LD HL,SYNCF + BIT 3,(HL) + LD BC,001DH ;WAIT 20ms + JR Z,TMLPS + RES 3,(HL) +SYNCS1: LD BC,0140H ;WAIT 220ms +TMLPS: CALL TIMW + LD A,05H + OUT (SIOAC),A + LD A,0EFH + OUT (SIOAC),A + LD BC,1 ;WAIT 0.7ms + CALL TIMW + LD A,0A5H + CALL TRANS + JP PATCH1 ; LD A,0C0H; OUT(SIOAC),A; RET + +;*------------------------- +;* SBRK -- SEND BREAK (00H) +;*------------------------- +SBRK: LD A,05H + OUT (SIOAC),A + LD A,0FFH + OUT (SIOAC),A + RET + +SYNCA: LD C,SIOAC + OUT (C),A + LD A,5 + OUT (SIOBC),A + LD A,80H + OUT (SIOBC),A + OTIR + RET + +;*--------------------------- +;* EOM -- End off message +;* Save CRC#1,#2,FLAG +;* File space check +;*--------------------------- + +EOM: LD BC,1 ;WAIT 0.7ms + CALL TIMW + LD A,10H + OUT (SIOBC),A + IN A,(SIOBC) + AND 8 + RET NZ + JP IOE53 ;NO file space + +;*-------------------------- +;* RDCRC -- READ CRC & CHECK +;*-------------------------- +RDCRC: LD B,3 +RDCR1: CALL RDATA + DJNZ RDCR1 +RDCR2: IN A,(SIOAC) + RRCA + JR NC,RDCR2 ; Rx Available + LD A,01H + OUT (SIOAC),A + IN A,(SIOAC) + AND 40H + JR NZ,IOE41 ;Hard err + OR A + RET + +;*------------------ +;* Save 1 chr by Acc +;* & ready check +;*------------------ +TRANS: PUSH AF +TRA1: IN A,(SIOAC) + AND 4 ;TRANS buf null + JR Z,TRA1 + POP AF + OUT (SIOAD),A +NRCK: LD A,10H + OUT (SIOAC),A + IN A,(SIOAC) + AND 08H + JP Z,IOE50 ;Not ready + RET + +;*------------------ +;* Read data (1 chr) +;*------------------ +RDATA: CALL NRCK + IN A,(SIOAC) ;RR0 + RLCA + JR C,IOE41 ;Hard err + RRCA + RRCA + JR NC,RDATA + IN A,(SIOAD) + OR A + RET + +;*-------- +;* i/o err +;*-------- +IOE41: LD A,41 ;Hard err + DB 21H +IOE46: LD A,46 ;Write protect + DB 21H +IOE50: LD A,50 ;Not ready + DB 21H +IOE53: LD A,53 ;No file space + DB 21H +IOE54: LD A,54 ;Un format + LD SP,(RETSP) + SCF + RET + +;*------------------------------- +;* wait timer clock 3.54368MHz +;* +;* BC=001H= 0.7ms ( 0.698ms) +;* 003H= 2.0ms ( 2.072ms) +;* 01DH= 20.0ms ( 19.929ms) +;* 0A0H=110.0ms (109.899ms) +;* 0E9H=160.0ms (160.036ms) +;* 140H=220.0ms (219.787ms) +;*-------------------------------- +;* +TIMW: PUSH AF +TIMW1: LD A,150 ;MZ-1500=152 +TIMW2: DEC A + JR NZ,TIMW2 + DEC BC + LD A,B + OR C + JR NZ,TIMW1 + POP AF + RET + +;*-------------------------------- +;* SIO CH A COMMAND CHAIN +;* +;* SIOLD -- LOAD INIT. DATA +;* SIOSD -- SAVE INIT. DATA +;*-------------------------------- +SIOLD: DB 58H ;CHANNEL RESET + DB 04H ;POINT WR4 + DB 10H ;X1 CLOCK + DB 05H ;POINT WR1 + DB 04H ;CRC-16 + DB 03H ;POINT WR3 + DB 0D0H ;ENTER HUNT PHASE +;*Rx 8bits + DB 06H ;POINT WR6 + DB 16H ;SYNC CHR(1) + DB 07H ;POINT WR7 + DB 16H ;SYNC CHR(2) +;* +SIOSD: DB 98H ;CHANNEL RESET +;*Tx CRC Generator reset + DB 04H ;POINT WR4 + DB 10H ;X1 CLOCK + DB 06H ;POINT WR6 + DB 16H ;SYNC CHR(1) + DB 07H ;POINT WR7 + DB 16H ;SYNC CHR(2) + DB 05H ;POINT WR5 + DB 6DH ;Tx CRC ENABLE + +;*------------ +;* BREAK CHECK +;*------------ +BRKC: LD A,0E8H + OUT (LSD0),A + NOP + IN A,(LSD1) + AND 81H + RET NZ + CALL WRCAN + JP BREAKX ;Can't CONT + +;*-------------------------- +;* MZ-800 monitor +;* LDALL +;* SVALL +;* ver 0.1A 08.08.84 +;*-------------------------- +;*--------------- +;* RAM i/o port +;*--------------- +RCADR: EQU 0EBH ;RAM file ctrl port +RDADR: EQU 0EAH ;RAM file data port +;*---------------- +;* RAM equ table +;*---------------- +RMLIM: EQU 0000H ;RAM file limit +RMADR: EQU 0002H ;RAM file usage +RMTOP: EQU 0010H ;RAM file top adrs +;*----------------- +;* LDAL,SVAL WORK +;*----------------- +RMFRE: DW 0 +FAS: DW 0 +NFT: DW 0 ;1 File top +NBT: DW 0 ;1 Block top +;* +FLAGF: DB 0 +FNUPB: DB 0 +;* +BLKF: DB 0 +BLKSL: DB 0 +BLKSH: DB 0 + +;*------------------------ +;* SVC .LSALL +;* ent A=0 ... LOAD ALL +;* A=1 ... SAVE ALL +;*------------------------ +LSALL: CALL PUSHR + LD HL,LDALM + OR A + JR Z,LSAL1A + LD HL,SVALM +LSAL1A: LD (LSAL1+1),HL + RST 18H + DB .CLRIO + CALL QDHPC + PUSH HL + LD (RETSP),SP + POP HL + XOR A + CALL QREDY + JR C,LSAL2 + LD A,5 ;max retry + LD (RTYF),A +LSAL3: RST 18H + DB .DI +LSAL1: CALL 0 ;xxx LDALM or SVALM + CALL MTOF + RST 18H + DB .EI + RET NC + CP 41 + JR NZ,LSAL2 + LD HL,RTYF + DEC (HL) + JR NZ,LSAL3 + LD A,41 +LSAL2: JP ERRORJ + +;*-------------------- +;* LDALL main roution +;*-------------------- +LDALM: LD (RETSP),SP + LD HL,RMLIM + CALL EMLD2 + DEC DE ;RMFRE-end point buffer + DEC DE ;end point buffer(2byte) + LD (RMFRE),DE ;RAM buffer MAX adrs + LD HL,RMADR + CALL EMLD2 + LD HL,RMTOP + OR A + SBC HL,DE + JP NZ,RMER ;RAM Not init + LD (NFT),DE ;first NFT set(0010H) + INC DE + INC DE + LD (NBT),DE ;first NBT set(0012H) + LD HL,FAS + LD (HL),0 ;1 file byte size clear + INC HL + LD (HL),0 + CALL MTON +LDALN: LD HL,FNB + DEC (HL) + JP Z,LDEND + CALL SYNCL2 + LD (BLKF),A + CALL RDATA + LD (BLKSL),A + CALL RDATA + LD (BLKSH),A + LD HL,(BLKSL) + LD DE,(NBT) + ADD HL,DE ;NBT+Block size + JR C,LDALEE ;over + LD BC,2 + ADD HL,BC ;HL+BLKF+BLKS(H,L) +LDALEE: JP C,LDALE ;64K over + LD BC,(RMFRE) + SBC HL,BC ;usedadrs-maxused + JR Z,FBUF0 ;free just + JP NC,LDALE ;NTB+lodingsize+3>free +FBUF0: LD HL,BLKF + LD BC,3 + CALL EMSVD + EX DE,HL + LD DE,(BLKSL) + LD A,D ;size zero check + OR E + JP Z,IOE41 ;size zero error +LEQM: IN A,(SIOAC) + RLCA + JR C,LEQME + RRCA + RRCA + JR NC,LEQM + IN A,(SIOAD) + LD C,RCADR + LD B,H + OUT (C),L + DEC C + OUT (C),A + INC HL + DEC DE + LD A,D + OR E + JR NZ,LEQM + CALL RDCRC + LD (NBT),HL + LD HL,(FAS) ;1 file all size + LD DE,(BLKSL) + ADD HL,DE + INC HL + INC HL + INC HL + LD (FAS),HL + LD A,(BLKF) + BIT 2,A + JR NZ,LDALO ;end block ? +LDALP: CALL BRKCHK + JP NZ,LDALN + JP BREAKZ + +LDALO: LD DE,(NFT) + ADD HL,DE + INC HL + INC HL + LD (NFT),HL ;next NFT + PUSH HL + EX DE,HL + LD DE,(FAS) + CALL EMSV2 + LD HL,0 + LD (FAS),HL + POP HL + INC HL + INC HL + LD (NBT),HL + JR LDALP + +LDEND: LD HL,(NFT) + LD DE,RMADR + EX DE,HL + CALL EMSV2 + EX DE,HL + NOP + LD DE,0 + CALL EMSV2 + RET + +LDALE: CALL LDEND + LD A,53 +LEQME: SCF + RET + +;*-------------------- +;* SVALL main roution +;*-------------------- +SVALM: LD (RETSP),SP + XOR A + LD (FNUPB),A + LD (FLAGF),A + LD (FNUPS),A + LD HL,RMTOP + CALL EMLD2 + LD A,D + OR E + RET Z ;RAM Not file + CALL MTON + LD A,(FNB) + DEC A + JP NZ,QDER ;QD Not init + LD HL,RMTOP +SVALN: CALL EMLD2 + LD (FAS),DE + LD A,D + OR E + JR Z,SVALQ + INC HL + INC HL +SVALO: PUSH HL + CALL SYNCS2 + POP HL + CALL EMLD1 + CALL TRANS + INC HL + CALL EMLD2 + LD (BLKSL),DE + LD A,E + CALL TRANS + LD A,D + CALL TRANS + INC HL + INC HL +SEQM: LD C,RCADR + LD B,H + OUT (C),L + DEC C + IN B,(C) +SEQM1: IN A,(SIOAC) + AND 4 + JR Z,SEQM1 + LD A,B + OUT (SIOAD),A + INC HL + DEC DE + LD A,D + OR E + JR NZ,SEQM +;*------------- +;* check EOM +;*------------- + LD BC,1 + CALL TIMW + LD A,10H + OUT (SIOBC),A + IN A,(SIOBC) + AND 8 + JR NZ,SEQM2 + LD A,53 + LD (FLAGF),A + JP SVALQ + +SEQM2: PUSH HL + LD HL,FNUPS + INC (HL) + CALL BRKCHK + JP Z,BREAKZ + LD HL,(FAS) + LD DE,(BLKSL) + LD BC,3 + XOR A + SBC HL,DE + SBC HL,BC + JR Z,SVALP + LD (FAS),HL + POP HL + JR SVALO +SVALP: POP HL + LD A,(FNUPS) + LD (FNUPB),A + JP SVALN +;* +SVALQ: LD A,(FNUPB) + LD (FNUPS),A + CALL MTOF + CALL MTON + LD HL,RMTOP +SVALT: CALL EMLD2 + LD (FAS),DE + INC HL + INC HL +SVALR: LD A,(FNUPB) + DEC A + JP Z,SVALU + LD (FNUPB),A + PUSH HL + CALL SYNCL2 + POP HL + LD D,A + CALL EMLD1 + CP D + JR NZ,QDHER + INC HL + CALL EMLD2 + LD (BLKSL),DE + CALL RDATA + CP E + JR NZ,QDHER + CALL RDATA + CP D + JR NZ,QDHER + INC HL + INC HL +VEQM: IN A,(SIOAC) + RLCA + JR C,QDHER + RRCA + RRCA + JR NC,VEQM + IN A,(SIOAD) + LD C,RCADR + LD B,H + OUT (C),L + DEC C + IN B,(C) + CP B + JR NZ,QDHER + INC HL + DEC DE + LD A,D + OR E + JR NZ,VEQM + CALL RDCRC + PUSH HL + CALL BRKCHK + JP Z,BREAKZ + LD HL,(FAS) + LD DE,(BLKSL) + LD BC,3 + XOR A + SBC HL,DE + SBC HL,BC + JR Z,SVALS + LD (FAS),HL + POP HL + JR SVALR +;* +SVALS: POP HL + JR SVALT +;* +SVALU: CALL MTOF + LD A,(FNUPS) + CALL QDSVFN + XOR A + LD (FNUPS),A + LD A,(FLAGF) + OR A + RET Z + SCF + RET + +QDER: +RMER: LD A,54 + SCF + RET + +QDHER: + LD A,41 + SCF + RET + +;* END of original module H-QD.ASM +;*============================================================================= +;* START of original module H-CMT.ASM +;*---------------------------- +;* PLE-monitor CMT-driver +;* FI:M-CMT ver 0.1 6.05.84 +;*---------------------------- +;*---------------------- +;* DEVICE TABLE FOR CMT: +;*---------------------- +SCMT: DW SRS ;address of next table in chain (SRS) + DB "CMT" ;name of THIS table + DB 0 + DB 5FH ;Seq, W, R +SCMTF2: DB 0C0H ;CMT, 1OPN + DB 0 + DW CTINI ;INIT + DW CTRINF ;RO + DW CTWINF ;WO + DW .RET ;START + DW 256 ;Block/byte + DW CTRDAT ;INP + DW CTWDAT ;OUT + DW 0 ;DELETE + DW 0 ;WDIR + DW ER59M ;FREE + +CTINI: CALL TEST1 ; Change EOF process + DB 'T' + LD HL,SCMTF2 + SET DOEOF,(HL) ; Tape BASIC mode + RET Z + RES DOEOF,(HL) ; Disk BASIC mode + OR A + RET + +CTWINF: CALL PUSHR + LD DE,IBUFE + LD A,(HL) + LD C,5 + CP 2 ; BTX 2 ==> 5 + JR Z,CTWF2 + LD C,4 + CP 3 ; BSD 3 ==> 4 + JR Z,CTWF2 + LD C,A +CTWF2: LD A,C + LD (DE),A + INC HL + INC DE + LD BC,17 + LDIR + INC HL + INC HL + LD BC,6 + LDIR + LD B,128-24 + CALL QCLRDE + LD HL,IBUFE + LD BC,128 + CALL SVCMT1 + JR CTWD9 + +CTWDAT: CALL SVCMT2 +CTWD9: JP C,BREAKX ; break! + RET ; ok! + +;*-------------- +;* read inf +;* ent HL:adrs +;*-------------- +CTRINF: LD A,37H ; SCF + LD (CTRDAT),A + PUSH HL + LD HL,IBUFE + LD BC,128 + CALL LDCMT1 + JR C,CTERR ; error or break + LD DE,FINMES ; "Found" + CALL FNMPRT ; ? file name + POP DE + LD A,(ZLOG) + OR A ; ROPEN or LOAD? + LD A,(HL) + JP NZ,CTRI1 ; R + LD C,2 ; L BTX 5 ==> 2 + CP 5 + JR Z,CTRI2 +CTRI1: LD C,3 ; BSD 4 ==> 3 + CP 4 + JR Z,CTRI2 + LD C,A + SUB 2 + CP 2 + JP C,ER61M ; file mode error! +CTRI2: LD A,C + LD (DE),A + INC HL + INC DE + LD BC,17 + LDIR + XOR A + LD B,2 + CALL QCLRDE + LD BC,6 + LDIR + LD B,32-18-2-6 + JP QCLRDE + +;*-------------------- +;* read data +;* ent HL:adrs +;* BC:byte size +;*-------------------- +CTRDAT: XOR A ; XOR A / SCF + JR NC,CTRD2 + LD A,0AFH ;XOR A + LD (CTRDAT),A + PUSH HL ; first time only + LD HL,ELMD + LD DE,LDNGMS ; "Loading" + CALL FNMPRT ; ? file name + POP HL +CTRD2: CALL LDCMT2 + RET NC ; ok! +CTERR: CP 2 + JP NZ,BREAKX ; break! + LD A,70+80H + JP ERRORJ ; error! + +;*--------- +;* CMT SAVE +;*--------- +SVCMT1: LD A,0CCH ;Information + JR SAVE3 +;* +SVCMT2: LD A,53H ;Data +SAVE3: LD (SPSV+1),SP + LD SP,IBUFE + PUSH DE + LD E,A + LD D,0D7H ; 'W'=Dreg. + LD A,B + OR C + JR Z,RET1 + CALL CKSUM ; check sum set + CALL MOTOR ; motor on + JR C,WRI3 ; break! + LD A,E + CP 0CCH + JR NZ,WRI2 ; write Data + PUSH DE + LD DE,WRTMES ; "Writing" + CALL FNMPRT ; ? file name + POP DE +WRI2: DI + CALL GAP ; write gap + CALL NC,WTAPE ; write Inf. or Data +WRI3: DI + CALL TMSTOP ; motor off +RET1: POP DE +SPSV: LD SP,0 ;xxx + PUSH AF + RST 18H + DB .EI + POP AF + RET + +;*--------- +;* CMT LOAD +;*--------- +LDCMT1: LD A,0CCH ;Information + JR LOAD3 +;* +LDCMT2: LD A,53H ;Data +LOAD3: LD (SPSV+1),SP ;;; + LD SP,IBUFE ;;; + PUSH DE + LD D,0D2H ; 'L'->Dreg + LD E,A + LD A,B + OR C + JR Z,RET1 + CALL MOTOR ; motor on + DI + CALL NC,TMARK ; read gap & tape mark + CALL NC,RTAPE ; read Inf. or Data + JR WRI3 + +;*----------- +;* CMT VERIFY +;*----------- +CMTVRF: PUSH HL + LD DE,VFNGMS ; "Verifying" + LD HL,ELMD + CALL FNMPRT ; ? file name + POP HL + CALL CHKTAP + RET NC ; ok! + CP 2 + JP NZ,BREAKX ; break! + LD A,3+80H + JP ERRORJ ; error! + + +CHKTAP: LD (SPSV+1),SP + LD SP,IBUFE + PUSH DE + LD D,0D2H + LD E,53H + LD A,B + OR C + JR Z,RET1 + CALL CKSUM ; check sum set + CALL MOTOR ; motor on + DI + CALL NC,TMARK ; read gap & tape mark + CALL NC,TVRFY ; verify + JR WRI3 + +;*---------------------------------------- +;* motor on +;* exit CF=0:ok +;* CF=1:break +;*---------------------------------------- +MOTOR: CALL PUSHR + RST 18H + DB .DI + LD A,0F8H + OUT (LSD0),A ; break set + LD B,10 +MOT1: IN A,(LSD2) + AND 10H + JR Z,MOT4 +MOT2: LD B,0FFH ; 2sec delay +MOT3: CALL DLY7 ; 7ms delay + DJNZ MOT3 ; motor entry adjust + XOR A ; CF=0 + RET + +MOT4: LD A,6 + OUT (LSD3),A + INC A + OUT (LSD3),A + DJNZ MOT1 + LD A,(CMTMSG) + OR A + JR NZ,MOT6 + RST 18H + DB .CR2 + LD A,7FH ; Play mark + RST 18H + DB .CRT1X + LD A,20H + RST 18H + DB .CRT1C + LD A,D + CP 0D7H ; 'W' + LD DE,RECMES ; "RECORD." + JR Z,MOT5 ; write + LD DE,PLYMES ; "PLAY" +MOT5: RST 18H ;LABEL 'MOT5' MISSING IN THE ORIGINAL SOURCE + DB .CRTMS + RST 18H + DB .CR2 +MOT6: IN A,(LSD2) + AND 10H + JR NZ,MOT2 + IN A,(LSD1) + AND 80H + JR NZ,MOT6 + SCF ; CF=1,break! + RET + +;*-------------------- +;* write tape +;* in BC=byte size +;* HL=adr. +;* exit CF=0:ok. +;* CF=1:break +;*-------------------- +WTAPE: PUSH DE + PUSH BC + PUSH HL + LD D,2 ; repeat set + LD A,0F8H + OUT (LSD0),A ; break set +WTAP1: LD A,(HL) + CALL WBYTE ; 1 byte write + IN A,(LSD1) + AND 80H ; break check + SCF + JR Z,RTP5 ; break! + INC HL + DEC BC + LD A,B + OR C + JR NZ,WTAP1 + LD HL,(SUMDT) ; check sum write + LD A,H + CALL WBYTE ; high + LD A,L + CALL WBYTE ; low + CALL LONG + XOR A + DEC D + JR Z,RTP5 ; ok! + LD B,A ; Breg=256 +WTAP2: CALL SHORT ; write short 256 + DJNZ WTAP2 + POP HL + POP BC + PUSH BC + PUSH HL + JR WTAP1 ; repeat + +;*------------------------ +;* read tape +;* in BC=byte size +;* HL=load adr. +;* exit CF=0:ok +;* CF=1,Acc=2:error +;* else:break +;*------------------------ +RTAPE: PUSH DE + PUSH BC + PUSH HL + LD D,2 ; repeat set +RTP1: CALL EDGE ; edge search:(49c) + JR C,RTP5 ; break!:7c +;* reading point search + CALL DLY3 ; 17c (1232c) + IN A,(LSD2) + AND 20H + JR Z,RTP1 ; again + LD HL,0 + LD (SUMDT),HL + POP HL + POP BC + PUSH BC + PUSH HL +RTP3: CALL RBYTE ; 1 byte read + JR C,RTP5 ; error! + LD (HL),A ; data->(mem.) + INC HL + DEC BC + LD A,B + OR C + JR NZ,RTP3 + LD HL,(SUMDT) ; check sum + CALL RBYTE ; high + JR C,RTP5 ; error! + CP H + JR NZ,RTP6 ; error! + CALL RBYTE ; low + JR C,RTP5 ; error! + CP L + JR NZ,RTP6 ; error! +RTP4: XOR A +RTP5: POP HL + POP BC + POP DE + RET + +RTP6: DEC D + JR NZ,RTP1 ; repeat +VFERR: LD A,2 ; error + SCF + JR RTP5 + +;*------------------------ +;* verify tape +;* in BC=byte size +;* HL=adr. +;* exit CF=0:ok +;* CF=1,Acc=2:error +;* else:break +;*------------------------ +TVRFY: PUSH DE + PUSH BC + PUSH HL + LD D,2 ; repeat set +TVF1: CALL EDGE ; edge search:(49c) + JR C,RTP5 ; break!:7c +;* reading point search + CALL DLY3 ; 17c (1232c) + IN A,(LSD2) + AND 20H + JR Z,TVF1 ; again + POP HL + POP BC + PUSH BC + PUSH HL +TVF2: CALL RBYTE ; 1 byte read + JR C,RTP5 ; error! + CP (HL) ; CP A.(mem.) + JR NZ,VFERR ; verify error! + INC HL + DEC BC + LD A,B + OR C + JR NZ,TVF2 + LD HL,(CSMDT) ; Check sum. + CALL RBYTE ; high + JR C,RTP5 ; error! + CP H + JR NZ,VFERR ; error! + CALL RBYTE ; low + JR C,RTP5 ; error! + CP L + JR NZ,VFERR ; error! + DEC D + JR NZ,TVF1 ; repeat + JR RTP4 ; ok! + +RECMES: DB "RECORD." + +PLYMES: DB "PLAY" + DB 0 + +;*---------------- +;* file name print +;*---------------- +FNMPRT: LD A,(CMTMSG) + OR A + RET NZ + RST 18H + DB .CR2 + RST 18H + DB .CRTMS + PUSH HL + INC HL + LD A,'"' + RST 18H + DB .CRT1C + LD D,16 +FNMLP: LD A,(HL) + CP 0DH + JR Z,FNMLE + RST 18H + DB .CRT1C + INC HL + DEC D + JR NZ,FNMLP +FNMLE: LD A,'"' + RST 18H + DB .CRT1C + RST 18H + DB .CR2 + POP HL + RET + +;*---------------------------------------------------------------- +;* NOTE - In the message strings below,  (05) changes subsequent +;* characters to lower/case, and  (06) restores upper-case +;*---------------------------------------------------------------- +WRTMES: DB "WRITING " + DB 0 +FINMES: DB "FOUND " + DB 0 +LDNGMS: DB "LOADING " + DB 0 +VFNGMS: DB "VERIFYING " + DB 0 + +;*------------------------------------------------- +;* diagrams showing pulse timimg, tape format, etc. +;*------------------------------------------------- +;* +;* وS | 460 | 496 |240|264| +;* ______ ___ ___ +;* | | | | | | | +;* ____| |______| |___| |___| +;* +;* | | | | +;* | | | | +;* | Read point| Read point +;* | 368us | 368us +;* Read edge Read edge +;* +;*----------------------------------------- +;* +;* Information format : Data format +;* : +;* * gap : * gap +;* short 10 sec : short 5 sec +;* (22000) : (11000) +;* * tape mark : * tape mark +;* long 40 : long 20 +;* short 40 : short 20 +;* * long 1 : * long 1 +;* * Information : * Data +;* block : block +;* (128 bytes) : (???? bytes) +;* * check sum : * check sum +;* (2 bytes) : (2 bytes) +;* * long 1 : * long 1 +;* * short 256 : * short 256 +;* * Information : * Data +;* block : block +;* (128 bytes) : (???? bytes) +;* * check sum : * check sum +;* (2 bytes) : (2 bytes) +;* * long 1 : * long 1 + +;*--------------------------------------- +;* EDGE (tape data edge search) +;* (85c+111c)/4= 49 cycles +;* +;* exit CF=0:ok +;* CF=1:break +;*--------------------------------------- + +EDGE: LD A,0F8H + OUT (LSD0),A ; break set + NOP +EDG1: IN A,(LSD1) + AND 81H ; shift & break + JR NZ,EDG2 + SCF + RET + +EDG2: IN A,(LSD2) ; 11c + AND 20H ; 7c + JR NZ,EDG1 ; CSTR D5=0: 7c/12c +EDG3: IN A,(LSD1) ; 11c + AND 81H ; 7c + JR NZ,EDG4 ; 7c/12c + SCF + RET + +EDG4: IN A,(LSD2) ; 7c + AND 20H ; 7c + JR Z,EDG3 ; CSTR D5=1: 7c/12c + RET ; 10c + +;*-------------- +;* 1 byte read +;* exit SUMDT=Store +;* CF=1:break +;* CF=0:data=Acc +;*-------------- +RBYTE: PUSH DE + PUSH BC + PUSH HL + LD HL,0800H ; 8 repeat set +RBY1: CALL EDGE ; edge search:(49c) + JP C,TM4 ; break!:7c +;* reading point search:17c(1232c) + CALL DLY3 ; 17c (1232c) + IN A,(LSD2) ; data read + AND 20H ; CF=0 + JP Z,RBY2 ; again + PUSH HL + LD HL,(SUMDT) ; check sum set + INC HL + LD (SUMDT),HL + POP HL + SCF ; CF=1 +RBY2: LD A,L + RLA ; rotate left + LD L,A + DEC H + JP NZ,RBY1 ; repeat + CALL EDGE + LD A,L + JR TM4 ; ok! + +;*--------------- +;* 1 byte write +;* in Acc=data +;*--------------- +WBYTE: PUSH BC + LD B,8 ; 8 repeat set + CALL LONG ; write long +WBY1: RLCA ; rotate left + CALL C,LONG ; 'H' long + CALL NC,SHORT ; 'L' short + DEC B + JP NZ,WBY1 ; repeat + POP BC + RET + +;*------------------------------------ +;* tape mark read +;* in E=CCH:Inf. long40,short40 +;* else:Data long20,short20 +;* exit CF=0:ok +;* CF=1:break +;*------------------------------------ +TMARK: CALL GAPCK + PUSH DE + PUSH BC + PUSH HL + LD HL,2828H ; H=40,L=40 + LD A,E + CP 0CCH ;'L' + JR Z,TM0 + LD HL,1414H ; H=20,L=20 +TM0: LD (TMCNT),HL +TM1: LD HL,(TMCNT) +TM2: CALL EDGE ; edge search:(49c) + JR C,TM4 ; break!:7c +;* reading point search:17c(1232c) + CALL DLY3 ; 17c (1232c) + IN A,(LSD2) + AND 20H + JR Z,TM1 ; again + DEC H + JR NZ,TM2 +TM3: CALL EDGE ; edge search:(49c) + JR C,TM4 ; break!:7c +;* reading point search:17c(1232c) + CALL DLY3 ; 17c (1232c) + IN A,(LSD2) + AND 20H + JR NZ,TM1 ; again + DEC L + JR NZ,TM3 + CALL EDGE +TM4: POP HL +TM5: POP BC + POP DE + RET + +;*--------------------- +;* check sum set +;* in BC=byte size +;* HL=adr. +;* exit SUMDT=store +;* CSMDT=store +;*-------------------- +CKSUM: PUSH DE + PUSH BC + PUSH HL + LD DE,0 +CKS1: LD A,B + OR C + JR NZ,CKS2 + EX DE,HL + LD (SUMDT),HL + LD (CSMDT),HL + JR TM4 ; ret +CKS2: LD A,(HL) + PUSH BC + LD B,8 ; 8 bits +CKS3: RLCA ; rotate left + JR NC,CKS4 + INC DE +CKS4: DJNZ CKS3 + POP BC + INC HL + DEC BC + JR CKS1 + +;*---------------------------------- +;* gap + tape mark +;* +;* in E=CCH:short gap (10 sec) +;* else:short GAP ( 5 sec) +;*---------------------------------- +GAP: PUSH DE + PUSH BC + LD A,E + LD BC,55F0H ; Inf. 22000(10 sec) + LD DE,2828H ; short40,long40 + CP 0CCH ;'L' + JP Z,GAP1 + LD BC,2AF8H ; Data 11000( 5 sec) + LD DE,1414H ;short20,long20 +GAP1: CALL SHORT ; write short + DEC BC + LD A,B + OR C + JR NZ,GAP1 +GAP2: CALL LONG ; write long + DEC D + JR NZ,GAP2 +GAP3: CALL SHORT ; write short + DEC E + JR NZ,GAP3 + CALL LONG + JR TM5 + +;*------------------- +;* GAP check +;* (long100 search) +;*------------------- +GAPCK: PUSH DE + PUSH BC + PUSH HL +GAPCK1: LD H,100 ; 100 repeat set +GAPCK2: CALL EDGE ; edge search:(49c) + JR C,TM4 ; error!:7c + CALL DLY3 ; reading point search:17c(1232c) + IN A,(LSD2) + AND 20H + JR NZ,GAPCK1 ; again + DEC H + JR NZ,GAPCK2 + JR TM4 + +;*---------------------------------------- +;* SHORT AND LONG PULSE FOR 1 BIT WRITE +;*---------------------------------------- +SHORT: PUSH AF ; 11c + LD A,03H ; 7c + OUT (LSD3),A ; 11c + CALL DLY1 ; 17c (408c) + CALL DLY1 ; 17c (408c) + LD A,02H ; 7c + OUT (LSD3),A ; 11c + CALL DLY1 ; 17c (408c) + CALL DLY1 ; 17c (408c) + POP AF ; 10c + RET ; 10c + +LONG: PUSH AF ; 11c + LD A,03H ; 7c + OUT (LSD3),A ; 11c + CALL DLY4 ; 17c (1704c) + LD A,02H ; 7c + OUT (LSD3),A ; 11c + CALL DLY4 ; 17c (1704c) + POP AF ; 10c + RET ; 10c + +;*----------------- +;* TAPE MOTOR STOP +;*----------------- +TMSTOP: PUSH AF + PUSH BC + PUSH DE + LD B,10 +MST1: IN A,(LSD2) ; motor check + AND 10H + JR Z,MST3 ; ok + LD A,06H ; motor off + OUT (LSD3),A + INC A + OUT (LSD3),A + DJNZ MST1 +MST3: POP DE + POP BC + POP AF + RET + +;*---------------------------- +;* 7.046 ms delay ... 24989c +;*---------------------------- +DLY7: PUSH BC ; 11c + LD B,20 ; 7c +DLY.7: CALL DLY3 ; 17*19+17 (23332c) + CALL DLY0 ; 17*19+17 ( 226c) + DJNZ DLY.7 ; 13*19+8 + POP BC ; 10c + RET ; 10c + +;*----------------- +;* 14 clock delay +;*----------------- +DLY0: NOP ; 4c + RET ; 10c +;*--------------------------- +;* 347.4 us delay ... 1232c +;*--------------------------- +DLY3: NOP ; 4c + LD A,76 ; 7c +DLYA: DEC A ; 4*XX+4 + JR NZ,DLYA ; 12*XX+7 + RET ; 10c +;*----------------- +;* Delay for short. +;* 115.0 us delay ... 408c +;*----------------- +DLY1: LD A,24 ; 7c + JR DLYA ; 12c +;*---------------- +;* Delay for long. +;* 480.4 us delay ... 1704c +;*---------------- +DLY4: LD A,105 ; 7c + JR DLYA ; 12c + +;* END of original module H-CMT.ASM +;*============================================================================ +;* START of original module H-FD.ASM +;*----------------------------- +;* PL-monitor FD dummy +;* FI:DMY-FD ver 003 3.28.84 +;*----------------------------- + +SFD: DW SQD ;address of next table in chain + DB 0 ;name of THIS table (0 = not available) + +;* The Labels below are mainly dummies that identify the missing FD routines +CLX: +DUST: +FLOFF: +FREEX: +INREC: +INX1B: +LD.DIR: +LDX: +LOPX: +OPX: +PRREC: +PRX1B: +RECST: +SVX: OR A + RET +FLOCK: +FSWAP: JP ER59M + +;*------------------ +;* SVC .DELET +;*------------------ +FDELET: CALL PUSHR + LD HL,(ZDELT) ;SEQ + LD A,L + OR H + JR Z,FREN2 + PUSH HL + RST 18H + DB .LOPEN + LD A,2 + LD (ZRWX),A + CALL QOPEND + JR FREN4 +;*-------------- +;* SVC .RENAM +;*-------------- +FRENAM: CALL PUSHR + LD HL,(ZWDIR) + LD A,L + OR H +FREN2: JP Z,ER59M + PUSH HL + RST 18H + DB .LOPEN + LD HL,ELMD + CALL SETFNAM + LD HL,200H + LD (ZLOG),HL + CALL SERFLW ;check already exist +FREN4: POP IX + JP IOCALL + + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0 + +;* END of original module H-FD.ASM +;*============================================================================ +;* START of original module MON4.ASM + + ORG 3C00H ;ensures that this section starts on 3C00H + +;*------------------------- +;* ascii display code trans +;*------------------------- +QADCN: CP 10H ;EX only + JR C,QAD3 ; <10H ==> F0H + CP 80H + JR Z,QAD7 ; 80H ==> 40H + CP 0C0H + JR Z,QAD7 ; C0H ==> 80H + DI + OUT (LSE2),A + CALL 0BB9H + OUT (LSE0),A + EI + RET +QAD3: LD A,0F0H + RET +QAD7: SUB 40H + RET + +QDACN: CP 0F0H + JR NC,QDA3 + CP 73H + JR Z,QAD3 ; 73H ==> F0H + CP 40H ;EX only + JR Z,QDA7 ; 40H ==> 80H + CP 80H + JR Z,QDA7 ; 80H ==> C0H + DI + OUT (LSE2),A + CALL 0BCEH + OUT (LSE0),A + EI + CP 0F0H + RET NZ +QDA3: LD A,20H + RET + +QDA7: ADD A,40H + RET + +QKYTBL: PUSH AF + LD A,L + SUB 8 + JR C,QKY0 + SUB 48 + JR C,QKY1 +QKY0: ADD A,10 + LD L,A + ADD HL,BC + LD C,(HL) + POP AF + RET + +QKY1: LD A,(BC) + PUSH AF + INC BC + LD A,(BC) + LD B,A + POP AF + LD C,A ;BC=ROM adrs + ADD HL,BC + DI + OUT (LSE2),A + LD A,(HL) + OUT (LSE0),A + EI + CALL QDACN + LD C,A + POP AF + RET + + +;* END of original module MON4.ASM +;*============================================================================ +;* START of original module MON-RS.ASM +;*----------------------------- +;* MZ-800 RS-232C driver +;* FI:MON-RS ver 001 8.02.84 +;*----------------------------- + + IF RSYS = 0 ;this EQUATE IS NOT assembled for the MZ-800 +RMCH: EQU 3 ;channels 0,1,2,3 + ENDIF + + IF RSYS = 1 ;this EQUATE IS assembled for the MZ-800 +RMCH: EQU 1 ;channels 0 and 1 + ENDIF + +SRS: DW SRAM ;address of the NEXT table in the chain + DB "RS" ;name of THIS table + DW 0 + DB 8FH ;Stream, O1C, I1C, W, R + DB RMCH ;ch. + DB 0 + DW RSINI ;INIT + DW RSRO ;ROPEN + DW RSWO ;WOPEN + DW RSCL ;CLOSE + DW RSKL ;KILL + DW RSINP ;INP1C + DW RSOUT ;OUT1C + DW .RET ;POS + +RSINI: RET C + PUSH IY + CALL SETIY + CALL RSINT0 + CALL RSPARM + JR RETIY + +RSINT0: RST 18H + DB .DEASC + LD (IY+MONITN),E ;THIS WAS (IY+XMONITIN) (a mistake!) + CALL TEST1 + DB ',' + JP NZ,ER03M + RST 18H + DB .DEASC + LD (IY+INITN),E + CALL TEST1 + DB 0 + RET Z + CALL TEST1 + DB ',' + JP NZ,ER03M + RST 18H + DB .DEASC + LD (IY+CRLFN),E + RET + +RSRO: +RSWO: PUSH IY + CALL SETIY + LD A,(IY+STATN) + INC (IY+STATN) + OR A + CALL Z,RSOPEN + JR RETIY + +;*------------------------------------------------------ +;* Top of p.220 in German Listing of MZ-2Z046 Disk Basic +;*------------------------------------------------------ +RSCL: +RSKL: PUSH IY + CALL SETIY + DEC (IY+STATN) + LD A,(IY+STATN) + OR A + CALL Z,RCLOSE + JR RETIY2 + +RSINP: PUSH IY + CALL SETIY + CALL RSINP0 + JP C,IOERR + CP (IY+CRLFN) + JR NZ,RETIY2 + LD A,0DH +RETIY2: OR A +RETIY: POP IY + RET + +RSINP0: BIT 6,(IY+INITN) + JP Z,GET1C + LD IX,GET1C + PUSH IY + POP HL + LD DE,JISRN + ADD HL,DE + JP JISR + +RSOUT: PUSH IY + CALL SETIY + CP 0DH + JR NZ,RSOUTC + LD A,(IY+CRLFN) +RSOUTC: CALL RSOUT0 + JR RETIY + +RSOUT0: BIT 6,(IY+INITN) + JP Z,PUT1C + LD IX,PUT1C + PUSH IY + POP HL + LD DE,JISXN + ADD HL,DE + LD DE,(DISPX) + JP JISX + +SETIY: PUSH AF + PUSH DE + LD A,(ZCH) + INC A + LD IY,MARKA-TBLN + LD DE,TBLN +SETIY2: ADD IY,DE + DEC A + JR NZ,SETIY2 + LD C,(IY+0) + POP DE + POP AF + RET + +;*------------------------------ +;* RS PORT ADDRESS EQUATES +;*------------------------------ +CHADT: EQU 0B0H +CHACT: EQU 0B1H +CHBDT: EQU 0B2H +CHBCT: EQU 0B3H + +CHCDT: EQU 0D0H +CHCCT: EQU 0D1H +CHDDT: EQU 0D2H +CHDCT: EQU 0D3H + +CRLFN: EQU -8 ; 0FFF8H +JISXN: EQU -7 ; 0FFF9H +JISRN: EQU -5 ; 0FFFBH +MONITN: EQU -3 ; 0FFFDH +INITN: EQU -2 ; 0FFFEH +STATN: EQU -1 ; 0FFFFH + + DB 0 ;CR or LF (was DEFS 1) + DB 0,0 ;for JISX (was DEFS 2) + DB 0,0 ;for JISR(was DEFS 2) + DB 0 ;monitor (was DEFS 1) + DB 0 ;init code (was DEFS 1) + DB 0 ;status (was DEFS 1) +MARKA: DB CHACT ;0 + DB CHADT ;1 + DB 0 ;2 Mask Pattern (was DEFS 1) + DW 1010H ;3,4 + DW 4004H ;5,6 WR4 + DW 0C003H ;7,8 WR3 + DW 6005H ;9,10 WR5 + DB 30H + DB 3 +;* + DB 0,0,0,0,0,0,0,0 ;(was DEFS 8) + + +MARKB: DB CHBCT + DB CHBDT + DB 0 ;(was DEFS 1) + DW 1010H + DW 4004H + DW 0C003H + DW 6005H + DB 30H + DB 3 + + IF RSYS = 0 ;start of section NOT assembled for MZ-800 + DB 0,0,0,0,0,0,0,0 +MARKC: DB CHCCT ;0 (channel C) + DB CHCDT ;1 + DB 0 ;2 Mask Pattern + DW 1010H ;3,4 + DW 4004H ;5,6 WR4 + DW 0C003H ;7,8 WR3 + DW 6005H ;9,10 WR5 + DB 30H + DB 3 + + DB 0,0,0,0,0,0,0,0 +MARKD: DB CHDCT ;(channel D) + DB CHDDT + DB 0 + DW 1010H + DW 4004H + DW 0C003H + DW 6005H + DB 30H + DB 3 + ENDIF ;end of section not assembled for MZ-800 + +TBLN: EQU MARKB-MARKA +;*-------------- +;* Break Check +;*-------------- +BRK: CALL BRKCHK + RET NZ + JP BREAKZ + +;*--------------------- +;* sio parameter set +;*--------------------- +RSPARM: LD A,18H ;channel reset + OUT (C),A + LD A,30H ;err reset + OUT (C),A + LD A,(IY+INITN) ;inital bit + AND 0CH ;stop bit + JR NZ,RSP0 + SET 2,(IY+INITN) ;1 bit/chr +RSP0: LD A,(IY+INITN) ;initial bit + LD B,A ;B=init code + AND 0FH ;mask + OR 40H ;clock rate *16 + LD (IY+6),A ;wr4 + LD A,B + AND 80H ;rx disable d7 bit/chr + OR 40H + LD (IY+8),A ;wr3 + RRA + AND 7FH ;dtroff + OR 0AH ;tx enable rtson dtroff + LD (IY+10),A ;wr5 + LD A,B + OR 7FH + LD (IY+2),A ;bit mask + CALL RSSUB +RSTBUF: IN A,(C) + RRCA + RET NC + DEC C + IN A,(C) + INC C + LD A,1 + OUT (C),A + IN A,(C) + AND 70H + JR Z,RSTBUF + RET + +;*----------- +;* SIO close +;*----------- +RCLOSE: RES 0,(IY+8) ;rx disable + RES 7,(IY+10) ;rdy off + LD (IY+STATN),0 +RSSUB: LD B,10 + PUSH IY + POP HL + LD DE,3 + ADD HL,DE + OTIR + RET + +;*---------- +;* SIO open +;*---------- +RSOPEN: LD A,30H + OUT (C),A ;err reset + RET + +;*---------------------------- +;* in IY=channel data +;* C=channel control port +;*---------------------------- +RSEN: SET 0,(IY+8) ;wr3 RX enable + LD A,13H + OUT (C),A ;ext/int reset + LD A,(IY+8) ;wr3 + OUT (C),A ;wr5 + LD A,35H ;err reset + OUT (C),A + LD A,(IY+10) ;wr5 + OR 88H ;dtr,rts on tx enable + LD (IY+10),A ;wr5 + OUT (C),A + RET + +RSDIS: LD A,3 + OUT (C),A + RES 0,(IY+8) ;wr3 RX disenable + LD A,(IY+8) ;wr3 + OUT (C),A +RDYOF: RES 7,(IY+10) ;wr5 dtr reset + JR WR5OUT + +RTSON: SET 1,(IY+10) ;wr5 rts set + JR WR5OUT +;* +RTSOFF: RES 1,(IY+10) ;wr5 rts reset + JR WR5OUT +;* +RDYON: SET 7,(IY+10) ;wr5 dtr set +WR5OUT: LD A,5 + OUT (C),A + LD A,(IY+10) ;wr5 + OUT (C),A + OR A + RET + +;*------------------- +;* Receive 1 char +;*------------------- +GET1C: CALL PUSHR + LD C,(IY+0) +GET1: CALL BRK + CALL DRCKR + JR C,GET1 + CALL RSEN +CHIN: CALL BRK + IN A,(C) + RRCA + JR NC,CHIN ;skip if no data + DEC C + IN A,(C) ;data input + INC C + AND (IY+2) ;mask + PUSH AF + LD A,1 + OUT (C),A + IN A,(C) + AND 70H + JR NZ,RSER ;skip if err + CALL RDYOF + POP AF + RET + +RSER: LD B,A + POP AF + PUSH BC + CALL RSPARM + POP BC + LD A,29 ;framing err + RLC B + RLC B + RET C + INC A ;overrun err + RLC B + RET C + INC A ;parity err + SCF + RET + +;*---------------- +;* Send 1 char +;*---------------- +PUT1C: CALL PUSHR + LD C,(IY+0) + LD D,A + CALL RTSON +PUT1: CALL BRK + CALL DRCKS + CALL NC,CTSCK + JR C,PUT1 + IN A,(C) + BIT 2,A ;tx buf empty ? + JR Z,PUT1 + BIT 7,(IY+MONITN) ;all chr send? + JR Z,PUT2 + LD A,1 + OUT (C),A + IN A,(C) + RRCA + JR NC,PUT1 +PUT2: DEC C + OUT (C),D ;data out + INC C + BIT 6,(IY+MONITN) ;rts on/off? + JR Z,PUT3 + CALL RTSOFF +PUT3: OR A + RET + +;*----------- +;* DCD check +;*----------- +DRCKR: OR A + BIT 0,(IY+MONITN) ;moniter dr ? + JR DRCK1 +;* +DRCKS: OR A ;carry clear + BIT 1,(IY+MONITN) ;moniter dr ? +DRCK1: RET Z + LD A,10H ;ext/int reset + OUT (C),A + IN A,(C) + AND 8 + RET NZ ;cy=0 + SCF + RET + +;*---------- +;* CTS check +;*---------- +CTSCK: OR A + BIT 2,(IY+MONITN) ;moniter cts ? + RET Z + LD A,10H + OUT (C),A + IN A,(C) + AND 20H + RET NZ + SCF + RET + +;* END of original module MON-RS.ASM +;*============================================================================ +;* START of original module MON-EMM.ASM +;*----------------------------- +;* Lx-monitor EMM driver +;* FI:MON-EMM ver 005 4.27.84 +;*----------------------------- + +;*---------------------- +;* DEVICE TABLE FOR RAM: +;*---------------------- +SRAM: DW SFD ;address of the NEXT table in the chain + DB "RAM" ;name of THIS table + DB 0 + DB 5FH + DB 20H ;WOPN1 + DB 32 ;Max dir + DW EMINI ;INIT + DW EMRINF + DW EMWINF + DW EMON + DW 1024 + DW EMRDAT + DW EMWDAT + DW EMDEL + DW EMWDIR + DW EMFRKB + +;*------------------------------------------------------ +;* Top of p.230 in German Listing of MZ-2Z046 Disk Basic +;*------------------------------------------------------ +EMFRKB: CALL PATCH2 ; DI; CALL EMFRB;EI; RET + LD C,H + LD B,0 ;/256 + SRL C ;/512 + SRL C ;/1024 + OR A + RET + +EMFRB: PUSH DE + LD HL,0 ;free area(bytes) + CALL EMLD2 ;max + PUSH DE + INC HL + INC HL + CALL EMLD2 ;use + POP HL + SBC HL,DE + JP C,ER41 ;I/O ERR + POP DE + RET + +EMCLR: LD DE,10H +EMSETU: LD HL,2 + CALL EMSV2 ;Set used mem + EX DE,HL + LD DE,0 + JP EMSV2 ;File end mark + +EMINI: RET C + LD A,(EMFLG) + OR A + JP Z,ER50 + CALL OKYN + CALL TEST1 + DB ',' + PUSH HL + CALL PATCH3 ; DI; CALL EMLCR; EI; RET + POP HL + CALL TEST1 + DB 0 + RET Z ;INIT "EM:" + RST 18H ;INIT "EM:$hhhh" + DB .DEASC +EMINI2: LD HL,0 + DI + LD B,1 + LD A,D + AND 0FCH + CP 0FCH + LD HL,0FFFFH + JR Z,EMINI3 ;if >=FC00 then FFFF + LD B,3 + LD A,D + OR A + LD HL,20H + JR NZ,EMINI4 ;if <=00FF then 0020 +EMINI3: EX DE,HL +EMINI4: LD A,B + LD (EMFLG),A ;WAS EMFL (error) + LD HL,0 + CALL EMSV2 ;Set max mem + CALL PBCCLR ;WAS PBCCL (error) + EI + RET + +;*---------------------- +;* EMM power on routine +;*---------------------- +EMMPWR: LD HL,8 + LD B,L + LD C,0 +EMPWR2: CALL EMLD1 + SUB L + OR C + LD C,A + LD A,L + CALL EMSV1 + INC L + DJNZ EMPWR2 + LD A,C + OR A + JR NZ,EMPWR4 + LD HL,0 ;already initialized + CALL EMLD2 + LD A,2 + INC D + JR Z,EMPWR3 + INC A +EMPWR3: LD (EMFLG),A + JP PBCCLR + +EMPWR4: CALL EMCLR + LD HL,0 ;check EMM installed? + LD A,5AH + CALL EMSV1 + CALL EMLD1 + SUB 5AH + LD DE,0C000H ;Initial set 48KB + JR Z,EMINI2 + XOR A + LD (EMFLG),A + RET + +;*------------------ +;* RAM Dir search +;*------------------ +EMON: LD A,(EMFLG) + OR A + JP Z,ER50 + LD HL,10H + LD (EMPTR),HL + RET + +;*--------------- +;* Read RAM info +;* ent HL:adrs +;*--------------- +EMRINF: LD B,H + LD C,L + LD HL,(EMPTR) + CALL PATCH4 ; DI; JP EMLD2 + LD A,D + OR E + SCF + RET Z + INC HL + INC HL + PUSH HL + ADD HL,DE + JP C,ER41 ;I/O ERR + LD (EMPTR),HL + POP HL + INC HL + INC HL + INC HL + LD D,B + LD E,C + LD BC,32-2 + CALL EMLDD + LD BC,32+2 + ADD HL,BC + EX DE,HL + LD (HL),E ;Save data area adrs + INC HL + JP PATCH5 ;LD (HL),D; OR A; EI; RET + +;*---------------------- +;* Read RAM data +;* ent HL:buffer adrs +;* BC:byte size +;*---------------------- +EMRDAT: EX DE,HL + LD L,(IY+30) + LD H,(IY+31) + INC HL + INC HL + INC HL + CALL PATCH6 ;DI; CALL EMLDD; EI; RET + LD (IY+30),L + LD (IY+31),H + OR A + RET + +;*---------------- +;* Write RAM file +;* HL:inf adrs +;*---------------- +EMWINF: PUSH AF + CALL SERFLW + PUSH HL + LD HL,2 + CALL PATCH7 ; DI; JP EMLD2 + LD (EMWP0),DE + PUSH DE + LD HL,64+7 + ADD HL,DE + CALL EMFREQ ;Check file space + POP DE + INC DE + INC DE + POP HL ;inf adrs + LD BC,64 + POP AF + CALL PATCH8 ; CALL EMSVB; EI; RET + LD (EMWP1),DE + RET + +;*----------------- +;* Write RAM data +;* HL:data adrs +;* BC:data bytes +;* A0:close flag +;*----------------- +EMWDAT: PUSH AF + PUSH HL + PUSH BC + LD HL,(EMWP1) + INC BC + INC BC + INC BC + ADD HL,BC + CALL EMFREQ + POP BC + POP HL + LD DE,(EMWP1) + POP AF + PUSH AF + OR 01H ;data block + CALL EMSVB + LD (EMWP1),DE + POP AF + BIT 2,A ;close ? + RET Z ;no + PUSH DE ;yes + CALL EMSETU + POP HL + LD DE,(EMWP0) + DEC HL + DEC HL + OR A + SBC HL,DE + EX DE,HL + JP EMSV2 + +EMFREQ: JR C,ER53A + PUSH HL + LD HL,0 + CALL EMLD2 + OR A + POP HL + SBC HL,DE + RET C +ER53A: JP ER53 ;No file pace + +;*----------------- +;* delete RAM file +;*----------------- +EMDEL: LD HL,(ELMD30) + LD DE,0FFBBH ; - 69 + ADD HL,DE ;HL:=move destination + CALL EMLD2 ;DE:=delete size - 2 + EX DE,HL ;DE:=move destination + ADD HL,DE + INC HL + INC HL ;HL:=move source + PUSH DE + PUSH HL + LD HL,2 + CALL EMLD2 + EX DE,HL ;HL:=last use + POP DE ;DE:=move source + PUSH DE + OR A + SBC HL,DE + INC HL + INC HL + LD B,H + LD C,L ;BC:=move bytes + POP HL ;HL:=move source + POP DE ;DE:=move destination + CALL EMLDIR + DEC DE + DEC DE ;DE:=new last-use + LD HL,2 + JP EMSV2 + +;*--------------- +;* write RAM dir +;*--------------- +EMWDIR: LD HL,(ELMD30) + LD DE,-64 + ADD HL,DE + EX DE,HL + LD HL,ELMD + LD BC,32 + JP EMSVD + +EM.P0: EQU 0EAH +EM.P1: EQU 0EBH +;*------------------ +;* EMM 1 Byte Write +;* ent A: data +;* HL:EMM adrs +;*------------------ +EMSV1: PUSH BC + LD C,EM.P1 + LD B,H + OUT (C),L + OUT (EM.P0),A + POP BC + OR A + RET + +;*------------------ +;* EMM 1 Byte Read +;* ent HL:EMM adrs +;* ext A: dat +;*------------------ +EMLD1: PUSH BC + LD C,EM.P1 + LD B,H + OUT (C),L + IN A,(EM.P0) + POP BC + OR A + RET + +;*------------------ +;* EMM 2 Byte Write +;* ent DE:data +;* HL:EMM adrs +;*------------------ +EMSV2: LD A,E + CALL EMSV1 + INC HL + LD A,D + CALL EMSV1 + DEC HL + RET + +;*------------------ +;* EMM 2 Byte Read +;* ent HL:EMM adrs +;* DE:data +;*------------------ +EMLD2: CALL EMLD1 + LD E,A + INC HL + CALL EMLD1 + LD D,A + DEC HL + RET + +;*--------------------- +;* EMM write block +;* ent HL :data Top +;* DE :EMM Adrs +;* BC :byte Size +;* A :block flag +;*--------------------- +EMSVB: EX DE,HL + CALL EMSV1 + INC HL + LD A,C + CALL EMSV1 + INC HL + LD A,B + CALL EMSV1 + INC HL + EX DE,HL +EMSVD: EX DE,HL +EMSVE: LD A,(DE) + CALL EMSV1 + INC HL + INC DE + DEC BC + LD A,B + OR C + JR NZ,EMSVE + EX DE,HL + RET + +;*-------------------- +;* EMM BC Byte Read +;* ent DE :Store Top +;* HL :EMM Adrs +;* BC :Byte Size +;*-------------------- +EMLDD: CALL EMLD1 + LD (DE),A + INC HL + INC DE + DEC BC + LD A,B + OR C + RET Z + JR EMLDD + +;*------------------------------ +;* EMM BC Byte LDIR +;* ent HL :EMM source top +;* DE :EMM destination top +;* BC :Byte Size +;*------------------------------ +EMLDIR: CALL EMLD1 ;EMM (HL) Data => Acc + EX DE,HL + CALL EMSV1 ;Acc => (DE) EMM + EX DE,HL + INC HL + INC DE + DEC BC + LD A,B + OR C + RET Z ;End + JR EMLDIR + +;* END of original module MON-EMM.ASM +;*============================================================================ +;* START of original module MON-PSG.ASM +;*----------------------------- +;* MZ800-monitor PSG handler +;* FI:MON-PSG ver 001 7.26.84 +;*----------------------------- +;* +NMAX: EQU 83 ;µفأ² max +PSGA: EQU 0F2H +PSG3: EQU 3F2H +PSG9: EQU 9F2H + + IF SYS = 0 +MUSCH: EQU 6 ;these EQUATES are NOT assembled for MZ-800 +MAXCH: EQU 8 +PSGALL: EQU 0E9H +PSGOFF: EQU 4E9H + ENDIF + + IF SYS = 1 +MUSCH: EQU 3 ;these EQUATES ARE assembled for the MZ-800 +MAXCH: EQU 4 +PSGALL: EQU 0F2H +PSGOFF: EQU 4F2H + ENDIF + +;*----------------------------- +;* INTM (music interrupt mode ) +;*0 no operation +;*1 music or noise +;*2 sound n.time +;*----------------------------- +INTM: DB 0 +SBUSY: DB 0 ;music or noise only +INTC: DB 0 +;*-------------------------- +;* sound out current table +;*-------------------------- +;* tone 1a +STBL: DB 80H ;frequency (l) + DB 00H ;frequency (h) + DB 9FH ;attenation +;* tone 2a + DB 0A0H ;frequency (l) + DB 00H ;frequency (h) + DB 0BFH ;attenation +;* tone 3a + DB 0C0H ;frequency (l) + DB 00H ;frequency (h) +STN0: DB 0DFH ;attenation + ;* + IF SYS = 0 ;table not assembled for the MZ-800 + ;* tone 1b + DB 80H ;frequency (l) + DB 00H ;frequency (h) + DB 9FH ;attenation + ;* tone 2b + DB 0A0H ;frequency (l) + DB 00H ;frequency (h) + DB 0BFH ;attenation + ;* tone 3b + DB 0C0H ;frequency (l) + DB 00H ;frequency (h) +STN1: DB 0DFH ;attenation + ENDIF + +;**----------- +;* play table +;*----------- +PTBL: DB 00H ;ch no. + DB 00H ;atc0 + DB 255 ;atc1 + DB 00H ;emva(l) + DB 00H ;emva(h) + DB 00H ;att + DB 00H ;length0 + DB 00H ;tempo0 + DB 08H ;length1 + DB 0DH ;tempo1 + DB 00H ;qbuf(l) + DB 00H ;qbuf(h) + DB 08H ;emvp + DB 00H ;status + DB 00H ;vol + DB 00H ;reserve + DB 01H ;ch no. + DB 0,255,0,0,0,0,0,8 ;ch1 (was DEFS 15) + DB 13,0,0,8,0,0,0 + DB 02H ;ch no. + DB 0,255,0,0,0,0,0,8 ;ch2 (was DEFS 15) + DB 13,0,0,8,0,0,0 + DB 03H ;ch no. + DB 0,255,0,0,0,0,0,8 ;noise (was DEFS 15) + DB 13,0,0,8,0,0,0 + + IF SYS = 0 ;table not assembled for the MZ-800 + DB 04H ;ch no. + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;ch3 + DB 05H ;ch no. + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;ch4 + DB 06H ;ch no. + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;ch5 + DB 07H ;ch no. + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;noise2 + ENDIF + +;*----------------- +;* ontyo table +;*----------------- +LTBL: DB 1 ;0 + DB 2 ;1 + DB 3 ;2 + DB 4 ;3 + DB 6 ;4 + DB 8 ;5 + DB 12 ;6 + DB 16 ;7 + DB 24 ;8 + DB 32 ;9 +;*------------ +;* tempo table +;*------------ + DB 23 ;1 64 + DB 20 ;2 74 + DB 17 ;3 90 + DB 13 ;4 114 + DB 10 ;5 152 + DB 7 ;6 222 + DB 3 ;7 450 +;*------------------------- +;* emvelop pattern table +;*--------------------- +;* ATT حفجقف code +;* 0 3 +;* -1 4 +;* +1 5 +;* r 0 +;* max 1 +;* min 2 +;*--------------------- +ETBL: DB 00H ;emvp 0 + DB 05H + DB 03H + DB 03H ;dummy + + DB 0FH ;emvp 1 + DB 04H + DB 01H + DB 03H ;dummy + + DB 00H ;emvp 2 + DB 05H + DB 02H + DB 00H + + DB 0FH ;emvp 3 + DB 04H + DB 01H + DB 00H + + DB 00H ;emvp 4 + DB 05H + DB 02H + DB 03H + + DB 0FH ;emvp 5 + DB 04H + DB 03H + DB 03H ;dummy + + DB 00H ;emvp 6 + DB 05H + DB 04H + DB 00H + + DB 0FH ;emvp 7 + DB 04H + DB 05H + DB 00H + + DB 00H ;emvp 8 + DB 03H + DB 03H + DB 00H + +;*----------------- +;* frequency table +;*----------------- +NTBL: DW 3F00H ; A + DW 3B07H ; A# + DW 3802H ; B +;*-------------- +;* octave 1 +;*-------------- + DW 340FH ; C + DW 3200H ; C# + DW 2F03H ; D + DW 2C09H ; D# + DW 2A01H ; E + DW 270BH ; F + DW 2507H ; F# + DW 2306H ; G + DW 2106H ; G# + DW 1F08H ; A + DW 1D0CH ; A# + DW 1C01H ; B +;*-------------- +;* octave 2 +;*-------------- + DW 1A08H ; C + DW 1900H ; C# + DW 1709H ; D + DW 1604H ; D# + DW 1500H ; E + DW 130DH ; F + DW 120CH ; F# + DW 110BH ; G + DW 100BH ; G# + DW 0F0CH ; A + DW 0E0EH ; A# + DW 0E00H ; B +;*-------------- +;* octave 3 +;*-------------- + DW 0D04H ; C + DW 0C08H ; C# + DW 0B0DH ; D + DW 0B02H ; D# + DW 0A08H ; E + DW 090FH ; F + DW 0906H ; F# + DW 080DH ; G + DW 0805H ; G# + DW 070EH ; A + DW 0707H ; A# + DW 0700H ; B +;*-------------- +;* octave 4 +;*-------------- + DW 060AH ; C + DW 0604H ; C# + DW 050EH ; D + DW 0509H ; D# + DW 0504H ; E + DW 040FH ; F + DW 040BH ; F# + DW 0407H ; G + DW 0403H ; G# + DW 030FH ; A + DW 030BH ; A# + DW 0308H ; B +;*-------------- +;* octave 5 +;*-------------- + DW 0305H ; C + DW 0302H ; C# + DW 020FH ; D + DW 020DH ; D# + DW 020AH ; E + DW 0208H ; F + DW 0205H ; F# + DW 0203H ; G + DW 0201H ; G# + DW 010FH ; A + DW 010EH ; A# + DW 010CH ; B +;*-------------- +;* octave 6 +;*-------------- + DW 010AH ; C + DW 0109H ; C# + DW 0108H ; D + DW 0106H ; D# + DW 0105H ; E + DW 0104H ; F + DW 0103H ; F# + DW 0102H ; G + DW 0101H ; G# + DW 0100H ; A + DW 000FH ; A# + DW 000EH ; B +;*-------------------- +MSTBL: DW 0BF9FH + DW 0FFDFH +;*-------------------- +TSOUT: DB 80H ;ch 0 + DB 00H + DB 90H ;att +TSOUTC: DB 00H ;counter(l) + DB 00H ;counter(h) +;*------------------------ +;* Music interrupt routine +;*------------------------ +PSGINT: PUSH IY + CALL INT0 + POP IY + EI + RETI + +INT0: CALL PUSHRA + CALL MSTART ;8253 intialize + LD A,(INTM) + OR A + JP Z,MSTOP0 + DEC A + JP NZ,SDINT ;skip if sound out + LD BC,PSG9 ;psg data out + LD HL,STBL + OTIR + + IF SYS = 0 ;instructions not assembled for the MZ-800 + LD B,9 + INC C + OTIR + ENDIF + + LD B,8 + LD A,(SBUSY) + OR A + JP Z,MSTOP0 ;channel all close + LD C,A +INT1: DEC B + RET M + RLC C + JR NC,INT1 + PUSH BC + LD A,B + CALL INTER + BIT 0,(IY+13) + CALL Z,NINT + CALL MINT + POP BC + JR INT1 + +;*----------------- +;* Envelop control +;*----------------- +NINT: DEC (HL) ;HL=chx act0 + RET NZ + INC HL ;new couter set + LD A,(HL) ;load atc1 + DEC HL + LD (HL),A ;save atc0 + INC HL + INC HL + LD E,(HL) ;HL=enva + INC HL + LD D,(HL) ;HL=enva+1 + EX DE,HL +NINT1: LD A,(HL) ;env حفجقف data + OR A ;data check 0 + JR NZ,NINT2 ;noskip if repeat + DEC HL + DEC HL + JR NINT1 + +NINT2: EX DE,HL ;de=curent emva + INC HL + DEC A + JR Z,NINT3 ;skip if max Acc=1 + DEC A + JR Z,NINT5 ;skip if min Acc=2 + DEC A + RET Z ;حفجقف 0 Acc=3 + DEC A ;Acc=4 + LD A,(HL) ;att data + JR Z,NINT4 ;skip if dec att + INC A ;Acc=5 + CP 15 ;max + JR Z,NINT7 + JR C,NINT7 +NINT3: LD A,15 ;maximam + JR NINT6 +NINT4: DEC A ;dec att + JP M,NINT5 + LD C,(IY+14) ;vol minimum + CP C + JR NC,NINT7 +NINT5: LD A,(IY+14) ;minimum +NINT6: INC DE ;de=next curent emva +NINT7: LD (HL),A ;new att data + DEC HL + LD (HL),D + DEC HL + LD (HL),E +ATTSET: AND 0FH + LD B,A ;acc=att data +ATTS1: LD A,(IX+2) ;stbl att + AND 0F0H + OR B + LD (IX+2),A ;stbl att + RET + +;*------------------------------ +;* new data interpret routine +;*------------------------------ +MINT: DEC (IY+6) ;length0 + RET NZ + DEC (IY+7) ;tempo0 + LD A,(IY+8) ;length1 + LD (IY+6),A ;length counter preset + RET NZ + LD A,(IY+9) ;tempo1 + LD (IY+7),A ;tempo counter preset + LD E,(IY+10) ;que addr(l) + LD D,(IY+11) ;que addr(h) +MINT1: LD A,(DE) + INC DE + CP 0FFH + JR Z,MINT2 + CP 0A0H + JR Z,MINT3 + CP 90H + JR NC,MINT4 + CP 80H + JR NC,MINT5 + CP 60H + JR NC,MINT6 + SUB 9 + LD (IY+10),E ;que addr (l) + LD (IY+11),D ;que addr (h) + SET 0,(IY+13) ;rflag set + JR C,MINT7 + RES 0,(IY+13) ;rflag reset + CALL SETNO ;Nn +MINT7: LD A,(IY+2) ;att + LD (IY+1),A + LD A,(IY+8) ;length + LD (IY+6),A + LD A,(IY+9) ;tempo + LD (IY+7),A + BIT 0,(IY+13) + JR NZ,MEND + LD A,(IY+12) ;emv pattern + LD BC,ETBL + ADD A,A ;*2 + ADD A,A ;*4 + LD H,0 + LD L,A + ADD HL,BC ;HL=ETBL+4*A + LD A,(HL) + OR A + JR NZ,MINT71 + LD A,(IY+14) ;vol minimum +MINT71: LD (IY+5),A ;att + CALL ATTSET + INC HL + LD (IY+3),L ;emva (l) + LD (IY+4),H ;emva (h) + RET + +MINT3: LD A,(DE) ;Mn + INC DE + LD (IY+2),A ;atc1 +MINT11: JR MINT1 + +MINT2: CALL BRESET ;channel reset +MEND: LD A,0FH + JP ATTSET + +MINT4: SUB 90H ;Sn + LD (IY+12),A ;curent emv no. + JR MINT11 + +MINT5: SUB 80H ;Vn + CPL + AND 0FH + LD (IY+14),A ;vol minimum + JR MINT11 + +;*------------------ +;* tempo & length +;*------------------ +MINT6: SUB 60H ;Tn,Ln + LD B,0 + LD C,A + LD HL,LTBL + ADD HL,BC + CP 0AH + LD A,(HL) + JR NC,MINT61 + LD (IY+8),A ;length1 + JR MINT11 +MINT61: LD (IY+9),A ;tempo1 + JR MINT11 + +;*---------------------------- +;* onpu set +;* acc = onpu map data +;* ix = set mout tbladdr +;*---------------------------- +SETNO: ADD A,A ;*2 + LD HL,NTBL + LD B,0 + LD C,A + ADD HL,BC + LD B,(HL) + LD A,(IX+0) + AND 0F0H + OR B + LD (IX+0),A + INC HL + LD A,(HL) + LD (IX+1),A + RET + +;*--------------------- +;* SOUND=(reg,data) +;* ent A.... reg+80H +;* DE... data +;* +;* SOUND n,time +;* ent A.... n +;* DE... time +;*--------------------- + +MSOUND: OR A + JP P,SOUT + AND 0FH + LD C,PSGA ;psg-a + + IF SYS = 0 ;instructions not assembled for the MZ-800 + CP 8 + JR C,MSND.P + SUB 8 + INC C ;C=psg sel, A=reg#. + ENDIF + +MSND.P: ADD A,A + ADD A,A + ADD A,A + ADD A,A + OR 80H + LD B,A ;B = 1rrr0000 + BIT 4,A + JR NZ,MSND.A ;att + CP 0E0H + JR Z,MSND.N ;noise ctrl + LD A,D ;freq + CP 04H + JR NC,MER3 + LD A,E + AND 0FH + OR B ;1rrrffff + OUT (C),A + LD A,D + LD B,4 +MSND.R RL E + RLA + DJNZ MSND.R + OUT (C),A ;0fffffff + RET + +;*------------------------------------------------------ +;* Top of p.254 in German Listing of MZ-2Z046 Disk Basic +;*------------------------------------------------------ +MSND.N: BIT 3,E + JR NZ,MER3 +MSND.A: LD A,E + AND 0F0H + OR D + JR NZ,MER3 + LD A,E + OR B + OUT (C),A ;1rrrcccc + RET + +MER3: JP ER03M + +;*-------- +;* sout +;*-------- + +SDINT: LD HL,(TSOUTC) + DEC HL + LD (TSOUTC),HL + LD A,L + OR H + RET NZ + JP MSTOP0 + +;*---------- +;* SOUND n,l +;*---------- +SOUT: LD C,A + LD A,D + OR E + RET Z + LD A,C + LD IX,TSOUT + CP NMAX+1 + RET NC + SUB 9 + PUSH AF + LD A,90H + JR NC,SOUT1 + LD A,9FH +SOUT1: LD (IX+2),A ;TSOUT att + CALL MWAIT0 + POP AF + CALL NC,SETNO ;skip if not rest + DI + LD A,2 + LD (INTM),A + LD (TSOUTC),DE + LD HL,TSOUT + LD BC,PSG3 ;psg-a out + OTIR + CALL MSTART + EI + RET + +;*------------------------- +;* Interpret point set +;* in Acc=channel +;* exit ix:stbl +;* iy:ptbl +;* hl:ptbl+1 +;*------------------------- +INTER: PUSH BC + PUSH AF + CP 3 + JR C,INTER1 + DEC A + + IF SYS = 0 ;instructions not assembled for the MZ-800 + CP 6 + JR NZ,INTER1 + DEC A + ENDIF + +INTER1: LD HL,STBL + LD B,A + ADD A,A ;*2 + ADD A,B ;*3 + LD C,A + LD B,0 + ADD HL,BC + PUSH HL + POP IX + POP AF + ADD A,A ;*2 + ADD A,A ;*4 + ADD A,A ;*8 + ADD A,A ;*16 + LD HL,PTBL + LD B,0 + LD C,A + ADD HL,BC + PUSH HL + POP IY + INC HL + POP BC + RET + +;*------------- +;* play, noise +;*------------- + +PLAY: CP 0FFH + JR NZ,PLY0 + LD A,MAXCH-1 +PLYALL: PUSH AF + PUSH DE + CALL PLY0 + POP DE + POP AF + DEC A + JP M,PSGON + JR PLYALL + +PLY0: PUSH AF + LD HL,STN0 + + IF SYS = 0 ;instructions not assembled for the MZ-800 + CP 4 + JR C,PLY00 + LD HL,STN1 + ENDIF + +PLY00: CP 3 + JR Z,PLY1 + + IF SYS = 0 ;instructions not assembled for the MZ-800 + CP 7 + JR Z,PLY1 + ENDIF + + LD A,0DFH + JR PLY2 + +PLY1: LD A,0E7H ;noise channel out + OUT (PSGALL),A + LD A,0FFH +PLY2: LD (HL),A ;STN0 or STN1 + DI + LD A,1 + LD (INTM),A + POP AF + CALL INTER + CALL BSET + CALL MINT1 + EI + RET + +PSGON: DI + LD A,(INTM) + OR A + CALL NZ,MSTART + EI + RET + +BRESET: LD B,86H + JR BSET0 + +BSET: LD B,0C6H +BSET0: LD HL,SBUSY + LD A,(IY+0) + OR A + RLCA + RLCA + RLCA ;00xxx000 + OR B ;10xxx110 or 11xxx110 + LD (BSET1),A + DB 0CBH ;SET n,(HL) or reset +BSET1: DB 0 + RET + +;*---------------------------------- +;* sft+break or error or music stop +;*---------------------------------- +MLDSP: +MSTOP: CALL PUSHR ;routine called by RAM Monitor as MLDSP ! +MSTOP0: XOR A + LD (INTM),A + LD (SBUSY),A + LD BC,PSGOFF + LD HL,MSTBL + OTIR + LD B,MUSCH + LD HL,STBL+2 +MSTOP1: LD A,(HL) + AND 0F0H + OR 0FH + LD (HL),A + INC HL + INC HL + INC HL + DJNZ MSTOP1 + LD A,3 + OUT (0FCH),A ;pio disenable + XOR A + + IF SYS = 1 ;RET instruction assembled for the MZ-800 + RET ;8253 gate no effect + ENDIF + + IF SYS = 0 ;instructions not assembled for the MZ-800 + LD HL,0E008H ;mz-700 compatible mode + LD (HL),A ;8253 gate disable + RET + ENDIF + +;*----------- +;* music wait +;*----------- +MWAIT: +MWAIT0: LD A,(INTM) + OR A + RET Z +MWAIT1: RST 18H + DB .BREAK + JR NZ,MWAIT + JP BREAKZ + +;*---------------------------------- +;* SVC .MCTRL ; music control +;* B=0: init +;* B=1: psgon +;* B=2: stop +;* B=3: wait +;*---------------------------------- +MCTRL: DEC B ;this routine is called only by DF 23H ! + JP Z,PSGON + DEC B + JR Z,MSTOP ;1 + DEC B + JR Z,MWAIT0 ;2 +;*------------------ +;* PSG power on init +;*------------------ +PSGPWR: CALL MSTOP + LD BC,5FCH + IF SYS = 0 + LD HL,PIOTBL1 + ENDIF + IF SYS = 1 + LD HL,PIOTBL2 + ENDIF + OTIR + LD DE,MUINID + LD A,0FFH + JP PLAY + +PIOTBL1: IF SYS = 0 ;instruction not assembled for the MZ-800 + DB 0FCH ;Vector + DB 0FFH ;mode 3 (bit mode) + DB 3FH ;I/O + DB 37H ;interrupt control + DB 0EFH ;interrupt mask + ENDIF + +MSTART: ; Global scope for label needs to be outside IF block. + IF SYS = 0 ;instruction not assembled for the MZ-800 + OUT (0E3H),A + LD A,30H + LD HL,0E007H + LD (HL),A ;8253 control + LD BC,22A5H ;10ms =22F6H + LD L,4 ;HL=E004H + LD (HL),C ;8253 time const + LD (HL),B + DEC HL ;HL=E003H + LD (HL),4 ;8253 int disable + LD (HL),0 ;8253 music disable + LD A,01H + LD L,8 ;HL=E008H + LD (HL),A ;8253 gate enable + LD A,83H + OUT (0FCH),A ;pio int enable + OUT (0E1H),A + RET + ENDIF ;END of section not assembled for the MZ-800 +;MSTART: + IF SYS = 1 ;start of section assembled for the MZ-800 + LD HL,PIOTBL2 + LD BC,5FCH + OTIR + LD HL,CTCTBL + LD B,6 + JP IOOUT + ENDIF + +PIOTBL2: IF SYS = 1 ;start of section assembled for the MZ-800 + DB 0FCH ;Vector + DB 0FFH ;mode 3 (bit mode) + DB 3FH ;I/O + DB 17H ;interrupt control + DB 0EFH ;interrupt mask + ENDIF +;* +CTCTBL: IF SYS = 1 ;start of section assembled for the MZ-800 + DW 0D730H + DW 0D4B0H ;10 ms =2B4CH + DW 0D42AH + DW 0D304H + DW 0D300H + DW 0FC83H + ENDIF +;* +MUINID: DB 65H ;L5 + DB 6DH ;T4 + DB 98H ;S8 + DW 0FFA0H ;M255 + DB 0FFH ;END + +CTRLG: ; Defined outside the IF block to be globally visible. + IF SYS = 0 ;this section is not assembled for the MZ-800 + CALL PUSHR + LD (CTRLG9+1),SP + RST 18H + DB .DI + LD SP,IBUFE + OUT (0E4H),A ;K/C mapping + CALL 02BEH ;ROM MLDSP + LD A,1 + LD DE,0E003H + LD (DE),A ;8253 music gate on + LD HL,03F9H + CALL 02AEH ;ROM MLDST+3 + LD BC,18H +CTRLG2: EX (SP),HL ;wait + DJNZ CTRLG2 + DEC C + JR NZ,CTRLG2 + CALL 02BEH ;ROM MLDSP + XOR A + LD (DE),A ;8253 music gate off + OUT (0E0H),A ;K/C mapping + OUT (0E1H),A + RST 18H + DB .EI +CTRLG9: LD SP,0 ;xxx + RET + ENDIF ;end of section not assembled for the MZ-800 + +;*------------------------------------------------------ +;* Top of p.261 in German Listing of MZ-2Z046 Disk Basic +;*------------------------------------------------------ +;* BELL (BEEP) uses 8253 +;*----------------------- + IF SYS = 1 ;this section is assembled for the MZ-800 + CALL PUSHR + RST 18H + DB .DI + LD HL,BEEP0 + LD B,4 + CALL IOOUT + LD BC,18H +CTRLG1: EX (SP),HL + DJNZ CTRLG1 + DEC C + JR NZ,CTRLG1 + LD HL,BEEP1 + LD B,2 + CALL IOOUT + RST 18H + DB .EI + RET + +BEEP0: DW 0D736H + DW 0D301H + DW 0D4F9H + DW 0D403H + +BEEP1: DW 0D736H + DW 0D300H + ENDIF +;*----------------- +;* tempo set +;* acc=1-7 +;*---------------- +QTEMP: IF SYS = 1 + CALL PUSHRA + LD DE,TEMPOW + AND 0FH + ADD A,69H + LD (DE),A + LD B,3 + RST 18H ;MWAIT + DB .MCTRL + LD A,0FFH ;Channel all + RST 18H + DB .PLAY + LD B,1 + RST 18H ;PSGON + DB .MCTRL + RET + +TEMPOW: DB 0 ;(was DEFS 1) + DB 0FFH + + ENDIF ;End of section assembled on the MZ-800 + +;* END of original module MON-PSG.ASM +;*============================================================================ +;* START of original module MON-GRPH.ASM +;*-------------------------------- +;* MZ-800 Monitor Graphic-package +;* FI:MON-GRPH ver 1.0A 9.05.84 +;*-------------------------------- +;*------------ +;* INIT "CRT: +;*------------ +CRTINI: CALL TEST1 + DB 'M' + JR Z,CRMD + OR A + JR Z,ICRT + CP 'B' + JP NZ,ER03M +;*------------------ +;* CRT palette block +;*------------------ +PBLOCK: XOR A + LD (PALBK),A + LD A,(CRTMD2) + CP 2 + JP NZ,ER68 + INC HL + LD B,4 + CALL DEVASC + LD (PALBK),A + RST 18H + DB .DPLBK + JR CRTLP +;*----------------------- +;* CRT mode +;* 1.....320x200 4 Color +;* 2.....320x200 16 Color +;* 3.....640x200 2 Color +;* 4.....640x200 4 Color +;*----------------------- +CRMD: LD B,5 + CALL DEVASC + OR A + JR Z,ER3JP + LD B,A + RST 18H + DB .DSMOD + JP C,ER68 + LD A,B + LD (CRTMD2),A + XOR A + LD (INPFLG),A + SCF +CRMD1: ADC A,A + DJNZ CRMD1 + LD (CRTMD1),A + CALL ICRT2 +CRTLP: CALL TEST1 + DB 0 + RET Z + CP ',' + INC HL + JR Z,CRTINI +ER3JP: JP ER03M + +ICRT: LD A,(CRTMD2) + RST 18H + DB .DSMOD +ICRT2: CALL COLINI + XOR A + LD (PALBK),A + RST 18H + DB .DPLBK + RET + +COLINI: LD A,(CRTMD1) + LD B,3 + RRA + JR C,CI1 + LD B,15 + RRA + JR C,CI1 + LD B,1 + RRA + JR C,CI1 + LD B,3 +CI1: LD A,B + LD (SELCOL),A + RST 18H + DB .DCOL + RET + +;*------------------- +;* BYTE CONVERT TABLE +;*------------------- +TDOTL: DB 0FFH + DB 0FEH + DB 0FCH + DB 0F8H + DB 0F0H + DB 0E0H + DB 0C0H + DB 80H +;* +TDOTR: DB 01H + DB 03H + DB 07H + DB 0FH + DB 1FH + DB 3FH + DB 7FH + DB 0FFH +;* +TDOTN: DB 01H + DB 02H + DB 04H + DB 08H + DB 10H + DB 20H + DB 40H + DB 80H + +;*-------------------------- +;* // 64 - 32 TRANS // +;*-------------------------- +CHGRPH: LD BC,703H + LD HL,CHGTBL + JP PATCH +;* +CHGTBL: DW SYMS42+1 ;word patch table + DW 0BE80H + DW 9F40H + + DW RNGCK0+1 + DW -640 + DW -320 + + DW LRBSR + DW 640 + DW 320 + + DW BFL0+1 + DW 80 + DW 40 + + DW BFL1+1 + DW 80 + DW 40 + + DW BFC0+1 + DW -640 + DW -320 + + DW BFC1+1 + DW 639 + DW 319 + +;*------------------ +;* byte patch table +;*------------------ + DW ADCH ;adrs + DB 29H ;640 ADD HL,HL + DB 00H ;320 + + DW SYMS21+1 + DB 80 + DB 40 + + DW SYMS41+1 + DB 80 + DB 40 +;*-------------------------------- +;* address calc +;* ent. de=x (0-13FH,27FH) +;* hl=y (0-C7H) +;* +;* ext. hl=vram addr +;* a=vram bit +;* c=de/8 +;*-------------------------------- +ADCH: ADD HL,HL ;NOP + LD A,E + AND 7 + LD B,A + LD A,E + AND 0F8H + ADD A,D + RRCA + RRCA + RRCA + LD C,A + LD A,B + LD B,80H ;vramh + LD D,H + LD E,L + ADD HL,HL + ADD HL,HL + ADD HL,DE + ADD HL,HL + ADD HL,HL + ADD HL,HL ;HL=HL*40 + ADD HL,BC + RET + +;*-------------------------- +;* READ POINT +;* Ent:DE=X (0-13FH,27EH) +;* HL=Y (0-C7H) +;*-------------------------- +QPOINT: CALL RNGCK + JP C,OVER + CALL ADCH + RLCA + RLCA + RLCA + OR 46H + LD (PNT2+1),A + LD C,LSRF + LD A,(MAXCF) + LD B,A + DI + IN A,(LSE0) + XOR A +PNT1: RR B + JR C,PNT4 + OUT (C),B + OR A +PNT2: BIT 0,(HL) ;bit n,(hl) + JR Z,PNT3 + SCF +PNT3: RLA + JR PNT1 + +PNT4: LD B,A + IN A,(LSE1) + EI + LD A,(CPLANE) + AND B + LD B,A + LD A,(DMD) + CP 6 + LD A,B + RET NZ + CP 4 + RET C + SUB 2 + RET + +;*------------------------- +;* MODE SET (PWMODE,GMODE) +;* ent. A= 0 RESET +;* A<>0 SET +;*------------------------- +SETW: LD A,0FFH +MODSET: PUSH BC + OR A + LD A,(GMODE) + LD C,A + LD A,(PWMODE) + JR Z,RSET1 + OR A + LD A,0C0H ;w0 pset + JR Z,SET1 + LD A,40H ;w1 or +SET1: OR C + OUT (LSWF),A ;Write mode set + POP BC + RET + +RSET1: OR A + LD A,60H ;w1 reset + JR NZ,SET1 + LD A,(CPLANE) + LD B,A + LD A,C ;reverse color + CPL + AND B ;mask color + OR 0C0H ;w0 pset mode + OUT (LSWF),A ;Write mode set + POP BC + RET + +;*-------------------------- +;* Point Write/Erase +;* Ent:DE=X (0-13FH,27EH) +;* HL=Y (0-C7H) +;*-------------------------- +PSET: CALL MODSET +PSET0: CALL RNGCK + JP C,OVER + CALL ADCH + EX DE,HL + LD HL,TDOTN + LD B,0 + LD C,A + ADD HL,BC + DI + IN A,(LSE0) + LDI + IN A,(LSE1) + EI + XOR A + RET + +;*-------------------------- +;* RANGE CHECK +;* Ent:DE=X (0-13FH,27EH) +;* HL=Y (0-C7H) +;* ext:if over then CF=1 +;*-------------------------- +RNGCK: PUSH BC + PUSH DE + PUSH HL + LD A,H + RLCA + JR C,RNGER + LD BC,-200 + ADD HL,BC + JR C,RNGER + LD A,D + RLCA + JR C,RNGER + EX DE,HL +RNGCK0: LD BC,-640 ;-320 + ADD HL,BC +RNGER: POP HL + POP DE + POP BC + RET + +;*---------------------- +;* Draw line +;* ent DE':X0, DE:X +;* HL':Y0, HL:Y +;* A := 0 BLINE +;* <>0 LINE +;* ext DE':X +;* HL':Y +;*---------------------- +X0: EQU KEYBF ;2 +DX: EQU X0+2 ;2 +XDIRE: EQU DX+2 ;1 +Y0: EQU XDIRE+1 ;2 +DY: EQU Y0+2 ;2 +YDIRE: EQU DY+2 ;1 + +WLINE0: LD A,0FFH +;*------------------------------------------------------ +;* Top of p.272 in German Listing of MZ-2Z046 Disk Basic +;*------------------------------------------------------ +WLINE: CALL MODSET + PUSH DE + PUSH HL + EXX + LD (X0),DE + LD (Y0),HL + EXX + PUSH HL ;y + PUSH DE ;x + EX DE,HL + LD HL,(Y0) + CALL PLS + LD (YDIRE),A + LD (DY),HL + POP DE ;x + JP NC,WYLIN ;skip if y=y0 + PUSH HL ;dy + LD HL,(X0) + CALL PLS + LD (XDIRE),A + LD (DX),HL + POP BC ;dy + POP DE ;y + JP NC,WTLIN ;skip if x=x0 + XOR A + SBC HL,BC + JR NC,WLIN04 ;skip if dx>dy + LD HL,X0 ;parameter change + LD DE,Y0 + LD B,5 +WLIN02: LD A,(DE) + LD C,(HL) + LD (HL),A + LD A,C + LD (DE),A + INC HL + INC DE + DJNZ WLIN02 + LD A,0EBH ;ex de,hl +WLIN04: LD (PLOT0),A + LD (PLOT1),A + LD A,(YDIRE) + AND A + LD A,23H ;inc hl + JR Z,DIRE1 + LD A,2BH ;dec hl +DIRE1: LD (PP2),A + LD A,(XDIRE) + AND A + LD A,13H ;inc de + JR Z,DIRE2 + LD A,1BH ;dec de +DIRE2: LD (PP1),A + EXX + LD HL,(DX) ;initial parm set + LD D,H + LD E,L + SRL H + RR L + LD BC,(DY) + EXX + LD HL,(Y0) ;first point set + LD DE,(X0) + LD BC,(DX) +;*--------------------------------------------------------- +;* The original source names the entry point below as PLOT +;* This creates a very nasty problem with duplicate labels ! +;*--------------------------------------------------------- +PLOT0: EX DE,HL ;dynamic byte EX DE,HL or NOP + PUSH HL + PUSH DE + PUSH BC + CALL PSET0 + POP BC + POP DE + POP HL +PLOT1: EX DE,HL ;dynamic byte EX DE,HL or NOP + DEC BC + LD A,B + INC A + JR Z,FINW ;skip if end of line +;*------------- +;* pointer calc +;*------------- +PP1: DB 0 ;INC DE or DEC DE (was DEFS 1) + EXX + OR A + SBC HL,BC + EXX + JP NC,PLOT0 + EXX + ADD HL,DE + EXX +PP2: DB 0 ;INC HL or DEC HL (was DEFS 1) + JP PLOT0 + +FINW: EXX + POP HL + POP DE + EXX + RET + +WYLIN: POP HL ;Y +WYLIN0: CALL WBOXSB + CALL WBOXSB + CALL YLINE + JR FINW + +WTLIN: EX DE,HL + LD DE,(X0) + JR WYLIN0 + +PLS: LD A,H + ADD A,40H + LD H,A + LD A,D + ADD A,40H + LD D,A + OR A + SBC HL,DE + JR C,PLS1 + LD A,H + OR L + RET Z +OVER: LD A,0FFH + SCF + RET + +PLS1: OR A + EX DE,HL + LD HL,0 + SBC HL,DE + XOR A + SCF + RET + +;*------------------------------------------------------ +;* Top of p.276 in German Listing of MZ-2Z046 Disk Basic +;* Write one sector of a circle or an ellipse +;*------------------------------------------------------ +WSECTR: CALL WSPUT + LD HL,(POINTX) + PUSH HL + PUSH BC ;POINTY + EXX + CALL WSPUT + LD B,2 + JP WBOX2 + +WSPUT: POP IX ;Ret adrs + EX DE,HL + CP 2 + CALL Z,WSCTRH + LD BC,(POINTX) + ADD HL,BC + PUSH HL ;X + EX DE,HL + CP 1 + CALL Z,WSCTRH + LD BC,(POINTY) + ADD HL,BC + PUSH HL ;Y + JP (IX) + +WSCTRH: BIT 7,H + JP Z,HIRITU + CALL WSCTRV + CALL HIRITU +;*------------------------------------------------------ +;* Top of p.277 in German Listing of MZ-2Z046 Disk Basic +;*------------------------------------------------------ +WSCTRV: EX AF,AF' + CALL NEGHL + EX AF,AF' + RET + +;*----------------------------- +;* Circle Write +;* ent DE:End X DE':Start X +;* HL:End Y HL':Start Y +;* IX:R BC':Hiritu +;* A:Angle flag +;* if CF then sector +;* uses KEYBUF +;*----------------------------- +WCIRCL: PUSH AF + CALL SETW ;set pwmode + POP AF + PUSH AF + LD (CIR3+1),IX ;R + LD (SYUX),DE + LD (SYUY),HL + EXX + LD (CIR.HF),BC + LD (KAIX),DE + LD (KAIY),HL + LD A,C ;CIR.HF + CALL C,WSECTR + LD HL,(KAIX) + LD DE,(KAIY) +;* ;پ BLOCK NO.»ف¼­آƒBL ¼أف + CALL BLCKRU + LD (KBL),A + LD HL,(SYUX) + LD DE,(SYUY) +;* ;پ BLOCK NO.»ف¼­آƒSBL ¼­³أف + CALL BLCKRU + LD (SBL),A + LD HL,CIR.BK + LD B,8 + CALL QCLRHL + LD HL,KBL + POP AF + LD B,A + AND 0FH + JR Z,CIR4 ;KK=SK + CP 3 + JR Z,CIR15 ;2PI <= ABS(KK-SK) + LD A,(HL) + INC HL + CP (HL) + JR NZ,CIR4 + LD A,B + CP 81H + JR Z,CIR4 + JR CIR14 + +CIR15: LD A,9 + LD (HL),A + INC HL + LD (HL),A +CIR14: LD B,8 + LD HL,CIR.BK + INC A + CALL QSETHL + LD A,0B0H ;OR B + CALL CHENGE + JR CIR3 + +CIR4: LD A,0A0H ;AND B + CALL CHENGE + LD D,00H + LD HL,(KBL) + LD B,H + LD A,L +CIR2: LD HL,CIR.BK-1 + LD E,A + ADD HL,DE + LD (HL),1 + CP B ;¶²¼جقغ¯¸ؤ ¼­³جقغ¯¸¦ ث¶¸ + JR Z,CIR3 + AND 7 + INC A + JR CIR2 + +CIR3: LD HL,0 + LD (DYY),HL + LD (XX),HL + LD HL,1 + LD (CI.D),HL + LD (YY),HL +CIR7: LD HL,(DYY) + LD DE,(CI.D) + XOR A + SBC HL,DE + LD (DYY),HL + LD HL,(YY) + DEC HL + LD (CYE),HL + LD A,(CIR.HF) + OR A + LD D,H + LD E,L + CALL NZ,HIRITU + CP 1 + JR Z,CIR8 + EX DE,HL +CIR8: LD (YYY),DE + LD (YYHI),HL + LD HL,(XX) + OR A + LD D,H + LD E,L + CALL NZ,HIRITU + CP 1 + JR Z,CIR9 + EX DE,HL +CIR9: LD (XXX),DE + LD (XXHI),HL + LD HL,(XXX) + CALL NEGHL + LD (FUXX),HL ;FUXX = -XXX + LD HL,(YYY) + CALL NEGHL + LD (FUYE),HL ;FUYE = -YYY + LD HL,(YYHI) + CALL NEGHL + LD (FUYYHI),HL ;FUYYHI = -YYHI + LD HL,(XXHI) + CALL NEGHL + LD (FUXXHI),HL ;FUXXHI = -XXHI + LD HL,(CYE) + CALL NEGHL + LD (FUNOYE),HL ;FUNOYE = -YE + LD HL,CIR.BK + + LD A,(HL) ;BLOCK NO.1 + OR A + INC HL + JR Z,P222 + EXX + LD HL,(XXX) + LD (PL1+1),HL + LD B,0 + LD DE,(FUNOYE) + BIT 7,D + JR Z,P12 + LD A,(KBL) + CP 1 + JR NZ,P11 + LD HL,(KAIY) + XOR A + SBC HL,DE + JR Z,P11 + JR C,P12 +P11: INC B +P12: LD A,(SBL) + CP 1 + JR NZ,P13 + LD HL,(SYUY) + XOR A + SBC HL,DE + JR Z,P13 + JR NC,P14 +P13: LD A,1 +P14: AND B + JR Z,P15 + LD HL,(FUYYHI) + CALL PLALL +P15: EXX + +P222: LD A,(HL) ;BLOCK NO.2 + OR A + INC HL + JR Z,P3 + EXX + LD B,0 + LD HL,(YYY) + LD (PL1+1),HL + LD DE,(CYE) + LD A,(KBL) + CP 2 + JR NZ,P21 + LD HL,(KAIX) + XOR A + SBC HL,DE + JR Z,P21 + JR C,P22 +P21: INC B +P22: LD A,(SBL) + CP 2 + JR NZ,P23 + LD HL,(SYUX) + XOR A + SBC HL,DE + JR Z,P23 + JR NC,P24 +P23: LD A,1 +P24: AND B + JR Z,P25 + LD HL,(FUXXHI) + CALL PLALL +P25: EXX + +P3: LD A,(HL) ;BLOCK NO.3 + OR A + INC HL + JR Z,P4 + EXX + LD B,0 + LD HL,(FUYE) + LD (PL1+1),HL + LD DE,(FUNOYE) + BIT 7,D + JR Z,P32 + LD A,(KBL) + CP 3 + JR NZ,P31 + LD HL,(KAIX) + XOR A + SBC HL,DE + JR Z,P31 + JR C,P32 +P31: INC B +P32: LD A,(SBL) + CP 3 + JR NZ,P33 + LD HL,(SYUX) + XOR A + SBC HL,DE + JR Z,P33 + JR NC,P34 +P33: LD A,1 +P34: AND B + JR Z,P35 + LD HL,(FUXXHI) + CALL PLALL +P35: EXX + +P4: LD A,(HL) ;BLOCK NO.4 + OR A + INC HL + JR Z,P5 + EXX + LD B,0 + LD HL,(FUXX) + LD (PL1+1),HL + LD DE,(FUNOYE) + LD A,(KBL) + CP 4 + JR NZ,P41 + LD HL,(KAIY) + XOR A + SBC HL,DE + JR Z,P41 + JR NC,P42 +P41: INC B +P42: XOR A + BIT 7,D + JR Z,P44 + LD A,(SBL) + CP 4 + JR NZ,P43 + LD HL,(SYUY) + XOR A + SBC HL,DE + JR Z,P43 + JR C,P44 +P43: LD A,1 +P44: AND B + JR Z,P45 + LD HL,(FUYYHI) + CALL PLALL +P45: EXX + +P5: LD A,(HL) ;BLOCK NO.5 + OR A + INC HL + JR Z,P6 + EXX + LD B,0 + LD HL,(FUXX) + LD (PL1+1),HL + LD DE,(CYE) + LD A,(KBL) + CP 5 + JR NZ,P51 + LD HL,(KAIY) + XOR A + SBC HL,DE + JR Z,P51 + JR NC,P52 +P51: INC B +P52: LD A,(SBL) + CP 5 + JR NZ,P53 + LD HL,(SYUY) + XOR A + SBC HL,DE + JR Z,P53 + JR C,P54 +P53: LD A,1 +P54: AND B + JR Z,P55 + LD HL,(YYHI) + CALL PLALL +P55: EXX + +P6: LD A,(HL) ;BLOCK NO.6 + OR A + INC HL + JR Z,P7 + EXX + LD B,0 + LD HL,(FUYE) + LD (PL1+1),HL + LD DE,(FUNOYE) + LD A,(KBL) + CP 6 + JR NZ,P61 + LD HL,(KAIX) + XOR A + SBC HL,DE + JR Z,P61 + JR NC,P62 +P61: INC B +P62: XOR A + BIT 7,D + JR Z,P64 + LD A,(SBL) + CP 6 + JR NZ,P63 + LD HL,(SYUX) + XOR A + SBC HL,DE + JR Z,P63 + JR C,P64 +P63: LD A,1 +P64: AND B + JR Z,P65 + LD HL,(XXHI) + CALL PLALL +P65: EXX + +P7: LD A,(HL) ;BLOCK NO.7 + OR A + INC HL + JR Z,P8 + EXX + LD HL,(YYY) + LD (PL1+1),HL + LD DE,(CYE) + LD B,0 + LD A,(KBL) + CP 7 + JR NZ,P71 + LD HL,(KAIX) + XOR A + SBC HL,DE + JR Z,P71 + JR NC,P72 +P71: INC B +P72: LD A,(SBL) + CP 7 + JR NZ,P73 + LD HL,(SYUX) + XOR A + SBC HL,DE + JR Z,P73 + JR C,P74 +P73: LD A,1 +P74: AND B + JR Z,P75 + LD HL,(XXHI) + CALL PLALL +P75: EXX + +P8: LD A,(HL) ;BLOCK NO.8 + OR A + INC HL + JR Z,PECMD + EXX + LD HL,(XXX) + LD (PL1+1),HL + LD DE,(CYE) + LD B,0 + LD A,(KBL) + CP 8 + JR NZ,P81 + LD HL,(KAIY) + XOR A + SBC HL,DE + JR Z,P81 + JR C,P82 +P81: INC B +P82: LD A,(SBL) + CP 8 + JR NZ,P83 + LD HL,(SYUY) + XOR A + SBC HL,DE + JR Z,P83 + JR NC,P84 +P83: LD A,1 +P84: AND B + JR Z,P85 + LD HL,(YYHI) + CALL PLALL +P85: EXX + +PECMD: LD HL,(DYY) ;¹²»ف¼· + BIT 7,H + JR Z,CIR10 + LD DE,(YY) + LD HL,(XX) + DEC HL + LD (XX),HL + BIT 7,H + RET NZ + XOR A + SBC HL,DE + RET C + LD HL,(XX) + ADD HL,HL + LD DE,(DYY) + ADD HL,DE + LD (DYY),HL +CIR10: LD HL,(YY) + INC HL + LD (YY),HL + LD HL,(CI.D) + INC HL + INC HL + LD (CI.D),HL + JP CIR7 + +;*----------------------------------------------------------- +;* Near Top of p.288 in German Listing of MZ-2Z046 Disk Basic +;*----------------------------------------------------------- +;* ;CIRCLE »جقظ-ءف +;* ;BLOCK NUMBER ¹ف¼­آ »جقظ-ءف +BLCKRU: PUSH HL + PUSH DE + CALL ABSHL + EX DE,HL + CALL ABSHL + EX DE,HL + OR A + SBC HL,DE + POP DE + POP HL + JR C,BLCK1 + BIT 7,H + JR NZ,BLCK2 + BIT 7,D + LD A,8 + RET Z + LD A,1 + RET + +BLCK2: BIT 7,D + LD A,5 + RET Z + LD A,4 + RET + +BLCK1: BIT 7,H + JR NZ,BLCK5 + BIT 7,D + LD A,7 + RET Z + LD A,2 + RET + +BLCK5: BIT 7,D + LD A,6 + RET Z + LD A,3 + RET + +ABSHL: BIT 7,H + RET Z +NEGHL: LD A,H + CPL + LD H,A + LD A,L + CPL + LD L,A + INC HL + RET + +;*--------- +;*PLOT ظ-ءف +;*--------- +PLALL: LD DE,(POINTY) + ADD HL,DE + LD DE,65336 + LD B,H + LD C,L + ADD HL,DE + RET C +PL1: LD HL,0000H ;LKD HL,XXXXH + LD DE,(POINTX) + ADD HL,DE + EX DE,HL + LD HL,64896 + ADD HL,DE + RET C + LD H,B + LD L,C + JP PSET0 + +;* ;ثطآ ¹²»ف ظ-ءف +HIRITU: PUSH AF ;correction routine for ellipse + PUSH DE + LD B,8 + LD C,L + LD E,H + XOR A + LD D,A + LD H,A + LD L,A + EX AF,AF' + LD A,(CIR.HD) +HR1: RRA + JR NC,HR2 + ADD HL,DE + EX AF,AF' + ADD A,C + JR NC,HR3 + INC HL +HR3: EX AF,AF' +HR2: SLA C + RL E + RL D + DJNZ HR1 + EX AF,AF' + BIT 7,A + JR Z,HR4 + INC HL +HR4: POP DE + POP AF + RET + +CHENGE: LD (P14),A + LD (P24),A + LD (P34),A + LD (P44),A + LD (P54),A + LD (P64),A + LD (P74),A + LD (P84),A + RET + +;*------------------------- +;* CIRCLE Work Area EQUATES +;*------------------------- +CI.D: EQU KEYBF ;2 +DYY: EQU CI.D+2 ;2 +XX: EQU DYY+2 ;2 +YY: EQU XX+2 ;2 +CYE: EQU YY+2 ;2 +KBL: EQU CYE+2 ;1 ¼أفة BLOCK NO. +SBL: EQU KBL+1 ;1 ¼­³أفة BLOCK NO. + +;* ;جة CYE ·ق¬¸½³ حف¶ +FUYE: EQU SBL+1 ;2 +;* ;جة XX ·ق¬¸½³ حف¶ +FUXX: EQU FUYE+2 ;2 +;* ;جة CYE ثطآ ·ق¬¸½³ حف¶ +FUYYHI: EQU FUXX+2 ;2 +;* ;جة XX ثطآ ·ق¬¸½³ حف¶ +FUXXHI: EQU FUYYHI+2 ;2 + +FUNOYE: EQU FUXXHI+2 ;2 +CIR.BK: EQU FUNOYE+2 ;9 Block data + +KAIX: EQU CIR.BK+9 ;2 ¼أف X +KAIY: EQU KAIX+2 ;2 ¼أف Y +SYUX: EQU KAIY+2 ;2 ¼­³أف X +SYUY: EQU SYUX+2 ;2 ¼­³أف Y +XXHI: EQU SYUY+2 ;2 XXة ثطآ DATA +YYHI: EQU XXHI+2 ;2 YEة ثطآ DATA + +XXX: EQU YYHI+2 ;2 +YYY: EQU XXX+2 ;2 + +CIR.HF: EQU YYY+2 ;1 +CIR.HD: EQU CIR.HF+1 ;1 +;*-------------------------------- +;* End of CIRCLE Work Area EQUATES +;*-------------------------------- + +;*------------------------------------------------------ +;* pp.291-292 in German Listing of MZ-2Z046 Disk Basic +;*------------------------------------------------------ +;*------------------------------- +;* Box Write +;* ext DE':xs, DE:xe +;* HL':ys, HL:ye +;* if CF then A:fill color +;*------------------------------- +LSTA: EQU KEYBF +RSTA: EQU LSTA+2 +SPBOX: EQU RSTA+2 + +WBOX: LD (SPBOX),SP + EX AF,AF' + CALL WBOXSB + CALL WBOXSB + EXX + PUSH DE ;XS Upper + PUSH HL ;YS + PUSH DE ;XS Lower + EXX + PUSH HL ;YE + PUSH DE ;XE Lower + PUSH HL ;YE + PUSH DE ;XE Upper + EXX + PUSH HL ;YS + PUSH DE ;XS Upper Left + PUSH HL ;YS + EXX + EX AF,AF' + CALL C,BOXF ;Box fill + LD B,4 +WBOX2: EXX + POP HL + POP DE + EXX +WBOX4: POP HL + POP DE + PUSH BC + CALL WLINE0 ;Box bound + POP BC + DJNZ WBOX4 + RET + +WBOXSB: EX DE,HL + LD A,H ;Compare HL,HL' + EXX + EX DE,HL + CP H + EXX + JR Z,WBOXS2 + RET P + JR WBOXS4 +WBOXS2: LD A,L + EXX + CP L + EXX + RET NC +WBOXS4: PUSH HL + EXX + EX (SP),HL + EXX + POP HL + RET + +;*--------------------------------------------------------- +;* Middle of p.293 in German Listing of MZ-2Z046 Disk Basic +;*--------------------------------------------------------- +;*-------------------------- +;* BOX FILL +;* ent DE':xs, DE:xe +;* HL':ys, HL:ye +;* A:fill color +;*-------------------------- +BOXF: CALL COLS ;Fill Color Set + LD B,A + LD A,(GMODE) + CP B + JR NZ,BOXC + LD SP,(SPBOX) ;line routions pop +BOXC: LD A,(PWMODE) + OR A + LD A,0C0H ;w0 pset + JR Z,BOXF0 + LD A,40H ;w0 or +BOXF0: OR B + OUT (LSWF),A ;Write mode set +YLINE: LD A,H ;draw line parallel to axis + OR D + RET M + CALL BFCHK + LD A,L ;ye + EXX ;hl=ys,de=xs + BIT 7,H + JR Z,YLINE1 + LD HL,0 +YLINE1: BIT 7,D + JR Z,YLINE2 + LD DE,0 +YLINE2: EX AF,AF' + CALL BFCHK + RET C + EX AF,AF' ;ye + INC A + SUB L ;acc=lines(ye-ys+1) + RET C + RET Z + EX AF,AF' ;acc'=lines + PUSH HL ;ye + CALL ADCH + LD (LSTA),HL + EXX + POP HL ;ye + LD B,A ;left + PUSH BC + CALL ADCH + POP BC + LD (RSTA),HL + LD C,A ;right + LD DE,(LSTA) +HLINE: OR A + SBC HL,DE + JR Z,BOXI + DEC HL + INC DE ;next point + LD A,L + OR A + CALL NZ,BOXL ;a' reserve +BOXH: LD HL,TDOTR + LD A,B + LD B,0 + ADD HL,BC + LD L,(HL) + LD C,A + LD A,L + LD HL,TDOTL + ADD HL,BC + LD B,(HL) + LD DE,(RSTA) + PUSH BC + CALL BOXW + POP BC + LD DE,(LSTA) + LD A,B + JR BOXW + +BOXI: LD HL,TDOTR + LD A,B + LD B,0 + ADD HL,BC + LD C,A + LD A,0FFH + AND (HL) + LD HL,TDOTL + ADD HL,BC + AND (HL) +BOXW: LD C,A + EX AF,AF' + LD B,A + EX AF,AF' + EX DE,HL + DI +BFL0: LD DE,80 ;dynamic - 80 or 40 + IN A,(LSE0) +BOXW1: LD (HL),C + ADD HL,DE + DJNZ BOXW1 + IN A,(LSE1) + EI + RET + +BOXL: PUSH BC + EX DE,HL ;hl=start + LD B,A ;yoko counter + EX AF,AF' + LD C,A ;tate counter + EX AF,AF' +BFL1: LD DE,80 ;dynamic - 80 or 40 + DI +BOXL1: PUSH HL + PUSH BC + IN A,(LSE0) + LD A,0FFH +BOXL0: LD (HL),A + INC HL + DJNZ BOXL0 + IN A,(LSE1) + POP BC + POP HL + ADD HL,DE + DEC C + JR NZ,BOXL1 + EI + POP BC + RET + +;*---------------------- +;* box fill range check +;*---------------------- +BFCHK: LD A,H + OR A + JR NZ,BFCHK0 + LD A,199 + CP L + JR NC,BFCHK1 ;skip if hl>199 +BFCHK0: LD HL,199 + SCF +BFCHK1: RRA ;push cf + PUSH HL +BFC0: LD HL,-640 ;dynamic -640 or -320 + ADD HL,DE + POP HL + JR NC,BFCHK3 ;skip if de>639,319 +BFC1: LD DE,639 ;dynamic 319 or 639 + RET + + +BFCHK3: RLA ;pop cf + RET + +;*--------------------------------------------------------- +;* Bottom of p.297 in German Listing of MZ-2Z046 Disk Basic +;*--------------------------------------------------------- +;*--------------- +;* Position check +;*--------------- +POSCK: EXX + CALL RNGCK + EXX + RET NC ;OK + LD A,3 + JP ERRORJ + +;*-------------- +;* Position save +;*-------------- +POSSV: EXX ;Position save + LD (POINTX),DE + LD (POINTY),HL + EXX + RET + +;*-------------------------- +;* SYMBOL +;* Ent. A:angle +;* B:string length +;* H:Y ratio +;* L:X ratio +;* DE:string address +;*-------------------------- +;*------------------------------------------ +;* EQUATES and DEFW's for the SYMBOL COMMAND +;*------------------------------------------ +SBDTAP: DB 0,0,0,0,0,0,0,0 ;(was DEFS 8) + +SDT0: EQU 1200H +SDT7: EQU 1207H +SCNT: EQU 1208H ;1 +HCNT: EQU SCNT+1 ;1 +VCNT: EQU HCNT+1 ;1 +BCNT: EQU VCNT+1 ;1 +STRAP: EQU BCNT+1 ;2 +SDTAP: EQU STRAP+2 ;2 +BDTAP: EQU SDTAP+2 ;2 +DEFX0: EQU BDTAP+2 ;1 +DEFY0: EQU DEFX0+1 ;1 +DEFX8: EQU DEFY0+1 ;2 +DEFY8: EQU DEFX8+2 ;2 +PX: EQU DEFY8+2 ;2 +PY: EQU PX+2 ;2 +VADD: EQU PY+2 ;2 +LDOT: EQU VADD+2 ;1 +DEFX: EQU LDOT+1 ;1 +DEFY: EQU DEFX+1 ;1 +DEF8: EQU DEFY+1 ;2 +NSDT: EQU DEF8+2 ;2 + +CLLADD: DW LOD00 + DW LOD90 + DW LOD18 + DW LOD27 + +SYMBOL: PUSH BC ;SYMBOL command + PUSH DE ;string address + LD BC,PX + LD D,L + LD E,H + BIT 0,A + JR Z,SYMB10 ;skip acc=0,2 + EX DE,HL ;exchange milti + INC BC + INC BC ;bc=py +SYMB10: LD (SYMB18+1),BC + LD (DEFX0),HL + LD H,0 + ADD HL,HL + ADD HL,HL + ADD HL,HL ;defx8=defx*8 + LD (DEFX8),HL + LD L,E + LD H,0 + ADD HL,HL + ADD HL,HL + ADD HL,HL ;defy8=defy*8 + LD (DEFY8),HL +;*--------------- +;* set py, def8 +;*--------------- + LD DE,0 + EX DE,HL ;de=defy8 + SBC HL,DE ;hl=-defy8 + LD (DEF8),HL ;def8=-defy8 + BIT 1,A + JR Z,SYMB11 ;skip if acc=0,1 + LD (DEF8),DE ;def8=defy8 +SYMB11: OR A ;HL=-defy8 + JP PO,SYMB12 ;skip if acc=1,2 + LD HL,0 +SYMB12: LD DE,(POINTY) + ADD HL,DE ;pointy or pointy-defy8 + LD (PY),HL ;set py +;*-------------- +;* set px, def8 +;*-------------- + LD DE,(DEFX8) + LD HL,0 + OR A ;de=defx8 + SBC HL,DE ;hl=-defx8 + BIT 0,A + JR NZ,SYMB13 ;skip if acc=1,3 + BIT 1,A + LD (DEF8),DE ;DE=defx8 + JR Z,SYMB13 ;skip if acc=0 + LD (DEF8),HL ;hl=-defx8 +SYMB13: EX DE,HL ;de=-defx8 + LD HL,(POINTX) + BIT 1,A + JR Z,SYMB15 ;skip if acc=0,1 + ADD HL,DE ;pointx or pointx-defx8 +SYMB15: LD (PX),HL ;set px +;*--------------------------- +;* calc rotation program addr +;*--------------------------- + ADD A,A + LD HL,CLLADD + LD D,0 + LD E,A + ADD HL,DE + LD E,(HL) + INC HL + LD D,(HL) + LD (SYMS10+1),DE + CALL SETW ;set pwmode + POP HL + POP BC +SYMB17: DEC B ;string count down + RET M + PUSH HL + PUSH BC + CALL SYMS +SYMB18: LD HL,PX ;py + LD E,(HL) ;calc px(py)=px(py)+def8 + INC HL + LD D,(HL) + PUSH HL + LD HL,(DEF8) + ADD HL,DE + EX DE,HL + POP HL + LD (HL),D + DEC HL + LD (HL),E ;set next disp addr + POP BC + POP HL + INC HL ;next string pointer + JR SYMB17 + +;*------------------- +;* SYMBOL SUBROUTINE +;*------------------- +SYMS: LD IY,SCNT + LD A,(HL) ;mz ascii -> display + RST 18H ;font addr calc + DB DQADCN + LD H,0 + LD L,A + ADD HL,HL + ADD HL,HL + ADD HL,HL + LD A,10H + ADD A,H + LD H,A ;hl=hl+1000H + LD DE,SBDTAP ;xfer cg data + LD BC,8 + DI + IN A,(LSE0) + LDIR + IN A,(LSE1) + EI + LD B,8 ;rotation pro. +SYMS10: CALL LOD00 ;LODXX + LD HL,808H + LD (HCNT),HL ;set hcnt,vcnt + LD DE,(DEFX0) + LD (DEFX),DE + LD HL,(PX) + BIT 7,H + JR Z,SYMS20 ;skip if PX>=0 + CALL SSYMB + RET C ;error position +SYMS11: EXX ;data area rotate + LD B,8 + LD HL,SDT0 +SYMS12: RLC (HL) + INC HL + DJNZ SYMS12 + EXX + DJNZ SYMS11 + LD HL,0 +SYMS20: LD (SYMS23+1),HL + LD A,0F8H + AND L + OR H + RRC A + RRC A + RRC A +SYMS21: SUB 80 ;dynamic - 80 or 40 + RET NC ;buffer full check? + LD L,A ;SEND DATA ADD. + LD H,11H + LD (BDTAP),HL + LD HL,(PY) + XOR A + BIT 7,H + JR Z,SYMS22 + INC IY + CALL SSYMB + DEC IY + RET C ;error position + LD HL,0 + LD A,8 + SUB B +SYMS22: LD (SYMS24+1),A +SYMS23: LD DE,0 ;XXH + PUSH HL + PUSH DE + CALL RNGCK + POP DE + POP HL + RET C ;error position + CALL ADCH + LD (VADD),HL + LD HL,TDOTN + LD D,0 + LD E,A + ADD HL,DE + LD A,(HL) + LD (LDOT),A +SYMS24: LD HL,SDT0 +SYMS25: LD DE,(BDTAP) + LD BC,(LDOT) ;b defx c ldot + XOR A + EXX + LD B,(IY+1) ;hcnt +SYMS30: EXX + LD (DE),A + XOR A + RRC (HL) + JR NC,SYMS31 + LD A,0B1H ;OR C +SYMS31: LD (SYMS32),A + LD A,(DE) +SYMS32: OR C ;nop + RLC C + JR NC,SYMS33 + LD (DE),A + INC E ;next data addr + JR Z,SYMS34 ;skip if buffer full + XOR A +SYMS33: DJNZ SYMS32 +SYMS3A: LD B,(IY+0AH) ;defx0 + EXX + DJNZ SYMS30 ;hcnt + EXX + LD (DE),A + INC E +SYMS34: DEC E + INC L + LD (SDTAP),HL + LD HL,(BDTAP) + EX DE,HL + XOR A + SBC HL,DE + INC HL + LD (NSDT),HL + LD A,(DEFY) + LD B,A ;loop counter set +SYMS40: EXX + LD DE,(VADD) + LD HL,(BDTAP) + LD BC,(NSDT) + DI + IN A,(LSE0) + OUT (LSE0),A + LDIR + IN A,(LSE1) + EI +SYMS41: LD DE,80 ;dynamic - 80 or 40 + LD HL,(VADD) + ADD HL,DE + LD (VADD),HL ;next disp addr +SYMS42: LD DE,0BE80H ;dynamic - 9F40H or BE80H + OR A + SBC HL,DE + RET NC ;position error check + EXX + DJNZ SYMS40 +SYMS43: LD A,(DEFY0) ; + LD (DEFY),A ;set loop counter + LD HL,(SDTAP) + DEC (IY+2) ;VCNT + JP NZ,SYMS25 + RET + +;*----------------------------------------- +;* Bottom of p.304, German Listing of 2Z046 +;*----------------------------------------- +LOD00: LD HL,SBDTAP ;rotation subroutine + LD DE,SDT0 + LD C,B + LD B,0 + LDIR + RET + +LOD90: LD DE,SDT0 +LOD901: EXX + LD HL,SBDTAP + LD B,8 + XOR A +LOD902: RLC (HL) + RRA + INC HL + DJNZ LOD902 + EXX + LD (DE),A + INC DE + DJNZ LOD901 + RET + +LOD18: LD DE,SDT7 + LD HL,SBDTAP +LOD181: LD A,(HL) + EXX + LD C,A + LD B,8 + XOR A +LOD182: RR C + RL A + DJNZ LOD182 + EXX + LD (DE),A + INC HL + DEC DE + DJNZ LOD181 + RET + +LOD27: LD DE,SDT7 +LOD271: EXX + LD HL,SBDTAP + XOR A + LD B,8 +LOD272: RLC (HL) + RLA + INC HL + DJNZ LOD272 + EXX + LD (DE),A + DEC DE + DJNZ LOD271 + RET + +;*--------------- +;* calc position +;*--------------- +SSYMB: LD B,8 + LD E,(IY+0AH) ;defx0,defy0 + LD D,0 +SSYMB1: ADD HL,DE + BIT 7,H + JR Z,SSYMB2 + DJNZ SSYMB1 +SSYMB4: SCF + RET + +SSYMB2: LD A,H + OR L + JR NZ,SSYMB3 + LD L,E + DEC B + JR Z,SSYMB4 +SSYMB3: LD (IY+17H),L ;defx,defy + LD (IY+1),B ;HCNT,VCNT + OR A + RET + +;*------------------------------- +;* PATTERN +;* ent A:Heighth +;* B:String length +;* H:Direction +;* DE:String adrs +;*------------------------------- +POINTW: EQU KEYBF ;2 +STRAD: EQU POINTW+2 ;2 +PATDA1: EQU POINTW+250 +PATDA2: EQU POINTW+251 +PATDA3: EQU POINTW+252 +PATDA4: EQU POINTW+263 +;* +CHARW: OR A ;no mode ? + RET Z ;yes + LD (STRAD),DE + LD E,A ;E'=Height + LD C,A ;C'=Height(work) + LD A,H + OR A + LD A,23H ;INC HL + JR NZ,PATT1 ;DOWN + LD A,2BH ;DEC HL +PATT1: LD (PATTA),A + LD (PATTC),A + LD A,B + OR A ;no string ? + RET Z ;yes + LD HL,(POINTX) + LD A,07H + AND L + LD D,A + EXX ;keep c',e',b',d' + LD HL,TDOTL + LD D,0 + LD E,A + ADD HL,DE + LD A,(HL) + LD (PATTB+1),A ;MASK DATA +PATT3: LD HL,(POINTY) +PATT4: LD (POINTW),HL ;save (POINTY) +PATTB: LD C,0FFH ;C=mask data + LD HL,(STRAD) ;read DATA + LD A,(HL) + EXX ;keep c',e',b',d' + LD H,A + LD A,D + OR A ;X=0 ? + JR Z,PATT6 ;yeS +PATT7: RRC H + DEC A + JR NZ,PATT7 +PATT6: LD A,H + EXX ;A=pattern data + LD HL,PATDA1 + LD B,8 ;DATA sift + LD D,A +PATT80: SRL D + RLA + DJNZ PATT80 + LD D,A ;C^D + AND C + LD (HL),A ;left set data + LD A,D + CPL + LD B,A ;B=CPL(D)=CPL(STRAD) + AND C ;C^CPL(D) + INC HL + LD (HL),A ;left reset data + LD A,C + CPL + LD C,A + AND D ;CPL(C)^D + INC HL + LD (HL),A ;right set data + LD A,C + AND B ;CPL(C)^CPL(D) + INC HL + LD (HL),A ;right reset data + LD DE,(POINTX) + LD HL,(POINTW) + PUSH DE + PUSH HL + EX DE,HL ;X=X+1 + LD BC,8 + ADD HL,BC + EX DE,HL + LD A,1 ;right mode + CALL PATT90 + POP HL + POP DE + XOR A ;left mode + CALL PATT90 + LD HL,(STRAD) ;next data + INC HL + LD (STRAD),HL + EXX + DJNZ PATT5 ;B' + DEC C ;C' X-->END + EXX + JP Z,PATT70 ;X=X+8 & END + LD HL,(POINTW) +PATTC: INC HL ;DEC HL + LD (POINTY),HL + XOR A ;end + RET + + +PATT5: DEC C ;C' + JR NZ,PATT2 ;next Xposition + LD C,E ;C' E' + EXX + CALL PATT70 ;X=X+8 + JR PATT3 +PATT2: EXX + LD HL,(POINTW) +PATTA: INC HL ;DEC HL + JR PATT4 + +;*---------- +;* pointx+8 +;*---------- +PATT70: LD HL,(POINTX) + LD BC,8 + ADD HL,BC + LD (POINTX),HL + RET + +;*----------------------------------------------------------- +;* Near Top of p.310 in German Listing of MZ-2Z046 Disk Basic +;*----------------------------------------------------------- +;*---------------------- +;* V-RAM write +;* non keep +;* A=0 ----->left +;* 1 ----->right +;* DE=X positin +;* HL=y position +;*---------------------- +PATT90: EX AF,AF' ;PUSH AF ! + CALL RNGCK + RET C ;address err + CALL ADCH ;get V-RAM address + LD B,A ;B=0 -->no right data +;*------------------------------ +;* at this point HL=VRAM address +;*------------------------------ + LD DE,PATDA1 ;(DE)=write data + EX AF,AF' ;pop AF + OR A ;left data ? + JR Z,PATT91 ;yes + LD A,B ;non right data + OR A + RET Z + INC DE ;DE,PATDA3 + INC DE +PATT91: CALL SETW ;mode set + DI + IN A,(LSE0) + OUT (LSE0),A ;get V-RAM + LD A,(DE) ;B=right data + LD (HL),A + LD A,(PWMODE) + OR A ;OR mode ? + JR NZ,PATT92 ;YES + LD A,(CPLANE) ;read color data + OR 60H + OUT (LSWF),A + INC DE + LD A,(DE) ;C=reset data + LD (HL),A +PATT92: IN A,(LSE1) + EI + RET + +;*------------------------------- +;* PAINT ROUTINE ( 9.5/84 ) +;* HL: COLOR ADD. +;* B : NUM. of COLOR +;*------------------------------- +DIRAR: EQU 27D0H +ENKYB: EQU 12A0H +NDSP: EQU KEYBF ;2 +DSP: EQU NDSP+2 ;2 +NSSP: EQU DSP+2 ;1 +SSP: EQU NSSP+1 ;2 +PBXL: EQU SSP+2 ;2 +PBXR: EQU PBXL+2 ;2 + +Y: EQU PBXR+2 ;2 +BXL: EQU Y+2 ;2 +BXR: EQU BXL+2 ;2 +DIRECT: EQU BXR+2 ;1 +JCONT: EQU DIRECT+1 ;1 +JSAVE: EQU JCONT+1 ;1 +JSAVE1: EQU JSAVE+1 ;1 +BUFF: EQU JSAVE1+1 ;11 DATA BUFF. + +;*------------------------------------------------------ +;* The original source names the first EQUATE below as PEEK +;* This creates a very nasty problem with duplicate labels ! +;*------------------------------------------------------ +WAREA: EQU DIRAR ;Workspace for copied routine +;* +WORK: EQU Y +;*------------------------------------------- +;* Middle of p.311 in German Listing of 2Z046 +;*------------------------------------------- +WPAINT: LD A,(GMODE) ;Main PAINT routine + OR 0C0H + OUT (LSWF),A ;Write mode set + EXX + LD DE,WAREA ;copy 1st part of routine to WAREA + LD HL,DPEEK + LD BC,DPEEK1-DPEEK + LDIR + EXX +PAIN0: LD A,(HL) ;COLOR SELECT + CALL COLS ;Bound Color Set + OR 80H ;SEARCH MODE SET + LD (DPEEK1+1),A + INC HL + EXX + LD HL,DPEEK1 ;copy 2nd part of routine to WAREA + LD BC,DPEEK2-DPEEK1 + LDIR + EXX + DJNZ PAIN0 + EXX + LD BC,DPEEK3-DPEEK2+1 ;copy 3rd part of routine to WAREA + LDIR + LD HL,(TMPEND) + LD (DSP),HL + LD (CSAVE+2),HL + LD HL,(PAIWED) + LD DE,-6 + ADD HL,DE + LD (SVDT0+1),HL + LD HL,(POINTX) + DEC HL + LD (BXL),HL ;BXL=POINTX-1 + INC HL + INC HL + LD (BXR),HL ;BXR=POINTX+1 + DEC HL + EX DE,HL + LD HL,0 + LD (NDSP),HL + LD HL,(POINTY) + LD (Y),HL + CALL RNGCK + CCF + RET NC ;START OUT RANGE + LD (SOVER1),SP + LD SP,DIRAR+700H + CALL ADCH + LD DE,TDOTN + PUSH HL + LD H,0 + LD L,A + ADD HL,DE + LD C,(HL) + POP HL + CALL WAREA + AND C + JP NZ,PAINCE ;ON BOUND + CALL RBSR + LD (BXR),IX ;SET R.BOUND + CALL LBSR + LD (BXL),IX ;SET L.BOUND + LD A,0FFH + LD (DIRECT),A ;DOWN + CALL SVDT + LD HL,ENKYB + LD (SSP),HL + XOR A + LD (DIRECT),A + LD (NSSP),A +PAIN1: LD A,(DIRECT) + CALL CHDIR0 + LD A,199 + CP L + JR C,PAINA ;OUT RANGE + CALL NBSRCH + JR C,PAINA ;CLOSE + LD (JCONT),A + AND 9 + CALL NZ,PAIND + CALL CSAVE + LD A,(JSAVE) + OR A + JR NZ,PAINA +PAIN3: CALL PSRCH + JR Z,PAIN1 + LD HL,(BXR) + PUSH HL + PUSH DE + CALL RBSR0 + LD (BXR),IX + CALL SVDT + POP HL + LD (BXL),HL + POP HL + LD (BXR),HL + JR PAIN1 + +PAINA: LD HL,(DSP) + DEC HL + LD DE,-7 + LD BC,(NDSP) +PAINA1: LD A,B + OR C + JR Z,PAINC + LD A,0FH + DEC BC + CP (HL) + ADD HL,DE + JR Z,PAINA1 + INC HL + PUSH HL + LD (PAINA2+1),HL + LD DE,WORK + LD BC,7 + LDIR + EX DE,HL + LD HL,(DSP) + XOR A + POP BC + LD (DSP),BC + SBC HL,DE + JR Z,PAINA3 + LD B,H + LD C,L +PAINA2: LD HL,00H ;XXH + EX DE,HL + LDIR + LD (DSP),DE +PAINA3: LD HL,(NDSP) + DEC HL + LD (NDSP),HL + JP PAIN3 + +PAINC: LD HL,(NDSP) + LD A,L + OR H + JR NZ,PAINC0 +PAINCE: LD SP,(SOVER1) ;END JOB + RET + +PAINC0: DEC HL + LD (NDSP),HL + LD HL,(DSP) + DEC HL + LD DE,WORK+6 + LD BC,7 + LDDR + INC HL + LD (DSP),HL +PAINC1: CALL PSRCH + JR Z,PAINC + CALL RBSR0 + LD (BXR),IX + JR PAINC1 + +PAIND: LD HL,PBXL ;DATA SAVE + LD DE,BUFF + CALL PAIND3 + LD A,(JCONT) + BIT 0,A + JR Z,PAIND1 +LTW: LD HL,(PBXL) + LD (BXR),HL + CALL TWR + JR C,LTW1 ;CLOSE + BIT 0,A + JR NZ,LTW +LTW1: CALL PAIND2 + LD A,(JCONT) + CP 9 + RET NZ +PAIND1: LD HL,(PBXR) + LD (BXL),HL + CALL TWR + JR C,PAIND2 + BIT 3,A + JR NZ,PAIND1 +PAIND2: LD HL,BUFF + LD DE,PBXL +PAIND3: LD BC,11 + LDIR + RET + +;*----------------------------------------- +;* Middle p.316, German Listing of 2Z046 +;* CHECK SAVE DATA +;*----------------------------------------- +CSAVE: LD IY,00H ;dynamic byte xxH + LD BC,(NDSP) + LD HL,00H + LD (JSAVE),HL ;STATUS CLEAR +CSAVE1: CALL DSAVE + LD A,(NSSP) + OR A + RET Z + DEC A + LD (NSSP),A + LD (CSAVE2+1),SP + LD SP,(SSP) + POP IY + POP BC + POP HL + LD (BXR),HL + POP HL + LD (BXL),HL + LD (SSP),SP +CSAVE2: LD SP,00H ;XXH + JR CSAVE1 + +DSAVE: LD A,B + OR C + LD (DSAVEC+1),BC + JP Z,DSAVE3 + LD HL,(Y) + LD E,(IY+0) + LD D,(IY+1) + XOR A + SBC HL,DE + JR NZ,DSAVE2 + CALL COMP + CP 5 + JR Z,DSAVE1 + CP 0FH + JR NZ,DSAVE4 + LD L,(IY+2) ;SBXL + LD H,(IY+3) + LD DE,(BXR) + XOR A + SBC HL,DE + JR NC,DSAVE2 + LD HL,(BXL) + PUSH HL + LD L,(IY+2) + LD H,(IY+3) + PUSH HL + LD (BXL),HL + LD A,3 + CALL ESAVE + POP HL + LD (BXR),HL + POP HL + LD (BXL),HL + CALL RBSR + LD (BXR),IX + JR DSAVE2 + +DSAVE1: LD E,(IY+4) ;SBXR + LD D,(IY+5) + LD HL,(BXL) + XOR A + SBC HL,DE + JR NC,DSAVE2 + LD HL,(BXR) + PUSH HL + LD L,(IY+4) + LD H,(IY+5) + PUSH HL + LD (BXR),HL + LD A,4 + CALL ESAVE + POP HL + LD (BXL),HL + POP HL + LD (BXR),HL + CALL LBSR + LD (BXL),IX +DSAVE2: LD DE,7 + ADD IY,DE +DSAVEC: LD BC,00H ;XXH + DEC BC + JP DSAVE + +DSAVE3: LD A,(JSAVE1) + OR A + CALL NZ,SVDT + RET + +DSAVE4: EX AF,AF' + LD A,0FH + LD (JSAVE),A + EX AF,AF' + OR A + JR NZ,DSAVE5 + LD A,0FH + LD (IY+6),A + RET + +DSAVE5: CP 1 + JR NZ,DSAVE6 + LD L,(IY+4) ;SBXR + LD H,(IY+5) + LD (BXL),HL + CALL LBSR + LD (BXL),IX + JR DSAVE8 + +DSAVE6: CP 0CH + JR NZ,DSAVE9 +DSAVE7: LD L,(IY+2) ;SBXL + LD H,(IY+3) + LD (BXR),HL + CALL RBSR + LD (BXR),IX +DSAVE8: LD A,0FH + LD (IY+6),A + LD (JSAVE1),A ;SAVE DATA AFTER JOB + JR DSAVE2 + +DSAVE9: CP 0DH + JP NZ,ESAVE + LD A,(NSSP) + INC A + CP 27 + CCF + JP C,SOVER ;STACK OVER + LD (NSSP),A + LD HL,(BXL) + PUSH HL ;SAVE BXL + LD L,(IY+4) + LD H,(IY+5) + LD (BXL),HL + CALL LBSR + LD (DSAVEB+2),IY + LD DE,7 + ADD IY,DE + LD BC,(DSAVEC+1) + DEC BC + LD (DSAVEA+1),SP + LD SP,(SSP) + PUSH IX ;BXL + LD DE,(BXR) + PUSH DE + PUSH BC + PUSH IY + LD (SSP),SP +DSAVEA: LD SP,00H ;XXH +DSAVEB: LD IY,00H ;XXH + POP HL + LD (BXL),HL + JP DSAVE7 + +ESAVE: EX AF,AF' + CALL SVDT + DEC DE + LD A,0FH + LD (DE),A + EX AF,AF' + CP 3 + JR NZ,ESAVE2 +ESAVE1: LD HL,(BXR) + LD (BXL),HL + LD L,(IY+4) + LD H,(IY+5) ;SBXR + LD (BXR),HL + CALL LBSR + PUSH IX + POP HL + LD (IY+2),L + LD (IY+3),H + RET + +ESAVE2: CP 4 + JR Z,ESAVE3 + LD HL,(DSP) + PUSH HL + LD (SVDT1+1),IY + CALL SVDT + LD HL,WORK + LD (SVDT1+1),HL + LD HL,(BXL) + PUSH HL + CALL ESAVE1 + POP HL + LD (BXR),HL + POP IY + JR ESAVE4 + +ESAVE3: LD HL,(BXL) + LD (BXR),HL +ESAVE4: LD L,(IY+2) + LD H,(IY+3) + LD (BXL),HL + CALL RBSR + PUSH IX + POP HL + LD (IY+4),L + LD (IY+5),H + RET + +;*------------------------------------------------------ +;* Top of p.322 in German Listing of MZ-2Z046 Disk Basic +;*------------------------------------------------------ +;*----------------------- +;* NEXT BOUNDARY SEARCH +;*----------------------- +NBSRCH: LD HL,(BXL) + LD (PBXL),HL + LD HL,(BXR) + LD (PBXR),HL + CALL LBSR + RET C ;CLOSE + LD (BXL),IX + CALL RBSR + LD (BXR),IX + CALL CONT0 ;CF=0 + LD A,B + RET + +;*----------------------- +;* CHANGE Y DIRECTON +;* & +;* NEXT Y CO-ORDINATE +;*----------------------- +CHDIR: LD A,(DIRECT) + CPL + LD (DIRECT),A +CHDIR0: LD HL,(Y) + INC L + OR A + JR NZ,CHDIR1 + DEC L + DEC L +CHDIR1: LD (Y),HL + RET + +TWR: CALL CHDIR + CALL NBSRCH + RET C + PUSH AF + LD HL,(BXL) + PUSH HL + LD HL,(BXR) + PUSH HL + CALL CSAVE + LD A,(JSAVE) + OR A + CALL Z,SVDT + POP HL + LD (BXR),HL + POP HL + LD (BXL),HL + POP AF + RET + +;*--------------------- +;* LEFT BOUNDARY SEARCH +;*--------------------- +LBSR: LD DE,(BXR) + LD HL,(BXL) + PUSH HL + LD (BSRCH4+1),DE + LD HL,00H + LD (BSRCH6+1),HL + LD A,2BH ;DEC IX + LD (BSRCH3+1),A + LD A,2FH ;CPL + LD (BSRCH5),A + XOR A + LD (BSRCH7),A + LD HL,BSRCHL + LD (BSRCH1+1),HL + LD HL,BSRCHR + LD (BSRCH2+1),HL + POP DE + INC DE + JR BSRCH +;*----------------------------------------------------------- +;* Near Top of p.324 in German Listing of MZ-2Z046 Disk Basic +;*----------------------------------------------------------- +;*---------------------- +;* RIGHT BOUNDARY SEARCH +;*---------------------- +RBSR: LD DE,(BXR) +RBSR0: LD HL,(BXL) + LD (BSRCH6+1),HL + DB 21H ;LD HL,640 or 320 +LRBSR: DW 0280H ;dynamic 0280H or 0140H (WAS 8002H!!) + LD (BSRCH4+1),HL + LD A,23H ;INC IX + LD (BSRCH3+1),A + LD A,2FH ;CPL + LD (BSRCH7),A + XOR A + LD (BSRCH5),A + LD HL,BSRCHR + LD (BSRCH1+1),HL + LD HL,BSRCHL + LD (BSRCH2+1),HL + DEC DE +;*---------------- +;* SEARCH ROUTINE +;*---------------- +BSRCH: LD HL,(Y) + PUSH DE + POP IX + CALL ADCH + LD DE,TDOTN + PUSH HL + LD H,0 + LD L,A + ADD HL,DE + LD C,(HL) + POP HL + CALL WAREA + LD E,A + AND C +BSRCH1: JP Z,BSRCHL ;JP BSRCHR +BSRCH2: CALL BSRCHR ;CALL BSRCHL +BSRCH3: DEC IX ;INC IX + RET + +;*-------------- +;* SEARCH LEFT +;*-------------- +BSRCHL: DEC IX + RRC C + JR NC,BSRCHC + PUSH IX + EXX + POP DE + INC DE +BSRCH6: LD HL,00H ;BX + INC HL + SBC HL,DE + EXX + RET NC + DEC HL + CALL WAREA + LD E,A +BSRCHC: LD A,E +BSRCH7: NOP ;CPL + AND C + JP Z,BSRCHL + RET + +;*--------------- +;* SEARCH RIGHT +;*--------------- +BSRCHR: INC IX + RLC C + JR NC,BSRCHA + CALL BSRCHD + RET C + INC HL + CALL WAREA + LD E,A +BSRCHA: LD A,E +BSRCH5: CPL ;NOP + AND C + JR Z,BSRCHR +BSRCHD: PUSH IX + EXX + POP HL +BSRCH4: LD DE,BXR + XOR A + SBC HL,DE + EXX + CCF + RET + +;*------------- +;* CONT. CHECK +;*------------- +;*----------------------------------------------------- +;* The original source shows the routine below as CONT +;* This creates a nasty problem with duplicate labels ! +;*----------------------------------------------------- +CONT0: LD B,0H + LD HL,(PBXR) + LD DE,(BXR) + CALL CONT1 + LD HL,(PBXL) + LD DE,(BXL) + INC HL ;FOR HL=FFH + INC DE ;FOR DE=FFH +CONT1: PUSH HL + XOR A + INC HL + SBC HL,DE + POP HL + RL B + INC DE + EX DE,HL + SBC HL,DE + RL B + RET + +;*--------------- +;* POINT DATA +;* SAVE & LOAD +;*--------------- +;*------------ +;* DATA SAVE +;*------------ +SVDT: LD DE,(DSP) +SVDT0: LD HL,0000 ; XX END ADD + XOR A + SBC HL,DE + JR NC,SVDT1 +SOVER: DB 31H ;STACK POINTER +SOVER1: DW 00H ;LD SP,xxH + SCF + RET + +SVDT1: LD HL,WORK + LD BC,0007H + LDIR + LD (DSP),DE + LD HL,(NDSP) + INC HL + LD (NDSP),HL + RET + +;*---------------- +;* PAINT & SEARCH +;*---------------- +PSRCH: LD HL,(Y) + LD DE,(BXR) + DEC DE + CALL ADCH + LD DE,TDOTR + PUSH HL + LD H,0 + LD L,A + ADD HL,DE + INC C + LD B,C + LD C,(HL) + POP HL +PSRCH1: CALL WAREA + AND C + JR NZ,PSRCH2 ;BOUND + DI + IN A,(LSE0) + LD (HL),C + IN A,(LSE1) + EI + LD C,0FFH + DEC HL + DJNZ PSRCH1 + LD DE,-1 + JR PSRCH5 + +PSRCH2: LD E,B + LD B,7H + LD D,00H +PSRCH3: RLC A + JR C,PSRCH4 + SCF + RR D + DJNZ PSRCH3 +PSRCH4: IN A,(LSE0) + LD A,C + AND D + LD (HL),A + IN A,(LSE1) + LD A,E + DEC A + RLC A + RLC A + RLC A + LD C,A + LD A,07H + AND C + LD D,A + LD A,0F8H + AND C + OR B + LD E,A +PSRCH5: XOR A + LD HL,(BXL) + SBC HL,DE + RET + +;*------------------------------------------- +;* Routine at DPEEK: below is copied to WAREA +;*------------------------------------------- +DPEEK: PUSH HL + EXX + POP HL + DI + IN A,(LSE0) + LD C,LSRF + XOR A +DPEEK1: LD B,00H ;RE DATA + OUT (C),B + OR (HL) +DPEEK2: LD E,A + IN A,(LSE1) + EI + LD A,E + EXX +DPEEK3: RET + +;*--------------- +;* COMP. BXL,BXR +;*--------------- +COMP: LD HL,(BXL) + LD E,(IY+2) + LD D,(IY+3) + INC HL + INC DE + XOR A + CALL COMP1 + LD HL,(BXR) + LD E,(IY+4) + LD D,(IY+5) +COMP1: SBC HL,DE + RLA + RLA + RET Z + OR 1 + RET + +;* END of code in the original module MON-GRPH.ASM +;*============================================================================= +;* START of NEW module containing PATCHES 1 to 8 and a large SPARE AREA + +;*--------------------------------- +;* MZ-800 QUICKDISK BASIC MZ- 5Z009 +;*Patches to convert v1.0A to v1.0B +;*Added to ASM file 24 January 2004 +;*--------------------------------- + +PATCH1: LD A,0C0H + OUT (SIOAC),A + RET + +PATCH2: DI + CALL EMFRB + EI + RET + +PATCH3: DI + CALL EMCLR + EI + RET + +PATCH4: DI + JP EMLD2 + +PATCH5: LD (HL),D + OR A + EI + RET + +PATCH6: DI + CALL EMLDD + EI + RET + +PATCH7: DI + JP EMLD2 + +PATCH8: CALL EMSVB + EI + RET + +;*============================================================================ + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0 ; SPARE AREA 55B3H to 57FFH + + + +H55C0: DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + +H5600: DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + +H5700: DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + +;* END of additional module containing PATCHES 1 to 8 and SPARE AREA +;*============================================================================ +;* START of original module XSYS.ASM + + ORG 5800H ;set start of main BASIC module + +BSTART: +;* +;* END of original module XSYS.ASM +;*============================================================================ +;*Original module MONEQU.ASM was here, omitted as it created duplicate labels +;*============================================================================ +;* START of original module BASIC.ASM +;* +;*--------------------------- +;* MZ-800 BASIC Main program +;* FI:BASIC ver 1.0A 9.06.84 +;* Programmed by T.Miho +;*--------------------------- + +CHYEN: EQU 7DH ;YEN character (on Japanese machines) + +SBASIC: PUSH BC + CALL CLSHET + POP BC + LD HL,NEWAD0 + LD (TEXTST),HL + LD HL,CLSST + LD (SYSSTA),HL + LD A,B + OR A +COLDRT: JP Z,SBAS2 ;JP SBAS3 Change + CP 1 + JR Z,SBAS2 + LD HL,ARUN + LD DE,INBUFL + LD BC,16 + LDIR +SBAS2: LD DE,IMDBUF + RST 18H + DB .CRTMS + RST 18H + DB .BELL + LD A,0C3H + LD (COLDRT),A + LD HL,SBAS3 + LD (COLDRT+1),HL +SBAS3: LD HL,NEWAD0 +MEMCLI: LD (HL),0 + INC HL + LD A,H + CP 0FFH ;mem max + JR C,MEMCLI + CALL MEMSET + CALL NEWTXT + CALL IOINIT + JR HOTENT + +ARUN: DB 15 + DB "RUN \"AUTO RUN\"" + DB 0DH + +CLSHET: LD A,1 ;INIT "CRT:M1" + RST 18H + DB .DSMOD + XOR A + LD (PWMODE),A + INC A + LD (CRTMD2),A + LD (CRTMD1),A + RST 18H + DB .ICRT + RET + +CLSST: CALL CLSHET +HOTENT: LD HL,ERRORA + LD (ERRORP),HL +OK: RST 18H + DB .CR2 + LD DE,OKMES + RST 18H + DB .CRTMS + RST 18H + DB .CR1 +INPAGN: LD A,(CONTFG) + OR A + JR NZ,INPAG2 + LD SP,(INTFAC) + LD HL,0FFFFH + PUSH HL + LD (STACK),SP +INPAG2: LD HL,0 ;Set direct-mode + LD (LNOBUF),HL + XOR A + LD (CMTMSG),A + CALL AUTODS + RST 18H ;FD,QD motor off + DB .ERCVR + LD DE,KEYBUF + RST 18H + DB .GETL + JR NC,NORINP +AUTOFF: LD HL,AUTOFG + LD A,(HL) + OR A + LD (HL),0 + JR NZ,OK + JR INPAGN + +NORINP: CALL SKPDE + OR A + JR Z,INPAGN + CALL TSTNUM + JP NC,EDITOR + LD HL,IMDBUF ;Direct command + PUSH HL + CALL CVIMTX + INC HL + LD (NXTLPT),HL + CALL LDHL00 + POP HL + JR MAIN + +;*-------- +;* Execute +;*-------- +MAIN9: CALL CHKEND +MAIN: LD (STACK),SP +MAIN0: LD DE,MAIN9 + PUSH DE +MAIN2: LD (TEXTPO),HL + CALL BRKCHK + JP Z,BREAKZ +MAIN4: LD A,(HL) + INC HL + CP 80H + JR NC,STATEM + CP 27H ; REM + JP Z,DATA + CP 20H ; SP + JR Z,MAIN4 + CP 3AH ; colon + JR Z,MAIN2 + OR A + JR Z,ENDLIN ;END OF LINE + DEC HL + SUB 41H + CP 26 + JP C,LET + JP ER01 + +ENDLIN: LD HL,(NXTLPT) +NXLINE: LD E,(HL) + INC HL + LD D,(HL) + LD A,D + OR E + JR Z,ENDPRG ;END OF PROGRAM + LD (CMTMSG),A + EX DE,HL + ADD HL,DE + DEC HL + LD (NXTLPT),HL + EX DE,HL + INC HL + CALL LDDEMI + LD (LNOBUF),DE + CALL TRDISP + POP DE + JR MAIN + +ENDPRG: POP HL + CALL QDIRECT + JP Z,OK + XOR A + LD (CONTFG),A + LD A,(ERRORF) + CP 2 + JP Z,ER20 + PUSH HL + JP ENDCMD ;end command + +STATEM: CP 0FFH ;command jp + JP Z,PFUNCT + LD DE,GJPTBL + CP 0FEH + JR NZ,NROSTM + LD A,(HL) + INC HL + JR MIDFJP + +NROSTM: CP 0E0H + JP NC,ER01 + LD DE,SJPTBL +MIDFJP: ADD A,A + PUSH HL + EX DE,HL + LD E,A + LD D,0 + ADD HL,DE + LD A,(HL) + INC HL + LD H,(HL) + LD L,A + EX (SP),HL +ENDCHK: CALL HLFTCH +ENDCK0: OR A + RET Z + CP ':' + RET + +QDIRECT: PUSH HL ;Direct mode ? + LD HL,(LNOBUF) + LD A,L + OR H + POP HL + RET + +;*--------------------- +;* BASIC KEYWORD TABLE +;*--------------------- +CTBL1: DB "GOT" ; TOKEN 80H + DB 'O'+80H + DB "GOSU" + DB 'B'+80H + DB 80H + DB "RU" + DB 'N'+80H + DB "RETUR" + + DB 'N'+80H + DB "RESTOR" + + DB 'E'+80H + DB "RESUM" + + DB 'E'+80H + DB "LIS" + DB 'T'+80H + DB 80H ; TOKEN 88H + DB "DELET" + + DB 'E'+80H + DB "RENU" + DB 'M'+80H + DB "AUT" + DB 'O'+80H + DB "EDI" + DB 'T'+80H + DB "FO" + DB 'R'+80H + DB "NEX" + DB 'T'+80H + DB "PRIN" + DB 'T'+80H + DB 80H ; TOKEN 90H (NOT USED) + DB "INPU" + DB 'T'+80H + DB 80H + DB "I" + DB 'F'+80H + DB "DAT" + DB 'A'+80H + DB "REA" + DB 'D'+80H + DB "DI" + DB 'M'+80H + DB "RE" + DB 'M'+80H + DB "EN" ; TOKEN 98H + DB 'D'+80H + DB "STO" + DB 'P'+80H + DB "CON" + DB 'T'+80H + DB "CL" + DB 'S'+80H + DB 80H + DB "O" + DB 'N'+80H + DB "LE" + DB 'T'+80H + DB "NE" + DB 'W'+80H + DB "POK" ; TOKEN A0H + DB 'E'+80H + DB "OF" + DB 'F'+80H + DB "PMOD" + DB 'E'+80H + DB "PSKI" + DB 'P'+80H + DB "PLO" + DB 'T'+80H + DB "PLIN" + DB 'E'+80H + DB "RLIN" + DB 'E'+80H + DB "PMOV" + DB 'E'+80H + DB "RMOV" ; TOKEN A8H + DB 'E'+80H + DB "TRO" + DB 'N'+80H + DB "TROF" + DB 'F'+80H + DB "INP" + DB '@'+80H + DB "DEFAUL" + + DB 'T'+80H + DB "GE" + DB 'T'+80H + DB "PCOLO" + + DB 'R'+80H + DB "PHOM" + DB 'E'+80H + DB "HSE" ; TOKEN B0H + DB 'T'+80H + DB "GPRIN" + + DB 'T'+80H + DB "KE" + DB 'Y'+80H + DB "AXI" + DB 'S'+80H + DB "LOA" + DB 'D'+80H + DB "SAV" + DB 'E'+80H + DB "MERG" + DB 'E'+80H + DB "CHAI" + DB 'N'+80H + DB "CONSOL" ; TOKEN B8H + + DB 'E'+80H + DB "SEARC" + + DB 'H'+80H + DB "OUT" + DB '@'+80H + DB "PCIRCL" + + DB 'E'+80H + DB "PTES" + DB 'T'+80H + DB "PAG" + DB 'E'+80H + DB "WAI" + DB 'T'+80H + DB "SWA" + DB 'P'+80H + DB 80H ; TOKEN C0H (NOT USED) + DB "ERRO" + DB 'R'+80H + DB "ELS" + DB 'E'+80H + DB "US" + DB 'R'+80H + DB "BY" + DB 'E'+80H + DB 80H + DB 80H + DB "DE" + DB 'F'+80H + DB 80H ; TOKEN C8H (NOT USED) + DB 80H + DB "LABE" + DB 'L'+80H + DB 80H + DB 80H + DB 80H + DB "WOPE" + DB 'N'+80H + DB "CLOS" + DB 'E'+80H + DB "ROPE" ; TOKEN D0H + DB 'N'+80H + DB "XOPE" + DB 'N'+80H + DB 80H + DB 80H + DB 80H + DB "DI" + DB 'R'+80H + DB 80H + DB 80H + DB "RENAM" ; TOKEN D8H + + DB 'E'+80H + DB "KIL" + DB 'L'+80H + DB "LOC" + DB 'K'+80H + DB "UNLOC" + + DB 'K'+80H + DB "INI" + DB 'T'+80H + DB 80H + DB 80H + DB 80H + DB 'T' ; TOKEN E0H + DB 'O'+80H + DB "STE" + DB 'P'+80H + DB "THE" + DB 'N'+80H + DB "USIN" + DB 'G'+80H + DB 80H ; TOKEN E4H (RESERVED FOR PI) + DB "AL" + DB 'L'+80H + DB "TA" + DB 'B'+80H + DB "SP" + DB 'C'+80H + DB 80H ; TOKEN E8H + DB 80H + DB ".XO" + DB 'R'+80H + DB ".O" + DB 'R'+80H + DB ".AN" + DB 'D'+80H + DB ".NO" + DB 'T'+80H + DB ">" + DB '<'+80H + DB "<" + DB '>'+80H + DB "=" ; TOKEN F0H + DB '<'+80H + DB "<" + DB '='+80H + DB "=" + DB '>'+80H + DB ">" + DB '='+80H + DB '='+80H + DB '>'+80H + DB '<'+80H + DB '+'+80H + DB '-'+80H ; TOKEN F8H + DB '\\'+80H ; THIS WAS '%YEN' in Japanese source code + DB ".MO" + DB 'D'+80H + DB '/'+80H + DB '*'+80H + DB '^'+80H + DB 0FFH ;FF marks the END of CTBL1 + +GTABL: DB 80H ; DOUBLE TOKEN FE 80 + DB "CSE" + DB 'T'+80H + DB "CRESE" + + DB 'T'+80H + DB "CCOLO" + + DB 'R'+80H + DB 80H + DB 80H + DB 80H + DB 80H + DB 80H ; DOUBLE TOKEN FE 88 (NOT USED) + DB 80H + DB "SOUN" + DB 'D'+80H + DB 80H + DB "NOIS" + DB 'E'+80H + DB "BEE" + DB 'P'+80H + DB 80H ; MZ-1500 VOICE + DB 80H + DB "COLO" ; DOUBLE TOKEN FE 90 + DB 'R'+80H + DB 80H ; MZ-1500 PRTY + DB "SE" + DB 'T'+80H + DB "RESE" + DB 'T'+80H + DB "LIN" + DB 'E'+80H + DB "BLIN" + DB 'E'+80H + DB "PA" + DB 'L'+80H + DB "CIRCL" + + DB 'E'+80H + DB "BO" ; DOUBLE TOKEN FE 98 + DB 'X'+80H + DB "PAIN" + DB 'T'+80H + DB "POSITIO" + + DB 'N'+80H + DB "PATTER" + + DB 'N'+80H + DB "HCOP" + DB 'Y'+80H + DB 80H ; MZ-1500 KPATTERN + DB 80H ; MZ-1500 FPRINT + DB 80H + DB "SYMBO" ; DOUBLE TOKEN FE A0 + + DB 'L'+80H + DB 80H + DB "MUSI" + DB 'C'+80H + DB "TEMP" + DB 'O'+80H + DB "CURSO" + + DB 'R'+80H + DB "VERIF" + + DB 'Y'+80H + DB "CL" + DB 'R'+80H + DB "LIMI" + DB 'T'+80H + DB 80H ; DOUBLE TOKEN FE A8 + DB 80H + DB 80H + DB 80H + DB 80H + DB 80H + DB "BOO" + DB 'T'+80H + DB 0FFH ; FFH marks the END of GTABL + +CTBL2: DB "IN" ; DOUBLE TOKEN FF 80 + DB 'T'+80H + DB "AB" + DB 'S'+80H + DB "SI" + DB 'N'+80H + DB "CO" + DB 'S'+80H + DB "TA" + DB 'N'+80H + DB "L" + DB 'N'+80H + DB "EX" + DB 'P'+80H + DB "SQ" + DB 'R'+80H + DB "RN" ; DOUBLE TOKEN FF 88 + DB 'D'+80H + DB "PEE" + DB 'K'+80H + DB "AT" + DB 'N'+80H + DB "SG" + DB 'N'+80H + DB "LO" + DB 'G'+80H + DB "FRA" + DB 'C'+80H + DB "PA" + DB 'I'+80H + DB "RA" + DB 'D'+80H + DB 80H ; DOUBLE TOKEN FF 90 + DB 80H + DB 80H + DB 80H + DB 80H + DB 80H + DB 80H + DB 80H + DB 80H ; DOUBLE TOKEN FF 98 + DB 80H + DB 80H + DB 80H + DB "STIC" + DB 'K'+80H + DB "STRI" + DB 'G'+80H + DB 80H ; MZ-1500 JOY + DB 80H + DB "CHR" ; DOUBLE TOKEN FF A0 + DB '$'+80H + DB "STR" + DB '$'+80H + DB "HEX" + DB '$'+80H + DB 80H + DB 80H + DB 80H + DB 80H + DB 80H + DB "SPACE" ; DOUBLE TOKEN FF A8 + + DB '$'+80H + DB 80H + DB 80H ; MZ-1500 ASCCHR$ + DB "AS" + DB 'C'+80H + DB "LE" + DB 'N'+80H + DB "VA" + DB 'L'+80H + DB 80H + DB 80H + DB 80H ; DOUBLE TOKEN FF B0 + DB 80H + DB 80H ; MZ-1500 HEXCHR$ + DB "ER" + DB 'N'+80H + DB "ER" + DB 'L'+80H + DB "SIZ" + DB 'E'+80H + DB "CSR" + DB 'H'+80H + DB "CSR" + DB 'V'+80H + DB "POS" ; DOUBLE TOKEN FF B8 + DB 'H'+80H + DB "POS" + DB 'V'+80H + DB "LEFT" + DB '$'+80H + DB "RIGHT" + + DB '$'+80H + DB "MID" + DB '$'+80H + DB 80H ; MZ-1500 FONT$ + DB 80H + DB 80H + DB 80H ; DOUBLE TOKEN FF C0 + DB 80H + DB 80H + DB 80H + DB "TI" + DB '$'+80H + DB "POIN" + DB 'T'+80H + DB "EO" + DB 'F'+80H + DB "F" + DB 'N'+80H + DB 0FFH ; FFH marks the END of CTBL2 + +;*----------------------------- +;* BASIC KEYWORDS ADDRESS TABLE +;*----------------------------- +SJPTBL: DW GOTO ; 80 + DW GOSUB + DW ER01 + DW RUN + DW RETURN + DW RESTOR + DW RESUME + DW LIST + DW ER01 ; 88 + DW DELETE + DW RENUM + DW AUTO + DW EDIT + DW FOR + DW NEXT + DW PRINT + + DW ER01 ; 90 + DW INPUT + DW ER01 + DW IF + DW DATA + DW READ + DW DIM + DW REM + DW ENDCMD ; 98 + DW STOP + DW CONT + DW CLS + DW ER01 + DW ON + DW LET + DW NEW + + DW POKE ; A0 + DW ER01 + DW PMODE ;WAS 'MODE' (error) + DW SKIP + DW PLOT + DW PLINE + DW RLINE + DW PMOVE + DW RMOVE ; A8 + DW TRON + DW TROFF + DW INP@ + DW DEFAULT + DW GETOP + DW PCOLOR + DW PHOME + + DW HSET ; B0 + DW GPRINT + DW KLIST + DW AXIS + DW LOAD + DW SAVE + DW MERGE + DW CHAIN + DW CONSOL ; B8 + DW SEARCH + DW OUT@ + DW PCIRCLE + DW TEST + DW PAGE + DW PAUSE + DW SWAP + + DW ER01 ; C0 + DW ERRORCMD + DW ELSECMD + DW USR + DW BYE + DW ER01 + DW ER01 + DW DEFOP + DW ER01 ; C8 + DW ER01 + DW LABEL + DW ER01 + DW ER01 + DW ER01 + DW WOPEN + DW CLOSE + + DW ROPEN ; D0 + DW XOPEN + DW ER01 + DW ER01 + DW ER01 + DW DIR + DW ER01 + DW ER01 + DW RENAME ; D8 + DW KILL + DW LOCK + DW UNLOCK + DW INIT + DW ER01 + DW ER01 + DW ER01 + +GJPTBL: DW ER01 ; FE 80 + DW ER01 + DW ER01 + DW ER01 + DW ER01 + DW ER01 + DW ER01 + DW ER01 + DW ER01 ; FE 88 + DW ER01 + DW SOUND + DW ER01 + DW NOISE + DW BEEP + DW ER01 + DW ER01 + + DW COLOR ; FE 90 + DW ER01 + DW SETCMD + DW RESET + DW LINE + DW BLINE + DW PALET + DW CIRCLE + DW BOX ; FE 98 + DW PAINT + DW POSITION + DW PATTERN + DW HCOPY + DW ER01 + DW ER01 + DW ER01 + + DW SMBOL ; FE A0 + DW ER01 + DW MUSIC + DW TEMPO + DW CURSOR + DW VERIFY + DW CLR + DW LIMIT + DW ER01 ; FE A8 + DW ER01 + DW ER01 + DW ER01 + DW ER01 + DW ER01 + DW BOOT + +FJPTBL: DW INTOPR ; FF 80 + DW ABS + DW SIN + DW COS + DW TAN + DW LOG ;LN (to base 'e') + DW EXP + DW SQR + DW RND ; FF 88 + DW PEEK + DW ATN + DW SGN + DW LOGD ;LOG (to base 10) + DW FRACT + DW PAI + DW RAD + + DW ER01 ; FF 90 + DW ER01 + DW ER01 + DW ER01 + DW ER01 + DW ER01 + DW ER01 + DW ER01 + DW ER01 ; FF 98 + DW ER01 + DW ER01 + DW ER01 + DW STCK + DW STIG + DW ER01 + DW ER01 + + DW ER01 ; FF A0 CHR$ + DW STR$ + DW HEX$ + DW ER01 + DW ER01 + DW ER01 + DW ER01 + DW ER01 + DW SPACE$ ; FF A8 + DW ER01 + DW ER01 + DW ASC + DW LEN + DW VAL + DW ER01 + DW ER01 + + DW ER01 ; FF B0 + DW ER01 + DW ER01 + DW ERR + DW ERL + DW SIZE + DW CSRH + DW CSRV + DW POSH ; FF B8 + DW POSV + DW LEFT$ + DW RIGHT$ + DW MID$ + DW ER01 + DW ER01 + DW ER01 + + DW ER01 ; FF C0 + DW ER01 + DW ER01 + DW ER01 + DW TI$ + DW POINT + DW EOF + DW FNEXP ; FN + DW ER01 ; FF C8 + DW ER01 + DW ER01 + DW ER01 + DW ER01 + DW ER01 + DW ER01 + DW ER01 + +;*-------------- +;* GET LINE ADRS +;*-------------- +GETLIN: CALL TEST1 + DB 0CH + JR NZ,GLIN2 + CALL LDDEMI + OR 0FFH + RET + +GLIN2: INC HL + CP 0BH + JR NZ,GLIN4 + LD E,(HL) + INC HL + LD D,(HL) + INC HL + LD A,E + OR D + RET Z + EX DE,HL + CALL LNOSER + JP C,ER16 + EX DE,HL + DEC HL + LD (HL),D + DEC HL + LD (HL),E + DEC HL + LD (HL),0CH + INC HL + INC HL + INC HL + OR 0FFH + LD (REFFLG),A + RET + +GLIN4: CP '"' + JP NZ,ER01 + LD (LABA+1),HL + LD B,0 +GLIN6: LD A,(HL) + OR A + JR Z,GLIN8 + INC HL + CP '"' + JR Z,GLIN8 + INC B + JR GLIN6 +GLIN8: LD A,B + OR A + JP Z,ER01 + LD (LABN+1),A + EX DE,HL + CALL LABSER + JP C,ER16 + EX DE,HL + OR 0FFH + RET + +;*----------------------- +;* LABSER .. Label search +;* LNOSER .. Line# search +;*----------------------- +LABSER: PUSH BC + LD BC,LABSUB + JR LNOSR0 +LNOSER: PUSH BC + LD BC,LNOSUB +LNOSR0: LD (LNOSRQ+1),BC + PUSH DE + EX DE,HL + LD HL,(TEXTST) +LNOSR2: LD C,(HL) + INC HL + LD B,(HL) + LD A,B + OR C + SCF + JR Z,LNOSR9 + DEC HL + PUSH HL + ADD HL,BC + EX (SP),HL +LNOSRQ: CALL 0 + JR C,LNOSR8 + JR Z,LNOSR8 + POP HL + JR LNOSR2 +LNOSR8: POP DE ;DMY +LNOSR9: POP DE + POP BC + RET + +LNOSUB: INC HL + INC HL + INC HL + LD A,D + CP (HL) + RET NZ + DEC HL + LD A,E + CP (HL) + DEC HL + DEC HL + RET + +LABSUB: PUSH HL + INC HL + INC HL + INC HL + INC HL + CALL TEST1 ;LABEL + DB 0CAH + JR NZ,LABSR9 + CALL TEST1 + DB '"' + JR NZ,LABSR9 +LABN: LD B,0 ;Label length +LABA: LD DE,0 ;Label adrs +LABSR2: LD A,(DE) + CP (HL) + JR NZ,LABSR9 + INC HL + INC DE + DJNZ LABSR2 + LD A,(HL) + CP '"' + JR Z,LABSR9 + OR A +LABSR9: SCF + CCF + POP HL + RET + +;*---------------------- +;* START.LINE - END.LINE +;*---------------------- +GTSTED: LD DE,0000H + LD BC,0FFFFH + CALL END2C + RET Z + CP '-' + JR Z,GTNXNM + CP '.' + LD DE,(EDLINE) + JR Z,NX2C2D + CALL TESTX + DB 0BH + LD E,(HL) + INC HL + LD D,(HL) +NX2C2D: INC HL + CALL END2C + JR Z,ONELLN + CP '-' + JR Z,GTNXNM +ONELLN: LD C,E + LD B,D + RET + +GTNXNM: INC HL + CALL END2C + RET Z + CP '.' + JR NZ,GTEDNO + LD BC,(EDLINE) + INC HL + RET + +GTEDNO: CALL TESTX + DB 0BH + LD C,(HL) + INC HL + LD B,(HL) + INC HL + RET + +END2C: CALL ENDCHK + RET Z + CP ',' + RET + +;*------------------------------ +;* REFADR ... Line ref = Adrs +;* REFLNO ... Line ref = Number +;*------------------------------ +REFADR: CALL PUSHR + LD A,0FFH + LD (REFFLG),A + LD HL,CVASUB + JR REFL2 + +REFLNO: CALL PUSHR + CALL CLRFLG +REFLNX: LD A,(REFFLG) + OR A + RET Z + XOR A + LD (REFFLG),A + LD HL,CVLSUB +REFL2: LD (CVRTLN+1),HL + LD HL,(TEXTST) + DEC HL +REFL4: INC HL + LD A,(HL) + INC HL + OR (HL) + RET Z + INC HL + LD E,(HL) + INC HL + LD D,(HL) + LD (CVALN+1),DE +REFL6: CALL IFSKSB + OR A + JR Z,REFL4 +CVRTLN: JP 0 + +CVLSUB: CP 0CH + JR NZ,REFL6 + DEC HL + LD E,(HL) + INC HL + LD D,(HL) + PUSH HL + EX DE,HL + INC HL + INC HL + LD E,(HL) + INC HL + LD D,(HL) + POP HL + LD (HL),D + DEC HL + LD (HL),E + DEC HL + LD (HL),0BH + INC HL + INC HL + JR REFL6 + +CVASUB: CP 0BH + JR NZ,REFL6 + DEC HL + PUSH HL + CALL INDRCT + LD E,L + LD D,H + LD A,L + OR H + JR Z,CVAS9 + CALL LNOSER + JR C,CVASE + EX DE,HL + POP HL + DEC HL + LD (HL),0CH + INC HL + LD (HL),E + INC HL + LD (HL),D + JR REFL6 + +CVASE: PUSH DE + LD A,16 ;UNDEF LINE + RST 18H + DB .ERRX + LD A,20H + RST 18H + DB .CRT1C + POP HL + CALL ASCFIV + RST 18H + DB .CRTMS +CVALN: LD HL,0 ;xxx + CALL P.ERL + RST 18H + DB .CR2 +CVAS9: POP HL + INC HL + JR REFL6 + +REFFLG: DB 0 +;*--------------------------------------------------------- +;* Middle of p.359 in German Listing of MZ-2Z046 Disk Basic +;*--------------------------------------------------------- +EDITOR: RST 18H + DB .CLRIO + CALL REFLNO + CALL CVBCAS + LD A,B + OR C + JP Z,INPAGN + LD (EDLINE),BC + LD A,(DE) + CP 20H + JR NZ,EDIT1 + INC DE +EDIT1: PUSH AF + LD HL,IMDBUF + CALL CVIMTX + PUSH HL + LD HL,(EDLINE) + LD E,L + LD D,H + CALL DELSUB + POP HL ; END POINT + POP AF + OR A + JR Z,EDIT9 + LD DE,IMDBUF + OR A + SBC HL,DE + LD DE,5 + ADD HL,DE + LD B,H + LD C,L + LD HL,IMDBUF + CALL INSTLIN +EDIT9: LD A,(AUTOFG) + OR A + JP Z,INPAGN + LD DE,(EDSTEP) + LD HL,(EDLINE) + ADD HL,DE + LD (EDLINE),HL + JP NC,INPAGN + JP AUTOFF + +;*-------------------------- +;* INSTLIN HL .. IMD ADRS +;* BC .. IMD LENGTH +;*-------------------------- +INSTLIN: LD (INS.P+1),HL + PUSH BC + LD BC,(EDLINE) + LD HL,(TEXTST) + JR INSL4 +INSL2: CALL LDDEMD + ADD HL,DE +INSL4: CALL LDDEMD + LD A,D + OR E + JR Z,INSL6 + INC HL + INC HL + CALL LDDEMD + EX DE,HL + SBC HL,BC + DEC DE + DEC DE + EX DE,HL + JR C,INSL2 +INSL6: POP DE ;DE:=open bytes + PUSH HL ;Push inst-point + PUSH DE + LD HL,40 ;memory check ofset + ADD HL,DE + LD BC,(VARED) + LD (TMPEND),BC + ADD HL,BC + JP C,ER06A + EX DE,HL + CALL MEMECK + POP DE ;DE=open bytes + RST 18H + DB .ADDP0 + POP HL ;HL=inst point + PUSH DE ;DE=open bytes + PUSH BC + EX (SP),HL ;HL=old VARED + POP BC ;BC=inst point + PUSH HL + OR A + SBC HL,BC + LD B,H + LD C,L ;BC=xfer bytes + POP HL ;HL=old VARED + LD DE,(VARED) ;DE=new VARED + INC BC + LDDR + INC HL ;HL=inst point + POP BC ;BC=open bytes + LD (HL),C + INC HL + LD (HL),B + INC HL + LD DE,(EDLINE) + LD (HL),E + INC HL + LD (HL),D + INC HL + EX DE,HL +INS.P: LD HL,IMDBUF ;xxx + DEC BC + DEC BC + DEC BC + DEC BC + LDIR + RET + +RUN: JR Z,RUN0 ;RUN + CALL LINEQ2 + JP Z,GOTO ;RUN linenumber + JP FRUN ;RUN "filename" + +RUN0: CALL CLR +RUNX: CALL RUNINT + LD DE,(TEXTST) + LD SP,(INTFAC) + LD HL,0FFFFH + PUSH HL + PUSH HL + EX DE,HL + JP NXLINE + +RUNINT: PUSH HL + CALL CLRFLG + LD (AUTOFG),A + LD HL,10 + LD (EDLINE),HL + LD (EDSTEP),HL + POP HL + RET + +CLRFLG: LD HL,0 + LD (ERRLNO),HL + XOR A + LD (DATFLG),A + LD (CONTFG),A + LD (ERRORF),A + LD (ERRCOD),A + LD (LSWAP),A + RET + +ENDCMD: LD A,(LSWAP) + OR A + JP NZ,BSWAP + RST 18H ;END command + DB .CLRIO + XOR A + LD (CONTFG),A + POP BC + JP OK + +;*------------------------------------------------------ +;* Top of p.364 in German Listing of MZ-2Z046 Disk Basic +;*------------------------------------------------------ +AUTO: CALL CKCOM + LD DE,10 ;AUTO start,step + LD BC,10 + JR Z,AUTO6 + CP ',' + JR NZ,AUTO2 + INC HL + CALL IDEEXP + LD B,D + LD C,E + LD DE,10 + JR AUTO6 + +AUTO2: CP '.' + LD DE,(EDLINE) + JR Z,AUTO4 + CP 0BH + JP NZ,ER01 + INC HL + LD E,(HL) + INC HL + LD D,(HL) +AUTO4: INC HL + CALL TEST1 + DB ',' + JR NZ,AUTO6 + PUSH DE + CALL IDEEXP + LD C,E + LD B,D + POP DE +AUTO6: CALL CHKEND + LD A,C + OR B + JP Z,ER03 + LD (EDLINE),DE + LD (EDSTEP),BC + LD A,1 + LD (AUTOFG),A + POP AF + JP INPAGN + +AUTOFG: DB 0 ;(was DEFS 1) +AUTODS: LD A,(AUTOFG) ;Disp auto line + OR A + RET Z + XOR A + JR EDITL + +EDIT: CALL EDITL ;EDIT linenumber + JP INPAGN + +EDITL: LD DE,(EDLINE) + CALL NZ,GTSTED + PUSH DE + EX DE,HL + CALL LNOSER + POP DE + INC HL + INC HL + INC HL + INC HL + JR NC,EDL1 + LD HL,.NOP +EDL1: EX DE,HL + PUSH DE + LD (EDLINE),HL + CALL ASCFIV + RST 18H + DB .CRTMS + LD A,20H + RST 18H + DB .CRT1C + POP HL + LD DE,KEYBUF + PUSH DE + CALL CVTXIM + POP DE + LD B,0 +EDL2: LD A,(DE) + OR A + JR Z,EDL6 + INC B + RST 18H + DB .CRT1X + INC DE + JR EDL2 + +EDL6: LD A,B + OR A + RET Z +EDL7: LD A,14H ; CURSOR BACK + RST 18H + DB .CRT1C + DJNZ EDL7 ; erroneous DJNZ corrected here ! + RET + +MEMSET: PUSH DE + LD DE,-16 + ADD HL,DE + POP DE + LD (MEMLMT),HL + DEC H + LD (INTFAC),HL + XOR A + LD (LSWAP),A + RET + +NEWTXT: LD HL,(TEXTST) + CALL LDHL00 + LD (POOL),HL + CALL RUNINT + JR CLR + +NEW: CALL TEST1 ;NEW command + DB 9DH + CALL Z,NEWON + CALL NEWTXT + JP HOTENT + +CLR: PUSH HL ;CLR command + CALL CLPTR2 + POP HL + RST 18H + DB .CLRIO + RET + +CLPTR: LD HL,(TEXTST) + CALL LDHL00 + LD (POOL),HL +CLPTR2: LD HL,(POOL) + LD (HL),0 + INC HL + LD (VARST),HL + LD (HL),0 + INC HL + LD (STRST),HL + CALL LDHL00 + LD (VARED),HL + LD (TMPEND),HL + RET + +LDHL00: LD (HL),0 + INC HL + LD (HL),0 + INC HL + RET + +;*------------------------------------------------------ +;* Top of p.369 in German Listing of MZ-2Z046 Disk Basic +;*------------------------------------------------------ +TRON: CALL ENDCHK + LD A,1 + JR Z,TROFF+1 + CALL TESTX + DB 0FBH ;/ + CALL TESTX + DB 'P' + LD A,2 + JR TRONF + +TROFF: XOR A ;TROFF +TRONF: LD (TRDISP+1),A + RET + +TRDISP: LD A,0 ;0,1,2 + OR A + RET Z + DEC A + LD (FILOUT),A + JR Z,TRDSP2 + LD A,(PNMODE) + CP 2 + JR Z,TRDSP9 ;MODE GR +TRDSP2: PUSH HL + LD A,'[' + RST 18H + DB DH1C + LD HL,(LNOBUF) + CALL ASCFIV + RST 18H + DB DHMSG + LD A,']' + RST 18H + DB DH1C + POP HL +TRDSP9: XOR A + LD (FILOUT),A + RET + +DELETE: CALL END2C ;DELETE command + JP Z,ER01 ;DELETE, is error + CALL LINEQ2 + JR Z,DELLIN + CP '-' + JR Z,DELLIN + CP '.' + JP NZ,FDEL ;DELETE "filename" +DELLIN: CALL GTSTED ;DELETE lines xxx-yyy + EX DE,HL + LD E,C + LD D,B + CALL DELSUB + JP OK + +;*-------------------------- +;* Delete Lines (HL) to (DE) +;*-------------------------- +DELSUB: PUSH AF + PUSH BC + PUSH HL + PUSH DE + CALL REFLNO + LD C,L + LD B,H + LD HL,(TEXTST) +FSTLOP: CALL LDDEMI + LD A,E + OR D + JR NZ,FDDLST +RTDLTE: POP DE + POP HL + POP BC + POP AF + RET + +POPDLR: POP DE + JR RTDLTE + +FDDLST: EX DE,HL + ADD HL,DE + DEC HL + DEC HL + EX DE,HL + PUSH DE + LD E,(HL) + INC HL + LD D,(HL) + EX DE,HL + LD (LNOTBF),HL + SBC HL,BC + POP HL + JR C,FSTLOP + DEC DE + DEC DE + DEC DE + POP BC ; DELSUB END LINE NO. + PUSH BC + PUSH DE ; DELSUB START ADRS + PUSH HL ; NEXT LINE ADRS + + DB 21H ;dynamic LD HL,xxxxH +LNOTBF: DB 0,0 ;(was DEFS 2) + + SBC HL,BC + POP HL + JR Z,DLSTRT ; DEL-LINE END FOUND + JR NC,POPDLR ; NOTHING OCCUR +SNDDLP: CALL LDDEMI + LD A,D + OR E + JR Z,DLEFD + EX DE,HL + ADD HL,DE + EX DE,HL + DEC DE + DEC DE + PUSH DE + LD E,(HL) + INC HL + LD D,(HL) + EX DE,HL + SBC HL,BC + POP HL + JR C,SNDDLP + JR Z,DLSTRT + EX DE,HL + DEC HL +DLEFD: DEC HL + DEC HL +DLSTRT: POP DE + PUSH DE ;Delete (DE)-(HL) + PUSH HL + OR A + EX DE,HL + SBC HL,DE + EX DE,HL ;DE = - bytes + LD BC,(VARED) ;old VARED + RST 18H + DB .ADDP0 + POP DE ;DE = del end + LD H,B + LD L,C ;HL = old VARED + OR A + SBC HL,DE + LD B,H + LD C,L ;BC = move bytes + EX DE,HL ;HL = del end + POP DE ;DE = del start + LDIR + JR RTDLTE + +IDEEX0: CALL IDEEXP + LD A,D + OR E + RET NZ + JP ER03 + +RENUM: CALL CKCOM ;RENUMBER command + LD DE,10 ;RENUM xxx,yyy,zzz + LD (NEWNO),DE + LD (ADDNO),DE + LD E,0 + LD (STLNO),DE + JR Z,RNSTRT + CP ',' + JR Z,SKIRE1 + CALL IDEEX0 + LD (NEWNO),DE + CALL ENDCHK + JR Z,RNSTRT + CALL HCH2CH + DEC HL +SKIRE1: CALL INCHLF + CP ',' + JR Z,SKMRNU + CALL IDEEX0 + LD (STLNO),DE + CALL ENDCHK + JR Z,RNSTRT + CALL HCH2CH + DEC HL +SKMRNU: INC HL + CALL IDEEX0 + LD (ADDNO),DE +RNSTRT: PUSH HL + LD HL,(STLNO) + EX DE,HL + LD HL,(NEWNO) + OR A + SBC HL,DE + JP C,ER03 + CALL REFADR + LD HL,(TEXTST) +BEGRNS: LD E,(HL) + INC HL + LD D,(HL) + LD A,D + OR E + JR Z,RNUMED + EX DE,HL + ADD HL,DE + DEC HL + EX DE,HL + INC HL + LD C,(HL) + INC HL + LD B,(HL) + PUSH HL + DB 21H +STLNO: DB 0,0 ;(was DEFS 2) + OR A + SBC HL,BC + POP HL + JR Z,BEGREN + JR C,BEGREN + EX DE,HL + JR BEGRNS + +BEGREN: DEC HL + DEC HL + DEC HL + DB 01H +NEWNO: DB 0,0 ;(was DEFS 2) + OR A + PUSH AF +RENUML: LD E,(HL) + INC HL + LD D,(HL) + LD A,D + OR E + JR Z,RNUMED + EX DE,HL + ADD HL,DE + DEC HL + EX DE,HL + POP AF + JR C,RENOVR + INC HL + LD (HL),C + INC HL + LD (HL),B + DB 21H +ADDNO: DB 0,0 ;(was DEFS 2) + ADD HL,BC + PUSH AF + LD C,L + LD B,H + EX DE,HL + JR RENUML + +RNUMED: POP AF + CALL REFLNX + POP HL + RET + +RENOVR: LD HL,10 + LD (ADDNO),HL + LD (NEWNO),HL + LD L,0 + LD (STLNO),HL + CALL RNSTRT + JP ER03 + +;*-------------------------- +;* Error message & exception +;*-------------------------- +MAXERR: EQU 70 + +ER01: LD A,01 + DB 21H +ER02: LD A,02 + DB 21H +ER03: LD A,03 + DB 21H +ER04: LD A,04 + DB 21H +ER05: LD A,05 + DB 21H +ER06: LD A,06 + DB 21H +ER07: LD A,07 + DB 21H +ER08: LD A,08 + DB 21H +ER13: LD A,13 + DB 21H +ER14: LD A,14 + DB 21H +ER15: LD A,15 + DB 21H +ER16: LD A,16 + DB 21H +ER17: LD A,17 + DB 21H +ER18: LD A,18 + DB 21H +ER19: LD A,19 + DB 21H +ER20: LD A,20 + DB 21H +ER21: LD A,21 + DB 21H +ER22: LD A,22 + DB 21H +ER24: LD A,24 + DB 21H +ER25: LD A,25 + DB 21H +ER58: LD A,58 + DB 21H +ER64: LD A,64 + JR ERRJ2 + +ER06A: LD A,6 ;Nesting error +NESTER: LD SP,(INTFAC) + LD HL,0FFFFH + PUSH HL + LD (STACK),SP +ERRJ2: JR ERRJ1 + +LPTMER: LD HL,(DSLPT) ;LPT: Mode error + DB 0DDH +CRTMER: LD HL,(DSCRT) ;CRT: Mode error + LD (ZEQT),HL + XOR A + LD (ZFLAG2),A + LD A,68+80H ;+80H is I/O err + DB 21H +ER59: LD A,59+80H + DB 21H +ER59A: LD A,59 + DB 21H +ER60: LD A,60+80H + DB 21H +ER61: LD A,61+80H +ERRJ1: JP ERRORJ + +P.ERL: LD A,L ;Print "IN line#" + OR H + RET Z + LD DE,MESIN + RST 18H + DB .CRTMS + CALL ASCFIV + RST 18H + DB .CRTMS + RET + +MESIN: DB " IN " + DB 0 +MESBR: DB "BREAK" + DB 0 +OKMES: DB "READY" +CONTFG: DB 0 + DB 0 + +ERRORCMD: CALL IBYTE ;"ERROR" command + DEC A + CP MAXERR + JR C,ERRORX + LD A,69-1 +ERRORX: INC A + +ERRORA: LD SP,(STACK) ;jump from monitor + PUSH AF + RST 18H + DB .ERCVR + CALL LOAD10 ;WAS CALL LDEND (a duplicate label !) + POP AF + OR A + JR Z,.BRKX + CP 80H + JR Z,.BRKZ + LD C,A + LD HL,0 + LD (FNVRBF),HL + CALL QDIRECT + LD A,C + JR Z,ERR2 + LD HL,(LNOBUF) + LD (ERRLNO),HL + LD (EDLINE),HL + LD HL,(NXTLPT) + LD (ERRLPT),HL + LD HL,(TEXTPO) + LD (ERRPNT),HL + AND 7FH + LD (ERRCOD),A + LD A,(ERRORF) + INC A + CP 02H + JR Z,ERROPR + XOR A + LD (CONTFG),A + LD (LSWAP),A + LD A,C +ERR2: RST 18H + DB .ERRX +ERR4: LD HL,(LNOBUF) + CALL P.ERL + JP OK + +ERROPR: LD (ERRORF),A ;Error trap + LD HL,(ERRORV) + PUSH HL + JP NXLINE + +.BRKZ: LD A,'.' ;can CONT +.BRKX: LD HL,(TEXTPO) ;can't CONT + JR BREAK2 + +STOP: LD A,'.' ;STOP command (can CONT) + POP DE ;dummy POP +BREAK2: PUSH AF + PUSH HL + RST 18H + DB .CR2 + RST 18H + DB .BELL + LD DE,MESBR + RST 18H + DB .CRTMS + POP HL + CALL QDIRECT + JR Z,BREAK4 + LD (BREAKT+1),HL ;Text pointer + LD HL,(NXTLPT) + LD (BREAKN+1),HL ;Next line + LD HL,(LNOBUF) + LD (BREAKL+1),HL ;Line No. + LD (EDLINE),HL + POP AF + LD (CONTFG),A + JP ERR4 +BREAK4: POP AF + JP OK + +CONT: POP DE ;"CONT" command + LD HL,CONTFG + LD A,(HL) + OR A + JP Z,ER17 + LD (HL),0 +BREAKL: LD HL,0 ;Line No. + LD (LNOBUF),HL +BREAKN: LD HL,0 ;Next line + LD (NXTLPT),HL +BREAKT: LD HL,0 ;Text pointer + JP MAIN + +RESUME: LD A,(ERRORF) ;"RESUME" command + CP 2 + JP C,ER21 + DEC A + LD (ERRORF),A + CALL ENDCHK + EX DE,HL + LD HL,(ERRLNO) + LD (LNOBUF),HL + LD HL,(ERRLPT) + LD (NXTLPT),HL + LD HL,(ERRPNT) + JR NZ,RESUM2 + POP BC + JP MAIN0 ;RESUME +RESUM2: CP 8EH + JP Z,DATA ;RESUME NEXT + EX DE,HL + JP GOTO ;RESUME line# + +ONERRG: CALL TESTX ;GOTO + DB 80H + CALL GETLIN + JR Z,OFFER + LD (ERRORV),DE + LD A,1 +ONER9: LD (ERRORF),A + RET + +OFFER: LD A,(ERRORF) + DEC A + JR Z,ONER9 + XOR A + LD (ERRORF),A + LD HL,(ERRLNO) + LD (LNOBUF),HL + LD A,(ERRCOD) + JP ERRORA + +;* END of original module BASIC.ASM +;*============================================================================ +;* START of original module STMNT.ASM +;*---------------------------------- +;* MZ-800 BASIC Statement Interpret +;* FI:STMNT ver 1.0A 9.06.84 +;* Programmed by T.Miho +;*---------------------------------- + +LET: CALL TEST1 + DB 0FFH + JP Z,PFUNCT + CALL INTGTV + PUSH BC + PUSH BC + PUSH AF + CALL TESTX + DB 0F4H ;= + CALL EXPR + POP BC + LD A,(PRCSON) + CP B + JP NZ,ER04 + EX (SP),HL ; VAR ADRS<>TEXTPOINT + EX DE,HL + CP 05H + JR Z,DAIBCK + PUSH BC + CALL STRDAI + POP AF + POP HL + POP BC + RET + +DAIBCK: LD C,A + LD B,0 + LDIR + POP HL + POP BC + RET + +PFUNCT: CALL TESTX + DB 0C4H + JP TIMDAI ;TI$=... + +STRLET: PUSH DE + EX DE,HL + JR STRDI2 + +STRDAI: PUSH DE + CALL CVTSDC +STRDI2: LD HL,KEYBM1 + LD (HL),A + LD B,A + LD C,A + INC HL + CALL LDHLDE + POP HL + LD A,(HL) + CP C + JR Z,SMLNST + PUSH HL + OR A + CALL NZ,DELSTR + POP HL + LD A,(KEYBM1) + OR A + JR Z,STRNL1 + PUSH HL + LD BC,(VARST) + SBC HL,BC + EX DE,HL + LD HL,(VARED) + DEC HL + DEC HL + LD (HL),E + INC HL + LD (HL),D + INC HL + LD BC,(STRST) + OR A + POP DE + PUSH HL + SBC HL,BC + EX DE,HL + LD (HL),A + LD B,A + INC HL + LD (HL),E + INC HL + LD (HL),D + POP HL + LD DE,KEYBM1 + INC DE + CALL STRENT + CALL LDHL00 + LD (TMPEND),HL + LD (VARED),HL + RET + +STRNL1: LD (HL),0 + RET + +SMLNST: INC HL + LD E,(HL) + INC HL + LD D,(HL) + LD HL,(STRST) + ADD HL,DE + LD DE,KEYBM1 + LD B,C + INC DE + JP STRENT + +DELSTR: LD C,(HL) + LD B,0 + INC BC + INC BC + INC HL + LD E,(HL) + INC HL + LD D,(HL) + LD HL,(STRST) + ADD HL,DE + DEC HL + DEC HL + LD E,L + LD D,H + ADD HL,BC + PUSH BC + PUSH DE + EX DE,HL + LD HL,(VARED) + OR A + SBC HL,DE + LD C,L + LD B,H + EX DE,HL + POP DE + PUSH DE + JR Z,STRDE0 + LDIR +STRDE0: POP DE + POP BC + LD HL,(VARED) + OR A + SBC HL,BC + LD (VARED),HL + EX DE,HL +STRDE1: LD E,(HL) + INC HL + LD D,(HL) + LD A,D + OR E + RET Z + LD HL,(VARST) + ADD HL,DE + LD A,(HL) + INC HL + LD E,(HL) + INC HL + LD D,(HL) + OR A + EX DE,HL + SBC HL,BC + EX DE,HL + LD (HL),D + DEC HL + LD (HL),E + PUSH BC + LD C,A + LD B,0 + LD HL,(STRST) + ADD HL,DE + ADD HL,BC + POP BC + JR STRDE1 + +FOR: POP BC ;FOR - TO - STEP + LD (FORRTA),BC + CALL LET + LD IX,0 + ADD IX,SP + LD (FRTXPT),HL + CALL VAROFST + LD (FORVAD+1),BC +FOR3: LD E,(IX+0) + LD D,(IX+1) + LD HL,0FF12H + OR A + SBC HL,DE + JR NZ,FOR1 + LD E,(IX+6) + LD D,(IX+7) + EX DE,HL + OR A + SBC HL,BC + JR Z,FOR2 ;EQL FORVAR + LD DE,012H + ADD IX,DE + JR FOR3 + +FOR2: LD DE,012H + ADD IX,DE + LD SP,IX +FOR1: LD HL,(FRTXPT) + CALL TESTX ;TO + DB 0E0H + CALL EXPR + PUSH AF + PUSH HL + EX DE,HL + LD DE,TODTBF + CALL LDIR5 + POP HL + POP AF + CP 0E1H ;STEP + LD DE,FLONE + JR NZ,SSTEP1 + INC HL + CALL EXPR +SSTEP1: LD (FRTXPT),HL + LD HL,0FFF6H ;-10 + ADD HL,SP + LD SP,HL + EX DE,HL + CALL LDIR5 + LD HL,TODTBF + CALL LDIR5 +FORVAD: LD HL,0 + PUSH HL + DB 21H +FRTXPT: DB 0,0 ;(was DEFS 2) + PUSH HL + LD HL,(NXTLPT) + PUSH HL + LD HL,0FF12H ;FOR MARK + PUSH HL + LD HL,-512 + ADD HL,SP + LD DE,(TMPEND) + SBC HL,DE + LD A,11 ;FOR..NEXT ERR + JP C,NESTER + LD HL,(FRTXPT) + DB 0C3H ;dynamic JP xxxxH +FORRTA: DB 0,0 ;(was DEFS 2) + +NEXT: LD A,5 ;NEXT + LD (PRCSON),A + POP BC + LD (NEXRTA),BC +NEXT6: PUSH AF + POP BC + LD (FRTXPT),HL + LD IX,0 + ADD IX,SP + LD (FORSTK),IX + LD E,(IX+0) + LD D,(IX+1) + LD HL,0FF12H + OR A + SBC HL,DE + JP NZ,ER13 + PUSH BC + POP AF + JR NZ,NEXT1 + LD E,(IX+4) ;FOR TEXTPO + LD D,(IX+5) + EX DE,HL + LD (NEXT4+1),HL + LD E,(IX+6) ;FORVAD + LD D,(IX+7) + LD HL,(VARST) + ADD HL,DE + LD BC,8 ;STEP ADR + ADD IX,BC + PUSH IX + POP DE + CALL ADDCMD + INC DE + LD A,(DE) + LD IX,(FORSTK) + LD DE,0DH + ADD IX,DE + PUSH IX + POP DE + BIT 7,A + JR NZ,NEXT7 + EX DE,HL +NEXT7: CALL CMP + JR C,NEXT3 ;END + + DB 31H ;dynamic LD SP, xxxxH (set FOR stack) +FORSTK: DB 0,0 ;(was DEFS 2) + + LD HL,2 + ADD HL,SP + LD A,(HL) + INC HL + LD H,(HL) + LD L,A + LD (NXTLPT),HL +NEXT4: LD HL,0 ;TEXTPO +NEXT5: DB 0C3H ;dynamic JP xxxxH +NEXRTA: DB 0,0 ;(was DEFS 2) + +NEXT3: LD DE,012H + LD HL,(FORSTK) + ADD HL,DE + LD SP,HL + LD HL,(FRTXPT) + CALL TEST1 + DB ',' + JR NZ,NEXT5 + LD (FRTXPT),HL +NEXT1: LD IX,0 + ADD IX,SP + LD (FORSTK),IX + LD HL,(FRTXPT) + CALL TEST1 + DB ',' + JP Z,NEXT6 + CALL INTGTV + LD (FRTXPT),HL + CALL VAROFST + LD IX,(FORSTK) +NEXT12: LD E,(IX+0) + LD D,(IX+1) + LD HL,0FF12H + OR A + SBC HL,DE + JP NZ,ER13 + LD L,(IX+6) + LD H,(IX+7) + OR A + SBC HL,BC + LD HL,(FRTXPT) + JP Z,NEXT6 + LD DE,012H + ADD IX,DE + LD (FORSTK),IX + LD SP,(FORSTK) + JR NEXT12 + +VAROFST: LD H,B + LD L,C + LD BC,(VARST) + OR A + SBC HL,BC + LD B,H + LD C,L + RET + +TODTBF: DB 0,0,0,0,0 ;(was DEFS 5) + + +FRLNBF: DB 0,0 ;(was DEFS 2) +FRNLPT: DB 0,0 ;(was DEFS 2) + +FORSKS: CALL IFSKSB + OR A + RET NZ + INC HL + PUSH DE + LD E,(HL) + INC HL + LD D,(HL) + LD A,D + OR E + INC HL + LD (FRNLPT+1),DE + LD E,(HL) + INC HL + LD D,(HL) + LD (FRLNBF+1),DE + POP DE + SCF + RET Z + JR FORSKS + +USR: CALL CH28H ;USR command - USR(adrs,source$,dest$) + CALL IDEEXP ;adrs + LD (USRADR+1),DE + CALL TEST1 + DB ',' + JR NZ,USR2 + CALL EXPR ;source$ + CALL STROK + LD (USRSRC+1),DE + CALL TEST1 + DB ',' + JR NZ,USR2 + CALL INTGTV ;dest$ + CALL STROK + LD (USRDST+1),BC + XOR A +USR2: PUSH HL + PUSH AF +USRSRC: LD HL,0 ;xxx + CALL CVTSDC + LD IX,ERRORJ + XOR A +USRADR: CALL 0 ;xxx + POP AF + JR NZ,USR8 + LD A,B ;dest$ exist + EX DE,HL +USRDST: LD DE,0 ;xxx + CALL STRLET +USR8: POP HL + JP HCH29H + +PAUSE: CALL IDEEXP ;PAUSE command +PAUSE2: LD A,D + OR E + RET Z + LD B,0FBH ;Interval 0.1 sec approx (JAPAN 00H) +PAUSE3: DJNZ PAUSE3 ;Loop! + RST 18H + DB .BREAK + RET Z + DEC DE + JR PAUSE2 + +;*------------------------------------------------------ +;* Multiple entry point for REM, LABEL, DATA and GOSUB +;* Top of p.395 in German Listing of MZ-2Z046 Disk Basic +;*------------------------------------------------------ +REM: +LABEL: +DATA: +GSUB: DEC HL ;GOSUB +DATA0: CALL IFSKSB + OR A + SCF + RET Z + CP ':' + RET Z + JR DATA0 + +OUT@: CALL IBYTE ;OUT @port,data + SUB 0E0H + CP 7 + JP C,ER03 ;E0H .. E6H + CALL HCH2CH + PUSH DE + CALL IBYTE + POP BC + OUT (C),A + RET + +INP@: CALL IBYTE ;INP @port,data + CALL HCH2CH + PUSH DE + CALL INTGTV + CP 5 + JP NZ,ER04 + EX (SP),HL + PUSH BC + EX (SP),HL + POP BC + IN E,(C) + LD D,0 + CALL FLTHEX + POP HL + RET + +CURSOR: CALL CSRXY ;CURSOR x,y + EX DE,HL + RST 18H + DB .CURMV + EX DE,HL + RET + +CSRXY: LD B,24 + LD C,39 + LD A,(CRTMD2) ;80 char. mode change + CP 3 + JR C,CSRXY3 + LD C,79 +CSRXY3: CALL CSRXY2 + JP C,ER03 + RET + +CSRXY2: PUSH BC + CALL IBYTE + PUSH AF + CALL HCH2CH + CALL IBYTE + LD D,E + POP AF + LD E,A + POP BC + LD A,C + CP E + RET C + LD A,B + CP D + RET + +GETOP: CALL INTGTV ;GET Var + LD (PRCSON),A + CP 5 + JR Z,GETSUJ + PUSH HL ;GET STR + PUSH BC + LD A,0FFH + RST 18H + DB .INKEY + OR A + JR Z,NLGTKY + LD HL,(TMPEND) + LD (HL),A + LD A,1 +NLGTKY: POP DE + CALL STRLET + POP HL + RET + +GETSUJ: PUSH HL + PUSH BC + LD A,0FFH + RST 18H + DB .INKEY + SUB 30H + CP 0AH + JR C,GETSU2 + XOR A +GETSU2: LD E,A + LD D,0 + POP HL + CALL FLTHEX + POP HL + RET + +POKE: CALL IDEEXP ;POKE ad,d1,d2,d3,... + CALL CH2CH +POKELP: PUSH DE + CALL IBYTE + POP DE + LD (DE),A + INC DE + CALL TEST1 + DB ',' + RET NZ + JR POKELP + +LIMIT: PUSH HL ;LIMIT addr. + CALL TEST1 + DB 'M' + JR NZ,LIMIT1 + CALL TEST1 + DB 'A' + JR NZ,LIMIT1 + CALL TEST1 + DB 'X' + JR NZ,LIMIT1 + EX (SP),HL + LD HL,(MEMMAX) + JR LIMIT2 + +LIMIT1: POP HL + CALL IDEEXP + PUSH HL + LD HL,(MEMMAX) + OR A + SBC HL,DE + JP C,ER06A + LD HL,(TMPEND) + INC H + INC H + INC H + INC H + OR A + SBC HL,DE + JP NC,ER03 + EX DE,HL +LIMIT2: CALL MEMSET + POP HL + POP DE + LD SP,(INTFAC) + LD BC,0FFFFH + PUSH BC + PUSH DE + RET + +RETURN: POP IX ;RETURN line no. +RETRN2: POP BC + PUSH BC + LD A,B + INC A + JP NZ,ER14 + LD A,C + CP 12H + JR Z,RETRN6 + CP 0FEH + JP NZ,ER14 + POP BC + CALL ENDCHK + EX DE,HL + POP HL + LD (LNOBUF),HL + POP HL + LD (NXTLPT),HL + POP HL + PUSH IX + RET Z + EX DE,HL + JP GOTO +RETRN6: EX DE,HL + LD HL,12H + ADD HL,SP + LD SP,HL + EX DE,HL + JR RETRN2 + +GOSUB: PUSH HL ;GOSUB line no. + CALL GSUB + EX DE,HL + POP HL + POP BC + PUSH DE + EXX + LD HL,(NXTLPT) + PUSH HL + LD HL,(LNOBUF) + PUSH HL + LD HL,0FFFEH + PUSH HL + LD HL,-512 + ADD HL,SP + LD DE,(TMPEND) + SBC HL,DE + LD A,10 + JP C,NESTER + EXX + PUSH BC + JR GOTO + +ON: CALL TEST1 ;ON command + DB 0C1H + JP Z,ONERRG ;ON ERROR + CALL IDEEXP + LD C,E + LD B,D + CP 87H + JP NC,ER01 + CP 82H + JR NZ,ON.4 + CALL INCHLF + LD E,81H + CP 0E4H + JR Z,ON.2 + CP 0E0H + JP NZ,ER01 + DEC E +ON.2: LD A,E +ON.4: PUSH HL + LD HL,SJPTBL + SUB 80H + ADD A,A + LD E,A + LD D,0 + ADD HL,DE + CALL INDRCT + EX (SP),HL + INC HL + LD A,B + OR A + JR NZ,ON.9 + LD A,C + OR A + JR Z,ON.9 + LD B,A +ON.6: DEC B + RET Z + CALL HLFTCH + CALL LINEQ + JP NZ,ER01 + CALL DTSKL1 + OR A + RET Z + INC HL + CALL TEST1 + DB ',' + JR Z,ON.6 + POP DE + JP CHKEND + +ON.9: POP DE + JP DATA + +GOTO: CALL GETLIN ;GOTO line no. + EX DE,HL + JR NZ,GONUM + LD HL,(TEXTST) ;GOTO 0 +GONUM: LD (NXTLPT),HL + XOR A + LD (CONTFG),A + JP NXLINE + +IF: CALL EXPR ;IF-THEN-ELSE + EX AF,AF' + LD A,(DE) + OR A + JR Z,IFALSE + EX AF,AF' + CP 0E2H ;THEN + JR NZ,IF.4 +IF.2: CALL INCHLF + CALL LINEQ + JR Z,GOTO +IF.4: POP AF + JP MAIN + +LINEQ: CP '"' + RET Z +LINEQ2: CP 0BH + RET Z + CP 0CH + RET + +ELSECMD: CALL IFSKIP + JR NC,ELSECMD + RET + +IFALSE: DEC HL + CALL IFSKIP + JR NC,IF.2 + JP ENDLIN + +IFSKIP: CALL IFSKSB + OR A + SCF + RET Z + CP 0C2H ;ELSE + RET Z + CP 93H ;IF + JR NZ,IFSKIP + CALL IFSKIP + RET C + JR IFSKIP + +DTSKSB: INC HL + LD A,(HL) + JR DTSKL1 + +IFSKSB: INC HL + LD A,(HL) + CP 94H ;DATA + JR Z,IFDASK +DTSKL1: OR A + RET Z + CP '"' + JR Z,IFDQSK + CP 0FEH ;FUNC/OPTION + JR NC,IFFNRT + CP 97H ;REM + JR Z,IFDASK + CP 27H ;' + JR Z,IFDASK + CP 20H + RET NC + CP 0BH + RET C + CP 15H + JR NC,ISKFLT + INC HL +IFFNRT: INC HL + RET + +IFDASK: LD A,(HL) + OR A + RET Z + CP 3AH + RET Z + CP '"' + JR Z,DADQSK + INC HL + JR IFDASK + +DADQSK: CALL IFDQSK + OR A + RET Z + INC HL + JR IFDASK + +ISKFLT: AND 0FH + ADD A,L + LD L,A + LD A,20H + RET NC + INC H + RET + +IFDQSK: INC HL + LD A,(HL) + OR A + RET Z + CP '"' + RET Z + JR IFDQSK + +BEEP: RST 18H ;BEEP command + DB .BELL + RET + +BYE: CALL CHKEND ;BYE command + RST 18H + DB .CLRIO + RST 18H + DB .MONOP + RET + +CONSOL: JR Z,CONSOI ;CONSOLE x,xl,y,yl + LD A,(YS) + LD D,0 + LD E,A + CALL TEST1 + DB ',' + JR Z,CONSOK + CALL IBYTE + CALL HCH2CH +CONSOK: LD C,E + PUSH BC + CALL IBYTE + POP BC + DEC A + JP M,ER03 + ADD A,C + CP 25 + JP NC,ER03 + LD B,A + PUSH HL + LD H,B + LD L,C + RST 18H + DB .DWIND + POP HL + RET +CONSOI: PUSH HL ;CONSOLE init. + LD HL,1800H + RST 18H + DB .DWIND + POP HL + RET + +BOOT: DI ;BOOT command + OUT (0E4H),A + JP 0 + +SEARCH: XOR A ;SEARCH#n "xxxx" + DB 1 +LIST: LD A,1 ;LIST#n Start-End + LD (SELTF),A + PUSH AF + CALL GETLU + RST 18H + DB .LUCHK + JP C,ER64 + BIT 1,A ;W? + JP Z,ER64 + CALL TEST1 + DB ',' + POP AF + OR A + JR NZ,LIST10 + CALL STREXP ;SEARCH command only + LD A,B + LD (SECLEN),A + LD (SESTR),DE + CALL CHKEND + JR LIST10 + +LIST0: LD A,2 + LD (SELTF),A +LIST10: CALL GTSTED + LD (LISTSN),DE + LD (LISTEN),BC + LD A,0FFH + LD (DISPX),A + CALL PUSHR + LD HL,(TEXTST) +LIST20: CALL LDDEMI + LD A,D + OR E + RET Z + EX DE,HL + ADD HL,DE + DEC HL + DEC HL + EX DE,HL + PUSH DE + CALL LDDEMI + PUSH HL + DB 21H +LISTSN: DB 0,0 ;(was DEFS 2) + OR A + SBC HL,DE + JR C,LIST30 + JR Z,LIST30 + POP HL + POP HL + JR LIST20 + +LIST30: DB 21H +LISTEN: DB 0,0 ;(was DEFS 2) + OR A + SBC HL,DE + JR NC,LIST40 + POP HL + POP HL + RET + +LIST40: EX DE,HL + CALL ASCFIV + RST 18H + DB .COUNT + LD HL,KEYBUF + CALL LDHLDE + LD (HL),20H + INC HL + EX DE,HL + POP HL + CALL CVTXIM + LD A,(SELTF) + OR A + JR NZ,LIST50 + CALL SSEST + JR NC,LIST60 +LIST50: LD DE,KEYBUF + RST 18H + DB .COUNT + RST 18H + DB .PRSTR + CALL PRTCR +LIST60: POP HL + LD A,(SELTF) + CP 2 + JR Z,LIST20 ;ASCII SAVE + RST 18H + DB .HALT + JR LIST20 + +;*---------------------- +;* HL=TEXT START ADDRESS +;*---------------------- +SSEST: EX DE,HL +SSESTL: PUSH HL + CALL SSESTS + POP HL + RET C + RET Z + INC HL + JR SSESTL + +;*------------------------------------- +;* ent HL:CMP pointer +;* ext CY=1 same string +;* CY=0 Acc=0 not same & text end +;* Acc=FFH not same chr +;*------------------------------------- +SSESTS: LD A,(SECLEN) ;String Length + LD B,A + LD DE,(SESTR) ;String address +SSEST0: LD A,(HL) + INC HL + OR A + RET Z + CP 5 + JR Z,SSEST1 + CP 6 + JR NZ,SSEST2 +SSEST1: JR SSEST0 + +SSEST2: PUSH HL + LD C,A +SSEST4: LD A,(DE) + INC DE + CP 5 + JR Z,SSEST3 + CP 6 + JR NZ,SSEST5 +SSEST3: DEC B + SCF + POP HL + RET Z + PUSH HL + JR SSEST4 +SSEST5: SUB C + POP HL + OR A + RET NZ ;1 Chr not same + DEC B + SCF + RET Z + JR SSEST0 + +SECLEN: DB 0 ;String length (was DEFS 1) +SESTR: DB 0,0 ;String Address (was DEFS 2) +SSESTW: DB 0,0 ;Line No. (was DEFS 2) +SELTF: DB 0 ;0:SEARCH , 1:LIST (was DEFS 1) + +;*--------------------------------------------------------- +;* Middle of p.412 in German Listing of MZ-2Z046 Disk Basic +;*--------------------------------------------------------- +KLIST: CALL TESTX ;KEY command + DB 87H ;LIST ? + CALL TESTP + PUSH HL + LD C,0 +KLSTLP: RST 18H ;LABEL missing in original source ! + DB DHCR + LD A,C + ADD A,'1' + LD D,A + LD E,20H + CP 3AH + JR NZ,KLIST1 + LD DE,3031H ;'10' +KLIST1: LD (KEYME2),DE + LD DE,KEYME1 ;'DEF KEY(' + RST 18H + DB DHMSG + LD A,C + CALL KEYBCL + LD B,(HL) + INC HL + PUSH BC + CALL STKYMS ;(DE)=MSTRING + POP BC + INC C + LD A,C + CP 10 + JR NZ,KLSTLP + RST 18H + DB DHCR + POP HL + RET + +STKYMS: LD A,B + OR A + LD C,0 + JR NZ,STKYM1 + LD A,'"' + RST 18H + DB DH1CX + RST 18H + DB DH1CX + RET + +STKYM1: LD A,(HL) + CP 20H + JR C,CHRME1 + CP '"' + JR Z,CHRME1 + LD A,C + CP 1 + JR Z,CHRM22 + OR A + LD DE,KEYME3 + JR NZ,STKYM2 + INC DE + INC DE +STKYM2: RST 18H + DB DHMSG +CHRM22: LD A,(HL) + RST 18H + DB DH1CX + INC HL + LD C,1 + DJNZ STKYM1 +STKYE2: LD A,'"' +STKYE3: RST 18H + DB DH1CX + RET + +CHRME1: LD A,C + CP 0FFH + JR Z,CHRM12 + OR A + LD DE,KEYME4 + JR NZ,CHRME2 + INC DE + INC DE +CHRME2: RST 18H + DB DHMSG +CHRM16: PUSH BC + PUSH HL + LD L,(HL) + LD H,0 + CALL ASCFIV + RST 18H + DB DHMSG + POP HL + POP BC + INC HL + LD C,0FFH + DJNZ STKYM1 + LD A,')' + JP STKYE3 + +CHRM12: LD A,',' + RST 18H + DB DH1CX + JR CHRM16 + +KEYME1: DB "DEF KEY(" +KEYME2: DB 0,0 ;(was DEFS 2) + DB ")=" + DB 0 +KEYME3: DB ")+\"" + DB 0 +KEYME4: DB "\"+CHR$(" + DB 0 + +DEFOP: CALL TEST1 ;DEF command + DB 0B2H + JR Z,DEFKEY ;DEF KEY(n)="..." + CALL TESTX + DB 0FFH + CALL TESTX + DB 0C7H + JP DEFFN ;DEF FNx(x)=expr + +DEFKEY: CALL TESTX + DB '(' + CALL IBYTE + CALL TESTX + DB ')' + CALL TESTX + DB 0F4H ;= + LD A,E + DEC A + CP 10 + JP NC,ER03 + PUSH HL + CALL KEYBCL + EX (SP),HL + CALL STREXP ;A,DE + EX (SP),HL + LD A,B + CP 16 + JR C,DFKEY2 + LD A,15 +DFKEY2: LD (HL),A + OR A + JR Z,ESCKPT + LD B,A + INC HL +DFKEY3: LD A,(DE) + LD (HL),A + INC DE + INC HL + DJNZ DFKEY3 +ESCKPT: POP HL + EI + RET + +KEYBCL: ADD A,A + ADD A,A + ADD A,A + ADD A,A + LD HL,FUNBUF + JP ADDHLA + +;* END of original module STMNT.ASM +;*============================================================================ +;* START of original module IOCS.ASM +;*--------------------------- +;* MZ-800 BASIC IOCS command +;* FI:IOCS ver 1.0B 9.20.84 +;* Programmed by T.Miho +;*--------------------------- + +RUNRFL: EQU 11A4H ;KEYBUF label +BKEYBF: EQU 11A5H ;KEYBUF+1 label + +;* ZFLAG1 bit position (all 3 EQUATES defined in a previous module) + +;*RAND: EQU 5 ;FD +;*SEQU: EQU 6 ;CMT, QD, RAM +;*STREM: EQU 7 ;CRT, KB, LPT, RS, USR + +;* ZRWX bit position (all except LDALU and DATLU defined in a previous module) + +;*ROPNAA: EQU 0 ;duplicated elsewhere +;*WOPNAA: EQU 1 ;duplicated elsewhere +;*XOPNAA: EQU 2 ;duplicated elsewhere +;*EOFAA: EQU 7 ;duplicated elsewhere + +;*CMTLU: EQU 80H ;duplicated elsewhere +LDALU: EQU 81H +;*CRTLU: EQU 88H ;duplicated elsewhere +;*LPTLU: EQU 89H ;duplicated elsewhere +DATLU: EQU 8AH +;*------------------------------------------------------------------------- +CRTDUP: LD A,(ZLOG) ;This routine duplicates CRTLUQ: but it is + CP CRTLU ;retained and used to keep the code aligned + RET ;with existing versions of QDBASIC MZ-5Z009 +;*------------------------------------------------------------------------- +PRTEXP: CALL EXPR + LD A,(PRCSON) + CP 3 + PUSH HL + EX DE,HL + JR Z,PRTEX2 + CALL CVNMFL + POP HL + RST 18H + DB .COUNT + RET + +PRTEX2: CALL CVTSDC + POP HL + RET + +;*--------------- +;* PRINT command +;*--------------- +PRINT: XOR A + LD (DISPX),A + CALL GETLU + RST 18H + DB .LUCHK + JP C,ER44 ;not open + BIT 2,A ;X? + JP NZ,PRX + BIT 1,A ;W? + JP Z,ER59DU ;can't exec + CALL LU2CH + CALL CRTDUP + JR NZ,PRT04 + LD A,(SELCOL) + LD (COL),A + CALL TEST1 + DB '[' + JR NZ,PRT04 + CALL COLCHK + LD (COL),A + CALL TESTX + DB ']' +PRT04: CALL ENDCHK + JP Z,PRTCR +PRT10: LD A,(HL) + CP 0E3H ;USING + JR Z,PRUSNG + LD BC,PRT20 + PUSH BC ;Return adrs + CP ';' + RET Z + CP ',' + RET Z + CP 0E6H ;TAB + JR Z,PRTAB + CALL PRTEXP + JP PRTMS2 + +PRT20: CALL ENDCHK + JP Z,PRTCR + CP ',' + JR NZ,PRT30 + CALL CRTDUP + JR C,PRT25 + LD IX,(ZPOS) ; TAB10 + CALL IOCALL + LD B,A +PRT22: SUB 10 + JR NC,PRT22 + NEG + LD B,A + CALL PRTAB2 + JR PRT30 + +PRT25: CALL PRTCR +PRT30: LD A,(HL) + CP ',' + JR Z,PRT33 + CP ';' +PRT33: JR NZ,PRT35 + INC HL +PRT35: CALL ENDCHK + RET Z + JR PRT10 + +PRTAB: CALL CRTDUP + JP C,ER59DU + CALL ICH28H + CALL IBYTE + CALL HCH29H + LD IX,(ZPOS) + CALL IOCALL + SUB E + RET NC + NEG + LD B,A + CALL CRTDUP + LD A,13H ;Cursor right + JR Z,PRTAB3 +PRTAB2: LD A,20H +PRTAB3: LD DE,BKEYBF + PUSH BC + PUSH DE + CALL QSETDE + POP DE + POP BC + JR PRTMS2 + +PRUSNG: INC HL ;PRINT USING + CALL STREXP + LD A,B + OR A + JP Z,ER03 + PUSH HL + LD HL,BKEYBF + PUSH HL + PUSH BC + CALL LDHLDE + POP BC + LD A,0F0H + LD E,B + LD D,0 + INC DE + RST 18H + DB .OPSEG + LD (USINGS),HL + LD (USINGP),HL + POP DE + CALL LDHLDE + LD (HL),0 + POP HL +PRUSG2: CALL ENDCHK + JR Z,PRUSG8 + INC HL + CP ',' + JR Z,PRUSG4 + CP ';' + JP NZ,ER01 +PRUSG4: CALL ENDCHK + JR Z,PRUSG9 + CALL EXPRNX + PUSH HL + LD BC,(TMPEND) + PUSH BC + CALL USNGSB + POP DE + CALL PRTMSG + POP HL + JR PRUSG2 +PRUSG8: CALL PRTCR +PRUSG9: LD A,0F0H + RST 18H + DB .DLSEG + RET + +.CR: DW 0DH ;FMP + +PRTCR: LD DE,.CR +PRTMSG: RST 18H ;print message + DB .COUNT +PRTMS2: CALL CRTDUP + JR Z,PRTMC + RST 18H + DB .PRSTR + RET + +PRTMC: PUSH AF + LD A,(COL) + RST 18H + DB .DCOL + POP AF + RST 18H + DB .PRSTR + LD A,(SELCOL) + RST 18H + DB .DCOL + RET + +;*-------------- +;* READ command +;*-------------- +READ: LD A,DATLU + LD (ZLOG),A + JR INP10 + +;*--------------- +;* INPUT command +;*--------------- +INPUT: CALL GETLU ;INPUT command + RST 18H + DB .LUCHK + JP C,ER44 ;not open + BIT 2,A ;X? + JP NZ,INX + BIT 0,A ;R? + JP Z,ER59DU ;can't exec + CALL LU2CH + CALL CRTDUP + JR NZ,INP10 + CALL HLFTCH + CP '"' + LD DE,MEMQIN + LD B,2 + JR NZ,INP05 + CALL STREXP + CALL TESTX + DB ';' +INP05: LD A,B + OR A + JR Z,INP10 +INP07: LD A,(DE) + INC DE + RST 18H + DB .CRT1C + DJNZ INP07 +INP10: LD (INPSP+1),SP + LD DE,(VARED) + LD (TMPEND),DE +INP15: LD DE,(TMPEND) + CALL MEMECK + CALL INTGTV + PUSH AF + PUSH BC + CALL ENDCHK + JR Z,INP20 + CALL CH2CH + JR INP15 + +ER44: LD A,44 ;not opened + DB 21H +;*----------------------------------------------------- +;* THE ERROR TRAP BELOW DUPLICATES ER59: but is retained +;* & used to keep the code aligned with existing versions +;*----------------------------------------------------- +ER59DU: LD A,59+80H ;can't exec + JP ERRORJ + +MEMQIN: DB "? " + +INP20: XOR A + PUSH AF ;END=00 + PUSH HL + RST 18H + DB .INSTT + LD HL,(INPSP+1) + DEC HL +INP24: LD A,(HL) + OR A + JR Z,INP30 + DEC HL + DEC HL + LD B,(HL) + DEC HL + LD C,(HL) + DEC HL + PUSH HL + PUSH AF ;Type + PUSH BC ;Adrs + LD DE,(TMPEND) + CALL INPMX + LD H,0 + LD L,B + ADD HL,DE + LD (HL),0 + POP DE ;Adrs + POP AF ;Type + CALL INSUB + POP HL + JR INP24 + +INP30: POP HL +INPSP: LD SP,0 ;dynamic address xxxxH + RET + +INPMX: LD A,(ZLOG) + CP DATLU + JR Z,DATINP + RST 18H + DB .INMSG + RET + +INSUB: CP 3 ;String ? + JR NZ,INSUB4 ; No + LD HL,(TMPEND) ; Yes + LD A,B + JP STRLET + +INSUB4: PUSH DE + LD HL,(INTFAC) + LD DE,(TMPEND) + EX DE,HL + CALL HLFTCH + CP 'E' + JP Z,ER03 + EX DE,HL + CALL CVFLAS + EX DE,HL + CALL TEST1 + DB 0 + JP NZ,ER03 + EX DE,HL + POP DE + JP LDIR5 + +;*----------------- +;* RESTORE command +;*----------------- +RESTOR: XOR A + LD (DATFLG),A + CALL ENDCHK + CALL NZ,GETLIN + EX DE,HL + CALL NZ,DTSRCX + EX DE,HL + JP DATA ;ON RESTORE + +DATINP: PUSH HL + PUSH DE + CALL DATINX + POP DE + POP HL + RET + +DATIN0: LD HL,(TEXTST) + CALL DTSRCX +DATINX: LD A,(DATFLG) ;read flag + CP 1 ;0 is restore top + JP Z,ER24 ;1 is out of data + JR C,DATIN0 ;2 is ok + LD HL,(DATPTR) ;read pointer + LD C,':' + RST 18H + DB .INDAT + LD (DATPTR),HL ;read pointer + CALL ENDCHK + SCF + CCF + RET NZ + DEC HL +DTSRCH: CALL DTSKSB ;DATA search + OR A + JR NZ,DTSRC4 + INC HL +DTSRCX: LD A,(HL) + INC HL + OR (HL) + LD A,1 + JR Z,DTSRC9 + INC HL + INC HL + JR DTSRCH +DTSRC4: CP 94H ;DATA + JR NZ,DTSRCH + INC HL + LD (DATPTR),HL ;read pointer + LD A,2 +DTSRC9: LD (DATFLG),A ;read flag + RET + +;*-------------------------------- +;* GETLU ... interpret #n, /P, /T +;* ent HL: pointer +;* ext HL: pointer +;* A: LU# +;*-------------------------------- +GETLU: CALL TEST1 + DB '#' + JR NZ,GETLU2 + CALL HLFTCH + CP 20H + JP NC,ER01 + PUSH DE + PUSH BC + LD DE,ZFAC + PUSH DE + CALL FACNUM + EX (SP),HL + CALL HLFLT + LD A,H + OR A + JP NZ,ER64 + OR L + JP Z,ER64 + JP M,ER64 + POP HL + POP BC + POP DE + RET + +GETLU2: CALL TEST1 ;/ + DB 0FBH + LD A,CRTLU + RET NZ + CALL TEST1 + DB 'P' + LD A,LPTLU + RET Z + CALL TESTX + DB 'T' + LD A,CMTLU + RET + +LU2CH: LD A,(ZLOG) + OR A + RET M + JP HCH2CH + +;*---------------- +;* DEFAULT "dev:" +;*---------------- +DEFAULT: CALL DEVNAM ;set default device + RST 18H + DB .SETDF + RET + +;*-------------------- +;* INIT "dev:command" +;*-------------------- +INIT: CALL ENDCHK + LD B,0 + CALL NZ,STREXP +INIT2: PUSH HL + RST 18H + DB .DEVNM + RST 18H + DB .FINIT + POP HL + RET + +;*------------------------------------------------------ +;* Top of p.430 in German Listing of MZ-2Z046 Disk Basic +;* Entry point for file commands ROPEN, WOPEN and XOPEN +;*------------------------------------------------------ +ROPEN: LD A,1 + DB 1 +WOPEN: LD A,2 + DB 1 +XOPEN: LD A,4 + PUSH AF + LD (ZRWX),A + CALL GETLU + CP CRTLU + JR NZ,OPEN.A + LD A,CMTLU +OPEN.A: LD (ZLOG),A + CALL LU2CH + CALL ELMT + POP AF + CP 4 ;X + JR Z,OPEN.C +OPEN.B: LD A,3 ;BSD +OPEN.C: LD (ELMD),A + PUSH AF + RST 18H + DB .RWOPN + LD A,(ELMD) + POP BC + CP B + JP NZ,ER61 + RET + +;*-------------------- +;* CLOSE/KILL command +;*-------------------- +CLOSE: DB 0F6H +KILL: XOR A + LD B,A + CALL ENDCHK + JR Z,CLALL ;all files +CLKL2: CALL GETLU + CP CRTLU + RET NC + RST 18H + DB .CLKL + CALL TEST1 + DB ',' + JR CLKL2 + +CLALL: XOR A + RST 18H + DB .CLKL + RET + +ELMT: CALL END2C + LD B,0 + CALL NZ,STREXP + PUSH HL + RST 18H + DB .DEVFN + POP HL + RET + +DEVNAM: PUSH HL + CALL HLFTCH + LD DE,ELMWRK + LD B,1 + CALL ELMCK + CALL NC,ELMCK + JR C,DEVNM2 + CALL ELMCK + CALL TSTNUM + CALL ELMCK2 + CALL ENDCHK + JR NZ,DEVNM2 + LD A,':' + LD (DE),A + POP AF ;dummy + LD DE,ELMWRK + JR DEVNM4 + +DEVNM2: POP HL + CALL ENDCHK + LD B,0 + CALL NZ,STREXP +DEVNM4: PUSH HL + RST 18H + DB .DEVNM + INC (HL) + DEC (HL) + JP NZ,ER58 + POP HL + RET + +ELMCK: CP 41H ;'A' + RET C + CP 5BH ;'Z'+ 1 + CCF +ELMCK2: RET C + LD (DE),A + INC HL + INC DE + LD A,(HL) + INC B + RET + +ELMWRK: DB 0,0,0,0 ;(was DEFS 4) + +;*-------------------- +;* LOAD "dev:filename" +;*-------------------- +LOAD: CALL TEST1 ;ALL + DB 0E5H + JR NZ,LOAD2 + XOR A +SVC.LS: RST 18H + DB .LSALL + RET + +LOAD2: CALL ELMT + CALL TEST1 + DB ',' + JP Z,LOADA + PUSH HL + CALL LDRDY + DEC A + JR Z,LDOBJ + DEC A + JP NZ,ER61 ;il file mode + CALL CKCOM + CALL CLRVAR + CALL LDFIL + JR LOAD9 + +LDOBJ: LD HL,(ELMD22) ;load addr + PUSH HL + LD DE,(MEMLMT) + CALL COMPR + LD DE,(ELMD20) ;size + LD BC,(MEMMAX) + CALL NC,MEMOBJ + JP C,ER18 + POP HL + RST 18H + DB .LOADF +LOAD9: CALL LOAD10 + POP HL + RET + +MEMOBJ: ADD HL,DE + RET C + EX DE,HL + LD H,B + LD L,C +COMPR: PUSH HL + OR A + SBC HL,DE + POP HL + RET + +;*--------------------- +;* CHAIN "dev:filename" +;*--------------------- +CHAIN: CALL ELMT + CALL LDRDY + CP 2 + JP NZ,ER61 ;illegal file mode + LD A,(LSWAP) + OR A + JP Z,RUN2 + JP SWAP2 + +;*--------------------- +;* MERGE "dev:filename" +;*--------------------- +MERGE: CALL CKCOM + CALL ELMT + CALL TEST1 + DB ',' + JR Z,MERGEA + RST 18H + DB .LOPEN + CP 2 + JP NZ,ER61 + PUSH HL + LD HL,(VARED) + LD (TMPEND),HL + LD BC,1000 + ADD HL,BC + JP C,ER06A + PUSH HL + LD BC,(ELMD20) ;size + INC B + ADD HL,BC + JP C,ER06A + SBC HL,SP + JP NC,ER06A + POP HL + PUSH HL + RST 18H + DB .LOADF + POP HL + CALL MERGE0 + POP HL + RET + +MERGE0: CALL LDDEMI + LD A,D + OR E + RET Z + PUSH DE + CALL LDDEMI + PUSH HL + LD H,D + LD L,E + LD (EDLINE),HL + CALL DELSUB + POP HL + POP BC + PUSH BC + PUSH HL + CALL INSTLIN + POP HL + POP BC + ADD HL,BC + DEC HL + DEC HL + DEC HL + DEC HL + JR MERGE0 + +;*----------------------- +;* LOAD/MERGE/RUN ascii +;*----------------------- +LOADA: CALL CKCOM + LD A,1 + DB 1 +MERGEA: LD A,0 + DB 1 +RUNA: LD A,2 + PUSH AF + CALL TESTX + DB 'A' + CALL CHKEND + LD A,1 + LD (ZRWX),A + LD A,LDALU + LD (ZLOG),A + CALL OPEN.B + POP AF + PUSH AF + PUSH HL ;RJOB + LD HL,0 + LD DE,0FFFFH + OR A + CALL NZ,DELSUB ;load/run only + LD A,LDALU + RST 18H + DB .LUCHK + LD HL,(VARED) + LD (TMPEND),HL + LD BC,1000 + ADD HL,BC + JP C,ER06 + PUSH HL ;load start adrs + LD (LDAPTR),HL +LDA2: LD HL,-512 + ADD HL,SP + LD DE,(LDAPTR) + SBC HL,DE + JP C,ER06 + LD DE,(TMPEND) + RST 18H + DB .INMSG + LD A,B + OR A + JR Z,LDA4 + CALL CVBCAS + LD A,B + OR C + JP Z,ER03 + LD HL,(LDAPTR) + PUSH HL ;load pointer + INC HL + INC HL + LD (HL),C + INC HL + LD (HL),B + INC HL + PUSH HL + LD H,D + LD L,E + CALL TEST1 + DB 0 + JP Z,ER03 + POP HL + LD A,(DE) + CP 20H + JR NZ,LDA3 + INC DE +LDA3: CALL CVIMTX + LD (HL),0 + INC HL + LD (LDAPTR),HL + POP DE ;old load pointer + OR A + SBC HL,DE + EX DE,HL ;DE := length + LD (HL),E + INC HL + LD (HL),D + JR LDA2 + +LDA4: LD HL,(LDAPTR) + CALL LDHL00 + CALL CLR + POP HL ;load start adrs + CALL MERGE0 + POP HL ;RJOB + POP AF + CP 2 ;RUN ? + RET NZ ;no (load/merge) + JP RUNX ;RUN from text-top + +LDAPTR: DB 0,0 ;(was DEFS 2) + +;*------------------- +;* RUN "dev:filename" +;*------------------- +FRUN: CALL ELMT + PUSH HL + CALL TEST1 + DB ',' + JR NZ,RUN1 + CALL HLFTCH + CP 'A' + JP Z,RUNA +RUN1: CALL LDRDY + POP HL + DEC A + JR Z,RUNOBJ + DEC A + JP NZ,ER61 ;il file mode + CALL CLRVAR +RUN2: CALL LDFIL ;jump from CHAIN + CALL LOAD10 + JP RUNX + +;*---------------------------------------------- +;* Middle of p.440 in German Listing of MZ-2Z046 +;* Floppy-Disk Basic - Run Machine-code Program +;*---------------------------------------------- +RUNOBJ: LD D,0 ; normal + LD BC,0FF00H + CALL TEST1 + DB ',' + JR NZ,RUNOB2 + CALL TESTX + DB 'R' + LD D,1 ;,R + LD BC,0CFF0H +RUNOB2: LD A,D + LD (RUNRFL),A ;,R flag + LD HL,(ELMD20) ;size + LD DE,(ELMD22) ;load addr + PUSH HL + CALL MEMOBJ + POP DE ;size + LD HL,SBASIC ;load file area + LD BC,0FF00H + CALL NC,MEMOBJ + JP C,ER06A + LD SP,0 + CALL CLPTR + XOR A + LD (LOADFG),A + LD A,36H ;count0 mode3 + OUT (0D7H),A ;8253 mode set + LD A,1 + OUT (0D3H),A ;8253 music enable + LD HL,(ELMD22) ;load addr + LD DE,(TMPEND) + CALL COMPR + JR NC,RUNOB3 +;*-------------- +;* destroy BASIC +;*-------------- + PUSH HL + LD HL,SBASIC ;load file area + LD (TEXTST),HL + CALL CLPTR + LD HL,RUNOBE-PRXFER+BKEYBF + LD (ERRORP),HL + POP HL +RUNOB3: LD DE,(TMPEND) + CALL COMPR + JR NC,RUNOB6 + EX DE,HL +RUNOB6: PUSH AF + PUSH HL + LD HL,PRXFER + LD DE,BKEYBF + PUSH DE + LD BC,RUNTBE-PRXFER + LDIR + RET ;JP BKEYBF + +;*------------ +;* ORG BKEYBF +;*------------ +PRXFER: POP HL + RST 18H + DB .LOADF + LD A,0C3H ;int tbl make + LD HL,038DH + LD (1038H),A + LD (1039H),HL + LD A,01H ;320*200 4 color + RST 18H + DB .DSMOD + RST 18H + DB .DI + EX AF,AF' + LD A,(RUNRFL) ;run" " ,r + OR A + CALL NZ,INITIO-PRXFER+BKEYBF + EX AF,AF' + LD HL,(ELMD24) ;exec addr + LD A,H + OR L + EXX + LD HL,(TMPEND) ;data store addr + LD DE,(ELMD22) ;load addr + LD BC,(ELMD20) ;size + OR D + OR E + JR Z,PROX0 + LD A,0E9H ;jp (hl) + LD (PRO70P-PRXFER+BKEYBF),A +PROX0: EXX + POP AF ;ldir flg + PUSH HL ;store exec addr + LD HL,PROFF-PRXFER+BKEYBF + LD DE,0FF00H + LD BC,PRO80E-PROFF + LDIR + EXX + JP 0FF00H +;*------------------------------------------------------------------- +;* ORG FF00H (the code below is copied to $FF00H and run from there) +;*------------------------------------------------------------------- +PROFF: JR NC,RUNOB4 + LDIR +RUNOB4: EX AF,AF' + RET Z ;,R + IN A,(LSDMD) ;check dipsw + AND 2 + LD A,0 ;mode 800 + OUT (LSDMD),A ;800 mode + LD HL,PRO800-PROFF+0FF00H + LD BC,PRO80E-PRO800 + JR NZ,RUNOB5 + LD A,8 ;mode 700 + OUT (LSDMD),A ;700 or 800 mode + IN A,(LSE0) ;CG xfer + LD HL,1000H + LD DE,0C000H + LD BC,1000H + LDIR + IN A,(LSE1) + LD HL,PRO700-PROFF+0FF00H + LD BC,PRO70E-PRO700 +RUNOB5: LD DE,0CFF0H + LDIR + POP HL + LD SP,IBUFE + LD DE,0D800H ;vram2 for 700 mode + JP 0CFF0H +;* +RUNOBE: RST 18H + DB .ERRX + RST 18H + DB .ERCVR + RST 18H + DB .DI + HALT + +;*------------- +;* ORG CFF0H +;*------------- +PRO700: OUT (LSE4),A +PRO701: LD A,71H ;blue and white + LD (DE),A ;vram2 clr + INC DE + LD A,D + CP 0E0H + JR NZ,PRO701 +PRO70P: OUT (LSE0),A ;jp (hl) + JP (HL) + +;*-------------------------------------------------------------------- +;* ORG CFF0H (the code below is copied to CFF0H and run from there) +;*-------------------------------------------------------------------- +PRO70E: +PRO800: OUT (LSE0),A ;700mon rom bank off + OUT (LSE3),A ;800mon rom bank on + JP (HL) + +PRO80E: +INITIO: PUSH AF + DI ;run "file name",r + IM 1 + LD HL,RUNTBL-PRXFER+BKEYBF + LD B,17 + RST 18H ;io dev init + DB .IOOUT + POP AF + RET + +RUNTBL: +;* pio channel a + DW 0FC00H ; int vecter + DW 0FCCFH ; mode 3 (bit mode) + DW 0FC3FH ; i/o reg. set + DW 0FC07H ; int seqence (disenable) +;* pio channel b + DW 0FD00H ; int vecter + DW 0FDCFH ; mode 3 (bit mode) + DW 0FD00H ; i/o reg. set + DW 0FD07H ; int seqence (disenable) +;* + DW 0D774H ;8253 C1 mode 2 + DW 0D7B0H ; C2 mode 0 + DW 0D6C0H ;counter2 12h + DW 0D6A8H ; + DW 0D5FBH ;counter1 1s + DW 0D53CH ; + DW 0D305H ;8253 int ok + DW 0CD01H ;RF mode 700 + DW 0CC01H ;WF mode 700 + +RUNTBE: +LDRDY0: LD HL,(VARED) + LD (TMPEND),HL + LD DE,(POOL) + LD (OLDPOOL),DE + OR A + SBC HL,DE + LD (VARLN),HL + LD HL,-256 + ADD HL,SP + LD (LAST),HL + LD DE,(VARED) + PUSH HL + OR A + SBC HL,DE + JP C,ER06A + EX (SP),HL + EX DE,HL + LD BC,(VARLN) + INC BC + LDDR + POP DE + RST 18H + DB .ADDP0 + LD A,1 + LD (LOADFG),A + RET + +LDRDY: CALL LDRDY0 + RST 18H + DB .LOPEN + LD A,(ELMD) + RET + +CLRVAR: LD HL,(VARED) + XOR A + DEC HL + LD (HL),A + DEC HL + LD (HL),A + LD (STRST),HL + DEC HL + LD (HL),A + LD (VARST),HL + DEC HL + LD (HL),A + LD (POOL),HL + LD HL,4 + LD (VARLN),HL + RET + +OLDPOOL: DB 0,0 ;(was DEFS 2) +VARLN: DB 0,0 ;(was DEFS 2) +LAST: DB 0,0 ;(was DEFS 2) +LOADFG: DB 0 + +CKCOM: PUSH AF + CALL QDIRECT + JP NZ,ER19 + POP AF + RET + +LDFIL: LD BC,(ELMD20) + PUSH BC + LD HL,(POOL) + LD DE,(TEXTST) + OR A + SBC HL,DE ;HL := text area size + LD L,0 + SBC HL,BC + JP C,ER06A + LD HL,0 + LD (OLDPOOL),HL + CALL RUNINT + LD HL,0 + LD (LNOBUF),HL + LD HL,(TEXTST) + RST 18H + DB .LOADF + POP BC + LD HL,(TEXTST) + ADD HL,BC + LD (OLDPOOL),HL + RET + +LOAD10: LD A,LDALU + LD B,0 + RST 18H + DB .CLKL + LD HL,LOADFG + LD A,(HL) + OR A + RET Z + LD (HL),0 + LD HL,(OLDPOOL) + LD A,H + OR L + JR NZ,LOAD11 + LD HL,(TEXTST) + CALL LDHL00 +LOAD11: EX DE,HL + LD HL,(POOL) + LD BC,(VARLN) + LDIR + EX DE,HL + OR A + SBC HL,DE + EX DE,HL + RST 18H + DB .ADDP0 + RET + +;*---------------------- +;* VERIFY "CMT:filename" +;*---------------------- +VERIFY: PUSH HL + CALL REFLNX + POP HL + CALL ELMT + PUSH HL + RST 18H + DB .LOPEN + CP 2 + JP NZ,ER61 + LD HL,(TEXTST) + RST 18H + DB .VRFYF + POP HL + RET + +;*--------------------- +;* SAVE "dev:filename" +;*--------------------- +SAVE: CALL TEST1 ;ALL + DB 0E5H + LD A,1 + JP Z,SVC.LS + PUSH HL + CALL REFLNX + POP HL + CALL ELMT + CALL TEST1 + DB ',' + JR Z,SAVEA + PUSH HL + LD A,2 + LD (ELMD),A + LD HL,(TEXTED) + LD DE,(TEXTST) + OR A + SBC HL,DE + LD (ELMD20),HL + LD A,(ELMD1) + CP 0DH + JP Z,ER60 + RST 18H + DB .SAVEF + POP HL + RET + +SAVEA: CALL TESTX + DB 'A' + PUSH HL + LD A,2 + LD (ZRWX),A + LD A,LDALU + LD (ZLOG),A + CALL OPEN.B + POP HL + CALL LIST0 + CALL PRTCR + LD B,1 + LD A,LDALU + RST 18H + DB .CLKL + RET + +;*---------------------------- +;* LOCK/UNLOCK "dev:filename" +;*---------------------------- +UNLOCK: XOR A + DB 1 +LOCK: LD A,1 + PUSH AF + CALL STREXP + RST 18H + DB .DEVFN + POP AF + RST 18H + DB .LOCK + RET + +;*--------------- +;* DIR[#n] "dev:" +;* DIR[/P] dev +;*--------------- +DIR: CALL GETLU + PUSH AF ;lu# + RST 18H + DB .LUCHK + JP C,ER44 + BIT 1,A ;W? + JP Z,ER59DU + CALL LU2CH + CALL DEVNAM + LD B,A ;ch# + XOR A + RST 18H ;read directory + DB .DIR + LD A,B ;A=ch# + RST 18H ;set default + DB .SETDF + POP AF ;A=lu# + RST 18H ;print directory + DB .DIR + RET + +;*----------------------- +;* DELETE "dev:filename" +;*----------------------- +FDEL: CALL STREXP + RST 18H + DB .DEVFN + RST 18H + DB .DELET + RET + +;*-------------------------------- +;* RENAME "dev:oldname","newname" +;*-------------------------------- +RENAME: CALL STREXP + RST 18H + DB .DEVFN + CALL HCH2CH + CALL STREXP + RST 18H + DB .RENAM + RET + +;*------------------- +;* random file access +;*------------------- +PRX: CALL RAN0 +PRX2: CALL PRTEXP + RST 18H + DB .PRREC + CALL ENDCHK + RET Z + CALL CH2CH + JR PRX2 + +INX: CALL RAN0 + LD DE,(TMPEND) + CALL MEMECK +INX2: CALL INTGTV + PUSH HL + PUSH AF + PUSH BC + LD DE,(TMPEND) + RST 18H + DB .INREC + POP DE + POP AF + CALL INSUB + POP HL + CALL ENDCHK + RET Z + CALL CH2CH + JR INX2 + +RAN0: CALL TEST1 + DB '(' + RET NZ + CALL IDEEXP + LD A,D + OR E + JP Z,ER03 + RST 18H + DB .RECST + CALL HCH29H + CALL TEST1 + DB ',' + RET + +;*--------------------- +;* SWAP "dev:filename" +;*--------------------- +SWAP: LD A,(LSWAP) + OR A + JP NZ,ER25 + PUSH HL + LD B,0 + RST 18H + DB .DEVNM + LD (SWAPDV),DE + LD (SWAPCH),A + LD HL,(TEXTED) + LD DE,(TEXTST) + XOR A + SBC HL,DE + LD (ELMD20),HL + RST 18H + DB .SWAP + POP HL + CALL ELMT + CALL CHKEND + LD A,(ZFLAG1) + BIT RAND,A + JP Z,ER59DU + PUSH HL ;RJOB + LD HL,(SWAPNB) + ADD HL,SP + LD SP,HL + EX DE,HL + LD HL,SWAPDS + LD BC,(SWAPBY) + LDIR + CALL LDRDY + CP 2 + JP NZ,ER61 + LD (SWAP2+1),SP +SWAP2: LD SP,0 ;jump from CHAIN + CALL LDFIL + CALL LOAD10 + LD HL,0FFFDH + PUSH HL ;SWAP flag + PUSH HL + LD A,1 + LD (LSWAP),A + LD HL,(TEXTST) + JP NXLINE + +;*------------- +;* Recover SWAP +;*------------- +BSWAP: XOR A + LD (LSWAP),A + POP IX +BSWAP2: POP BC + LD A,B + CP 0FFH + JP NZ,ER25 + LD A,C + CP 0FDH + JR Z,BSWAP6 + CP 0FEH + LD HL,4 + JR Z,BSWAP4 + CP 12H + LD HL,10H + JP NZ,ER25 +BSWAP4: ADD HL,SP + LD SP,HL + JR BSWAP2 + +BSWAP6: LD DE,(SWAPDV) + LD A,(SWAPCH) + RST 18H + DB .SETDF + LD B,0 + RST 18H + DB .DEVNM + CALL LDRDY0 + OR 0FFH + RST 18H + DB .SWAP + CALL LDFIL + CALL LOAD10 + LD HL,0 + ADD HL,SP + LD DE,SWAPDS + LD BC,(SWAPBY) + LDIR + LD SP,HL + POP HL ;RJOB + RET + +SWAPDV: DB 0,0 ;(was DEFS 2) +SWAPCH: DB 0 ;(was DEFS 1) + +;*--------------------------- +;* I/O initial for cold-start +;*--------------------------- +IOINIT: POP HL + PUSH HL + LD (ERRORP),HL + LD A,'1' + CALL IOINI2 + LD A,'2' + CALL IOINI2 + LD DE,INITD3 + LD B,INITD4-INITD3 + JR IOINI4 + +IOINI2: LD (INITD1+2),A + LD DE,INITD1 + LD B,INITD3-INITD1 +IOINI4: JP INIT2 + +INITD1: DB "RS?:0,$8C,13" +INITD3: DB "CMT:T" + + +INITD4: + +;* END of original module IOCS.ASM +;*============================================================================ +;* START of original module GRPH.ASM +;*------------------------------ +;* MZ-800 BASIC Graphic command +;* FI:GRPH ver 1.0B 9.21.84 +;* Programmed by T.Miho +;*------------------------------ + + +BITFU2: DB 0 ;Default W0/W1 +COL: DB 03H ;color code + +;*------------------- +;* SET/RESET [c,w]x,y +;*------------------- +SETCMD: DB 0F6H +RESET: XOR A + PUSH AF + CALL COORD0 + RST 18H + DB .POSSV + POP AF ;SET/RESET + PUSH HL + EXX + RST 18H + DB .PSET + POP HL + RET + +;*----------------------------------- +;* LINE/BLINE [c,w] x0,y0,x1,y1,..... +;*----------------------------------- +LINE: DB 0F6H +BLINE: XOR A + LD (LINE4+1),A + CALL COORD0 + CALL HCH2CH +LINE2: EXX + PUSH HL ;YS + PUSH DE ;XS + EXX + CALL COORD + POP DE ;XS + EX (SP),HL ;YS,Text + EXX +LINE4: LD A,0 ;LINE/BLINE + RST 18H + DB .LINE + POP HL + CALL TEST1 + DB ',' + JR Z,LINE2 + RST 18H + DB .POSSV + RET + +;*------------------- +;* PATTERN [C,W] N,X$ +;*------------------- +PATTERN: CALL COLCON ;PATTERN command + CALL IDEEXP + XOR A + BIT 7,D + JR Z,GRDSP4 + PUSH HL + LD H,A + LD L,A + SBC HL,DE + EX DE,HL + POP HL + LD A,1 +GRDSP4: EX AF,AF' + LD A,D + OR A + JR NZ,ER03A + LD A,E + PUSH AF + EX AF,AF' + PUSH AF + CALL HCH2CH + CALL STREXP + POP AF + LD C,A + POP AF + PUSH HL + LD H,C + RST 18H + DB .PATTR + POP HL + CALL ENDCHK + JR NZ,PATTERN + RET + +;*-------------- +;* POSITION x,y +;*-------------- +POSITION: CALL COORD ;POSITION command + RST 18H + DB .POSSV + RET + +;*-------------------- +;* Get X-Y coordinate +;*-------------------- +COORD0: CALL COLCON +COORD: CALL COORD1 ;Get x,y coordinate + PUSH DE + CALL TEST1 + DB ',' + CALL COORD1 + PUSH DE + EXX + POP HL + POP DE + EXX + RET + +COORD1: CALL IDEEXP + LD A,D ;0000 ... 3FFF + ADD A,40H ;C000 ... FFFF + RET P +ER03A: JP ER03 + +;*-------------- +;* color palette +;*-------------- +PALET: CALL ENDCHK + JP Z,ER01 + CALL PALRD + CALL COLCK2 + AND 03H + PUSH AF + LD A,(PALBK) + LD D,E + SRL D + SRL D + CP D + JP NZ,ER22 + CALL TESTX + DB ',' + CALL PALRD + LD B,A + POP AF + RST 18H + DB .DPLST + RET + +PALRD: CALL IBYTE + CP 16 ;0 .. 15 check + JR NC,ER03A + RET + +;*----------------------- +;* BOX [c,w] xs,ys,xe,ye +;*----------------------- +BOX: CALL COORD0 + EXX + PUSH HL ;YS + PUSH DE ;XS + EXX + CALL HCH2CH + CALL COORD + EXX + PUSH HL ;YE + PUSH DE ;XE + EXX + CALL ENDCHK + JR Z,BOX9 + CALL CH2CH + CALL ENDCHK + LD A,(COL) + CALL NZ,COLCHK + SCF +BOX9: EXX + POP DE + POP HL + EXX + POP DE + EX (SP),HL + RST 18H + DB .BOX + POP HL + RET + +;*---------- +;* COLOR c,w +;*---------- +COLOR: CALL COLSUB + LD A,(COL) + RST 18H + DB .DCOL + LD (SELCOL),A + LD A,(PWMODE) + LD (BITFU2),A + CALL CHKEND + RET + +;*------------------ +;* COLOR CONTROL EXP +;*------------------ +COLCON: CALL TEST1 + DB ',' + CALL TEST1 + DB '[' + JR NZ,COLCN1 + CALL COLSUB + LD A,(COL) + RST 18H + DB .DGCOL + CALL TESTX + DB ']' + CALL TEST1 + DB ',' + RET + +COLCN1: LD A,(SELCOL) + LD (COL),A + RST 18H + DB .DGCOL +COLCN2: LD A,(BITFU2) + LD (PWMODE),A + RET + +COLSUB: CALL TEST1 + DB ',' + JR Z,COLC8 + CALL COLCHK + LD (COL),A + CALL TEST1 + DB ',' + JR NZ,COLCN2 +COLC9: CALL IBYTE + CP 2 + JR NC,ER03B + LD (PWMODE),A + RET + +COLC8: LD A,(SELCOL) + LD (COL),A + JR COLC9 + +COLCHK: PUSH BC + CALL IBYTE + POP BC +COLCK2: LD A,(CRTMD1) + RRA + JR C,CMD1 + RRA + JR C,CMD2 + RRA + JR C,CMD3 +CMD1: LD A,E + CP 4 + JR NC,ER03B + RET + +CMD2: LD A,E + CP 16 + JR NC,ER03B + RET + +CMD3: LD A,E + CP 2 + RET C +ER03B: JP ER03 + +;*------------------------------------------------------ +;* Top of p.466 in German Listing of MZ-2Z046 Disk Basic +;*------------------------------------------------------ +;*------------- +;*PAINT COMMAND +;*------------- +PAINT: CALL COLCON + CALL POSITION + LD B,0 + LD DE,PAINTB + PUSH DE + CALL ENDCHK + JR Z,PAINT3 +PAINT1: CALL CH2CH + PUSH DE + CALL COLCHK + POP DE + LD (DE),A + INC DE + INC B + LD A,B + CP 16 + JP Z,ER01 + CALL ENDCHK + JR NZ,PAINT1 +PAINT2: EX (SP),HL ;data adrs + PUSH HL + LD HL,-527 + ADD HL,SP + LD (PAIWED),HL + POP HL + RST 18H + DB .PAINT + JP C,ER06 + POP HL + RET + +PAINT3: LD A,(COL) + LD (DE),A + INC B ; data count + JR PAINT2 + +PAINTB: DB 0,0,0,0,0,0,0,0 ;(was DEFS 16) + + DB 0,0,0,0,0,0,0,0 + + +;*------------------------------------------------------ +;* Top of p.467 in German Listing of MZ-2Z046 Disk Basic +;*------------------------------------------------------ +;*-------------- +;*CIRCLE COMMAND +;*-------------- +CIRCLE: PUSH HL + LD HL,0 + LD (CW.H+1),HL + LD (CW.XS+1),HL + LD (CW.YS+1),HL + LD (CW.XE+1),HL + LD (CW.YE+1),HL + LD HL,KK + CALL CLRFAC + LD HL,FLT2PI + LD DE,SK ;¼­³ط®³¶¸=2PAI + CALL LDIR5 + POP HL + CALL COORD0 ;¶²¼¬¸ ½ہ-ؤ + RST 18H + DB .POSSV + CALL HCH2CH + CALL IDEEXP + PUSH HL + LD A,D + AND 0C0H + JP NZ,ER03 + EX DE,HL + LD (CW.R+2),HL ;تف¹² + LD (CW.XS+1),HL + LD (CW.XE+1),HL + LD HL,(INTFAC) + LD DE,CIR.R + CALL LDIR5 + POP HL + CALL ENDCHK + JP Z,CW + CALL CH2CH + CALL TEST1 + DB ',' + JR Z,CIRCL2 + CALL HIRIT + CALL ENDCHK + JP Z,CW + CALL CH2CH +CIRCL2: CALL TEST1 + DB ',' + JR Z,CIRCL8 + LD IX,CW.XS+1 + LD IY,KK + CALL STX + CALL ENDCHK + JP Z,CW + CALL CH2CH +CIRCL8: CALL TEST1 + DB ',' + JR Z,CIRCL4 + LD IX,CW.XE+1 + LD IY,SK + CALL STX + CALL ENDCHK + JP Z,CW + CALL CH2CH +CIRCL4: CALL TESTX + DB 'O' + SCF + JR CW1 + +CW: XOR A +CW1: PUSH HL + PUSH AF + LD HL,KK + LD DE,SK + CALL SUBCMD + CALL LDIR5 + LD A,(KK) + OR A + LD B,0 + JR Z,CW2 ;KK=SK + LD HL,KK+1 + RES 7,(HL) + DEC HL ;HL:= ABS(KK-SK) + LD DE,FLTPAI + CALL CMP + LD B,1 + JR C,CW2 ; ABS() < PI + LD DE,FLT2PI + CALL CMP + LD B,2 + JR C,CW2 ;PI <= ABS() < 2*PI + LD B,3 ;2*PI <= ABS() +CW2: LD A,(SK+1) + AND 80H + OR B + LD B,A + POP AF ;CF='O' + LD A,B + EXX +CW.XS: LD DE,0 ;Start X +CW.YS: LD HL,0 ;Start Y +CW.H: LD BC,0 ;HIRITU + EXX +CW.XE: LD DE,0 ;End X +CW.YE: LD HL,0 ;End Y +CW.R: LD IX,0 ;R + RST 18H + DB .CIRCL + POP HL + OR A + RET + +HIRIT: CALL IDEEXP + CALL PUSHR + LD HL,(INTFAC) + INC HL + BIT 7,(HL) + JP NZ,ER03 + DEC HL + LD DE,FLONE + CALL CMP + RET Z + LD A,1 + JR C,HI + LD HL,FLONE + LD DE,CIRW3 + PUSH DE + CALL LDIR5 + POP HL + LD DE,(INTFAC) + CALL DIV + LD A,2 +HI: LD (CW.H+1),A + LD DE,LOG256 + CALL MUL + LD DE,LOGHLF + CALL ADDCMD + CALL HLFLT + LD A,L + LD (CW.H+2),A + BIT 0,H + RET Z + XOR A + LD (CW.H+1),A + RET + +STX: PUSH IX + PUSH IY + CALL IDEEXP + POP DE ;KK/SK + POP IX + PUSH HL + PUSH IX + LD HL,(INTFAC) + CALL LDIR5 + LD HL,(INTFAC) + LD D,H + LD E,L + INC DE + INC DE + INC DE + INC DE + INC DE + CALL LDIR5 + CALL COS ;HL=(INTFAC)+5 + LD DE,CIR.R + CALL MUL + CALL STXSUB + LD HL,(INTFAC) + CALL SIN + LD DE,CIR.R + CALL MUL + CALL NEGCMD + CALL STXSUB + POP IX + POP HL + RET + +STXSUB: INC HL + BIT 7,(HL) + PUSH AF + RES 7,(HL) + DEC HL + LD DE,LOGHLF + CALL ADDCMD + POP AF + INC HL + JR Z,STXSUC + SET 7,(HL) +STXSUC: DEC HL + CALL HLFLT + EX DE,HL + POP HL ;RET ADRS + EX (SP),HL ;Save coordinate + LD (HL),E + INC HL + LD (HL),D + INC HL + INC HL + EX (SP),HL + JP (HL) + +;*----------------------- +;*CIRCLE WORK AREA PART-2 +;*----------------------- +CIR.R: DB 0,0,0,0,0 ;(was DEFS 5) + + +CIRW3: DB 0,0,0,0,0 ;(was DEFS 5) + + +LOG256: DW 0089H + DW 0000H + DB 00H +LOGHLF: DW 0080H + DW 0A700H + DB 0C6H + +KK: DB 0,0,0,0,0 ;(was DEFS 5) + +SK: DB 0,0,0,0,0 ;(was DEFS 5) + + +;*------------------ +;* SYMBOL command +;*------------------ +;*DIRARE: EQU 27D0H ;DUPLICATE LABEL (commentd out) + +SMBOL: CALL COORD0 ;position load + RST 18H ;position input + DB .POSSV + CALL HCH2CH +;*string pointer load + CALL STREXP +;*string zero check + LD A,B + OR A + PUSH BC + PUSH HL + LD C,B + LD B,0 + LD HL,DIRARE + EX DE,HL + JR Z,SMBL2 + LDIR ;string data xfer +SMBL2: POP HL + CALL HCH2CH + CALL IBYTE ;yoko bairitsu + LD A,D + OR E + JR Z,ERJP3 ;zero error + PUSH DE + CALL HCH2CH + CALL IBYTE ;tate bairitsu + LD A,D + OR E +ERJP3: JP Z,ER03 ;zero error + LD A,E + POP DE + LD D,A + CALL ENDCHK ;end check + PUSH DE + JR Z,SMBL1 + CALL HCH2CH + CALL IBYTE ;angle load + LD A,3 + CP E + JP C,ER03 + LD A,E + DB 06H +SMBL1: XOR A + POP DE + POP BC + LD C,A ;angle push + LD A,B ;string length + OR A + RET Z ;zero return + LD A,C ;angle pop + PUSH HL + EX DE,HL + LD DE,DIRARE + RST 18H + DB .SYMBL + POP HL + RET + +;*------------- +;* HCOPY 1/2/3 +;* CLS 1/2/3 +;*------------- +HCOPY: CALL CHKEND + PUSH HL + LD A,00H ;ASAHI modify + RST 18H + DB .HCPY + POP HL + RET + +CLS: CALL CHKEND + PUSH HL + RST 18H + DB .CLS + POP HL + RET + +;* END of original module GRPH.ASM +;*============================================================================ +;* START of original module CONV.ASM +;*------------------------------ +;* MZ-800 BASIC Data Conversion +;* FI:CONV ver 1.0A 7.18.84 +;* Programmed by T.Miho +;*------------------------------ + +CHBAR: EQU 0C4H ; Sharp ASCII code for graphic '_' +;*%YEN: EQU 7DH ; DUPLICATE EQUATE (commented out) +CHUKP: EQU 0FBH ; Sharp ASCII code for 'œ' sign + +CHKEND: CALL ENDCHK + RET Z + JP ER01 + +TESTP: XOR A + LD (FILOUT),A + CALL TEST1 ;/ + DB 0FBH + RET NZ ;ZF=0 + CALL TESTX + DB 'P' + CALL LPTTMD ;Check text mode + LD A,'P' + LD (FILOUT),A + CP A ;ZF=1 + RET + +ASCFIV: LD DE,DGBF00 + LD B,0 ;Zero sup. + PUSH DE + RST 18H + DB .ASCHL + POP DE + RET + +;*------------------ +;* Fetch subroutines +;*------------------ +ICH28H: INC HL +HCH28H: CALL HLFTCH +CH28H: CP '(' + JR CHXX2 + +HCH29H: CALL HLFTCH +CH29H: CP ')' + JR CHXX2 + +HCH2CH: CALL HLFTCH +CH2CH: CP ',' + +CHXX2: INC HL + RET Z + JP ER01 + +SKPDI: INC DE +SKPDE: LD A,(DE) + CP ' ' + JR Z,SKPDI + RET + +LDIR1: LD HL,FLONE ;(DE)=1.0 +LDIR5: LD BC,5 ;(DE)=(HL) 5BYTES SET + LDIR + RET + +FLTHEX: CALL CLRFAC ;EXT(FLOAT) - (HL)=DE + LD A,E + OR D + RET Z + BIT 7,D + LD A,7FH + JR Z,NORFLH + LD A,D + CPL + LD D,A + LD A,E + CPL + LD E,A + INC DE + LD A,0FFH +NORFLH: LD B,91H +SFL: DEC B + BIT 7,D + JR NZ,FLHXRT + RL E + RL D + JR SFL + +FLHXRT: LD (HL),B + INC HL + AND D + LD (HL),A + INC HL + LD (HL),E + DEC HL + DEC HL + RET + +TSTNUM: CP 30H ;if 0-9 THEN CY=0 + RET C + CP 3AH + CCF + RET + +TSTVAR: CP 5FH ;if VAR THEN CY=0 + RET Z + CP 30H + RET C + CP 5BH + CCF + RET C + CP 3AH + CCF + RET NC + CP 41H + RET + +;*---------------------- +;*CONV FLOAT(HL)_ASC(DE) +;*---------------------- +CVFLAS: CALL CLRFAC + LD (DGITCO),A + LD (DGITFG),A + LD (EXPFLG),A + LD (PRODFL+1),A + LD A,5 + LD (PRCSON),A +DEFTCL: CALL SKPDE + INC DE + CP '+' + JR Z,DEFTCL + CP '-' + JR NZ,CHKAND + CALL DEFTCL + JP TOGLE + +CHKAND: CP '$' + JR NZ,ZRSKIP + PUSH HL + EX DE,HL + RST 18H + DB .DEHEX + EX (SP),HL + CALL FLTHEX + POP DE + LD A,5 + RET + +ZRSKIP: CP '0' + JR NZ,MDLAG + LD A,(DE) + INC DE + JR ZRSKIP + +FTCHL: LD A,(DE) + INC DE +MDLAG: CP 20H + JR Z,FTCHL + CP '.' + JR Z,DECNUM ;Label here was POINTS, changed to DECNUM + CALL TSTNUM + JR C,TST23H + SUB 30H + CALL MULTEN + CALL MULDEC + LD A,1 + LD (DGITFG),A + LD A,(DGITCO) + INC A + LD (DGITCO),A + JR FTCHL + +DECNUM: LD A,1 ;Label here was POINTS + LD (PRODFL+1),A + LD C,A +SKIPSP: LD A,(DE) ;Label here was POINT + INC DE + CP 20H + JR Z,SKIPSP + CALL TSTNUM + JR C,PESC + INC C + SUB 30H + JR Z,SDFGRE + PUSH AF + LD A,1 + LD (DGITFG),A + POP AF +SDFGRE: PUSH AF + LD A,(DGITFG) + LD B,A + LD A,(DGITCO) + ADD A,B + LD (DGITCO),A + POP AF + CALL MULTEN + CALL MULDEC + JR SKIPSP ;Label here was POINT + +PESC: DEC C + JR Z,TST23H + CALL DIVTEN + JR PESC + +TST23H: CP 'E' + JR Z,EXPON1 + +TSTPRC: DEC DE + LD A,(EXPFLG) + OR A + RET NZ +PRODFL: LD A,0 ;xxx + OR A + RET NZ + LD A,5 + RET + +EXPON1: LD A,(DE) + CP '-' + JR Z,EXPON2 + CP '+' + JR Z,EXPON2 + CALL TSTNUM + JR C,TSTPRC +EXPON2: LD A,1 + LD (PRODFL+1),A + PUSH HL + LD HL,MUL + LD (EXJPVC),HL + LD HL,0000H + LD A,(DE) + INC DE + CP '+' + JR Z,CBEGIN + CP '-' + JR NZ,CLMIDL + PUSH HL + LD HL,DIV + LD (EXJPVC),HL + POP HL +CBEGIN: LD A,(DE) + INC DE +CLMIDL: SUB 30H + JR C,ESCPER + CP 0AH + JR NC,ESCPER + PUSH DE + CALL ADHLCK + LD E,L + LD D,H + CALL ADHLCK + CALL ADHLCK + CALL ADDECK + LD E,A + LD D,0 + CALL ADDECK + POP DE + JR CBEGIN + +ESCPER: LD A,H + OR A + JR NZ,OVRFL + LD A,L + POP HL + PUSH DE + PUSH BC + PUSH HL + LD DE,ZFAC + PUSH DE + CALL LDIR1 + POP HL + LD B,A + INC B + JR ESCPR2 + +ESCPR1: CALL MULTEN +ESCPR2: DJNZ ESCPR1 + EX DE,HL + POP HL + DB 0CDH +EXJPVC: DB 0,0 ;(was DEFS 2) + POP BC + POP DE + JP TSTPRC + +DIVTEN: PUSH AF + PUSH BC + PUSH DE + LD DE,FLTEN + CALL DIV + POP DE + POP BC + POP AF + RET + +ADDECK: ADD HL,DE + RET NC + JR OVRFL + +ADHLCK: ADD HL,HL + RET NC +OVRFL: JP ER02 ;OVERFLOW + +MULDEC: PUSH DE + PUSH HL + LD HL,ZFAC ;***** + LD E,A + LD D,0 + CALL FLTHEX + EX DE,HL + POP HL + PUSH BC + CALL ADDCMD + POP BC + POP DE + RET + +;*---------------------- +;*CONV ASC(DE)_FLOAT(HL) +;*---------------------- +CVNMFL: LD A,5 + LD (PRCSON),A + LD A,(HL) + OR A + JR Z,ONLYZH + INC HL + LD A,(HL) + DEC HL + RLCA +ONLYZH: LD A,20H + JR NC,PLUS + CALL TOGLE + LD A,'-' +PLUS: PUSH AF + CALL CVASF1 + CALL ADJDGT + POP AF + DEC DE + LD (DE),A + RET + +CMP2: PUSH BC + CALL CMP + POP BC + RET + +INT: CALL PUSHR + LD A,(HL) + CP 81H + JP C,CLRFAC + LD A,(HL) + CP 0A0H + RET NC + INC HL + CALL RCHLBC + PUSH HL + LD L,(HL) + LD B,0 +INTSFL: SRL E + RR D + RR C + RR L + INC A + INC B + CP 0A0H + JR NZ,INTSFL +INTSBL: SLA L + RL C + RL D + RL E + DJNZ INTSBL + LD A,L + POP HL + LD (HL),A + DEC HL + LD (HL),C + DEC HL + LD (HL),D + DEC HL + LD (HL),E + RET + +RCHLBC: LD E,(HL) + INC HL + LD D,(HL) + INC HL + LD C,(HL) + INC HL + RET + +FRACT: LD A,(HL) + CP 81H + RET C + PUSH DE + PUSH HL + LD DE,FRACW + PUSH DE + CALL LDIR5 + POP HL + CALL INT + EX DE,HL + POP HL + CALL SUBCMD + POP DE + RET + +FRACW: DB 0,0,0,0,0 ;(was DEFS 5) + + +MULTEN: PUSH AF + PUSH BC + PUSH DE + LD DE,FLTEN + CALL MUL + POP DE + POP BC + POP AF + RET + +HLFLT: INC HL + BIT 7,(HL) + JR Z,NORHLC + CALL NORHLC + LD A,H + CPL + LD H,A + LD A,L + CPL + LD L,A + INC HL + RET + +NORHLC: DEC HL + LD A,(HL) + CP 91H + JP NC,ER02 ;OVERFLOW + CP 81H + JR C,HXZRRT + PUSH AF + INC HL + LD A,(HL) + INC HL + LD L,(HL) + LD H,A + POP AF + SET 7,H +HXFLSL: CP 90H + RET Z + INC A + SRL H + RR L + JR HXFLSL + +HXZRRT: CCF + LD HL,0 + RET + +SNGMXO: DW 3E9BH + DW 20BCH + DB 00H +SNGMXP: DW 1898H + DW 8096H + DB 00H + DW 7494H + DW 0024H + DB 00H + DW 4391H + DW 0050H + DB 00H + DW 1C8EH + DW 0040H + DB 00H + DW 7A8AH + DW 0000H + DB 00H + DW 4887H + DW 0000H + DB 00H + +FLTEN: DW 2084H + DW 0000H + DB 00H + +FLONE: DW 0081H + DW 0000H + DB 00H + DW 4C7DH + DW 0CCCCH + DB 0CDH + +SLLMT: DW 2B66H + DW 77CCH + DB 12H + +EXPASC: LD HL,(HLBUF2) + LD B,0 +TENCOM: LD DE,FLTEN + CALL CMP2 + JR C,ONECOM + CALL DIVTEN + INC B + JR TENCOM + +ONECOM: LD DE,FLONE + CALL CMP2 + JR NC,COMOK + CALL MULTEN + DEC B + JR ONECOM + +COMOK: PUSH BC + CALL CVASF1 + CALL ADJDGT + POP BC + PUSH DE + EX DE,HL +SERNOP: LD A,(HL) + OR A + JR Z,SEROK + INC HL + JR SERNOP + +SEROK: DEC HL + LD A,(HL) + INC HL + CP '0' + JR NZ,USEXPE + INC B + DEC HL +USEXPE: LD A,'E' + LD (HL),A + INC HL + LD A,B + LD B,'+' + BIT 7,A + JR Z,EXSGPT + NEG + LD B,'-' +EXSGPT: LD (HL),B + INC HL + LD (HL),'0' +EXTNPT: SUB 0AH + JR C,EXONPT + INC (HL) + JR EXTNPT + +EXONPT: ADD A,3AH + INC HL + LD (HL),A + INC HL + LD (HL),0 + POP DE + RET + +INTPAR: PUSH HL + CALL HLFLT + LD DE,DGBF11 + PUSH DE + LD B,1 ;Non zero-sup. + RST 18H + DB .ASCHL + POP HL + LD A,'0' + LD B,5 +INT22: CP (HL) + JR NZ,INTDGO + INC HL + DJNZ INT22 + JR INTDGE + +INTDGO: LD A,B + LD (DGITCO),A + LD A,1 + LD (DGITFG),A +INTDGE: LD A,'.' + LD (DGBF16),A + POP HL + CALL FRACT + JP FRACDG + +CVASF1: LD (HLBUF2),HL + XOR A + LD (DGITCO),A + LD (DGITFG),A + PUSH HL + LD HL,DGBF07 + LD (HL),0FFH + LD B,33 ;fill buffer with 0's + LD A,'0' +CVASF2: INC HL + LD (HL),A + DJNZ CVASF2 + LD A,'.' + LD (DGBF16),A + POP HL + LD A,(HL) + OR A + RET Z + LD DE,SNGMXO + CALL CMP + CCF + RET C + LD DE,SLLMT + CALL CMP + RET C + LD DE,ZFAC1 + PUSH DE + CALL LDIR5 + POP HL + LD A,(HL) + CP 81H + JR C,FRACDG ; + CP 90H + JP C,INTPAR ; + LD IX,DGBF08 + LD DE,SNGMXP + CALL GENDGT + CALL GENDQ + RET NC ;C=0 +FRACDG: LD IX,DGBF17 +FRCAGN: LD DE,SNGMXO + PUSH BC + PUSH IX + CALL MUL + POP IX + POP BC + INC DE + INC DE + INC DE + INC DE + INC DE + CALL GENDGT + CALL GENDQ + JR C,FRCAGN + RET + +CVASFL: LD A,5 + LD (PRCSON),A + PUSH HL + LD DE,ZFAC2 + PUSH DE + CALL LDIR5 + POP HL + CALL CVASF1 + CALL ADJDG2 + POP HL + RET + +ZERADJ: LD DE,DGBF16 + LD (DE),A + DEC DE + RET + +ADJDG2: JP C,EXPASC +ADJDGT: LD HL,(HLBUF2) + LD A,(HL) + OR A + JR Z,ZERADJ + LD DE,DGBF08 + DEC DE + EX DE,HL + LD DE,1 +SSNTO1: INC HL + LD A,(HL) + CP '.' + JR NZ,TST30H + LD DE,0 + JR SSNTO1 + +TST30H: CP '0' + JR Z,SSNTO1 + ADD HL,DE + LD DE,8 + ADD HL,DE + LD A,(HL) +FRCASL: LD (HL),'0' + CP 35H + JR C,BCKSER +ADDLOP: DEC HL + LD A,(HL) + CP '.' + JR Z,ADDLOP + INC A + JR Z,MAXNO + LD (HL),A + CP ':' + JR Z,FRCASL + INC HL +BCKSER: LD DE,DGBF16 + EX DE,HL + OR A + SBC HL,DE + EX DE,HL + JR C,KUMI + LD HL,DGBF16 + JR INTDI2 +KUMI: DEC HL + LD A,(HL) + CP '.' + DEC HL + JR Z,INTDIS + INC HL + CP '0' + JR Z,BCKSER + PUSH HL + LD DE,DGBF25 + SBC HL,DE + POP HL + JP NC,EXPASC +INTDIS: INC HL +INTDI2: LD (HL),0 + LD DE,DGBF08 +TSTFST: LD A,(DE) + CP '0' + JR NZ,ZEONLY + INC DE + JR TSTFST +ZEONLY: OR A + RET NZ + DEC DE + LD A,'0' + LD (DE),A + RET + +MAXNO: LD HL,DGBF00 + LD DE,M1E08 + PUSH BC + LD BC,6 + LDIR + POP BC + LD DE,DGBF00 + RET + +M1E08: DB "1E+08" + + DB 0 + +GENDGT: LD A,(DE) + CP 7DH + RET Z +INTGDL: CALL CMP + JR C,GTESTB + INC (IX+0) + PUSH IX + PUSH BC + CALL SUBCMD + POP BC + POP IX + LD A,1 + LD (DGITFG),A + JR INTGDL + +GTESTB: INC IX + INC DE + INC DE + INC DE + INC DE + INC DE + LD A,(DGITFG) + LD B,A + LD A,(DGITCO) + ADD A,B + LD (DGITCO),A + CALL GENDQ + RET NC + JR GENDGT + +GENDQ: LD A,(HL) + OR A + RET Z + LD A,(DGITCO) + CP 9 + RET + +DGITCO: DB 0 ;(was DEFS 1) +DGITFG: DB 0 ;(was DEFS 1) +EXPFLG: DB 0 ;(was DEFS 1) +HLBUF2: DB 0,0 ;(was DEFS 2) +;*------------------------------------- +;* Top p.498 in German Listing of 2Z046 +;*------------------------------------- +;*----------------- +;* USING CONVERSION +;*----------------- +USINGS: DB 0,0 ;USING START (was DEFS 2) +USINGP: DB 0,0 ;USING POINTER (was DEFS 2) + +USNGSB: LD HL,(USINGP) + PUSH DE +USNGS2: LD A,(HL) + OR A + JP Z,ER03 + CALL USGCD1 + JR Z,USNGS4 + LD (BC),A + INC BC + INC HL + JR USNGS2 +USNGS4: EX AF,AF' + LD A,(PRCSON) + CP 3 + JP NZ,FLTUSG + EX AF,AF' + CP '!' + JP Z,OUT1CH + CP '&' + JP Z,OUT2CH + JP ER04 + +OUT1CH: EX (SP),HL + PUSH BC + CALL CVTSDC + OR A + LD A,20H + JR Z,OUT1CJ + LD A,(DE) +OUT1CJ: POP BC + LD (BC),A + INC BC +AFTPR0: POP HL + INC HL +AFTPRT: LD A,(HL) + OR A + JR Z,BRTUSG + CALL USGCD1 + JR Z,RETUSG + LD (BC),A + INC BC + INC HL + JR AFTPRT + +BRTUSG: LD HL,(USINGS) +RETUSG: LD (USINGP),HL + XOR A + LD (BC),A + RET + +OUT2CH: LD D,2 +OUT22: INC HL + LD A,(HL) + CP '&' + JR Z,FOUN26 + INC D + CP 20H + JR Z,OUT22 + JP ER03 + +FOUN26: EX (SP),HL + LD A,(HL) + CP D + JR C,TRIZHH + INC HL + CALL INDRCT + PUSH BC + LD BC,(STRST) + ADD HL,BC + POP BC +HPRLOP: LD A,(HL) + LD (BC),A + INC BC + INC HL + DEC D + JR NZ,HPRLOP + JP AFTPR0 + +TRIZHH: LD E,(HL) + INC HL + CALL INDRCT + LD A,E + OR A + JR Z,HHSPCF + PUSH BC + LD BC,(STRST) + ADD HL,BC + POP BC +PRHHL1: LD A,(HL) + LD (BC),A + INC BC + INC HL + DEC E + JR Z,HHSPC + DEC D + JR NZ,PRHHL1 + JP AFTPR0 + +HHSPCF: LD A,20H + LD (BC),A + INC BC +HHSPC: DEC D + JR NZ,HHSPCF + JP AFTPR0 + +;*----------------- +;* Check using code +;*----------------- +USGCD1: CALL CHKACC + DB 4 + DB "!&#+" + RET Z + LD E,A + CP 2AH ;[*] + JR Z,USGCD2 + CALL QMONEY + JR Z,USGCD2 + CP '.' + LD E,'#' + JR Z,USGCD2 + CP CHBAR + RET NZ + INC HL + LD A,(HL) + OR A + JP Z,ER03 + RET + +USGCD2: INC HL + LD A,(HL) + CP E + DEC HL + LD A,(HL) + RET + +FLTUSG: XOR A + LD (FPLUSF),A + LD (PUASTF),A ;PUT * FLG + LD (PUYENF),A ;] + LD (PUAFMF),A ;AFTER-FLG + LD (PUCOMF),A ;PUT , FLG + LD (INTLEN),A ;INT LENGTH + LD (RPLUSF),A ;###+ + LD (PUEXPF),A ;^^^^ + DEC A + LD (FRCLEN),A ;FRAC LENGTH + EX AF,AF' + LD D,0 + CP '#' + JP Z,PFLENG + CP 2AH ;[*] + JP Z,ASTRSK + CALL QMONEY + JP Z,YENUSG + CP '.' + JP Z,PULSLS + CP '+' + JP Z,PLUSUS + JP ER04 + +ASTRSK: LD A,1 + LD (PUASTF),A + INC HL + INC D + INC HL + INC D + LD A,(HL) + CALL QMONEY + JR NZ,PULSLS + JR YENUS2 + +YENUSG: INC HL + INC D +YENUS2: INC HL + INC D + LD (PUYENF),A + JR PULSLS + +PLUSUS: LD A,1 + LD (FPLUSF),A + +PFLENG: INC HL + INC D + +PULSLS: EX DE,HL + DEC H +PUGTFC: INC H + LD A,(DE) + INC DE + CP '#' + JR Z,PUGTFC + CP ',' + JR NZ,PUCONP + LD A,1 + LD (PUCOMF),A + JR PUGTFC + +PUCONP: CP '.' + JR Z,PUPOIT + CP '-' + JR NZ,PUAFMO + LD A,1 + LD (PUAFMF),A + INC DE + JR PUAFQO + +PUAFMO: CP '+' + JR NZ,PUAFQO + LD A,(FPLUSF) + OR A + JR NZ,PUAFQO + LD A,1 + LD (RPLUSF),A + INC DE +PUAFQO: DEC DE + LD A,H + LD (INTLEN),A + JR BEGUSG + +PUPOIT: LD A,H + LD (INTLEN),A + LD H,0FFH +PUPOFC: INC H + LD A,(DE) + INC DE + CP '#' + JR Z,PUPOFC + CP '-' + JR NZ,PUCOPQ + LD A,1 + LD (PUAFMF),A + INC DE + JR PUCOPP + +PUCOPQ: CP '+' + JR NZ,PUCOPP + LD A,(FPLUSF) + OR A + JR NZ,PUCOPP + LD A,1 + LD (RPLUSF),A + INC DE +PUCOPP: DEC DE + LD A,H + LD (FRCLEN),A + JR BEGUSG + +NEXPP0: POP DE + JR NEXPPU + +BEGUSG: LD H,4 + PUSH DE +CHEXPU: LD A,(DE) + INC DE + CP '^' + JR NZ,NEXPP0 + DEC H + JR NZ,CHEXPU + POP AF + LD A,1 + LD (PUEXPF),A +NEXPPU: POP HL + PUSH DE + INC HL + LD A,(HL) + RES 7,(HL) + DEC HL + LD (USGSGN),A + LD A,(INTLEN) + LD D,A + DB 3EH +FRCLEN: DB 0 ;(was DEFS 1) + LD E,A + DB 3EH +PUEXPF: DB 0 ;(was DEFS 1) + PUSH BC + CALL USNGCV + POP BC + DB 3EH +PUCOMF: DB 0 ;(was DEFS 1) + OR A + JR Z,LADJS1 + PUSH BC + PUSH DE + LD A,(INTLEN) + LD L,A + LD H,0 + ADD HL,DE + LD DE,DGBF00 + LD C,0 + DEC HL +COMN3D: LD B,3 +COMSK3: LD A,(HL) + CP 20H + JR Z,ESCPUC + INC C + LD (DE),A + INC DE + DEC HL + DJNZ COMSK3 + LD A,(HL) + CP 20H + JR Z,ESCPUC + LD A,',' + LD (DE),A + INC DE + INC C + JR COMN3D + +ESCPUC: DB 3EH +INTLEN: DB 0 ;(was DEFS 1) + CP C + JP C,ER02 + LD B,C + LD L,A + LD H,0 + POP DE + PUSH DE + ADD HL,DE + LD DE,DGBF00 + DEC HL +INTLN2: LD A,(DE) + LD (HL),A + DEC HL + INC DE + DJNZ INTLN2 + POP DE + POP BC +LADJS1: DB 3EH +PUAFMF: DB 0 ;(was DEFS 1) + OR A + JR NZ,LADJS2 + DB 3EH +RPLUSF: DB 0 ;(was DEFS 1) + OR A + JR NZ,LADJS2 + DB 3EH +FPLUSF: DB 0 ;(was DEFS 1) + OR A + JR NZ,PTPLS1 + LD A,(USGSGN) + RLCA + JR NC,LADJS2 + LD A,(DE) + CP 20H + LD H,'-' + JR Z,FPUTER + CP 30H + JP NZ,ER02 +FPUTER: PUSH DE +PUPTML: LD A,(DE) + INC DE + CP 20H + JR Z,PUPTML + CP 30H + JR Z,PUPTML + OR A + JR NZ,LADJ11 + DEC DE +LADJ11: DEC DE + DEC DE + LD A,H + LD (DE),A + POP DE + JR LADJS2 + +PTPLS1: DB 3EH +USGSGN: DB 0 ;(was DEFS 1) + RLCA + LD H,'+' + JR NC,FPUTER + LD H,'-' + JR FPUTER + +LADJS2: DB 3EH +PUYENF: DB 0 ;(was DEFS 1) + OR A + JR Z,LADJS3 + LD A,(DE) + CP 20H + JR NZ,LADJS3 + PUSH DE +LADJ22: LD A,(DE) + INC DE + CP 20H + JR Z,LADJ22 + DEC DE + DEC DE + LD A,(PUYENF) + LD (DE),A + POP DE +LADJS3: DB 3EH +PUASTF: DB 0 ;(was DEFS 1) + OR A + JR Z,LADJS4 + PUSH DE +ASTFIL: LD A,(DE) + CP 20H + JR NZ,LADJ3 + LD A,2AH ;[*] + LD (DE),A + INC DE + JR ASTFIL +LADJ3: POP DE +LADJS4: LD A,(DE) + OR A + JR Z,USPRL8 + LD (BC),A + INC BC + INC DE + JR LADJS4 +USPRL8: LD A,(RPLUSF) + OR A + JR Z,TST2DH ;- + LD A,(USGSGN) + RLCA + LD A,'+' +LSDVZR: JR NC,PULSTX + LD A,'-' +PULSTX: LD (BC),A + INC BC + JR RETPU$ + +TST2DH: LD A,(PUAFMF) ;- + OR A + JR Z,RETPU$ + LD A,(USGSGN) + RLCA + LD A,20H + JR LSDVZR + +RETPU$: POP HL + JP AFTPRT + +;*--------------------------------------- +;*Top of p.510 in German Listing of 2Z046 +;*--------------------------------------- +QMONEY: CP CHUKP ; Sharp ASCII code for 'œ' sign + RET Z + CP '$' ; Sharp ASCII code for U.S. Dollar Sign + RET + +USNGCV: OR A + JP Z,USGCV2 + PUSH DE + LD A,(HL) + OR A + JR Z,USCMOK + PUSH HL + LD A,D + LD DE,ZFAC1 + PUSH AF + CALL LDIR1 + POP AF + OR A + JR Z,BMULED + LD B,A + LD HL,ZFAC1 + JR USNEXT + +USLOOP: CALL MULTEN +USNEXT: DJNZ USLOOP +BMULED: POP HL + LD B,0 +USTNCM: LD DE,ZFAC1 + CALL CMP2 + JR C,USTOCM + CALL DIVTEN + INC B + JR USTNCM +USTOCM: PUSH HL + LD HL,ZFAC1 + CALL DIVTEN + POP HL +USONCM: LD DE,ZFAC1 + CALL CMP2 + JR NC,USCMOK + CALL MULTEN + DEC B + JR USONCM +USCMOK: POP DE + PUSH BC + CALL USGCV1 + POP BC + PUSH DE + LD A,(DE) + CP '.' + JR NZ,FLADSR + LD DE,DGBF16 + DEC DE + LD A,(DE) + CP 31H + POP DE + PUSH DE + JR NZ,USEX0C + EX DE,HL + INC HL + LD (HL),31H + DEC HL + JR MIDDCX + +FLADSR: LD A,(DE) + CP 31H + JR NZ,USEX0C + EX DE,HL + INC HL + LD A,(HL) + DEC HL + CP '.' + LD A,'0' + JR Z,FLAD22 + LD A,20H +FLAD22: LD (HL),A +FLAD33: INC HL + LD A,(HL) + CP '.' + JR Z,FLAD33 + LD (HL),31H +MIDDCX: EX DE,HL + INC B +USEX0C: LD A,(DE) + INC DE + OR A + JR NZ,USEX0C + DEC DE + JP USEXPE + +USGCV2: PUSH DE + CALL USGCV1 + POP AF + OR A + RET NZ + PUSH HL + LD HL,DGBF16 + DEC HL + LD A,'0' + CP (HL) +FOVVXC: JP NZ,ER02 + DEC HL + LD A,20H + CP (HL) + JR NZ,FOVVXC + POP HL + RET + +USGCV1: PUSH DE + CALL CVASF1 + JP C,ER02 + POP HL + PUSH HL + LD H,0 + INC L + JR Z,USGCV3 + DEC L +USGCV3: LD DE,DGBF17 + ADD HL,DE + LD A,(HL) + LD (HL),0 + DB 11H +FRCASU: LD (HL),'0' + CP 35H + JR C,BCKSEU +USGCV4: DEC HL + LD A,(HL) + CP '.' + JR Z,USGCV4 + INC A + JP Z,ER02 + LD (HL),A + CP ':' + JR Z,FRCASU +BCKSEU: LD HL,KEYBM1 ;ئئKEYBUF + LD DE,2000H +USGCV5: LD (HL),D + INC HL + DEC E + JR NZ,USGCV5 + POP HL + PUSH HL + LD E,H + LD D,0 + LD HL,KEYBUF + ADD HL,DE + PUSH HL + LD HL,DGBF07 + LD (HL),20H + INC HL + LD D,7 +BF00SP: LD A,(HL) + CP 30H + JR NZ,BF00ED + LD (HL),20H + INC HL + DEC D + JR NZ,BF00SP +BF00ED: POP HL + PUSH HL + LD B,E + LD A,B + OR A + JR Z,BFST11 + LD DE,DGBF16 +BFSTL1: DEC HL + DEC DE + LD A,(DE) + LD (HL),A + CP 20H + JR Z,BFST11 + DJNZ BFSTL1 + DEC DE + LD A,(DE) + CP 20H + JR Z,BFST11 + INC A + JP NZ,ER02 +BFST11: POP HL + POP DE + INC E + JR Z,EDSTRT + LD B,E + LD DE,DGBF17 + LD (HL),'.' +BFSTL2: INC HL + DEC B + JR Z,EDSTRT + LD A,(DE) + INC DE + LD (HL),A + JR BFSTL2 +EDSTRT: LD (HL),0 + LD DE,KEYBUF + RET + +;* END of original module CONV.ASM +;*=========================================================================== +;* START of original module EDIT.ASM +;*------------------------------------- +;* MZ-800 BASIC Interm.code conversion +;* FI:EDIT ver 1.0A 7.18.84 +;* Programmed by T.Miho +;*------------------------------------- + +CVIMTX: PUSH DE + PUSH BC + LD C,0 + DEC DE +CVIM10: INC DE +CVIM12: CALL IMSPACE + OR A + JR Z,IMEND + CP 0FFH + JR Z,IMPAI + CP 80H + JP NC,ER01 + CP 20H + JR C,CVIM10 + LD IX,CVIM12 + PUSH IX + CP '"' + JR Z,IMSTR + CP 27H + JR Z,IMREM + CP '?' + JR Z,IMPRT + CP '.' + JP Z,IMFLT + CP '$' + JP Z,IMHEX + CALL TSTNUM + JR C,IMRSV + JP IMNUM + +IMEND: LD (HL),A + POP BC + POP DE + RET + +IMPAI: LD (HL),0E4H + CALL IM3R + JR CVIM12 + +IMPRT: LD A,8FH + CALL IM3RS + JR IMRSV6 + +IMREM: LD (HL),':' + CALL IM3R + LD (HL),27H + CALL IM3RH + JP IMDATA + +IMSTR: LD (HL),A + CALL IM3R +IMSTR2: LD A,(DE) + OR A + RET Z + CP '"' + JR NZ,IMSTR +IM3RS: LD (HL),A +IM3R: INC DE +IM3RH: INC HL +IM3RC: INC C + RET NZ + JP ER08 ;LINE LENGTH + +IMVAR: POP BC + LD A,(DE) + CALL TSTVAR + JR C,IM3RS +IMVAR2: CALL IM3RS + LD A,(DE) + CP '$' + JR Z,IM3RS + CALL TSTNUM + RET C + JR IMVAR2 + +IMRSV: PUSH BC + LD BC,CTBL1 + CALL IMSER + JR NC,IMRSV4 + LD BC,GTABL + CALL IMSER + LD C,0FEH + JR NC,IMRSV2 + LD BC,CTBL2 + CALL IMSER + LD C,0FFH + JR C,IMVAR +IMRSV2: LD (HL),C + INC HL + LD (HL),A + POP BC + CALL IM3RC + CALL IM3RH + CP 0B4H ; ERL ****** + RET NZ + CALL IMSPACE + CP '=' + RET NZ + LD (HL),0F4H ; = ****** + CALL IM3R + JR IMLNO + +IMRSV4: POP BC + CALL IM3RH +IMRSV6: CP 97H ; REM + JR Z,IMDATA + CP 94H ; DATA + JR Z,IMDATA + CP 0C2H ; ELSE + JR Z,IMELSE + CP 0E2H ; THEN + JR Z,IMLNO + CP 0E0H + RET NC + PUSH AF + CALL IMSPACE + CP '/' + JR NZ,IMRSV7 + LD (HL),0FBH ;/ + CALL IM3R + CALL SKPDE + CALL IM3RS + JR IMRSV8 + +IMRSV7: CP '#' + JR NZ,IMRSV8 + CALL IM3RS + CALL SKPDE + CALL TSTNUM + CALL NC,IMNUM +IMRSV8: POP AF + CP 8DH ; FOR + RET NC +IMLNO: CALL IMSPACE + CP '"' + JR NZ,IMLNO2 + CALL IMSTR + JR IMLNO +IMLNO2: CP 2CH + RET C + CP 2FH + JR C,IMLNO4 ;",-." + CALL TSTNUM + RET C + CALL IMINT + JR IMLNO +IMLNO4: CALL IM3RS + JR IMLNO + +IMELSE: DEC HL + LD (HL),':' + INC HL + LD (HL),A + CALL IM3RH + JR IMLNO + +IMDATA: LD A,(DE) + CALL ENDCK0 + RET Z + CALL IM3RS + CP '"' + CALL Z,IMSTR2 + JR IMDATA + +IMSER: PUSH HL ;Search in tabale + PUSH DE + LD H,B + LD L,C + LD B,7FH +IMSER2: POP DE + PUSH DE + INC B + LD A,(HL) + CP 0FFH + JR NZ,IMSER3 + POP DE ;Table end + POP HL + SCF + RET + +IMSER3: CP '.' + JR NZ,IMSER4 + INC HL ;AND OR XOR NOT + DEC DE + LD A,(DE) + INC DE + CALL TSTVAR + JR NC,IMSER6 +IMSER4: LD A,(DE) + CP 20H + JR NZ,IMSER5 + LD A,(HL) + AND 7FH + SUB 'A' + CP 26 + JR C,IMSER6 + CALL SKPDI +IMSER5: LD C,(HL) + INC HL + INC DE + CP '.' + JR Z,IMSER8 + SUB C + JR Z,IMSER4 + CP 80H + JR Z,IMSER9 +IMSER6: DEC HL ;Not match +IMSER7: BIT 7,(HL) + INC HL + JR Z,IMSER7 + JR IMSER2 + +IMSER8: LD A,B + CP 0E8H ;operator + JR NC,IMSER6 + CCF +IMSER9: POP HL ;Found + POP HL + LD (HL),B + LD A,B + RET + +IMSPACE: LD A,(DE) + CP 20H + RET NZ + LD (HL),A + CALL IM3R + JR IMSPACE + +IMNUM: EX AF,AF' + PUSH DE + CALL SKPDI + POP DE + CALL TSTNUM ;check if one-digit + JR NC,IMFLT + CP '.' + JR Z,IMFLT + CP 'E' + JR Z,IMFLT + EX AF,AF' + SUB 30H-1 + JP IMFLT ;ok, JP IM3RS + +IMFLT: PUSH BC + LD (HL),15H + INC HL + PUSH HL + CALL CVFLAS + POP HL + LD BC,5 + ADD HL,BC + LD A,6 + JR BCKSPS + +IMINT: PUSH BC + CALL CVBCAS + LD (HL),0BH + INC HL + JR PPOLNO + +IMHEX: LD (HL),A + INC DE + LD A,(DE) + RST 18H + DB .CKHEX + JP C,IM3RH + PUSH BC + LD (HL),11H + INC HL + PUSH HL + EX DE,HL + RST 18H + DB .DEHEX + LD B,D + LD C,E + EX DE,HL + POP HL +PPOLNO: LD A,3 + LD (HL),C + INC HL + LD (HL),B + INC HL +BCKSPS: POP BC + ADD A,C + JP C,ER08 ;LINE LENGTH + LD C,A +BCKSKP: DEC DE + LD A,(DE) + CP 20H + JR Z,BCKSKP + INC DE + RET + +CVTXIM: PUSH HL + PUSH DE + PUSH BC + EXX + LD B,0 + EXX + LD C,0 +CVTX10: LD A,(HL) + OR A + JR Z,TXEND + LD BC,CVTX10 + PUSH BC + CP 27H + JR Z,TXDAT2 + INC HL + LD BC,CTBL1 + CP 20H + JR C,TXNUM + CP '"' + JR Z,TXSTR + CP ':' + JR Z,TX3AH + CP 97H ;REM + JR Z,TXDATA + CP 94H ;DATA + JR Z,TXDATA + CP 0E4H ;PI + JR Z,TXPAI + CP 0FEH + JR NC,TXRSV0 + CP 80H + JP NC,TXRSV + JP STRDE + +TXEND: LD (DE),A + POP BC + POP DE + POP HL + RET + +TXPAI: LD A,0FFH + JP STRDE + +TXRSV0: LD BC,CTBL2 + JR NZ,TXRSV1 + LD BC,GTABL +TXRSV1: LD A,(HL) + INC HL + JR TXRSV + +TXDATA: CALL TXRSV + RET Z +TXDAT2: LD A,(HL) + CALL ENDCK0 + RET Z + CALL STRDE + LD A,(HL) + INC HL + CP '"' + CALL Z,TXSTR2 + JR TXDAT2 + +TXSTR: CALL STRDE +TXSTR2: LD A,(HL) + OR A + RET Z + INC HL + CP '"' + JR NZ,TXSTR + JR STRDE + +TX3AH: LD (DE),A + LD A,(HL) + CP 0C2H ; ELSE + RET Z + CP 27H + RET Z + JR STRDE2 + +TXNUM: CP 15H + JR Z,TXFLT + CP 0BH + JR NC,TXINT + DEC A + OR 30H + JR STRDE + +TXINT: PUSH DE + LD E,(HL) + INC HL + LD D,(HL) + INC HL + PUSH HL + CP 12H + JR Z,TXINT2 + CP 0CH + JR C,TXINT2 + JR NZ,TXHEX + EX DE,HL + INC HL + INC HL + LD E,(HL) + INC HL + LD D,(HL) +TXINT2: EX DE,HL + CALL ASCFIV + LD B,D + LD C,E + POP HL + POP DE +TXINT4: LD A,(BC) + OR A + RET Z + CALL STRDE + INC BC + JR TXINT4 + +TXFLT: PUSH HL + PUSH DE + CALL CVASFL + LD B,D + LD C,E + POP DE + POP HL + INC HL + INC HL + INC HL + INC HL + INC HL + JR TXINT4 + +TXRSV: CP 80H + JR Z,TXRSV4 + EX AF,AF' +TXRSV2: LD A,(BC) + RLCA + INC BC + JR NC,TXRSV2 + EX AF,AF' + DEC A + JR TXRSV +TXRSV4: LD A,(BC) + BIT 7,A + JR NZ,STRDES + CP '.' + CALL NZ,STRDE + INC BC + JR TXRSV4 + +STRDES: AND 7FH +STRDE: LD (DE),A + OR A + RET Z +STRDE2: INC DE + EXX + INC B + EXX + RET NZ + XOR A + LD (DE),A + DEC DE + EXX + DEC B + EXX + RET + +TXHEX: LD A,'$' + EX AF,AF' + EX DE,HL + CALL HEXHL + LD B,D + LD C,E + POP HL + POP DE + EX AF,AF' + CALL STRDE + JR TXINT4 + +HEXHL: LD DE,DGBF12 + PUSH DE + LD A,H + CALL HEXACC + LD A,L + CALL HEXACC + XOR A + LD (DE),A + POP DE + LD B,3 + +ZRSUP: LD A,(DE) + CP '0' + RET NZ + INC DE + DJNZ ZRSUP + RET + +;*------------------------------------------- +;* Middle of p.530 in German Listing of 2Z046 +;* Convert Byte in A to 2-hex at DE +;*------------------------------------------- +HEXACC: PUSH AF + RRCA + RRCA + RRCA + RRCA + AND 0FH + CALL HEXAC2 + POP AF + AND 0FH +HEXAC2: ADD A,30H + CP 3AH + JR C,HEXAC3 + ADD A,7 +HEXAC3: LD (DE),A + INC DE + RET + +CVBCAS: PUSH HL + EX DE,HL + RST 18H + DB .DEASC + LD B,D + LD C,E + EX DE,HL + POP HL + JP BCKSKP + +;* END of original module EDIT.ASM +;*============================================================================ +;* START of original module EXPR.ASM +;*------------------------------ +;* MZ-800 BASIC Expression part +;* FI:EXPR ver 1.0A 8.25.84 +;* Programmed by T.Miho +;*------------------------------ + +IBYTE: CALL IDEEXP ;0-255 +DCHECK: LD A,D + OR A + JP NZ,ER03 + LD A,E + RET + +DEEXP: CALL EXPR8 + DEC DE + DEC DE + DEC DE + DEC DE + DEC DE + JR STDEFC + +IDEEXP: CALL EXPR ;DE=(HL) +STDEFC: PUSH AF + PUSH HL + EX DE,HL + CALL STROMT + CALL HLFLT + EX DE,HL + POP HL + POP AF + RET + +STREXP: CALL EXPR + PUSH AF + CALL STROK + PUSH HL + EX DE,HL + CALL CVTSDC + POP HL + POP AF + RET + +CVTSDC: LD B,(HL) + INC HL + LD E,(HL) + INC HL + LD D,(HL) + LD HL,(STRST) + ADD HL,DE + EX DE,HL + LD A,B + RET + +EXPR: LD DE,(VARED) + LD (TMPEND),DE +EXPRNX: LD DE,(INTFAC) + PUSH DE + CALL EXPR8 + POP DE + RET + +EXPR8: PUSH DE + LD DE,(TMPEND) + CALL MEMECK + POP DE + +EXPR7: CALL EXPR6 +EXPR7L: CP 0EAH ;XOR + RET NZ + LD A,(PRCSON) + PUSH AF + INC HL + CALL EXPR6 + POP BC + PUSH AF + PUSH HL + CALL ADJUST + CALL .XOR. + POP HL + POP AF + JR EXPR7L + +EXPR6: CALL EXPR5 +EXPR6L: CP 0EBH ;OR + RET NZ + LD A,(PRCSON) + PUSH AF + INC HL + CALL EXPR5 + POP BC + PUSH AF + PUSH HL + CALL ADJUST + CALL .OR. + POP HL + POP AF + JR EXPR6L + +EXPR5: CALL EXPR4 +EXPR5L: CP 0ECH ;AND + RET NZ + LD A,(PRCSON) + PUSH AF + INC HL + CALL EXPR4 + POP BC + PUSH AF + PUSH HL + CALL ADJUST + CALL .AND. + POP HL + POP AF + JR EXPR5L + +EXPR4: CALL TEST1 ;NOT + DB 0EDH + JR NZ,EXPR3 + CALL EXPR3 + PUSH AF + PUSH HL + LD HL,-5 + ADD HL,DE + CALL .NOT. + POP HL + POP AF + RET + +EXPR3: CALL EXPR2 +EXPR3L: CP 0EEH ;>< + RET C + PUSH AF ;stk OPC + LD A,(PRCSON) + PUSH AF ;stk OPC, PRCSON + INC HL + CALL EXPR2 + POP BC ;stk OPC* B=PRCSON + EX (SP),HL ;stk RJOB* HL=OPC + PUSH AF ;stk RJOB,NEXT + PUSH HL ;stk RJOB,NEXT,OPC + CALL ADJUST + CALL CMP + EX AF,AF' ;AF' = result + POP AF ;stk RJOB,NEXT; A=OPC + CP 0F6H ;< + JR NZ,NXTCP1 + EX AF,AF' + JR C,TRUE +FALSE: LD BC,0 +RLBACK: LD (HL),C + INC HL + LD (HL),B + INC HL + XOR A + LD (HL),A + INC HL + LD (HL),A + INC HL + LD (HL),A + LD A,5 + LD (PRCSON),A + POP AF ;POP NEXT + POP HL ;POP RJOB + JR EXPR3L + +TRUE: LD BC,8081H + JR RLBACK + +NXTCP1: CP 0F5H ;> + JR NZ,NXTCP2 + EX AF,AF' + JR Z,FALSE + JR C,FALSE + JR TRUE + +NXTCP2: CP 0F4H ;= + JR NZ,NXTCP3 + EX AF,AF' + JR Z,TRUE + JR FALSE + +NXTCP3: CP 0F2H ;=>,>= + JR C,NXTCP4 + EX AF,AF' + JR NC,TRUE + JR FALSE + +NXTCP4: CP 0F0H ;=<,<= + JR C,NXTCP5 + EX AF,AF' + JR Z,TRUE + JR C,TRUE + JR FALSE + +NXTCP5: EX AF,AF' ;<>,>< + JR Z,FALSE + JR TRUE + +EXPR2: CALL EXPR1 +EXPR2L: CP 0F7H ;+,- + RET C + LD A,(PRCSON) + PUSH AF + INC HL + JR Z,EXPR2A ;+ + CALL EXPR1 + POP BC + PUSH AF + PUSH HL + CALL ADJUST + CALL SUBCMD +EXPR2X: POP HL + POP AF + JR EXPR2L + +EXPR2A: CALL EXPR1 + POP BC + PUSH AF + PUSH HL + CALL ADJUST + CALL ADDCMD + JR EXPR2X + +EXPR1: CALL EXPR0 +EXPR1L: CP 0F9H ;MOD, YEN + RET C + LD A,(PRCSON) + PUSH AF + INC HL + JR Z,EXPR1A ;YEN + CALL EXPR0 + POP BC + PUSH AF + PUSH HL + CALL ADJUST + CALL MOD +EXPR1X: POP HL + POP AF + JR EXPR1L + +EXPR1A: CALL EXPR0 + POP BC + PUSH AF + PUSH HL + CALL ADJUST + CALL YEN + JR EXPR1X + +EXPR0: CALL EXPRZ +EXPR0L: CP 0FBH ;/,* + RET C + LD A,(PRCSON) + PUSH AF + INC HL + JR Z,EXPR0A ;/ + CALL EXPRZ + POP BC + PUSH AF + PUSH HL + CALL ADJUST + CALL MUL +EXPR0X: POP HL + POP AF + JR EXPR0L +EXPR0A: CALL EXPRZ + POP BC + PUSH AF + PUSH HL + CALL ADJUST + CALL DIV + JR EXPR0X + +EXPRZ: CALL TEST1 ;+ + DB 0F7H + JR Z,EXPRZ + CP 0F8H ;- + JR NZ,EXPRY + INC HL + CALL EXPRY + JR EXPRX2 + +EXPRY: CALL FACTOR +EXPRYL: CP 0FDH ;^ + RET NZ + LD A,(PRCSON) + PUSH AF + INC HL + CALL EXPRX + POP BC + PUSH AF + PUSH HL + CALL ADJUST ; + CALL POWERS ;(HL)^(DE) + POP HL + POP AF + JR EXPRYL + +EXPRX: CALL TEST1 ;+ + DB 0F7H + JR Z,EXPRX + CP 0F8H ;- + JR NZ,FACTOR + INC HL + CALL FACTOR +EXPRX2: PUSH AF + PUSH HL + LD HL,-5 + ADD HL,DE + CALL NEGCMD + POP HL + POP AF + RET + +FACTOR: CALL ENDCHK + JP Z,ER01 + CALL FAC0 + JP HLFTCH + +FAC0: PUSH HL + LD HL,(MEMLMT) + SCF + SBC HL,DE + JP C,ER06 ;TOO COMPLEX EXPR + POP HL + CP 0E4H ;PI + JR Z,FACPAI + CP 20H + JR NC,VARFNC ;IM 20 .... + +FACNUM: INC HL ;factor(numeric) + CP 15H + JR C,FACINT + CALL LDIR5 ;IM 15 + JR FACR5 + +FACPAI: INC HL + PUSH HL + LD HL,FLTPAI + CALL LDIR5 + POP HL +FACR5: LD A,5 +FACRX: LD (PRCSON),A + RET + +FACINT: CP 0BH ;IM 00 .. 14 + JR NC,FACI4 + DEC A + JP M,ER01 ;IM 00 + LD B,0 + LD C,A + JR FACI6 + +FACI4: LD C,(HL) ;IM 0B .. 14 + INC HL + LD B,(HL) + INC HL + CP 0CH + JR NZ,FACI6 + INC BC + INC BC + LD A,(BC) + INC BC + EX AF,AF' + LD A,(BC) + LD B,A + EX AF,AF' + LD C,A +FACI6: PUSH HL + PUSH DE + EX DE,HL + LD E,C + LD D,B + CALL FLTHEX + POP DE + POP HL + LD A,5 +FACRX5: INC DE + INC DE + INC DE + INC DE + INC DE + JR FACRX + +VARFNC: CP '"' + JR NZ,VARFN1 + INC HL + PUSH HL + CALL STRLCK ;B=len(HL str.) + EX (SP),HL ;New text point + PUSH HL ;Old text point + LD HL,(TMPEND) + PUSH BC + LD BC,(STRST) + OR A + SBC HL,BC ;HL=OFSET+ADR + POP BC + EX DE,HL + LD (HL),B ;FAC set len. + INC HL + LD (HL),E ;FAC set adrs + INC HL + LD (HL),D + INC HL + INC HL + INC HL + POP DE ;Old text point + PUSH HL ;New expr point + LD HL,(TMPEND) + CALL STRENT ;(HL)_(DE),B + LD (TMPEND),HL + POP DE ;New expr point + POP HL ;New text point + LD A,3 + LD (PRCSON),A + RET + +VARFN1: CP '(' + JR NZ,FUNC + INC HL ;( ... ) + CALL EXPR8 + JP CH29H + +FUNC: OR A ;Function + JP P,VARFN2 + CP 0E7H ;SPC ==> + INC HL + JR NZ,FUNC1 + LD B,5 ;param is numeric + LD A,0A8H ; SPACE$ + PUSH AF + JR FUNC2 + +FUNC1: CP 0FFH + JP NZ,ER01 + LD A,(HL) + INC HL + CP 0A0H + JP Z,CHR$OP ;CHR$ + CP 0C8H + JP NC,ER01 + CP 0BAH + JR NC,GETJPA ;complex + CP 9CH ;JOY STICK + JR Z,GETJPA + CP 9DH ;JOY STRIG + JP Z,GETJPA + PUSH AF + CP 0B3H + JR NC,SYSV ;system var + LD B,3 + CP 0ABH + JR NC,FUNC2 ;param is string + LD B,5 ;param is numeric + CP 88H ;RND + JR Z,RNDONL +FUNC2: CALL HCH28H +FUNC4: PUSH BC + CALL EXPR8 + CALL CH29H + POP AF + CALL STRCK +FUNC6: POP AF + PUSH DE + PUSH HL + LD HL,-5 + ADD HL,DE + CALL GETJPA + POP HL + POP DE + RET + +RNDONL: CALL TEST1 + DB '(' + JR Z,FUNC4 +SYSV: LD A,5 + LD (PRCSON),A + PUSH HL + LD HL,FLONE + CALL LDIR5 + POP HL + JR FUNC6 + +GETJPA: PUSH HL + ADD A,A + LD L,A + LD H,0 + LD BC,FJPTBL + ADD HL,BC + LD A,(HL) + INC HL + LD H,(HL) + LD L,A + EX (SP),HL + RET + +SIZE: EX DE,HL + LD HL,-527 + ADD HL,SP + LD BC,(TMPEND) + OR A + SBC HL,BC + EX DE,HL + JR NC,PUT2B + XOR A + JR PUT1B + +CSRH: LD A,(CURX) + JR PUT1B + +CSRV: LD A,(CURY) + JR PUT1B + +POSH: LD DE,(POINTX) + JR PUT2B + +POSV: LD DE,(POINTY) + JR PUT2B + +ERR: LD A,(ERRCOD) +PUT1B: LD E,A + LD D,0 +PUT2B: LD A,5 + LD (PRCSON),A + JP FLTHEX + +ERL: LD DE,(ERRLNO) + CALL FLTHEX + INC HL + BIT 7,(HL) + DEC HL + RET Z + LD DE,FL64K + JP ADDCMD + +FL64K: DW 0091H ;65536 + DW 0000H + DB 00H + +CHR$OP: CALL HCH28H + LD B,0 +CHR$LP: PUSH BC ;counter + PUSH DE ;FAC + CALL DEEXP + CALL DCHECK + POP DE ;FAC + POP BC ;counter + PUSH AF ;data + INC B + CALL TEST1 + DB ',' + JR Z,CHR$LP + CALL CH29H + LD A,B ;length + EXX + LD B,A + LD HL,(TMPEND) ;string start + CALL ADDHLA + LD D,H + LD E,L ;string end+1 + CALL MEMECK +CHR$4: DEC HL + POP AF ;data + LD (HL),A + DJNZ CHR$4 + EXX + LD A,B ;length + EXX + LD B,A +;*---------------- +;*HL=String start +;*DE=String end+1 +;*B =String length +;*DE'=FAC +;*HL'=TEXT,?? +;*---------------- +STEXR2: LD (TMPEND),DE + LD DE,(STRST) + OR A + SBC HL,DE + PUSH HL + LD A,B + EXX + EX DE,HL + LD (HL),A + INC HL + POP BC + LD (HL),C + INC HL + LD (HL),B + LD BC,3 ; + ADD HL,BC +STRPRS: EX DE,HL + LD A,3 + LD (PRCSON),A + RET + +HEX$: PUSH HL + CALL HLFLT + CALL HEXHL + RST 18H + DB .COUNT +;*------------------ +;* DE:adrs +;* B:length +;* (SP):Text pointer +;*------------------ +PUTSTR: LD A,B + OR A + JR Z,NULSPC + LD HL,(TMPEND) + PUSH HL + PUSH BC + CALL STRENT + POP BC + EX DE,HL + POP HL + EXX + POP DE + EXX + JR STEXR2 +NULSPC: POP HL + CALL CLRFAC + JR STRPRS + +;*---------------------------------------- +;* Top of p.552 in German Listing of 2Z046 +;*---------------------------------------- +SPACE$: PUSH HL + CALL HLINCK + LD B,A + LD C,A + OR A + LD A,20H + PUSH DE + CALL NZ,QSETDE + POP DE + LD B,C + JR PUTSTR + +HLINCK: CALL HLFLT + LD DE,KEYBUF + LD A,H + OR A + JP NZ,ER03 + LD A,L + RET + +STR$: PUSH HL + CALL CVNMFL + LD A,(DE) + CP 20H + JR NZ,STR1 + INC DE +STR1: RST 18H + DB .COUNT + JR PUTSTR + +EOF: CALL HCH28H + CALL GETLU + LD B,A + CALL HCH29H + LD A,B + PUSH HL + PUSH DE + RST 18H + DB .SEGAD + LD DE,-1 + JR C,EOF2 + INC HL + BIT EOFAA,(HL) + JR NZ,EOF2 + LD DE,0 +EOF2: POP HL + CALL FLTHEX + LD A,5 + LD (PRCSON),A +EOF8: INC HL + INC HL + INC HL + INC HL + INC HL + EX DE,HL + POP HL + RET + +POINT: CALL HCH28H ;POINT command + PUSH DE ;EXPR pointer + CALL DEEXP ;X + LD B,D + LD C,E ;X + POP DE ;EXPR pointer + PUSH DE ;EXPR pointer + PUSH BC ;X + CALL CH2CH + CALL DEEXP ;Y + CALL CH29H + EX (SP),HL ;HL=X + EX DE,HL + RST 18H + DB .POINT + INC A + JP Z,ER03 ;Out of range + DEC A + POP DE ;TEXT pointer + POP HL ;EXPR pointer + PUSH DE ;TEXT pointer + CALL PUT1B + JR EOF8 + +ASC: PUSH HL + CALL CVTSDC + OR A + JR Z,ASC1 + LD A,(DE) +ASC1: JR LEN2 + +LEN: PUSH HL + CALL CVTSDC +LEN2: POP HL + JP PUT1B + +;*---------------------------------------- +;* Top of p.555 in German Listing of 2Z046 +;*---------------------------------------- +VAL: PUSH HL + CALL CVTSDC + LD HL,(TMPEND) + PUSH HL + CALL STRENT + LD (HL),0 + POP DE + POP HL + JP CVFLAS + +LEFT$: CALL CH28EX + CALL CH29H + CALL BCHECK + EX DE,HL + LD A,(HL) + CP C + JR NC,LEFT1 + LD C,A +LEFT1: LD (HL),C + LD BC,5 +FACSTR: LD A,3 + ADD HL,BC + EX DE,HL + LD (PRCSON),A + JP HLFTCH + +RIGHT$: CALL CH28EX + CALL CH29H + CALL BCHECK + EX DE,HL + LD A,(HL) + SUB C + JR NC,MID$EE + XOR A + LD C,(HL) +MID$EE: LD (HL),C + INC HL + ADD A,(HL) + LD (HL),A + INC HL + JR NC,RIGHT1 + INC (HL) +RIGHT1: LD BC,3 + JR FACSTR + +MID$: CALL CH28EX + CALL BCHECK + OR A + JP Z,ER03 + PUSH AF + CALL TEST1 + DB ')' + LD A,0FFH + JR Z,MID$2 + CALL HCH2CH + PUSH DE + EX DE,HL + LD BC,5 + ADD HL,BC + EX DE,HL + CALL DEEXP + CALL CH29H + CALL DCHECK + POP DE +MID$2: POP BC + LD C,A + EX DE,HL + LD A,(HL) + SUB B + JR C,MIDNUL + INC A + CP C + JR NC,MIDD3 + LD C,A +MIDD3: LD A,B + DEC A + JR MID$EE + +MIDNUL: XOR A + LD C,A + JR MID$EE + +BCHECK: LD A,B + OR A + JP NZ,ER03 + LD A,C + RET + +CH28EX: CALL HCH28H + PUSH DE + CALL EXPR8 + CALL CH2CH + CALL STROK + CALL DEEXP + LD C,E + LD B,D + POP DE + RET + +TI$: PUSH HL + PUSH DE + LD HL,(TMPEND) + PUSH HL + LD A,'0' + LD B,6 + CALL QSETHL + RST 18H ;A,DE + DB .TIMRD + POP HL + OR A + JR Z,TI$2 + INC (HL) + INC HL + INC (HL) + INC (HL) + DEC HL +TI$2: EX DE,HL + LD BC,8CA0H ;10H + CALL CLDGIT + LD BC,0E10H ;1H + CALL CLDGIT + CP 3AH + JR C,TI$4 + SUB 10 + DEC DE + LD (DE),A + DEC DE + LD A,(DE) + INC A + LD (DE),A + INC DE + INC DE +TI$4: DEC DE + DEC DE + LD A,(DE) + INC DE + LD B,A + LD A,(DE) + INC DE + LD C,A + LD A,B + CP 32H + JR NZ,TI$6 + LD A,C + CP 34H + JR NZ,TI$6 + LD HL,(TMPEND) + LD A,'0' + LD B,6 + CALL QSETHL + JR TI$8 + +TI$6: LD BC,258H ;10M + CALL CLDGIT + LD BC,3CH ;1M + CALL CLDGIT + LD BC,0AH ;10S + CALL CLDGIT + LD A,30H + ADD A,L + LD (DE),A +TI$8: LD HL,(TMPEND) + LD DE,6 + EX DE,HL + ADD HL,DE + LD (TMPEND),HL + EX DE,HL + LD DE,(STRST) + OR A + SBC HL,DE + EX DE,HL + POP HL + LD (HL),6 + INC HL + LD (HL),E + INC HL + LD (HL),D + INC HL + INC HL + INC HL + EX DE,HL + POP HL + LD A,3 + LD (PRCSON),A + JP HLFTCH + +CLDGIT: OR A + SBC HL,BC + JR C,CLDGRT + LD A,(DE) + INC A + LD (DE),A + JR CLDGIT + +CLDGRT: ADD HL,BC + INC DE + RET + +TIMDAI: CALL TESTX ;TI$=.... + DB 0F4H + CALL STREXP + LD A,B + CP 6 + JP NZ,ER03 + PUSH HL + PUSH DE + LD HL,0 + CALL TIMASC + CP 24 + JP NC,ER03 + CP 12 + LD A,0 + JR C,TIMDA2 + PUSH DE + LD DE,12 + OR A + SBC HL,DE + POP DE + INC A +TIMDA2: PUSH AF + CALL TIMASC + CP 60 + JP NC,ER03 + CALL TIMASC + CP 60 + JP NC,ER03 + POP AF + EX DE,HL + RST 18H + DB .TIMST + POP DE + POP HL + RET + +TIMASC: PUSH DE + LD D,H + LD E,L + ADD HL,HL + ADD HL,HL + ADD HL,DE + LD D,H + LD E,L + ADD HL,HL + ADD HL,DE + ADD HL,HL + ADD HL,HL + POP DE + LD A,(DE) + INC DE + SUB 30H + JP C,ER03 + CP 0AH + JP NC,ER03 + PUSH BC + LD C,A + ADD A,A + ADD A,A + ADD A,C + ADD A,A + LD C,A + LD A,(DE) + INC DE + SUB 30H + JP C,ER03 + CP 0AH + JP NC,ER03 + ADD A,C + LD C,A + LD B,0 + ADD HL,BC + POP BC + RET + +INTGTV: LD DE,(VARED) + LD (TMPEND),DE + LD DE,(INTFAC) +GETVAR: PUSH DE + CALL VSRTST +GETFNV: LD A,(HL) + CP '(' + JP Z,ARRAY + PUSH HL + CALL CHVRNM + JR NC,CRNVAR + LD A,C + LD C,L + LD B,H + POP HL + POP DE + RET + +CRNVAR: LD A,(DE) + ADD A,C ;VAR.LEN.+TYPE + ADD A,2 + PUSH BC + EX DE,HL + LD HL,(TMPEND) + PUSH HL + OR A + SBC HL,DE + INC HL + LD C,L + LD B,H + POP HL + PUSH DE + EX DE,HL + LD L,A + LD H,0 + ADD HL,DE + EX DE,HL + CALL MEMECK + LDDR + LD E,A + LD D,0 + RST 18H + DB .ADDP2 + POP HL + POP BC + LD DE,KEYBUF + LD (HL),C ;TYPE SET + INC HL + SCF + SBC A,C ;B=A-C-1 + LD B,A +VARSL1: LD A,(DE) ;VAR.LEN.&NAME + LD (HL),A + INC DE + INC HL + DJNZ VARSL1 + PUSH HL + LD B,C + CALL QCLRHL ;VAR.CLR + LD (HL),A ;VAR.END MARK + LD A,C + POP BC + POP HL + POP DE + RET + +VSRTST: CALL HLFTCH + SUB 'A' + CP 26 + JP NC,ER01 + LD DE,KEYBUF + LD B,0 +VSRTS1: INC DE + LD A,(HL) + CALL TSTVAR + JR C,TSTTYP + LD (DE),A + INC B + LD A,B + CP 3 + JR C,VSRTS2 + DEC B +VSRTS2: INC HL + JR VSRTS1 + +TSTTYP: LD DE,KEYBUF + EX DE,HL + LD (HL),B + EX DE,HL + LD C,5 + CP 24H ;$ + RET NZ + LD C,3 + INC HL + RET + +ADJUST: LD HL,-5 + EX DE,HL + ADD HL,DE + EX DE,HL + ADD HL,DE + LD A,B + JP STRCK + +STRLCK: LD B,0FFH +STRLL1: INC B + LD A,(HL) + OR A + RET Z + INC HL + CP '"' + RET Z + JR STRLL1 + +STRENT: LD A,B + OR A + RET Z + CALL LDHLDE + EX DE,HL + CALL MEMECK + EX DE,HL + RET + +MEMECK: PUSH HL ;SBC SP,DE + LD HL,-512 + ADD HL,SP + SBC HL,DE + POP HL + RET NC + JP ER06A + +;*------------------ +;* PUSH DE +;* KEYBUF..LEN. NAME +;* HL=( +;*------------------ + +ARRAY0: LD DE,(INTFAC) + PUSH DE + JR ARRAY2 + +ARRAY: XOR A + LD (AUTDIM),A + INC HL + LD (ARYTXT),HL +ARRAY2: LD B,0 + EXX + POP HL ;POP FAC + PUSH HL ;PUSH FAC + PUSH HL ;PUSH FAC1 + LD HL,(TMPEND) + LD DE,KEYBUF + PUSH HL + LD A,(DE) + LD (HL),A + INC DE + INC HL + LD B,A + CALL STRENT + POP DE + LD (TMPEND),HL + LD HL,(STRST) + EX DE,HL + OR A + SBC HL,DE + EX (SP),HL ;NAME ADR. + PUSH HL ;PUSH FAC1 + EXX +TSALOP: POP DE ;POP FAC1 + PUSH DE ;PUSH FAC1 + PUSH BC ;PUSH B,TYPE(C) + LD BC,(ARYTXT) + LD A,(AUTDIM) + PUSH BC + PUSH AF + LD BC,(DGBF00) + PUSH BC + CALL DEEXP ;ئئDE=EXP(INT) + BIT 7,D + JP NZ,ER03 + EX AF,AF' + POP BC + LD (DGBF00),BC + POP AF + LD (AUTDIM),A + POP BC + LD (ARYTXT),BC + EX AF,AF' + INC HL + CP ')' + JR Z,TSFARY + CP ',' + JP NZ,ER01 + POP BC ;POP B,TYPE(C) + INC B ;(.,.,.,.) + LD A,B + CP 4 + JP NC,ER03 + EXX + POP HL ;POP FAC1 + POP DE ;POP NAME ADR. + EXX + PUSH DE ;ANS + EXX + PUSH DE ;PUSH NAME ADR. + PUSH HL ;PUSH FAC1 + EXX + JR TSALOP + +TSFARY: POP BC ;POP B,TYPE(C) + EXX + POP HL ;POP FAC1 + POP DE ;POP NAME ADR. + EXX + INC B ;ARRAY POINT + PUSH DE ;ANS + PUSH HL ;PUSH TEXT POINT + EXX + LD HL,(STRST) + ADD HL,DE + LD B,(HL) + INC B + LD DE,KEYBUF + CALL LDDEHL + EXX + SET 7,C + CALL CHVRNM + RES 7,C + JR NC,ARYDIM + LD A,B + CP (HL) + JP NZ,ER07 ;DUPLICATE +;*---------------------------------------------------- +;* LD A,(AUTDIM) ;these three lines are +;* OR A ;commented out of the +;* JP NZ,ER07 ;original source code +;*---------------------------------------------------- + INC HL + EX DE,HL + POP HL + LD (DGBF00),HL ;TEXT END + EXX + LD HL,0000H + EXX + EX DE,HL +ADRCL: LD E,(HL) + INC HL + LD D,(HL) + INC HL + EX (SP),HL + PUSH DE + EXX + POP DE + CALL DIMMUL + EXX + PUSH HL + OR A + SBC HL,DE + JP NC,ER03 + EXX + POP DE + CALL DIMADD + EXX + POP HL + DJNZ ADRCL + PUSH HL + EXX + LD A,C + LD D,B + BIT 6,A + JR NZ,VARDIM + AND 0FH + LD E,A + PUSH AF + CALL DIMMUL + PUSH HL + EXX + POP BC + POP AF + POP HL + ADD HL,BC + LD C,L + LD B,H +VARDME: LD HL,(DGBF00) + POP DE + RET + +VARDIM: LD E,(HL) + INC HL + LD D,(HL) + POP HL + LD C,L + LD B,H + LD (HL),E + INC HL + LD (HL),D + AND 0FH + JR VARDME + +ARYDIM: EXX + LD A,(AUTDIM) + OR A + JP Z,ER03 + POP HL ;TEXT POINT + LD (DGBF00),HL + EXX + LD DE,(TMPEND) + LD L,B + LD H,0 + ADD HL,HL + ADD HL,DE + EX DE,HL + INC DE + CALL MEMECK + LD (HL),B + INC HL + EXX + LD HL,1 + EXX +ADRCL2: POP DE + LD A,(AUTDIM) + OR A + JR NZ,ADRCL3 + PUSH HL ;1 + EX DE,HL + LD DE,10 + SCF + SBC HL,DE + JP NC,ER03 + POP HL ;1 +ADRCL3: INC DE + LD (HL),E + INC HL + LD (HL),D + INC HL + PUSH DE + EXX + POP DE + CALL DIMMUL + EXX + DJNZ ADRCL2 + LD E,C + LD D,0 + PUSH BC + PUSH DE + EXX + POP DE + CALL DIMMUL + PUSH HL + EXX + POP BC + PUSH BC ;2 A*B*C*D + EX DE,HL + LD HL,(TMPEND) ;(.,.,.)*2 + LD L,(HL) + LD H,0 + ADD HL,HL + LD A,(KEYBUF) ;+NAME + ADD A,5 ;+TY+LN+NL+(.,.) + ADD A,L + LD L,A + LD A,0 + ADC A,H + LD H,A + JR C,DIMOVM + ADD HL,BC + JR C,DIMOVM + PUSH HL ;3 LEN + ADD HL,DE ;+TEMPEND +DIMOVM: JP C,ER06A + EX DE,HL + CALL MEMECK + PUSH HL ;4 TMPEND + EXX + POP HL ;4 TMPEND + LD BC,(STRST) ;VAR END + DEC BC + OR A + SBC HL,BC + PUSH HL ;4 TRANS LEN + EXX + POP BC ;4 TRANS LEN + LDDR + POP DE ;3 LEN + RST 18H + DB .ADDP2 + POP BC ;2 CLR LEN + PUSH DE ;2 LEN + EXX + POP DE ;2 LEN + LD H,B + LD L,C + POP BC ;1 TYPE + LD A,C + OR 80H + LD (HL),A + INC HL + DEC DE + LD (HL),E + INC HL + LD (HL),D + INC HL + LD DE,KEYBUF + LD A,(DE) + INC A + LD B,A + CALL LDHLDE + LD DE,(TMPEND) + LD A,(DE) + LD (HL),A + INC HL + INC DE + ADD A,A + LD B,A + CALL LDHLDE + PUSH HL + EXX + POP HL +DIMCLR: XOR A + LD (HL),A + INC HL + DEC BC + LD A,B + OR C + JR NZ,DIMCLR + LD (HL),A + EXX + POP DE + LD A,(AUTDIM) + OR A + JR Z,VARCUL + LD HL,(DGBF00) + RET + +VARCUL: LD HL,(ARYTXT) + PUSH DE + JP ARRAY2 + +DIM: LD A,0FFH + LD (AUTDIM),A +NXTDIM: CALL VSRTST + LD A,(HL) + CALL CH28H + CALL ARRAY0 + CALL HLFTCH + CP ',' + RET NZ + INC HL + JR NXTDIM + +DIMADD: ADD HL,DE + RET NC + JR SORDIM + +DIMMUL: PUSH BC + EX DE,HL + LD C,L + LD A,H + LD HL,0 + CALL DMMULS + LD A,C + CALL DMMULS + POP BC + RET + +DMMULS: OR A + JR Z,SKPMUL + LD B,8 +DMMULP: ADD HL,HL + JR C,SORDIM + RLCA + JR NC,DMMULE + ADD HL,DE + JR C,SORDIM +DMMULE: DJNZ DMMULP + RET + +SKPMUL: LD A,H + LD H,L + LD L,0 + OR A + RET Z +SORDIM: JP ER06 + +ARYTXT: DB 0,0 ;(was DEFS 2) +AUTDIM: DB 0 ;(was DEFS 1) + +VARFN2: SUB 'A' + CP 26 + JP NC,ER01 + LD BC,(FNVRBF) + LD A,B + OR C + JR NZ,FNGTVR + CALL GETVAR +FNGTV2: PUSH DE + PUSH HL + LD L,C + LD H,B + LD B,A + LD C,A + CALL LDDEHL + POP HL + LD A,C + POP DE + JP FACRX5 + +FNGTVR: PUSH DE + CALL VSRTST + PUSH HL + INC B + LD DE,KEYBUF + LD HL,(TMPEND) + CALL STRENT + LD B,0 + LD HL,(FNVRBF) + CALL HLFTCH + CP 0F4H + JR Z,FNSHNO + CP '(' + JR NZ,SERROL ;ئئJP NZ,ER01 +FNGTL1: INC HL + INC B + PUSH BC + CALL VSRTST + LD A,C + POP DE + CP E ;TYPE + LD C,E ;ئئ + JR NZ,FNGTL2 + PUSH DE + LD C,B + INC C + PUSH HL + LD HL,(TMPEND) + LD DE,KEYBUF + CALL HLDECH + POP HL + POP BC + JR Z,FNSHOK +FNGTL2: CALL HLFTCH + CP ')' + JR Z,FNSHNO + CP ',' + JR Z,FNGTL1 ;ئئئ +SERROL: JP ER01 ;ئئ + +FNSHNO: LD HL,(TMPEND) + LD DE,KEYBUF + LD A,(HL) + LD (DE),A + LD B,A +FNSH05: INC HL + INC DE + LD A,(HL) + LD (DE),A + DJNZ FNSH05 + POP HL + POP DE + CALL FNGTV1 + JR FNGTV2 + +FNSHOK: LD HL,(FNTXBF) + CALL HCH28H + DEC B + JR Z,FNSH13 + DEC HL +FNSH11: PUSH BC +FNSH12: CALL IFSKSB + CALL ENDCHK + JP Z,ER01 + CP ')' + JP Z,ER01 + CP ',' + JR NZ,FNSH12 + POP BC + DJNZ FNSH11 + INC HL +FNSH13: EX DE,HL + POP HL + EX (SP),HL + EX DE,HL + LD BC,(FNVRBF) + PUSH BC + LD BC,0 + LD (FNVRBF),BC + CALL EXPR8 + POP HL + LD (FNVRBF),HL + POP HL + JP HLFTCH + +FNGTV1: PUSH DE + JP GETFNV + +CHVRNM: LD HL,(VARST) +ASLOP: LD DE,KEYBUF + LD A,(HL) + OR A + RET Z + CP 40H + JR NC,ARYATA + CP C + JR NZ,SKIPUS + INC HL + LD A,(DE) + CP (HL) + JR NZ,SKIPU2 + LD B,A +VARCL1: INC DE + INC HL + LD A,(DE) ;بب + CP (HL) ;بب +;* CALL NZ,SMALCH ; commented out + JR NZ,SKIPU3 + DJNZ VARCL1 + INC HL + SCF + RET + +SKIPU3: INC HL + DJNZ SKIPU3 + LD A,C + JR ARSKFN +SKIPU2: LD A,C + DEC HL +SKIPUS: AND 0FH ;TYPE + INC HL + ADD A,(HL) ;NAME LEN. + INC HL +ARSKFN: LD E,A + LD D,0 + ADD HL,DE + JR ASLOP + +ARYATA: CP C ;TYPE + JR Z,ARMSN1 + INC HL +MIDNAM: LD E,(HL) + INC HL + LD D,(HL) + DEC HL + ADD HL,DE + JR ASLOP + +NXTVR1: LD A,C + SUB B + CPL + LD C,A + LD B,0FFH + ADD HL,BC + POP BC +NXTVR: DEC HL + DEC HL + JR MIDNAM + +ARMSN1: LD A,(HL) + EXX + LD C,A + LD B,00H + EXX + INC HL + PUSH DE + LD E,(HL) + INC HL + LD D,(HL) + INC HL + EX DE,HL + ADD HL,DE +;* LD (ARYEDA),HL ;this instruction is commented out + EX DE,HL + POP DE + LD A,(DE) + CP (HL) ;NAME LEN. + JR NZ,NXTVR + PUSH BC + LD B,A + LD C,A +AYNMCK: INC HL + INC DE + LD A,(DE) ;بب + CP (HL) ;بب + JR NZ,NXTVR1 + DJNZ AYNMCK + INC HL + POP BC + SCF + RET + +DEFFN: CALL VSRTST + SET 6,C + PUSH HL + CALL CHVRNM + JP C,ER07 ;ARY DEF ERR + LD (HL),C + EX (SP),HL + PUSH HL + DEC HL +FNSKP1: CALL IFSKSB + OR A + JR Z,FNSKED + CP 3AH ;: + JR NZ,FNSKP1 +FNSKED: POP DE + PUSH HL + INC HL + SBC HL,DE + LD A,(KEYBUF) + ADD A,4 + LD C,A + LD B,0 + LD A,L + ADD HL,BC + LD B,A + PUSH HL + EXX + POP BC + PUSH BC + PUSH HL + PUSH DE + PUSH BC + LD HL,0 + ADD HL,SP + LD DE,(TMPEND) + DEC H + OR A + SBC HL,DE + LD A,12 + JP C,NESTER + POP BC + POP DE + POP HL + LD HL,(TMPEND) + PUSH HL + ADD HL,BC + EX (SP),HL + PUSH HL + LD DE,(STRST) ;VAR END + OR A + SBC HL,DE + LD C,L + LD B,H + POP HL + POP DE + LDDR + POP DE + RST 18H + DB .ADDP2 + DEC DE + POP HL + EX (SP),HL + INC HL + LD (HL),E + INC HL + LD (HL),D + INC HL + LD DE,KEYBUF + LD A,(DE) + LD (HL),A + LD B,A +DEFFN2: INC DE + INC HL + LD A,(DE) + LD (HL),A + DJNZ DEFFN2 + INC HL + PUSH HL + EXX + POP HL + CALL LDHLDE + LD (HL),0 + POP HL + RET + +FNEXP: PUSH DE + CALL VSRTST + POP IX + PUSH BC + SET 6,C + LD DE,(FNTXBF) + LD (FNTXBF),HL + PUSH DE + CALL CHVRNM + JP NC,ER15 ;UNDEF FN + LD DE,(FNVRBF) + LD (FNVRBF),HL + PUSH DE + PUSH IX + DEC HL +FNEQSK: CALL IFSKSB + CALL ENDCHK + JP Z,ER01 + CP 0F4H ;= + JR NZ,FNEQSK + INC HL + POP DE + PUSH DE + CALL EXPR8 + POP DE + LD HL,(FNTXBF) + POP BC + LD (FNVRBF),BC + POP BC + LD (FNTXBF),BC + EX DE,HL + POP BC + LD A,C + CALL STRCK + LD BC,5 + ADD HL,BC + EX DE,HL + CALL HLFTCH + CP '(' + RET NZ + PUSH DE + LD B,1 +SK29LP: PUSH BC + CALL IFSKSB + POP BC + CALL ENDCK0 + JP Z,ER01 + CP '(' + JR NZ,FNEXP1 + INC B +FNEXP1: CP ')' + JR NZ,SK29LP + DJNZ SK29LP + INC HL + CALL HLFTCH + POP DE + RET + +STRCK: CP 3 + JR NZ,STROMT +STROK: LD A,(PRCSON) + CP 3 + RET Z + JP ER04 ;TYPE MISMATCH + +STROMT: LD A,(PRCSON) + CP 3 + RET NZ + JP ER04 + +FNVRBF: DW 0 +FNTXBF: DB 0,0 ;(was DEFS 2) + +;*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +HLDECH: LD A,(DE) ;this routine is duplicated as HLDECK: but + CP (HL) ;both routines have been left in and used, + RET NZ ;to keep the code aligned with existing + PUSH BC ;versions of MZ-800 QDBASIC MZ-5Z009 + PUSH DE + PUSH HL + LD B,C +HLDE1: LD A,(DE) + CP (HL) + JR NZ,HLDE2 + INC DE + INC HL + DJNZ HLDE1 + XOR A +HLDE2: POP HL + POP DE + POP BC + RET ;END of duplicate routine +;*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +;*------------------ +;* Joy stick command +;*------------------ +STCK: CALL HCH28H + PUSH DE + CALL DEEXP + CALL DCHECK + CP 3 + JP NC,ER03 + POP DE + PUSH AF + CALL HCH29H + POP AF + RST 18H + DB .STICK + EX DE,HL + PUSH DE + CALL PUT1B + JP EOF8 + +STIG: CALL HCH28H + PUSH DE + CALL DEEXP + CALL DCHECK + CP 5 + JP NC,ER03 + POP DE + PUSH AF + CALL HCH29H + POP AF + RST 18H + DB .STRIG + EX DE,HL + PUSH DE + CALL PUT1B + JP EOF8 + +;* END of original module EXPR.ASM +;*============================================================================ +;* START of original module FLOAT.ASM +;*----------------------------- +;* MZ-800 BASIC Floating point +;* FI:FLOAT ver 1.0A 7.18.84 +;* Programmed by T.Miho +;*----------------------------- + +CLRFAC: PUSH HL + LD B,5 + CALL QCLRHL + POP HL + RET + +NEGCMD: CALL STROMT +TOGLE: LD A,(HL) + OR A + RET Z + INC HL + LD A,(HL) + XOR 80H + LD (HL),A + DEC HL + RET + +;*-------------- +;*(HL)=(HL)-(DE) +;*-------------- +SUBCMD: CALL STROMT + LD C,A + LD A,80H + JP ADDSUB + +;*-------------- +;*(HL)=(HL)+(DE) +;*-------------- +ADDCMD: LD A,(PRCSON) + CP 03H + JP Z,STRADD + LD C,A + XOR A +ADDSUB: LD (HLBUF),HL + PUSH DE + PUSH HL + LD (SPBUF),SP + INC HL + INC DE + LD B,(HL) + XOR (HL) + EX DE,HL + XOR (HL) + DEC HL + DEC DE + EX DE,HL + RLCA + LD A,B + LD (SIGN),A + JP C,FSUB ;HL-DE +FADD: XOR A ;HL+DE + CP (HL) + JP Z,MOVEIT ;(HL)_(DE) + LD A,(DE) + OR A + JR Z,FLEXIT ;SIGN SET RET + SUB (HL) ;DE-HL + JP SFADD + +FLEXIT: LD SP,(SPBUF) + POP HL + POP DE + EI + LD A,(HL) + OR A + JP Z,ABS + LD A,(SIGN) + AND 80H + INC HL + RES 7,(HL) + OR (HL) + LD (HL),A + DEC HL + RET + +MOVEIT: LD B,0 + LD A,5 + LD C,A + EX DE,HL + LDIR + JP FLEXIT + +STRADD: LD B,(HL) + LD A,(DE) + ADD A,B + JP C,ER05 ;STRING TOO LONG + LD C,A + PUSH DE + PUSH HL + PUSH DE + INC HL + LD E,(HL) + INC HL + LD D,(HL) + LD HL,(STRST) + ADD HL,DE + EX DE,HL + LD HL,(TMPEND) + CALL STRENT + EX (SP),HL + LD B,(HL) + INC HL + LD E,(HL) + INC HL + LD D,(HL) + LD HL,(STRST) + ADD HL,DE + EX DE,HL + POP HL + CALL STRENT + LD A,C + LD DE,(TMPEND) + LD BC,(STRST) + EX DE,HL + OR A + SBC HL,BC + EX DE,HL + LD (TMPEND),HL + POP HL + LD (HL),A + INC HL + LD (HL),E + INC HL + LD (HL),D + DEC HL + DEC HL + POP DE + RET + +;*------------------------------------------- +;* Middle of p.592 in German Listing of 2Z046 +;* Compare strings at (DE) & (HL) +;*------------------------------------------- +CMP: LD A,(PRCSON) + CP 3 + JR NZ,FLTCP2 + PUSH DE + PUSH HL + LD A,(DE) + OR (HL) + JR Z,STCMPE + LD A,(DE) + CP (HL) + JR C,CMP1 + LD A,(HL) +CMP1: OR A + JR Z,STCMPF + INC HL + LD C,(HL) + INC HL + LD B,(HL) + EX DE,HL + INC HL + LD E,(HL) + INC HL + LD D,(HL) + LD HL,(STRST) + EX DE,HL + ADD HL,DE + EX DE,HL + ADD HL,BC + EX DE,HL + LD B,A + OR A + JR Z,STCMPE +STCMPL: LD A,(DE) + CP (HL) + JR NZ,STCMPE + INC DE + INC HL + DJNZ STCMPL +STCMPF: POP DE + POP HL + LD A,(DE) + CP (HL) + EX DE,HL + RET + +STCMPE: POP HL + POP DE + RET + +FLTCP2: INC DE + INC HL + LD A,(DE) + DEC DE + XOR (HL) + RLCA + JR NC,FLTCP3 + LD A,(HL) + DEC HL + RLCA + RET + +FLTCP3: LD A,(HL) + DEC HL + RLCA + JR NC,FLTCMP + CALL FLTCMP + RET Z + CCF + RET + +FLTCMP: PUSH DE + PUSH HL + EX DE,HL + LD A,(DE) + CP (HL) + JR NZ,SUBNZ + INC DE + INC HL + LD A,(HL) + OR 80H + LD B,A + LD A,(DE) + OR 80H + CP B + JR NZ,SUBNZ + LD A,(PRCSON) + LD B,A + DEC B + DEC B +CMPL: INC DE + INC HL + LD A,(DE) + CP (HL) + JR NZ,SUBNZ + DJNZ CMPL +SUBNZ: POP HL + POP DE + RET + +ZERO: POP HL + PUSH HL + CALL CLRFAC + JP FLEXIT + +FSUB: CALL FLTCMP + JR Z,ZERO + JR NC,SUBOK + LD A,(SIGN) + XOR 80H + LD (SIGN),A + SCF +SUBOK: EX AF,AF' + LD A,(HL) + OR A + JP Z,MOVEIT + LD A,(DE) + OR A + JP Z,FLEXIT + SUB (HL) + JR C,FSUB11 + CP 32 + JP NC,MOVEIT + JR SUBOK2 + +FSUB11: NEG + CP 32 + JP NC,FLEXIT +SUBOK2: EX AF,AF' + JR C,SUBOK3 + EX DE,HL +SUBOK3: EX AF,AF' + JP SSUB + +OVERF: LD SP,(SPBUF) + EI + POP HL + POP DE + LD A,(OFLAG) + OR A + JP Z,ER02 +;*SET MAX NUM HERE ***** + RET + +SFADD: JR NC,SNSH + NEG + CP 32 + JP NC,FLEXIT + EX DE,HL + JR SADD1 + +SNSH: CP 32 + JP NC,MOVEIT + +SADD1: CALL SSHIFT + LD A,H + EXX + ADC A,H ; ADJUST WITH CARRY + EXX + LD H,A + LD A,L + EXX + ADC A,L + EXX + LD L,A + LD A,D + EXX + ADC A,D + EXX + LD D,A + LD A,E + EXX + ADC A,E + EXX + JR NC,SSTORE + RRA + RR D + RR L + RR H + INC C + JP Z,OVERF +SSTORE: LD E,A + LD A,C + EXX + LD BC,5 + LD HL,(HLBUF) + LD (HL),A + ADD HL,BC + DI + LD SP,HL + EXX + PUSH HL + PUSH DE + JP FLEXIT + +SSHIFT: DI + LD (SPBF),SP + EX AF,AF' + INC HL + LD SP,HL + EXX + POP DE ;E,D,L,H + SET 7,E ;CY=0 + POP HL + OR A +SHFLP2: EX AF,AF' + CP 8 + JR C,BITET2 + SUB 8 + EX AF,AF' + RL H + LD H,L + LD L,D + LD D,E + LD E,0 + JR SHFLP2 + +BITET2: OR A + JR Z,BITSE2 +BITST2: EX AF,AF' + OR A + RR E + RR D + RR L + RR H + EX AF,AF' + DEC A + JR NZ,BITST2 +BITSE2: EXX + EX DE,HL + LD C,(HL) + INC HL + LD SP,HL + POP DE + SET 7,E + POP HL + EX AF,AF' + LD SP,(SPBF) + EI + RET + +SSUB: CP 32 + JP NC,FLEXIT + CALL SSHIFT + LD A,H + EXX + SBC A,H + EXX + LD H,A + LD A,L + EXX + SBC A,L + EXX + LD L,A + LD A,D + EXX + SBC A,D + EXX + LD D,A + LD A,E + EXX + SBC A,E + EXX +SSFL2: OR A + JR Z,BSIFT +SSFL3: BIT 7,A + JR NZ,SSTOR2 + RL H + RL L + RL D + RLA + DEC C + JP NZ,SSFL3 + JP ZERO + +SSTOR2: LD E,A + JP SSTORE + +BSIFT: LD A,C + SUB 8 + LD C,A + LD A,D + LD D,L + LD L,H + LD H,0 + JR Z,SADDX + JR NC,SSFL2 +SADDX: JP ZERO + +EXPCHK: LD C,A + INC HL + INC DE + LD A,(DE) + XOR (HL) + LD (SIGN),A + DEC HL + DEC DE + RET + +;*---------------------------------------- +;* Top of p.601 in German Listing of 2Z046 +;*---------------------------------------- +MUL: CALL STROMT + CALL EXPCHK + PUSH DE + PUSH HL + LD (SPBUF),SP + LD A,(HL) + OR A + JP Z,ZERO + LD A,(DE) + OR A + JP Z,ZERO + INC DE + PUSH DE + POP IX + ADD A,(HL) + LD E,A + LD A,0 + ADC A,A + LD D,A + LD (EXPSGN),DE + INC HL + XOR A + LD (CYFLG),A + LD D,(HL) + SET 7,D + INC HL + LD E,(HL) + INC HL + PUSH HL + LD H,A + LD L,A + EXX + POP HL + LD D,(HL) + INC HL + LD E,(HL) + LD B,A + LD C,A + LD H,A + LD L,A + EXX + LD A,(IX+0) + OR 80H + LD C,4 ;BYTES COUNTER +SMULL1: LD B,8 ;BIT COUNTER + OR A + JP Z,SMULL5 +SMULL2: RLCA + JR NC,SMULL4 + EX AF,AF' + EXX + LD A,C + ADD A,B + LD C,A + ADC HL,DE + EXX + ADC HL,DE + JR NC,SMULL3 + LD A,1 + LD (CYFLG),A +SMULL3: EX AF,AF' +SMULL4: SRL D + RR E + EXX + RR D + RR E + RR B + EXX + DJNZ SMULL2 +SMULL6: INC IX + LD A,(IX+0) + DEC C + JR NZ,SMULL1 + EXX + LD A,(CYFLG) + OR A + JR Z,SMULL7 + LD DE,(EXPSGN) + INC DE + LD (EXPSGN),DE + EXX + SCF + RR H + RR L + EXX + RR H + RR L + RR C +SMULL7: BIT 7,C + JR Z,SMULL8 + LD DE,1 + ADD HL,DE + EXX + LD DE,0 + ADC HL,DE + EXX + JR NC,SMULL8 + LD DE,(EXPSGN) + INC DE + LD (EXPSGN),DE + EXX + LD H,80H + EXX +SMULL8: POP IX + PUSH IX + LD (IX+4),L + LD (IX+3),H + EXX + LD (IX+2),L + LD (IX+1),H + LD HL,(EXPSGN) + OR A + LD DE,81H + SBC HL,DE + LD A,H + ADD A,0 + JP M,UNDRFL + JP NZ,OVERF + LD (IX+0),L + JP FLEXIT + +SMULL5: LD A,E + EXX + LD B,E + LD E,D + LD D,A + EXX + LD E,D + LD D,0 + JP SMULL6 + +UNDRFL: LD SP,(SPBUF) ;**** + JP ZERO + +DIV: CALL STROMT + CALL EXPCHK + PUSH DE + PUSH HL + LD (SPBUF),SP + LD A,(DE) + OR A + JP Z,ER02 ;DIVID BY ZERO + EX AF,AF' + LD A,(HL) + OR A + JP Z,ZERO + EXX + ADD A,81H + LD B,A + LD A,0 + ADC A,A + EX AF,AF' + LD C,A + LD A,B + SUB C + LD C,A + EX AF,AF' + LD B,A + EX AF,AF' + LD A,B + SBC A,0 + JP C,UNDRFL + JP NZ,OVERF + LD A,C + PUSH AF ;PUSH A(EXP) + EXX + INC DE + INC HL + LD B,(HL) + SET 7,B + INC HL + LD C,(HL) + INC HL + PUSH HL + EX DE,HL + LD D,(HL) + SET 7,D + INC HL + LD E,(HL) + INC HL + PUSH HL + LD H,B + LD L,C + EXX + POP HL + LD D,(HL) + INC HL + LD E,(HL) + POP HL + LD A,(HL) + INC HL + LD L,(HL) + LD H,A + EXX ;HLH'L'/DED'E' + LD C,5 ;C=5 +SDIVL1: LD B,8 ;B=8 + XOR A +SDIVL2: BIT 7,H + JR NZ,SDIVL3 + OR A +SDIVL4: RLA + EXX + ADD HL,HL + EXX + ADC HL,HL + DJNZ SDIVL2 + PUSH AF + DEC C + JR NZ,SDIVL1 + JP SDIVED + +SDIVL3: OR A + EXX + SBC HL,DE + EXX + SBC HL,DE + CCF + JR C,SDIVL4 + EXX + ADD HL,DE + EXX + ADC HL,DE + OR A + RLA + EXX + ADD HL,HL + EXX + ADC HL,HL + DJNZ SDIVL5 + PUSH AF + LD B,8 + DEC C + JP Z,SDIVED +SDIVL5: EXX + OR A + SBC HL,DE + EXX + SBC HL,DE + SCF + RLA + DJNZ SDIVL6 + PUSH AF + LD B,8 + DEC C + JR Z,SDIVED +SDIVL6: EXX + ADD HL,HL + EXX + ADC HL,HL + JR C,SDIVL5 + JP SDIVL2 + +SDIVED: POP AF + LD H,A ;H' + EXX + POP AF + LD E,A ;E + POP AF + LD D,A ;D + POP AF + LD C,A ;C + POP AF + LD B,A ;B + POP AF ;A(EXP) +SDIVL9: BIT 7,B + JR NZ,SDIVE2 + EXX + SLA H + EXX + RL E + RL D + RL C + RL B + DEC A + JP NZ,SDIVL9 + JP ZERO + +SDIVE2: EXX + RL H + EXX + JR NC,SDIVL8 + LD HL,1 + ADD HL,DE + EX DE,HL + LD HL,0 + ADC HL,BC + LD B,H + LD C,L + JR NC,SDIVL8 + LD B,80H + INC A +SDIVL8: POP HL + PUSH HL + LD (HL),A + INC HL + LD (HL),B + INC HL + LD (HL),C + INC HL + LD (HL),D + INC HL + LD (HL),E + JP FLEXIT + +HLBUF: DB 0,0 ;(was DEFS 2) +SIGN: DB 0 ;(was DEFS 1) +SPBUF: DB 0,0 ;(was DEFS 2) +SPBF: DB 0,0 ;(was DEFS 2) +CYFLG: DB 0 ;(was DEFS 1) +EXPSGN: DB 0,0 ;(was DEFS 2) +OFLAG: DB 0 ;(was DEFS 1) + +TSTSGN: INC HL + BIT 7,(HL) + DEC HL + RET + +MULTWO: INC (HL) + RET NZ + JP ER02 + +DIVTWO: LD A,(HL) + OR A + RET Z + DEC (HL) + RET NZ + JP CLRFAC + +ADDHL5: PUSH HL + INC HL + INC HL + INC HL + INC HL + INC HL + EX DE,HL + LD HL,(MEMMAX) + DEC HL + SBC HL,DE + JP C,ER06 + POP HL + RET + +FACSET: PUSH HL + LD (SNFAC0),HL + CALL ADDHL5 + EX DE,HL + LD (SNFAC1),HL + CALL ADDHL5 + EX DE,HL + LD (SNFAC2),HL + CALL ADDHL5 + LD (SNFAC3),DE + POP HL + RET + +POWERS: CALL STROMT ;(HL)^(DE) + EX DE,HL + LD A,(HL) + OR A + JP Z,POWR1 + EX DE,HL + LD A,(HL) + OR A + JP Z,CLRFAC + CALL TSTSGN + JR Z,POWER1 + CALL TOGLE + EX DE,HL + PUSH DE + PUSH HL + LD DE,ZFAC1 + CALL LDIR5 ;(ZFAC1)=(DE) + LD HL,ZFAC1 + CALL FRACT + LD A,(HL) + OR A + JP NZ,ER03 + POP HL + PUSH HL + CALL HLFLT + BIT 0,L + POP DE + POP HL + JR Z,POWER1 + CALL POWER1 + JP TOGLE + +POWER1: EX DE,HL + LD A,(HL) + OR A + JR Z,POWR1 + CALL TSTSGN + JR Z,POWER2 + CALL TOGLE + CALL POWER2 + PUSH DE + PUSH HL + LD DE,ZFAC1 + CALL LDIR1 ;(ZFAC1)=1 + LD HL,ZFAC1 + POP DE + CALL DIV ;(ZFAC1)/(HL) + PUSH DE + CALL LDIR5 ;(HL)=(ZFAC1) + POP HL + POP DE + RET + +POWR1: PUSH DE + CALL LDIR1 + POP HL + RET + +POWER2: PUSH DE + LD DE,ZFAC1 + CALL LDIR5 ;(ZFAC1)=(DE) + POP HL + CALL LOG ;LOG(HL) + LD DE,ZFAC1 + CALL MUL ;(HL)*(DE) + JP EXP ;EXP(HL) + +.NOT.: CALL STROMT + PUSH DE + PUSH HL + CALL HLFLT + LD A,L + CPL + LD E,A + LD A,H + CPL + LD D,A + JR AND9 + +.AND.: LD A,0A2H ;AND D + DB 1 +.OR.: LD A,0B2H ;OR D + DB 1 +.XOR.: LD A,0AAH ;XOR D + LD (AND2),A + INC A + LD (AND4),A + CALL STROMT + PUSH DE + PUSH HL + CALL HLFLT + EX DE,HL + CALL HLFLT + LD A,H +AND2: AND D ;AND, OR, XOR + LD D,A + LD A,L +AND4: AND E ;AND, OR, XOR + LD E,A +AND9: POP HL + CALL FLTHEX + POP DE + RET + +ABS: INC HL + RES 7,(HL) + DEC HL + RET + +INTOPR: CALL TSTSGN + JP Z,INT + CALL MVFAC1 + CALL INT + LD DE,ZFAC1 + CALL CMP + RET Z +ONESUB: LD DE,FLONE + JP SUBCMD + +ONEADD: LD DE,FLONE + JP ADDCMD + +ONECMP: LD DE,FLONE + JP CMP + +MVFAC1: PUSH HL + PUSH DE + LD DE,ZFAC1 + CALL LDIR5 + POP DE + POP HL + RET + +MOD: CALL INT + EX DE,HL + CALL INT + EX DE,HL + CALL MVFAC1 + CALL DIV + CALL INT + CALL MUL + PUSH DE + LD DE,ZFAC1 + CALL SUBCMD + POP DE + JP TOGLE + +YEN: CALL INT + EX DE,HL + CALL INT + EX DE,HL + CALL DIV + JP INT + +SQR: LD A,(HL) + OR A + RET Z + CALL TSTSGN + JP NZ,ER03 + CALL LOG + CALL DIVTWO + JP EXP + +RETONE: PUSH HL + EX DE,HL + CALL LDIR1 + POP HL + POP BC + RET + +ATNLM1: DB 7EH + DB 4CH + +ATNLM2: DB 80H + DB 2BH + +ATN: PUSH BC + INC HL + LD A,(HL) + RES 7,(HL) + DEC HL + PUSH AF + CALL ATN1 + POP AF + POP BC + RLCA + RET NC + JP TOGLE + +ATN1: CALL ONECMP + JR C,ATN2 + CALL ADDHL5 + PUSH DE + PUSH HL + CALL LDIR5 + POP DE + PUSH DE + CALL LDIR1 + POP HL + POP DE + CALL DIV + CALL ATN2 + LD DE,FLTHPI ;PI/2 + CALL SUBCMD + JP ABS + +ATN2: LD A,0FFH + LD (SINSGN),A + LD DE,ATNLM1 + CALL CMP + JR C,ATNCUL + LD DE,ATNLM2 + CALL CMP + PUSH AF + CALL ADDHL5 + POP AF + PUSH HL + PUSH DE + CALL LDIR5 + POP HL + JR C,ATNMID + CALL ONEADD + EX (SP),HL + CALL SUBCMD + POP DE + CALL DIV + CALL ATNCUL + LD DE,FLTQPI ;PI/4 + JP ADDCMD + +ATNMID: LD DE,SQRTMO + CALL MUL + CALL ONEADD + EX (SP),HL + LD DE,SQRTMO + CALL SUBCMD + POP DE + CALL DIV + CALL ATNCUL + CALL MULTWO + LD DE,FLTQPI ;PI/4 + CALL ADDCMD + JP DIVTWO + +SQRTMO: DW 547FH + DW 0CC13H + DB 0D0H + +ATNCUL: PUSH BC + PUSH HL + CALL FACSET + POP HL + PUSH HL + PUSH DE + CALL LDIR5 + POP HL + LD E,L + LD D,H + CALL MUL + LD DE,(SNFAC2) + POP HL + PUSH HL + CALL LDIR5 + LD A,(PRCSON) + DEC A + CP 04H + LD B,A + LD HL,TANTBL + JP Z,SIN6 + LD B,10 + JP SIN6 + +COS: PUSH BC + LD A,(HL) + OR A + JP Z,RETONE + LD DE,FLTHPI ;PI/2 + CALL SUBCMD + CALL TOGLE + POP BC +SIN: PUSH BC + INC HL + LD A,(HL) + RES 7,(HL) + AND 80H + CPL + LD (SINSGN),A + DEC HL + LD DE,FLT2PI ;PI*2 + PUSH HL + CALL CMP + JR C,SIN1 + CALL DIV + CALL FRACT + CALL MUL +SIN1: LD DE,FLTPAI + CALL CMP + JR C,SIN2 + CALL SUBCMD + LD A,(SINSGN) + XOR 80H + LD (SINSGN),A +SIN2: LD DE,FLTHPI ;PI/2 + CALL CMP + JR C,SIN4 + LD DE,FLTPAI + CALL SUBCMD + CALL ABS +SIN4: CALL FACSET + POP HL + PUSH DE + LD DE,FLTQPI ;PI/4 + CALL CMP + JR NC,COSCUL + POP DE + PUSH HL + PUSH DE + CALL LDIR5 + POP HL + LD E,L + LD D,H + CALL MUL + LD DE,(SNFAC2) + POP HL + PUSH HL + CALL LDIR5 + LD A,(PRCSON) + LD B,A + LD HL,SINTBL +SIN6: PUSH BC + PUSH HL + LD HL,(SNFAC2) + LD DE,(SNFAC3) + CALL MUL + POP HL + PUSH HL + LD DE,(SNFAC1) + PUSH DE + CALL LDIR5 + POP HL + LD DE,(SNFAC2) + CALL MUL + EX DE,HL + LD HL,(SNFAC0) + CALL ADDCMD + POP HL + LD DE,5 + ADD HL,DE + POP BC + DJNZ SIN6 + POP HL + POP BC + LD A,(SINSGN) + INC HL + XOR (HL) + CPL + LD (HL),A + DEC HL + LD A,(PRCSON) + CP 08H + LD A,(HL) + JR Z,SIN9 + CP 5CH ; ADJUST +SIN8: RET NC + JP CLRFAC + +SIN9: CP 4DH ; ADJUST + JR SIN8 + +COSCUL: LD DE,FLTHPI ;PI/2 + CALL SUBCMD + CALL ABS + POP DE + PUSH HL + PUSH DE + CALL LDIR5 + POP HL + LD E,L + LD D,H + CALL MUL + LD DE,(SNFAC2) + CALL LDIR1 + POP DE + PUSH DE + CALL LDIR1 + LD A,(PRCSON) + LD B,A + LD HL,COSTBL + JR SIN6 + +SINSGN: DB 0 ;(was DEFS 1) + +TAN: PUSH BC + PUSH HL + CALL ADDHL5 + EX DE,HL + LD (SNFAC4),HL + CALL ADDHL5 + LD (SNFAC5),DE + POP HL + PUSH HL + CALL LDIR5 + LD HL,(SNFAC4) + EX DE,HL + POP HL + PUSH HL + CALL LDIR5 + LD HL,(SNFAC5) + CALL SIN + POP DE + PUSH DE + CALL LDIR5 + LD HL,(SNFAC4) + CALL COS + EX DE,HL + POP HL + CALL DIV + POP BC + RET + +SINTBL: DW 0AA7EH + DW 0AAAAH + DB 0ABH + DW 087AH + DW 8888H + DB 89H + DW 0D074H + DW 000DH + DB 0D0H + DW 386EH + DW 1DEFH + DB 2BH + DW 0D767H + DW 2B32H + DB 40H + DW 3060H + DW 3092H + DB 9DH + DW 0D758H + DW 9F3FH + DB 3AH + DW 4A50H + DW 3B96H + DB 82H + +COSTBL: DW 8080H + DW 0000H + DB 00H + DW 2A7CH + DW 0AAAAH + DB 0ABH + DW 0B677H + DW 600BH + DB 0B6H + DW 5071H + DW 000DH + DB 0D0H + DW 0936BH + DW 7DF2H + DB 0BCH + DW 0F64H + DW 0C776H + DB 80H + DW 0C95CH + DW 0A5CBH + DB 46H + DW 5754H + DW 9F3FH + DB 3AH + +TANTBL: DW 0AA7FH + DW 0AAAAH + DB 0ABH + DW 4C7EH + DW 0CCCCH + DB 0CDH + DW 927EH + DW 2449H + DB 92H + DW 637DH + DW 388EH + DB 0E4H + DW 0BA7DH + DW 8B2EH + DB 0A3H + DW 1D7DH + DW 0D889H + DB 9EH + DW 887DH + DW 8888H + DB 89H + DW 707CH + DW 0F0F0H + DB 0F1H + DW 0D77CH + DW 3594H + DB 0E5H + DW 437CH + DW 300CH + DB 0C3H + +SGN: LD DE,0 + LD A,(HL) + OR A + JR Z,SGNSET + CALL TSTSGN + INC DE + JR Z,SGNSET + DEC DE + DEC DE +SGNSET: CALL FLTHEX + RET + +;*---------------------------------------- +;* Top of p.627 in German Listing of 2Z046 +;*---------------------------------------- +RAD: LD DE,FLTRAD + JR PAI2 + +PAI: LD DE,FLTPAI +PAI2: PUSH BC + CALL MUL + POP BC + RET + +FLT2PI: DW 4983H ;PI*2 + DW 0DA0FH + DB 0A2H +FLTPAI: DW 4982H ;PI + DW 0DA0FH + DB 0A2H +FLTHPI: DW 4981H ;PI/2 + DW 0DA0FH + DB 0A2H +FLTQPI: DW 4980H ;PI/4 + DW 0DA0FH + DB 0A2H + +FLTRAD: DW 0E7BH + DW 35FAH + DB 13H + +PEEK: PUSH HL + CALL HLFLT + LD E,(HL) + LD D,0 + POP HL + CALL FLTHEX + RET + +RND: LD A,(HL) + OR A + JR Z,RNDMIZ + CALL TSTSGN + JR Z,NORRND +RNDMIZ: PUSH HL + LD HL,4193H + LD (SEED),HL + POP HL + XOR A + LD R,A +NORRND: PUSH BC + LD DE,(SEED) + LD A,R + XOR D + RRC A + RRC A + RRC A + LD D,A + LD A,R + XOR E + RLC A + RLC A + LD E,D + LD D,A + LD (SEED),DE + PUSH HL + INC HL + RES 7,D + LD (HL),D + INC HL + LD (HL),E + INC HL + LD A,R + LD (HL),A + POP HL + LD (HL),81H + CALL ONESUB + POP BC + RET + +SEED: DW 4193H + +EXP: PUSH BC + LD A,(HL) + OR A + JP Z,RETONE + INC HL + LD A,(HL) + LD (EXPSIN),A + RES 7,(HL) + DEC HL + LD DE,LNTWOI + CALL MUL + PUSH HL + CALL ADDHL5 + PUSH DE + CALL LDIR5 + POP HL + CALL INT + PUSH HL + CALL HLFLT + XOR A + CP H + JP NZ,ER02 + LD A,L + LD (EXPOFF),A + POP DE + POP HL + PUSH HL + CALL SUBCMD + PUSH DE + PUSH HL + CALL LDIR1 + POP DE + POP HL + CALL DIVTWO + EX DE,HL + XOR A + LD B,8 +EXPLP1: PUSH BC + PUSH AF + CALL CMP + JR C,EXPNL1 + CALL SUBCMD + POP AF + SET 7,A + PUSH AF +EXPNL1: POP AF + RLC A + EX DE,HL + PUSH AF + CALL DIVTWO + POP AF + EX DE,HL + POP BC + DJNZ EXPLP1 + LD (EXPHBT),A + PUSH DE + LD DE,LNTWOA + LD A,(PRCSON) + BIT 3,A + JR NZ,EXPNL2 + LD DE,LNTWOB +EXPNL2: CALL MUL + POP DE + PUSH DE + CALL LDIR5 + POP HL + LD A,(PRCSON) + BIT 3,A + JP Z,EXPSKP + CALL MULTWO + LD DE,FLTEN + CALL ADDCMD + CALL DIVTWO + POP DE + PUSH DE + CALL MUL + LD DE,FLTEN + CALL DIVTWO + CALL ADDCMD + CALL MULTWO + POP DE + PUSH DE + CALL MUL + LD DE,FLT120 + CALL MUL + CALL MULTWO + CALL ONEADD + CALL DIVTWO + POP DE + PUSH DE + CALL MUL + CALL ONEADD + POP DE + PUSH DE + CALL MUL +EXPSKQ: CALL ONEADD + EX (SP),HL + EX DE,HL + PUSH DE + CALL LDIR1 + POP HL + LD DE,EXDTBL + LD A,(EXPHBT) + LD B,8 +EXPCLP: RLC A + JR NC,SKPEXP + PUSH AF + PUSH BC + CALL MUL + POP BC + POP AF +SKPEXP: INC DE + INC DE + INC DE + INC DE + INC DE + DJNZ EXPCLP + LD A,(EXPOFF) + ADD A,(HL) + JP C,ER02 + LD (HL),A + POP DE + CALL MUL + POP BC + LD A,(EXPSIN) + RLC A + RET NC + PUSH BC + PUSH DE + PUSH HL + CALL LDIR5 + POP DE + PUSH DE + CALL LDIR1 + POP HL + POP DE + CALL DIV + POP BC + RET + +EXPSKP: POP DE + PUSH DE + CALL MUL + LD A,(HL) + OR A + CALL NZ,DIVTWO + CALL ADDCMD + JP EXPSKQ + +EXPOFF: DB 0 ;(was DEFS 1) +EXPSIN: DB 0 ;(was DEFS 1) +EXPHBT: DB 0 ;(was DEFS 1) + +LOGD: PUSH BC + CALL LOG + LD DE,LOGE10 + CALL MUL + POP BC + RET + +LOG: PUSH BC ;LN(HL) + CALL TSTSGN + JP NZ,ER03 + LD A,(HL) + OR A + JP Z,ER03 + SUB 81H + LD (LOGEXP),A + LD (HL),81H + XOR A + LD B,8 + LD DE,EXDTBL +LOGCLL: PUSH BC + PUSH AF + CALL CMP + JR C,LOGNCL + PUSH HL + LD HL,40 + ADD HL,DE + EX DE,HL + EX (SP),HL + CALL MUL + POP DE + POP AF + SET 7,A + PUSH AF +LOGNCL: POP AF + RLC A + INC DE + INC DE + INC DE + INC DE + INC DE + POP BC + DJNZ LOGCLL + LD (SNFAC0),HL + CALL ADDHL5 + EX DE,HL + LD E,A + LD D,0 + CALL FLTHEX + LD A,(HL) + OR A + JR Z,NOTDCR + SUB 08H + LD (HL),A +NOTDCR: LD A,(LOGEXP) + CP 80H + JR C,LOG2 + NEG +LOG2: PUSH HL + CALL ADDHL5 + EX DE,HL + LD (SNFAC1),HL + LD E,A + LD D,0 + CALL FLTHEX + LD A,(LOGEXP) + AND 80H + INC HL + OR (HL) + LD (HL),A + DEC HL + EX DE,HL + POP HL + CALL ADDCMD + LD A,(PRCSON) + LD DE,LNTWOC + CP 05H + JR Z,LOG3 + LD DE,LNTWOA +LOG3: CALL MUL + PUSH HL + LD DE,(SNFAC1) + LD HL,(SNFAC0) + PUSH HL + PUSH DE + CALL LDIR5 + POP HL + CALL ONEADD + EX (SP),HL + CALL SUBCMD + POP DE + CALL DIV + PUSH DE + CALL LDIR5 + POP HL + PUSH DE + LD E,L + LD D,H + CALL MUL + POP DE + PUSH HL + PUSH DE + CALL LDIR5 + POP HL + LD DE,FIV3RD + CALL ADDCMD + EX DE,HL + POP HL + CALL MUL + LD DE,FLTEN + CALL MULTWO + CALL ADDCMD + CALL DIVTWO + EX DE,HL + LD HL,(SNFAC0) + CALL MUL + LD DE,TWO5TH + CALL MUL + POP DE + CALL ADDCMD + POP BC + RET + +LOGEXP: DB 0 ;(was DEFS 1) + +LOGE10: DW 5E7FH ;Log of 'e' to the base 10 + DW 0D85BH + DB 0A9H + +TWO5TH: DW 4C7FH ;2/5 + DW 0CCCCH + DB 0CDH + +FIV3RD: DW 5581H ;5/3 + DW 5555H + DB 56H + +EXDTBL: DW 3581H ;2^(1/2) + DW 0F304H + DB 34H + + DW 1881H ;2^(1/4) + DW 0F037H + DB 52H + + DW 0B81H ;2^(1/8) + DW 0C195H + DB 0E4H + + DW 0581H ;2^(1/16) + DW 0C3AAH + DB 68H + + DW 0281H ;2^(1/32) + DW 86CDH + DB 99H + + DW 0181H ;2^(1/64) + DW 0D164H + DB 0F4H + + DW 0081H ;2^(1/128) + DW 0EDB1H + DB 50H + + DW 0081H ;2^(1/256) + DW 0D758H + DB 0D3H + + DW 3580H + DW 0F304H + DB 34H + + DW 5780H + DW 0FC44H + DB 0CBH + + DW 6A80H + DW 0C6C0H + DB 0E8H + + DW 7580H + DW 7D25H + DB 16H + + DW 7A80H + DW 0B283H + DB 0DCH + + DW 7D80H + DW 0C3EH + DB 0DH + + DW 7E80H + DW 119EH + DB 5DH + + DW 7F80H + DW 0CB4EH + DB 5AH + +FLT120: DW 087AH + DW 8888H + DB 89H + +LNTWOA: DW 3180H ;LN(2) + DW 1772H + DB 0F8H + +LNTWOB: DW 3180H ;LN(2) again + DW 1772H + DB 0F8H + +LNTWOI: DW 3881H ;1/LN(2) + DW 3BAAH + DB 2AH + +LNTWOC: DW 3180H ;LN(2) again ! + DW 1772H + DB 0F8H + +SNFAC0: DB 0,0 ;(was DEFS 2) +SNFAC1: DB 0,0 ;(was DEFS 2) +SNFAC2: DB 0,0 ;(was DEFS 2) +SNFAC3: DB 0,0 ;(was DEFS 2) +SNFAC4: DB 0,0 ;(was DEFS 2) +SNFAC5: DB 0,0 ;(was DEFS 2) + +;* END of original module FLOAT.ASM +;*============================================================================ +;* START of original module MUSIC.ASM +;*---------------------------- +;* MZ-800 BASIC Music command +;* FI:MUSIC ver 1.0A 7.18.84 +;* Programmed by T.Miho +;*---------------------------- + +;*DIRARE: EQU 27D0H ;already defined +;*NMAX: EQU 83 ;already defined (µفأ² max) + +;*------------------------- +;* SOUND m,l / SOUND=(r,d) +;*------------------------- +SOUND: CALL TEST1 ;= + DB 0F4H + JR NZ,SOUND1 + CALL HCH28H ;( + CALL IBYTE + CP 16 + SET 7,A + JR SOUND2 + +SOUND1: CALL IBYTE + CP NMAX+1 +SOUND2: JP NC,ER03 + PUSH AF + CALL HCH2CH ;, + CALL IDEEXP + POP AF + PUSH AF + OR A + CALL M,HCH29H ;) + POP AF + PUSH HL + RST 18H + DB .SOUND + POP HL + RET + +;*---------------------- +;* TEMPO n (n= 1 to 7 ) +;*---------------------- +TEMPO: CALL IBYTE + DEC A + CP 7 + INC A + JP ATEMPO + +;*------------------------------- +;* NOISE A1$;A2$;B1$;... +;* MUSIC A1$;A2$;...;A6$;B1$;... +;*------------------------------- +NOISE: LD A,08H ;pattern (3) + DB 1 + +MUSIC: LD A,07H ;pattern (0,1,2) + LD (MUNOF),A ;channel pattern + CALL HLFTCH + LD B,3 + CP 0BEH ;WAIT + JR Z,MCTRLA + DEC B + CP 99H ;STOP + JR Z,MCTRLA + CP 0DCH ;INIT + JR NZ,MUSIC1 + LD DE,MUSCHO + LD B,4 + LD A,2 + CALL QSETDE +MCTRLA: PUSH HL + RST 18H + DB .MCTRL + POP HL + INC HL + RET + +MUSIC1: CALL ENDCHK + RET Z + XOR A + LD (MUDNO),A + LD (MUCHNO),A + LD B,A + LD A,0DH + LD DE,DIRARE + LD (MMBU1A),DE + LD (DE),A + CALL QSETDE + LD A,(MUNOF) + LD (MUNOF2),A +MUSI1: LD DE,MUNOF2 + LD A,(DE) + RRC A + LD (DE),A + PUSH AF + LD B,0 + JR NC,MUSI3 + CALL HLFTCH + CP ';' + JR Z,MUSI3 + CALL STREXP +MUSI3: PUSH HL + LD A,(MUCHNO) + CP 4 + JP Z,ER01 ;Ch no over + INC A + LD (MUCHNO),A + INC B + JP Z,ER05 + LD A,(MUDNO) + ADD A,B + JP C,ER05 ;data no. over + LD (MUDNO),A + LD HL,(MMBU1A) + CALL LDHLDE + LD (MMBU1A),HL + DEC HL + LD (HL),0DH + POP HL + POP AF + JR NC,MUSI1 + CALL ENDCHK + JR Z,MUSI4 + CALL TEST1 + DB ',' + JR Z,MUSI4 + CALL TEST1 + DB ';' + JR MUSI1 + +MUSI4: PUSH HL + LD HL,DIRARE + PUSH HL + POP IX + LD IY,MUSCHO + LD B,4 +MUSI5: PUSH BC + PUSH HL + PUSH IX + POP HL + LD DE,DIRARE + XOR A + SBC HL,DE + LD (IY+4),L + POP HL + LD (MUSI6+1),SP + CALL MML.EN +MUSI6: LD SP,0 ;xxx + POP BC + INC HL + INC IY + DJNZ MUSI5 + LD B,3 + RST 18H ;MWAIT + DB .MCTRL +MUSI8: LD BC,100H + LD HL,DIRARE + LD DE,DIRARE+700H + LDIR + LD B,4 + LD HL,MMCHDA +MUSDS: LD E,(HL) + LD D,0 + INC HL + PUSH HL + LD HL,DIRARE+700H + ADD HL,DE + LD A,(HL) + CP 0FFH + JR Z,MUSDS1 + LD A,4 + SUB B + PUSH BC + EX DE,HL + RST 18H + DB .PLAY + POP BC +MUSDS1: POP HL + DJNZ MUSDS + LD B,1 + RST 18H ;PSGON + DB .MCTRL + POP HL + JP MUSIC1 + +MUSCHO: DW 0202H ;Oct data eny ch. + DW 0202H + +MMCHDA: DB 0,0,0,0 ;Play & Noise Data addr (was DEFS 4) + +MUDNO: DB 0 ;total data No. (was DEFS 1) +MUCHNO: DB 0 ;ch no.(was DEFS 1) +MMBU1A: DB 0,0 ;MML data buffer (was DEFS 2) +MUNOF: DB 0 ;07:MUSIC 08:NOISE (was DEFS 1) +MUNOF2: DB 0 ;rotate(MUNOF) (was DEFS 1) + +;*--------------------------- +;* MML(HL) => IOCSM(IX) trans +;* END code=00H or 0DH or C8H +;*--------------------------- + +MML.EN: CALL MML.WC +MML.E0: CALL HLFTCH + CALL MMAGCH + JR C,MMTCAL + LD C,0 + CALL MML.AG ;String:A-G + JR MMTCA9 + +MMTCAL: CALL MMENCH + JP Z,MMLEND + LD B,12 + EX DE,HL + LD HL,MMTCAT ;Call address table +MMTCA0: CP (HL) ;cmp chr + INC HL + JR Z,MMTCAJ + DEC B + JP Z,ER03 + INC HL + INC HL + JR MMTCA0 +MMTCAJ: LD C,(HL) + INC HL + LD B,(HL) + EX DE,HL + INC HL + CALL .BC +MMTCA9: JP C,ER03 + JR MML.E0 + +.BC: PUSH BC + RET + +MMTCAT: DB '#' + DW MML.SH + DB '+' + DW MML.UO + DB 0D7H + DW MML.UO + DB '-' + DW MML.DO + DB 0CFH + DW MML.DO + DB 'O' + DW MML.O + DB 'N' + DW MML.N + DB 'T' + DW MML.T + DB 'V' + DW MML.V + DB 'S' + DW MML.S + DB 'M' + DW MML.M + DB 'L' + DW MML.L + +MML.DO: LD C,0F4H ;- + DB 11H + +MML.UO: LD C,12 ;+ + CALL TEST1 + DB '#' + JR NZ,LD.DE + INC C +LD.DE: DB 11H + +MML.SH: LD C,1 ;# + CALL HLFTCH + CALL MMAGCH + RET C +MML.AG: LD B,A + INC HL + CALL MML.DL + CCF + CALL C,MML.L1 + RET C + LD A,B + CP 'R' + JR Z,MML.R + PUSH HL + LD HL,ONCTT-41H ;A-G + CALL ADDHLA + LD B,(IY+0) + INC B + LD A,(HL) + POP HL + ADD A,C + SUB 12 +MML.11: ADD A,12 + DJNZ MML.11 + JR MML.N0 + +MML.R: XOR A +MML.R0: PUSH AF + CALL MML.WO + POP AF +MML.W1: LD (IX+0),A + INC IX + RET + +MML.O: CALL MML.DL ;O + JR NC,MML.O1 + LD A,2 +MML.O1: CP 7 + CCF + RET C + LD (IY+0),A ;oct No. + RET + +MML.N: CALL MML.DL ;N + RET C +MML.N0: CP NMAX+1 + CCF + RET C + JR MML.R0 + +MML.T: CALL MML.DL ;T + JR NC,MML.T1 + LD A,4 +MML.T1: DEC A + CP 7 + CCF + RET C + ADD A,6AH + LD (MML.W),A + RET + +MML.V: CALL MML.DL ;V + JR NC,MML.V1 + LD A,15 +MML.V1: CP 16 + CCF + RET C + ADD A,80H + LD (MML.W+1),A + RET + +MML.L: CALL MML.DL ;L + JR NC,MML.L1 + LD A,5 +MML.L1: CP 10 + CCF + RET C +MML.L2: ADD A,60H + LD (MML.W+2),A + RET + +MML.S: CALL MML.DL ;S + RET C + CP 9 + CCF + RET C + ADD A,90H + LD (MML.W+3),A + RET + +MML.M: CALL MML.DL ;M + RET C + OR A + SCF + RET Z + LD B,A + LD C,0A0H + LD (MML.W+4),BC + OR A + RET + +MML.DL: CALL HLFTCH + CALL MMENCH + SCF + CALL NZ,TSTNUM + RET C ;RET not number + RST 18H + DB .DEASC + JP DCHECK + +MMAGCH: CP 'R' ;A-G & R check + RET Z + CP 'A' + RET C + CP 'H' + CCF + RET + +MMENCH: OR A + RET Z + CP 0DH + RET Z + CP 0C8H + RET + +MMLEND: CALL MML.WO + LD A,0FFH ;Music Data end + CALL MML.W1 + JP MUSI6 + +MML.WO: LD DE,MML.W + LD B,6 +MML.W2: LD A,(DE) + OR A + CALL NZ,MML.W1 + INC DE + DJNZ MML.W2 +MML.WC: LD DE,MML.W + LD B,6 + JP QCLRDE + +ONCTT: DB 9 ;A + DB 11 ;B + DB 0 ;C + DB 2 ;D + DB 4 ;E + DB 5 ;F + DB 7 ;G +;* +MML.W: DB 0 ;T + DB 0 ;V + DB 0 ;L + DB 0 ;S + DB 0 ;Mn + DB 0 + +;* END of original module MUSIC.ASM +;*============================================================================ +;* START of original module WORKQ.ASM +;*--------------------------- +;* MZ-800 BASIC Work area +;* FI:WORKQ ver 1.0A 9.25.84 +;* Programmed by T.Miho +;*--------------------------- +;* The Label SWAPDS points to the start of the SWAP data + +SWAPDS: +NXTLPT: DB 0,0 ;(was DEFS 2) +EDLINE: DB 0,0 ;(was DEFS 2) +EDSTEP: DB 0,0 ;(was DEFS 2) +LNOBUF: DB 0,0 ;(was DEFS 2) +;* +ERRCOD: DB 0 ;(was DEFS 1) +ERRORF: DB 0 ;(was DEFS 1) +ERRLNO: DB 0,0 ;(was DEFS 2) +ERRLPT: DB 0,0 ;(was DEFS 2) +ERRPNT: DB 0,0 ;(was DEFS 2) +ERRORV: DB 0,0 ;(was DEFS 2) +;* +DATFLG: DB 0 ;(was DEFS 1) +DATPTR: DB 0,0 ;(was DEFS 2) +SWAPDE: +;* The Label SWAPDE comes 1 after the end of the SWAP data + +SWAPBY: DW SWAPDE-SWAPDS ;number of SWAP data bytes +SWAPNB: DW SWAPDS-SWAPDE ; -(SWAPBY) + +STACK: DB 0,0 ;(was DEFS 2) +TEXTPO: DB 0,0 ;(was DEFS 2) +LSWAP: DB 0 + +DGBFM1: DB 0 ;(was DEFS 1) +DGBF00: DB 0,0,0,0,0,0,0 ;(was DEFS 7) + +DGBF07: DB 0 ;(was DEFS 1) +DGBF08: DB 0,0,0 ;(was DEFS 3) +DGBF11: DB 0 ;(was DEFS 1) +DGBF12: DB 0,0,0,0 ;(was DEFS 4) +DGBF16: DB 0 ;(was DEFS 1) +DGBF17: DB 0,0,0,0,0,0,0,0 ;(was DEFS 8) + +DGBF25: DB 0,0,0,0,0,0,0,0 ;(was DEFS 25) + + DB 0,0,0,0,0,0,0,0 + + DB 0,0,0,0,0,0,0,0 + + DB 0 + +PRCSON: DB 8 +ZFAC: DB 0,0,0,0,0,0,0,0 ;(was DEFS 8) + +ZFAC1: DB 0,0,0,0,0,0,0,0 ;(was DEFS 8) + +ZFAC2: DB 0,0,0,0,0,0,0,0 ;(was DEFS 8) + + +;*---------------------------------------------------------------------- +;* Opening Screen for BASIC MZ-5Z009 v1.0B (overwritten after boot-up) +;*---------------------------------------------------------------------- +IMDBUF: DB 16H ;CLR + DB 0DH + DB " ×××××××××××××××××××××××××××××××××××××× " + DB " BASIC INTERPRETER MZ-5Z009" +TTJPEX: DB " V1.0B " + DB 0DH + DB " COPYRIGHT (C) 1984 BY SHARP CORP. " + DB " دددددددددددددددددددددددددددددددددددددد " + DB 0DH + DB " 22340 BYTES FREE" + DW 0D0DH +H9F71: DB 0 +H9F72: DB 0,0,0,0,0,0,0,0 ;(was DEFS 5CH = 92) + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0 + DB 0,0,0,0 + +;* END of original module WORKQ.ASM +;*=========================================================================== +;* START of original module PLT.ASM (optional) +;*------------------------------ +;* MZ-800 BASIC Plotter package +;* FI:PLT ver 1.0A 8.25.84 +;* Programmed by T.Miho +;*------------------------------ + ORG 9FCEH + +;*P.PLT: EQU 0 ;This EQUATE defined in a previous module +PNCHNM: DB 'N' ;N,S,L + +NEWON: LD BC,ER59A + LD DE,NEWONT ;NEW ON +NEWON2: LD A,(DE) ; omit plotter + INC DE + ADD A,A + JR Z,NEWON4 + LD HL,SJPTBL + CALL ADDHLA + LD (HL),C + INC HL + LD (HL),B + JR NEWON2 + +NEWON4: XOR A ; PLOT OFF + LD (INPFLG),A + LD A,(PNMODE) + DEC A + CALL NZ,MODETX ; PMODE TX + LD HL,NEWAD2 +NEWON9: LD (TEXTST),HL + RET + +NEWONT: DB 0A2H ;PMODE + DB 0A3H ;PSKIP + DB 0A4H ;PLOT + DB 0A5H ;PLINE + DB 0A6H ;RLINE + DB 0A7H ;PMOVE + DB 0A8H ;RMOVE + DB 0AEH ;PCOLOR + DB 0AFH ;PHOME + DB 0B0H ;HSET + DB 0B1H ;GPRINT + DB 0B3H ;AXIS + DB 0BBH ;PCIRCLE + DB 0BCH ;PTEST + DB 0BDH ;PAGE + DB 0 + +LPTTMD: LD B,1 ;Check text mode + JR LPTMD + +LPTGMD: LD B,2 ;Check graph mode +LPTMD: LD A,(PNMODE) + CP B + RET Z + JP LPTMER + +NEWAD2: +PMODE: CALL MODE0 ;PMODE command + XOR A + LD (LPOSB),A ;LPT TAB + RET + +MODE0: LD A,(INPFLG) + OR A + JP NZ,LPTMER + CALL PPCHCK + CALL TEST1 + DB 'G' + JP Z,PGRAPH + CALL TESTX + DB 'T' + CALL TEST1 + DB 'N' + JR Z,TEXTN + CALL TEST1 + DB 'L' + JR Z,TEXTN + CALL TESTX + DB 'S' +TEXTN: LD (PNCHNM),A + CALL CHKEND + CALL OUTA3H +MODETX: LD A,1 + LD (PNMODE),A + RST 18H + DB .LPTOT + LD A,(PNCHNM) + CP 'N' + RET Z + CP 'L' + LD A,0BH + JR Z,XLPTOT +T80CH: LD A,9 + RST 18H + DB .LPTOT + RST 18H + DB .LPTOT +XLPTOT: RST 18H + DB .LPTOT + RET + +OUTA3H: LD A,0AH + RST 18H + DB .LPTOT + LD A,3 + JR XLPTOT + +PGRAPH: INC HL ;Graphic mode + CALL CHKEND + LD A,2 + LD (PNMODE),A + JR XLPTOT + +SKIP: CALL PPCHCK + CALL LPTTMD ;SKIP n + CALL IDEEXP + LD A,E + OR A + RET Z + CP 0ECH ;-20 + JR NC,SKIPPS + CP 21 + JP NC,ER03 +SKIPPS: CALL CHKEND + BIT 7,E + JR NZ,SKIPD +SKIPI: LD A,0AH + RST 18H + DB .LPTOT + DEC E + JR NZ,SKIPI + RET + +SKIPD: LD A,03H + RST 18H + DB .LPTOT + INC E + JR NZ,SKIPD + RET + +PNMX99: PUSH HL + LD HL,999 + JR PNMX1 + +PNMX48: PUSH HL + LD HL,480 +PNMX1: PUSH HL + ADD HL,DE + POP HL + JR C,PNMX2 + SBC HL,DE + JP C,ER03 +PNMX2: POP HL + RET + +PLINE: LD C,'D' ; PLINE %n,x,y + DB 11H +RLINE: LD C,'J' ; RLINE %n,x,y" + DB 11H +PMOVE: LD C,'M' ; PMOVE x,y + DB 11H +RMOVE: LD C,'R' ; RMOVE x,y + CALL PPCHCK + CALL LPTGMD + LD A,C + LD (LINEC+1),A + CP 'M' + JR NC,LINE5 ;"M","R" + CALL TEST1 + DB '%' + JR NZ,LINE5 + CALL IBYTE + LD A,E + DEC A + CP 16 + JP NC,ER03 + DEC DE + LD A,'L' + RST 18H + DB .LPTOT + CALL NUMPLT + CALL LPTCR + CALL ENDCHK + RET Z + CALL CH2CH +LINE5: CALL IDEEXP + CALL CH2CH + CALL PNMX48 + PUSH DE + CALL IDEEXP + CP ',' + JR Z,LINEXY + CALL CHKEND +LINEXY: CALL PNMX99 + POP BC + PUSH DE +LINEC: LD A,0 ;Plotter command + RST 18H + DB .LPTOT + LD E,C + LD D,B + CALL NUMPLT ;X + CALL LPTCOM + POP DE + CALL NUMPLT ;Y + CALL LPTCR + CALL ENDCHK + RET Z + INC HL + JR LINE5 + +PCOLOR: CALL PPCHCK + CALL IBYTE ;PCOLOR n + LD A,E + CP 4 + JP NC,ER03 + CALL CHKEND + LD A,(PNMODE) + CP 2 + JR Z,PNMBR2 + CALL OUTA3H + LD A,2 + RST 18H + DB .LPTOT + CALL PNMBR2 + JP PRTTX + +PNMBR2: LD A,'C' + RST 18H + DB .LPTOT + LD A,E + OR 30H + RST 18H + DB .LPTOT +LPTCR: LD A,0DH + JR LPTTX + +LPTCOM: LD A,',' +LPTTX: RST 18H + DB .LPTOT + RET + +PHOME: LD C,'H' + DB 11H +HSET: LD C,'I' + CALL LPTGMD ;PHOME / HSET + CALL CHKEND + LD A,C + JR LPTTX ;WAS JP YLPTOT !! (error in original source code) + +GPRINT: CALL PPCHCK + CALL LPTGMD ;GPRINT [n,s],x$ + CALL TEST1 + DB '[' + JR NZ,SYMBL2 + CALL IBYTE + CP 64 + JP NC,ER03 + PUSH DE + CALL HCH2CH + CALL IBYTE + CP 4 + JP NC,ER03 + PUSH DE + CALL TESTX + DB ']' + POP BC + POP DE + PUSH BC + LD A,'S' + RST 18H + DB .LPTOT + CALL NUMPLT + CALL LPTCOM + POP DE + LD A,'Q' + RST 18H + DB .LPTOT + CALL NUMPLT + CALL LPTCR + CALL ENDCHK + RET Z + CALL CH2CH +SYMBL2: CALL STREXP + CALL ENDCHK + JR Z,SYMBL5 + CALL CH2CH + DEC HL +SYMBL5: LD A,B + OR A + JR Z,SYMBL4 + LD A,'P' + RST 18H + DB .LPTOT +SYMBL3: LD A,(DE) + RST 18H + DB .LPTOT + INC DE + DJNZ SYMBL3 + CALL LPTCR +SYMBL4: CALL ENDCHK + RET Z + INC HL + JR SYMBL2 + +AXIS: CALL LPTGMD ;AXIS x,p,r + CALL IBYTE + CP 2 + JP NC,ER03 + PUSH AF + CALL HCH2CH + CALL IDEEXP + PUSH DE + CALL CH2CH + CALL IBYTE + OR A + JP Z,ER03 + CALL CHKEND + LD A,'X' + RST 18H + DB .LPTOT + POP BC + POP AF + PUSH DE + PUSH BC + OR 30H + RST 18H + DB .LPTOT + CALL LPTCOM + POP DE + CALL PNMX99 + CALL NUMPLT + CALL LPTCOM + POP DE + CALL NUMPLT + JP LPTCR + +PCIRCLE: CALL LPTGMD ;PCIRCLE x,y,r,s,e,d + PUSH HL + LD DE,0 + LD HL,CRS + CALL FLTHEX + LD DE,360 + LD HL,CRE + CALL FLTHEX + LD HL,FLTEN + LD DE,CRTEN + CALL LDIR5 + POP HL + CALL EXPR ;X + CALL CH2CH + PUSH HL + LD HL,CRX + EX DE,HL + CALL LDIR5 + POP HL + CALL EXPR ;Y + CALL CH2CH + PUSH HL + LD HL,CRY + EX DE,HL + CALL LDIR5 + POP HL + CALL EXPR ;R + PUSH HL + PUSH AF + LD HL,CRR + EX DE,HL + CALL LDIR5 + LD A,(CRR+1) + RLCA + JP C,ER03 + POP AF + CP ',' + JR NZ,CIREND + POP HL + INC HL + CALL EXPR ;S + PUSH HL + PUSH AF + LD HL,CRS + EX DE,HL + CALL LDIR5 + POP AF + CP ',' + JR NZ,CIREND + POP HL + INC HL + CALL EXPR ;E + PUSH HL + PUSH AF + LD HL,CRE + EX DE,HL + CALL LDIR5 + POP AF + CP ',' + JR NZ,CIREND + POP HL + INC HL + CALL EXPR ;D + PUSH HL + LD HL,CRTEN + EX DE,HL + CALL LDIR5 + LD A,(CRTEN+1) + RLCA + JP C,ER03 +CIREND: POP HL + CALL CHKEND + PUSH HL + LD HL,CRE + LD DE,CRS + LD A,(CRTEN) + OR A + CALL NZ,CMP + JP C,ER03 + CALL CRXYRS ;CAL X,Y + LD HL,CRXX ;MOVE X,Y + LD (CRMOVX+1),HL + LD HL,CRYY + LD (CRMOVY+1),HL + CALL CRMOVE + LD A,(CRTEN) + OR A + JR Z,CREDLI +CRCLP: LD HL,CRS ;S+D + LD DE,CRTEN + CALL ADDCMD + LD DE,CRE + CALL CMP + JR NC,ENCRCL + CALL CRXYRS + CALL CRLINE + RST 18H + DB .BREAK + JR NZ,CRCLP + POP HL + RET + +ENCRCL: CALL CREDST + CALL CRLINE + POP HL + RET + +CREDST: LD HL,CRE + LD DE,CRS + LD BC,5 + LDIR + JR CRXYRS + +CREDLI: LD HL,CRX + LD (CRMOVX+1),HL + LD HL,CRY + LD (CRMOVY+1),HL + CALL CRLINE + CALL CREDST + LD HL,CRXX + LD (CRMOVX+1),HL + LD HL,CRYY + LD (CRMOVY+1),HL + CALL CRLINE + POP HL + RET + +CRLINE: LD A,'D' + DB 21H +CRMOVE: LD A,'M' + PUSH AF +CRMOVX: LD HL,CRX + CALL HLFLT + PUSH HL + EX DE,HL + CALL PNMX99 +CRMOVY: LD HL,CRY + CALL HLFLT + PUSH HL + EX DE,HL + CALL PNMX99 + POP HL + POP DE + POP AF + RST 18H + DB .LPTOT + PUSH HL + CALL NUMPLT + CALL LPTCOM + POP DE + CALL NUMPLT + JP LPTCR + +CRXYRS: LD DE,(INTFAC) + LD HL,CRS + CALL LDIR5 + LD HL,(INTFAC) + CALL RAD + CALL COS + LD DE,CRR + CALL MUL + LD DE,CRX + CALL ADDCMD + LD DE,CRXX + CALL LDIR5 + LD DE,(INTFAC) + LD HL,CRS + CALL LDIR5 + LD HL,(INTFAC) + CALL RAD + CALL SIN + LD DE,CRR + CALL MUL + LD DE,CRY + CALL ADDCMD + LD DE,CRYY + JP LDIR5 + +CRX: DB 0,0,0,0,0 ;(was DEFS 5) + +CRY: DB 0,0,0,0,0 ;(was DEFS 5) + +CRR: DB 0,0,0,0,0 ;(was DEFS 5) + +CRS: DB 0,0,0,0,0 ;(was DEFS 5) + +CRE: DB 0,0,0,0,0 ;(was DEFS 5) + +CRTEN: DB 0,0,0,0,0 ;(was DEFS 5) + +CRXX: DB 0,0,0,0,0 ;(was DEFS 5) + +CRYY: DB 0,0,0,0,0 ;(was DEFS 5) + + DB 0,0,0,0,0 ;(was DEFS 5) + + +NUMPLT: PUSH AF + PUSH HL + LD HL,(INTFAC) + CALL FLTHEX + CALL CVNMFL + RST 18H + DB .COUNT +NUMPL2: LD A,(DE) + RST 18H + DB .LPTOT + INC DE + DJNZ NUMPL2 + POP HL + POP AF + RET + +TEST: CALL PPCHCK + CALL LPTTMD ;TEST command + CALL CHKEND + LD A,04H + RST 18H + DB .LPTOT + RET + +PAGE: CALL LPTTMD ;PAGE n + CALL IDEEXP + LD A,E + OR A + JP Z,ER03 + CP 73 + JP NC,ER03 + CALL CHKEND + LD A,9 + RST 18H + DB .LPTOT + RST 18H + DB .LPTOT + LD A,(PSEL) + BIT P.PLT,A + JR Z,PAGE2 + CALL NUMPLT ;Plotter only + JP LPTCR + +PAGE2: LD A,E ;Except plotter + LD DE,KEYBUF + CALL HEXACC + DEC DE + DEC DE + LD A,(DE) + RST 18H + DB .LPTOT + INC DE + LD A,(DE) + RST 18H + DB .LPTOT + RET + +PLOT: LD A,(HL) + CP 9DH ;PLOT ON/OFF + JR Z,PLOT2 + CP 0A1H ;OFF + JP NZ,ER01 + XOR A +PLOTOK: LD (INPFLG),A + INC HL + RET + +PLOT2: CALL LPTTMD + CALL PPCHCK + LD A,(PNCHNM) + CP 'L' + JP Z,LPTMER + CALL PRTTX +PL40C: LD A,(INPFLG) + OR A + JR NZ,PLOTOK + CALL CONSOI + LD A,16H + RST 18H + DB .CRT1C + OR 01H + JR PLOTOK + +PRTTX: LD A,1 + RST 18H + DB .LPTOT + LD A,(CRTMD2) + CP 3 + RET C + CALL T80CH + RET + +PPCHCK: LD A,(PSEL) + BIT P.PLT,A ;if not plotter + JP Z,LPTMER ; then err + RET + +NEWAD0: +BASICEND: +;* END of original module PLT.ASM and of Sharp MZ-800 QD BASIC MZ-5Z009 +;*============================================================================ diff --git a/software/asm/include/CPM_Definitions.asm b/software/asm/include/CPM_Definitions.asm index d8f0ab4..5936add 100644 --- a/software/asm/include/CPM_Definitions.asm +++ b/software/asm/include/CPM_Definitions.asm @@ -7,7 +7,7 @@ ;- Definitions for the Sharp MZ80A CPM v2.23 OS used in the RFS ;- ;- Credits: -;- Copyright: (c) 2019-20 Philip Smart +;- Copyright: (c) 2019-21 Philip Smart ;- ;- History: Jan 2020 - Initial version. ; May 2020 - Advent of the new RFS PCB v2.0, quite a few changes to accommodate the diff --git a/software/asm/include/TZFS_Definitions.asm b/software/asm/include/TZFS_Definitions.asm index 60c5e98..88b49e0 100644 --- a/software/asm/include/TZFS_Definitions.asm +++ b/software/asm/include/TZFS_Definitions.asm @@ -10,7 +10,7 @@ ;- I/O processor in the K64F/ZPU. ;- ;- Credits: -;- Copyright: (c) 2019-20 Philip Smart +;- Copyright: (c) 2019-21 Philip Smart ;- ;- History: May 2020 - Branch taken from RFS v2.0 and adapted for the tranZPUter SW. ;- July 2020 - Updates to accommodate v2.1 of the tranZPUter board. @@ -137,8 +137,12 @@ BRKEY EQU 0001Eh 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 @@ -149,9 +153,13 @@ 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 ; ROM location differences between the MZ80A and MZ-700. @@ -178,7 +186,7 @@ DLY12: EQU 00996H ENADEBUG EQU 0 ; Enable debugging logic, 1 = enable, 0 = disable ;----------------------------------------------- -; Memory mapped ports in hardware.1G +; Memory mapped ports in hardware. ;----------------------------------------------- SCRN: EQU 0D000H ARAM: EQU 0D800H