mister35mm Posted January 6, 2016 Share Posted January 6, 2016 This is a bit of a shaggy dog story... Apologies in advance. Once upon a time, a bought a 2nd hand Sharp MZ721 computer (64k ram, Z80a, 2k monitor rom, BASIC etc loaded from tape.) It could be switched on, but I had no software for it, and even BASIC had to be loaded from cassette. Today, I was looking at one of the few Sharp computer 'fan' websites:- http://www.sharpmz.org/ to see what software I could find, I came across this interesting article about interfacing one of commodore's serial floppy disk drives to the Mz700's I/O port. Now you may or may not know that CBM / Commodore floppy drives, like Atari disk drives, have a built in microprocessor system with a kind of DOS built in. Communications are done via the particular computer's serial port. This article explains how to built the interface (one74ls06 series ic's) and programming on the MZ700. I was thinking with a little adaption, perhaps the same could be done with the TI-99/4a? The software is able to store storage areas on a Commodore 1541/1570/1571/1581 disk in conjunction with the simple hardware described above. The following functions are available by this version of the software: Save a storage area on disk Verify the saved data Load a machine code program or any data from disk to the memory Display the directory from disk Print the directory on the internal plotter or an external printer Get and display the status message from the drive Send a floppy command to the drive LSVCDIPF : Each character is the short form of a command. At the end of each process the program tries to get and display the drive status message, for example, 00, OK,00,00. A description of the commands follows now. "L" loads a machine code program into the memory. Example: LSVCDIPF: L Filename: MYFILE Searching for MYFILE Load to : C000 Searching for MYFILE Loading MYFILE 00, OK,00,00 MYFILE is the file name of the file to be loaded. C000 is displayed by the program. C000 is the address typed in during the save process as the start address of the area to be saved. You can change the address if the data is to be loaded to a new location. "S" saves a machine code program to disk. An example of the procedure follows: LSVCDIPF: S Filename: MYFILE Begin : C000 End : CA94 Saving MYFILE 00, OK,00,00 The name of the file to be saved is MYFILE, for example. The data to be saved is located in the memory from $C000 to $CA94. "V" verifies the data saved. Invoke the verify immediately afterwards of a save, otherwise, the data in the memory could be modified possibly. Example of the procedure: LSVCDIPF: V Searching for MYFILE Verifying MYFILE 00, OK,00,00 Depending on possible write errors during a save or depending on a damaged disk the following messages are possible: LSVCDIPF: V Searching for MYFILE Verifying MYFILE Verifying error 00, OK,00,00 In this case take a new disk and save the file again. "C" allows to invoke any available floppy drive command directly: LSVCDIPF: C Command : U0>M1 00, OK,00,00. This example shows the mode change of the 1571 from the 1541 mode to the 1571 mode. "D" gets the directory from the disk and stores the directory into the memory starting at the BASIC user programming area located at $6BCF for the S-BASIC like the C64 does. Then the directory is displayed on screen. If the screen is full the program waits until any key is pressed and then displays the next screen. Here is an example: LSVCDIPF: D Searching for $ Loading $ 0 "MYDISK1 " 00 2A 13 "FILE1" PRG 17 "GAME002" PRG 12 "PROGRAMM UTI" PRG 1 "MYFILE2" PRG 1 "MYTEST" PRG 618BLOCKS FREE. The first 3 messages will be overwritten by the directory display that follows. "I" prints the directory on an external printer and "P" prints the directory on the internal plotter. The directory is stored into the memory as described above and additional, it is displayed on the screen too. If the screen is full no key action is needed as needed for the "D" command. The program waits until the last character on the screen is printed and then automatically displays the next screen. The current character printed is inverted on the screen to see the progress of the print output. "F" gets and displays the floppy drive status message. An example follows: LSVCDIPF: F 73,CBM DOS V3.0 1571,00,00 Another example is: LSVCDIPF: F 74,DRIVE NOT READY,00,00 There is also a complete z80 assembly listing too:- AS V1.40r8 - Quelle MZ1571.ASM - Seite 1 - 23.8.1998 0:23:26 1/ 0 : ; written by KarlHeinz.Mau@t-online.de 1996, last modified August 22nd, 1998 2/ 0 : ; 3/ 0 : ; This program communicates with Commodore 15xx floppy disk drive running 4/ 0 : ; on Sharp MZ700-series homecomputers. 5/ 0 : ; 6/ 0 : ; The following commands are implemented: 7/ 0 : ; 8/ 0 : ; "L" Load a file from 15xx. The load address is modifiable, the program 9/ 0 : ; displays the address where it was stored. You can use or modify this 10/ 0 : ; address. First you have to specify the name of the file to load. 11/ 0 : ; 12/ 0 : ; "S" Save a file to 15xx. You have to know the begin/end address for save 13/ 0 : ; and you have to specify the name of the file to save. The name of 14/ 0 : ; the file must not exceed 16 characters in length. 15/ 0 : ; 16/ 0 : ; "V" Verifies a stored file. 17/ 0 : ; 18/ 0 : ; "C" You can input and send any command decsribed in handbooks for 15xx to 19/ 0 : ; the drive. 20/ 0 : ; 21/ 0 : ; "F" Reads and displays the error message channel of the floppy drive. 22/ 0 : ; 23/ 0 : ; "D" Loads the directory to main storage at location 6bcfh and displays the 24/ 0 : ; directory. 25/ 0 : ; Note, loaded directory overwrites the basic program area, like 26/ 0 : ; the C64 does. 27/ 0 : ; 28/ 0 : ; "I" Outputs directory to printer. 29/ 0 : ; 30/ 0 : ; "P" Outputs directory to plotter. 31/ 0 : ; 32/ 0 : 33/ 0 : 34/ 0 : CPU Z80 35/ A000 : org 0a000h ; A000h Entrypoint MZ700 36/ A000 : C3 F5 A0 jp start ; jump around definitions 37/ A003 : 38/ A003 : ; MZ7xx-Characterset conversion 39/ A003 : CHARSET 'a',0a1h 40/ A003 : CHARSET 'b',09ah 41/ A003 : CHARSET 'c',09fh 42/ A003 : CHARSET 'd',09ch 43/ A003 : CHARSET 'e',092h 44/ A003 : CHARSET 'f',0aah 45/ A003 : CHARSET 'g',097h 46/ A003 : CHARSET 'h',098h 47/ A003 : CHARSET 'i',0a6h 48/ A003 : CHARSET 'j',0afh 49/ A003 : CHARSET 'k',0a9h 50/ A003 : CHARSET 'l',0b8h 51/ A003 : CHARSET 'm',0b3h 52/ A003 : CHARSET 'n',0b0h 53/ A003 : CHARSET 'o',0b7h 54/ A003 : CHARSET 'p',09eh 55/ A003 : CHARSET 'q',0a0h 56/ A003 : CHARSET 'r',09dh 57/ A003 : CHARSET 's',0a4h 58/ A003 : CHARSET 't',096h 59/ A003 : CHARSET 'u',0a5h 60/ A003 : CHARSET 'v',0abh AS V1.40r8 - Quelle MZ1571.ASM - Seite 2 - 23.8.1998 0:23:26 61/ A003 : CHARSET 'w',0a3h 62/ A003 : CHARSET 'x',09bh 63/ A003 : CHARSET 'y',0bdh 64/ A003 : CHARSET 'z',0a2h 65/ A003 : CHARSET 'ä',0bbh 66/ A003 : CHARSET 'ö',0bah 67/ A003 : CHARSET 'ü',0adh 68/ A003 : CHARSET 'ß',0aeh 69/ A003 : CHARSET 'Ä',0b9h 70/ A003 : CHARSET 'Ö',0a8h 71/ A003 : CHARSET 'Ü',0b2h 72/ A003 : 73/ A003 : ; Monitor-ROM-entries 74/ A003 : =3H GETL: equ 0003h ; get input line to (de) 75/ A003 : =6H LETNL: equ 0006h ; set cursor to next line 76/ A003 : =12H PRNT: equ 0012h ; print character in accu 77/ A003 : =15H MSG: equ 0015h ; print character string from (de) 78/ A003 : =ADH ST1: equ 00adh ; entry of Monitor-ROM 79/ A003 : =18FH LPRNT: equ 018fh ; 1 Char. plot 80/ A003 : =3BAH PRTHL: equ 03bah ; ascii print for hl 81/ A003 : =3C3H PRTHX: equ 03c3h ; ascii print for accu 82/ A003 : =410H HLHEX: equ 0410h ; compute 4 ascii to hl 83/ A003 : =9B3H KEY: equ 09b3h ; waits for any key (accu=displ.code) 84/ A003 : =A50H SWEP: equ 0a50h ; checks for any key pressed 85/ A003 : =BCEH DACN: equ 0bceh ; converts display-code to ascii 86/ A003 : =BD4H dacn10: equ 0bd4h ; conversion routine 87/ A003 : =DB5H DSP: equ 0db5h ; prints display-code from accu 88/ A003 : =1171H DSPXY: equ 1171h ; 1171 curr. column, 1172 curr. row 89/ A003 : =6BCFH BasStrt: equ 6bcfh ; Start adress Basic-program area 90/ A003 : =D000H screen: equ 0d000h ; start of screen area 91/ A003 : =E000H le000: equ 0e000h ; 8255 Port A 92/ A003 : =E001H le001: equ 0e001h ; 8255 Port B 93/ A003 : =E008H le008: equ 0e008h ; LS367 94/ A003 : 95/ A003 : ; constants 96/ A003 : 97/ A003 : =AH lf: equ 0ah ; line feed + autom. cr for printer 98/ A003 : =DH cr: equ 0dh ; Carriage Return 99/ A003 : =16H cls: equ 16h ; Clear-Screen-Character 100/ A003 : =1BH brk2: equ 1bh ; MZ-code break 101/ A003 : =20H spc: equ 20h ; space-/blank-character 102/ A003 : =CBH brk1: equ 0CBh ; Keycode Break 103/ A003 : =66H cr2: equ 66h ; Keycode carriage return 104/ A003 : 105/ A003 : ; Definitions, variables, switches 106/ A003 : 4C 53 56 43 44 49 Prompt0: db "LSVCDIPF : \r" ; \r = 0Dh = Stringend 50 46 20 3A 20 0D 107/ A00F : 43 B7 B3 B3 A1 B0 Prompt1: db "Command : \r" 9C 20 20 3A 20 0D 108/ A01B : 4C B7 A1 9C 20 96 Prompt2: db "Load to : \r" B7 20 20 3A 20 0D 109/ A027 : 42 92 97 A6 B0 20 Prompt3: db "Begin : \r" 20 20 20 3A 20 0D 110/ A033 : 45 B0 9C 20 20 20 Prompt4: db "End : \r" 20 20 20 3A 20 0D 111/ A03F : 46 A6 B8 92 B0 A1 Prompt5: db "Filename : \r" B3 92 20 3A 20 0D 112/ A04B : 44 92 AB A6 9F 92 DEVNPRES: db "Device not present\r" 20 B0 B7 96 20 9E 9D 92 A4 92 B0 96 AS V1.40r8 - Quelle MZ1571.ASM - Seite 3 - 23.8.1998 0:23:26 0D 113/ A05E : 42 9D 92 A1 A9 0D Break: db "Break\r" 114/ A064 : 56 92 9D A6 AA BD veriferr: db "Verifying error\r" A6 B0 97 20 92 9D 9D B7 9D 0D 115/ A074 : 53 A1 AB 92 20 92 saveerr: db "Save error\r" 9D 9D B7 9D 0D 116/ A07F : 4C B7 A1 9C 20 92 loaderr: db "Load error\r" 9D 9D B7 9D 0D 117/ A08A : 53 92 A1 9D 9F 98 searchfo: db "Searching for \r" A6 B0 97 20 AA B7 9D 20 0D 118/ A099 : 4C B7 A1 9C A6 B0 loading: db "Loading \r" 97 20 0D 119/ A0A2 : 56 92 9D A6 AA BD veryfing: db "Verifying \r" A6 B0 97 20 0D 120/ A0AD : 53 A1 AB A6 B0 97 saving: db "Saving \r" 20 0D 121/ A0B5 : 46 A6 B8 92 20 B0 filenfnd: db "File not found\r" B7 96 20 AA B7 A5 B0 9C 0D 122/ A0C4 : 4D A6 A4 A4 A6 B0 namemiss: db "Missing filename\r" 97 20 AA A6 B8 92 B0 A1 B3 92 0D 123/ A0D5 : 124/ A0D5 : FF PrtSw: db 0ffh ; 'P'=Plot, not 'P'=print 125/ A0D6 : 00 lc401: db 00h ; 00h=go back to monitor, 126/ A0D7 : ; not 00h=goback to caller 127/ A0D7 : 00 00 stackptr: dw 0000h ; stack on entry to hardcopy routine 128/ A0D9 : 00 00 stckptr: dw 0000h ; stack pointer to return from errors 129/ A0DB : 130/ A0DB : ; IEC-Definitions 131/ A0DB : 132/ A0DB : 40 ST: db 40h ; (90h) means c64-zero-page, 133/ A0DC : ; Status word 134/ A0DC : 00 LVFlag: db 00h ; (93h) 00=load, 01=verify, 02=save 135/ A0DD : 55 iecflag: db 55h ; (94h) flag at IEC-output 136/ A0DE : 00 IECBUF: db 00h ; (95h) 1 byte IEC-buffer for 137/ A0DF : ; received byte 138/ A0DF : 55 sta: db 55h ; (a3h), IEC I/O-status 139/ A0E0 : 00 bitcnt: db 00h ; (a4h), IEC I/O-bit counter 140/ A0E1 : CD 00 EndPtr: dw 00cdh ; (aeh) current save-/load address 141/ A0E3 : 0D fileLen: db 0dh ; (b7h) length of file name 142/ A0E4 : 60 SecAdr: db 60h ; (b9h) secondary address 143/ A0E5 : 08 GerNr: db 08h ; (bah) device number (Floppy 144/ A0E6 : 00 00 IOStrt: dw 0000h ; (c1h) start address 145/ A0E8 : C1 00 AdrLoad: dw 00c1h ; load address for file/directory 146/ A0EA : 00 02 biostrt: dw 0200h ; save start address 147/ A0EC : 00 asave: db 00h ; save for accu 148/ A0ED : 00 hlsave: db 0000h ; save for hl 149/ A0EE : B5 zwispei: db 0b5h ; save for received bit(s) 150/ A0EF : 4E svsecadr: db 4eh ; save sec. address 151/ A0F0 : 30 30 30 30 30 ascwork: db "00000" ; workarea ascii-convertion 152/ A0F5 : AS V1.40r8 - Quelle MZ1571.ASM - Seite 4 - 23.8.1998 0:23:26 153/ A0F5 : NEWPAGE 154/ A0F5 : 155/ A0F5 : ; Entrypoint 156/ A0F5 : 157/ A0F5 : 11 03 A0 start: ld de,Prompt0 ; (prompt0) 158/ A0F8 : CD 56 A1 call inptproc 159/ A0FB : CA 7E A8 jp z,intbrk 160/ A0FE : CD CE 0B call DACN ; convert display code to ascii 161/ A101 : FE 66 cp cr2 ; enter (cr) key pressed? 162/ A103 : CA F5 A0 jp z,start ; yes, once more 163/ A106 : ED 73 D9 A0 ld (stckptr),sp ; save stackpointer for errors 164/ A10A : FE 43 cp 'C' ; C to put any command on floppydrive 165/ A10C : CA 6B A1 jp z,cmdin ; yes, jump in 166/ A10F : FE 44 cp 'D' ; D to get directory on screen 167/ A111 : CA 37 A1 jp z,start015 ; yes, jump in 168/ A114 : FE 46 cp 'F' ; F to get 15xx error message 169/ A116 : CA 15 A2 jp z,GetErSta ; yes, jump in 170/ A119 : FE 4C cp 'L' ; L to load a file 171/ A11B : CA 43 A2 jp z,Load ; yes, jump in 172/ A11E : FE 53 cp 'S' ; S to save a file 173/ A120 : CA A7 A2 jp z,Save ; yes, jump in 174/ A123 : FE 56 cp 'V' ; V to verify a stored file 175/ A125 : CA 96 A2 jp z,Verify ; yes, jump in 176/ A128 : FE 50 cp 'P' ; P to plot directory 177/ A12A : C2 3D A1 jp nz,start020 ; no, try 'I' 178/ A12D : 3E 40 ld a,40h ; set IRT bit 179/ A12F : D3 FE out (0feh),a ; IRT plotter (reset) 180/ A131 : 3E 00 ld a,00h ; clr lines 181/ A133 : D3 FE out (0feh),a 182/ A135 : 3E 50 ld a,'P' 183/ A137 : 32 D5 A0 start015: ld (PrtSw),a ; store to print marker 184/ A13A : C3 85 A1 jp getdir ; continue 185/ A13D : 186/ A13D : FE 49 start020: cp 'I' ; I to print directory? 187/ A13F : 20 B4 jr nz,start ; no, error, once more 188/ A141 : 32 D5 A0 ld (PrtSw),a ; store to print marker 189/ A144 : DB FE start030: IN A,(0FEh) 190/ A146 : CB 47 BIT 0,A ; busy? 191/ A148 : 28 3B JR Z,getdir ; not busy 192/ A14A : F6 40 OR 40h ; set IRT 193/ A14C : D3 FE OUT (0FEh),A ; reset printer 194/ A14E : CD B1 A3 CALL lC719 ; test break key 195/ A151 : 20 F1 JR NZ,start030 ; no, loop 196/ A153 : C3 7E A8 jp intbrk ; yes, goback 197/ A156 : 198/ A156 : CD 15 00 inptproc: call MSG ; print message (de) 199/ A159 : CD B3 09 inptp10: call KEy ; wait on any key. (display code) 200/ A15C : FE CB cp brk1 ; break key pressed? 201/ A15E : C8 ret z ; yes, jump to break routine 202/ A15F : FE C1 cp 0c1h ; don't show keys (c1h-cdh)cc? 203/ A161 : DC B5 0D call c,DSP ; echo key to screen 204/ A164 : F5 push af ; save key code 205/ A165 : CD 06 00 call LETNL ; skip cursor to next line 206/ A168 : F1 pop af ; restore 207/ A169 : A7 and a ; no break (note: test space bar?) 208/ A16A : C9 ret 209/ A16B : 210/ A16B : ; input for a 157xx-command that is to send to drive 211/ A16B : 11 0F A0 cmdin: ld de,prompt1 ; address of prompt1 to de 212/ A16E : CD 04 A3 call GetNam05 ; get command input line AS V1.40r8 - Quelle MZ1571.ASM - Seite 5 - 23.8.1998 0:23:26 213/ A171 : CA 7E A8 jp z,intbrk ; jump if break key or cr key pressed 214/ A174 : 3E 0F ld a,0fh ; command channel 0fh 215/ A176 : 32 E4 A0 ld (SecAdr),a ; store in 216/ A179 : CD BD A6 call IECOPEN ; open cmd channel and submit cmd 217/ A17C : CD 20 A8 call IECCLOSE ; close cmd channel 218/ A17F : CD BC A4 call ErrorChk ; check for errors 219/ A182 : C3 15 A2 jp GetErSta ; all done, displ. error msg channel 220/ A185 : 221/ A185 : 222/ A185 : ; Load and display directory 223/ A185 : 224/ A185 : AF GetDir: xor a ; 00=Load directory 225/ A186 : 32 DC A0 ld (LVFlag),a 226/ A189 : 3C inc a ; 00+01 227/ A18A : 32 E3 A0 ld (fileLen),a ; "$" is length of 1 228/ A18D : 3E 24 ld a,'$' ; $ is 157xx command to load directory 229/ A18F : 32 9B A8 ld (fileName+11),a ; $ to the command line 230/ A192 : 21 CF 6B ld hl,BasStrt ; area to store the directory info 231/ A195 : 22 E8 A0 ld (AdrLoad),hl ; save adress for load routine 232/ A198 : AF xor A 233/ A199 : 32 E4 A0 LD (SecAdr),a ; dir load transfer on channel 0 234/ A19C : CD 10 A7 call IECLOAD ; exec load routine 235/ A19F : CD BC A4 call ErrorChk ; check for errors 236/ A1A2 : DA 7E A8 jp c,intbrk ; stop at brk 237/ A1A5 : 11 CF 6B ld de,BasStrt ; address of directory info in main 238/ A1A8 : 3E 16 DirPrt05: ld a,cls ; first clear the screen 239/ A1AA : CD 12 00 call prnt ; do it 240/ A1AD : 13 DirPrt10: inc de ; skip around two 01h 241/ A1AE : 13 inc de 242/ A1AF : EB ex de,hl 243/ A1B0 : 5E ld e,(hl) ; load # of blocks to de 244/ A1B1 : 23 inc hl 245/ A1B2 : 56 ld d,(hl) 246/ A1B3 : 23 inc hl 247/ A1B4 : EB ex de,hl ; now to hl for hltoasc 248/ A1B5 : CD 69 A4 call HLtoASC ; print # blocks 249/ A1B8 : 1A DirPrt20: ld a,(de) ; check for line end 250/ A1B9 : A7 and a 251/ A1BA : 28 0C jr z,DirPrt40 ; yes, line end reached 252/ A1BC : FE 20 cp spc ; check for C64 reverse on 12h and 253/ A1BE : 30 02 jr nc,DirPrt30 ; other non displayable codes 254/ A1C0 : 3E 20 ld a,spc ; yes, force them to space 255/ A1C2 : CD 12 00 DirPrt30: call prnt ; Display character 256/ A1C5 : 13 inc de ; next char form dir 257/ A1C6 : 18 F0 jr DirPrt20 ; continue at this line 258/ A1C8 : 259/ A1C8 : 13 DirPrt40: inc de 260/ A1C9 : 1A ld A,(de) ; check end of directory 261/ A1CA : A7 and a ; (2nd 00h means end of dir) 262/ A1CB : 20 20 jr nz,dirprt50 ; no, continue 263/ A1CD : 3A D5 A0 ld a,(prtsw) ; yes, process end of dir now 264/ A1D0 : FE 44 cp 'D' ; screen only? 265/ A1D2 : 20 06 jr nz,dirprt45 ; no, output too 266/ A1D4 : CD 06 00 dirprt43: call letnl ; set cursor to next line on screen 267/ A1D7 : C3 F5 A0 jp start ; goback 268/ A1DA : 269/ A1DA : 3E FF dirprt45: ld a,0ffh ; lc692 uses ret command and not jump 270/ A1DC : 32 D6 A0 ld (lc401),a ; to monitor for returning 271/ A1DF : CD 4C A3 call lc692 ; print/plot 272/ A1E2 : CA 7E A8 jp z,intbrk AS V1.40r8 - Quelle MZ1571.ASM - Seite 6 - 23.8.1998 0:23:26 273/ A1E5 : CD A2 A3 call lc713 ; new line char printer/plotter 274/ A1E8 : CA 7E A8 jp z,intbrk ; stop at brk condition 275/ A1EB : 18 E7 jr dirprt43 ; go endprocess 276/ A1ED : 277/ A1ED : 3A 72 11 dirprt50: ld a,(DSPXY+1) ; get row number from systemarea 278/ A1F0 : FE 18 cp 24 ; screen full? 279/ A1F2 : 20 1C jr nz,DirPrt60 ; no, do new line on screen 280/ A1F4 : 3A D5 A0 ld a,(prtsw) 281/ A1F7 : FE 44 cp 'D' ; dir to screen only? 282/ A1F9 : 28 0D jr z,dirprt55 ; yes 283/ A1FB : 3E FF ld a,0ffh ; no, force return of lc692 to me 284/ A1FD : 32 D6 A0 ld (lc401),a ; and not to monitor 285/ A200 : CD 4C A3 call lc692 ; hardcopy screen 286/ A203 : CA 7E A8 jp z,intbrk ; brk condition during hardcopy 287/ A206 : 18 A0 jr dirprt05 ; cls, next screen 288/ A208 : 289/ A208 : CD AE A4 dirprt55: call WaitKey ; yes, wait on any key 290/ A20B : CA 7E A8 jp z,intbrk ; break key stops process 291/ A20E : 18 98 jr DirPrt05 ; do next line after clear screen 292/ A210 : 293/ A210 : CD 06 00 DirPrt60: call LETNL ; set cursor to new line 294/ A213 : 18 98 jr DirPrt10 ; and continue process 295/ A215 : 296/ A215 : ; Get and display message from drive 297/ A215 : 298/ A215 : AF GetErSta: xor A 299/ A216 : 32 DB A0 LD (ST),a ; clear status byte 300/ A219 : 3A E5 A0 ld a,(GerNr) ; set device number 301/ A21C : CD F3 A4 call SentTalk ; force device to init talk 302/ A21F : 3E 6F ld a,6fh 303/ A221 : CD BF A5 call SentSAdr ; init device with parameters 304/ A224 : CD 13 A6 GetSta10: call IECIN ; get 1 character from device 305/ A227 : F5 push af ; save gotten character 306/ A228 : 3A DB A0 ld a,(ST) ; check device status 307/ A22B : A7 and a 308/ A22C : 28 0F jr z,GetSta20 ; ok, continue 309/ A22E : CD 06 00 call letnl ; CR/new line 310/ A231 : 3A DB A0 ld a,(st) 311/ A234 : FE C2 cp 0c2h ; device not present status 312/ A236 : CA 55 A8 jp z,f707 ; stop on error 313/ A239 : F1 pop af ; end, restore accu 314/ A23A : C3 F5 A0 jp start ; done 315/ A23D : 316/ A23D : F1 GetSta20: pop af ; restore gotten character 317/ A23E : CD 12 00 call PRNT ; no, print the character on screen 318/ A241 : 18 E1 jr GetSta10 ; and continue 319/ A243 : 320/ A243 : ; Load file 321/ A243 : 322/ A243 : CD 01 A3 Load: call GetNam ; input file name 323/ A246 : CA 7E A8 jp z,intbrk ; stop if break or cr 324/ A249 : DA 43 A2 jp c,load ; again on any input error 325/ A24C : AF xor a 326/ A24D : 32 DC A0 ld (LVFlag),a ; 00h=Load 327/ A250 : 3E C9 ld a,0c9h ; at first get old address to store 328/ A252 : 32 49 A7 ld (MdfCmd02),a ; so read first two bytes only 329/ A255 : CD 10 A7 call IECLOAD ; do incomplete load first 330/ A258 : CD 94 A7 call F528 ; untalk and close file 331/ A25B : CD BC A4 call ErrorChk ; check for error 332/ A25E : 3E 3A ld a,3ah ; remodify load routine AS V1.40r8 - Quelle MZ1571.ASM - Seite 7 - 23.8.1998 0:23:26 333/ A260 : 32 49 A7 ld (MdfCmd02),a ; for complete work again 334/ A263 : DA 15 A2 jp c,GetErSta ; get error msg on error 335/ A266 : 3A DB A0 ld a,(ST) ; same on incorrect device status 336/ A269 : A7 and a 337/ A26A : C2 15 A2 jp nz,GetErSta 338/ A26D : 11 1B A0 Load20: ld de,Prompt2 ; set de to address of prompt2 339/ A270 : CD 15 00 call MSG ; and print prompt2 340/ A273 : 2A E1 A0 ld hl,(EndPtr) ; get old store address to hl 341/ A276 : CD BA 03 call PRTHL ; and print old store address 342/ A279 : 11 E0 A8 ld de,BUFL ; set address of input buffer 343/ A27C : CD 03 00 call GETL ; get input line (store address) 344/ A27F : 1A ld a,(de) 345/ A280 : FE 1B cp brk2 ; break? 346/ A282 : CA 7E A8 jp z,intbrk ; yes, stop 347/ A285 : 11 EB A8 ld de,BUFL+11 ; address of input 348/ A288 : CD 10 04 call HLHEX ; translate ascii-hex to hl 349/ A28B : 38 E0 jr c,Load20 ; no hex data, once more 350/ A28D : 22 E8 A0 ld (AdrLoad),hl ; ok, save store address 351/ A290 : AF xor a 352/ A291 : 32 E4 A0 ld (secadr),a ; means load to (adrload) 353/ A294 : 18 03 jr Verify10 ; jump around verify, load 00 to accu 354/ A296 : 355/ A296 : ; verify saved file 356/ A296 : 357/ A296 : 3E 01 Verify: ld a,01h ; 01=verify 358/ A298 : 21 db 21h ; dummy instruction ld hl,3e00h 359/ A299 : 3E 00 verify10: ld a,00h ; 00=load 360/ A29B : 32 DC A0 ld (LVFlag),a ; store 361/ A29E : CD 10 A7 call IECLOAD ; load file 362/ A2A1 : CD BC A4 call ErrorChk ; check for error 363/ A2A4 : C3 15 A2 jp GetErSta ; print error/ok message 364/ A2A7 : 365/ A2A7 : ; Save file 366/ A2A7 : 367/ A2A7 : CD 01 A3 Save: call GetNam ; get data set name 368/ A2AA : CA 7E A8 jp z,intbrk ; stop on brk key 369/ A2AD : 38 F8 jr c,save ; on error again 370/ A2AF : 11 27 A0 Save10: ld de,Prompt3 371/ A2B2 : CD 15 00 call MSG ; display prompt3 372/ A2B5 : 11 E0 A8 ld de,BUFL 373/ A2B8 : CD 03 00 call GETL ; get input to bufl (start address) 374/ A2BB : 1A ld a,(de) ; check for brk 375/ A2BC : FE 1B cp brk2 376/ A2BE : CA 7E A8 jp z,intbrk ; stop 377/ A2C1 : 11 EB A8 ld de,BUFL+11 ; 1st input char 378/ A2C4 : 1A ld a,(de) 379/ A2C5 : FE 0D cp cr ; if no input again 380/ A2C7 : 28 E6 jr z,Save10 381/ A2C9 : CD 10 04 call HLHEX ; ascii to hex in hl 382/ A2CC : 38 E1 jr c,Save10 ; if not hex again 383/ A2CE : 22 E6 A0 ld (IOStrt),hl ; store in start address 384/ A2D1 : 11 33 A0 Save20: ld de,Prompt4 385/ A2D4 : CD 15 00 call MSG ; display prompt4 386/ A2D7 : 11 E0 A8 ld de,BUFL 387/ A2DA : CD 03 00 call GETL ; get input to bufl (end address) 388/ A2DD : 1A ld a,(de) 389/ A2DE : FE 1B cp brk2 ; check for brk key 390/ A2E0 : CA 7E A8 jp z,intbrk ; stop on brk 391/ A2E3 : 11 EB A8 ld de,BUFL+11 392/ A2E6 : 1A ld a,(de) ; get 1st input char AS V1.40r8 - Quelle MZ1571.ASM - Seite 8 - 23.8.1998 0:23:26 393/ A2E7 : FE 0D cp cr ; check for no input 394/ A2E9 : 28 E6 jr z,Save20 ; if cr only again 395/ A2EB : CD 10 04 call HLHEX ; ascii to hex and put it to hl 396/ A2EE : 38 E1 jr c,Save20 ; on hex-error again 397/ A2F0 : 22 E1 A0 ld (EndPtr),hl ; save end address 398/ A2F3 : 3E 02 ld a,02h 399/ A2F5 : 32 DC A0 ld (LVFlag),a ; 02 means iecstor has to save data 400/ A2F8 : CD D1 A7 call IECSTORE ; exec save on disk 401/ A2FB : CD BC A4 call ErrorChk ; test for errors 402/ A2FE : C3 15 A2 jp GetErSta ; display floppy status message 403/ A301 : 404/ A301 : ; get file or other input to fileNAME 405/ A301 : 406/ A301 : 11 3F A0 GetNam: ld de,Prompt5 ; Address of prompt5 to de 407/ A304 : CD 15 00 GetNam05: call MSG ; put prompt5 on screen 408/ A307 : 11 90 A8 ld de,fileName ; address of input area 409/ A30A : CD 03 00 call GETL ; get input from keyboard 410/ A30D : CD 06 00 call LETNL ; set cursor to new line 411/ A310 : 3A 90 A8 ld a,(filename) ; get 1st char from input 412/ A313 : FE 1B cp brk2 ; break? 413/ A315 : C8 ret z ; yes, goback 414/ A316 : 11 9B A8 ld de,filename+11 415/ A319 : 1A ld a,(de) ; get 1st char from input line 416/ A31A : FE 0D cp cr ; test for cr 417/ A31C : C8 ret z ; goback if no further input 418/ A31D : 06 01 ld b,01h ; init length of name 419/ A31F : FE 0D GetNam10: cp cr ; end of name? 420/ A321 : 28 0C jr z,GetNam20 ; yes, stop testing and counting 421/ A323 : FE 20 cp spc ; valid name must be in the range of 422/ A325 : D8 ret c ; 20h and 5fh 423/ A326 : FE 5F cp 5fh 424/ A328 : 3F ccf ; carry is set if not 425/ A329 : D8 ret c 426/ A32A : 04 inc b ; count length 427/ A32B : 13 inc de ; next byte address of name 428/ A32C : 1A ld a,(de) ; get next byte of input 429/ A32D : 18 F0 jr GetNam10 ; continue 430/ A32F : 431/ A32F : 78 GetNam20: ld a,b ; length to accu 432/ A330 : 3D dec a ; adjust to correct length in accu 433/ A331 : 32 E3 A0 ld (fileLen),a ; save length 434/ A334 : FE 11 cp 17 ; must not exceed 16 chars in length 435/ A336 : 3F ccf ; carry means wrong length 436/ A337 : 3C inc a 437/ A338 : 3D dec a 438/ A339 : C9 ret ; goback to caller 439/ A33A : 440/ A33A : ; the following code is yet sleeping, 441/ A33A : ; it's for dir cmd if basic is active. The coding is under test. 442/ A33A : ; sets pointers of basic like cmd NEW does, but dir is still stored in 443/ A33A : ; basic's program area. 444/ A33A : ; 445/ A33A : ; another code is in progress for save and load, if basic is active 446/ A33A : ; and the user wants to save or load a basic program. 447/ A33A : ; 448/ A33A : ;bas: ld hl,(6abfh) 449/ A33A : ; ld a,6bh 450/ A33A : ; cp h 451/ A33A : ; ret nz 452/ A33A : ; ld a,0cfh AS V1.40r8 - Quelle MZ1571.ASM - Seite 9 - 23.8.1998 0:23:26 453/ A33A : ; ret nz 454/ A33A : ; ld hl,(endptr) 455/ A33A : ; ld (6ab3h),hl 456/ A33A : ; call 224eh 457/ A33A : ; ret 458/ A33A : ; 459/ A33A : ;startxx: call bas 460/ A33A : ; jp getdir 461/ A33A : 462/ A33A : 463/ A33A : ; if accu=f0h (display code for space) then accu=space 464/ A33A : 465/ A33A : FE F0 lC674: CP 0F0h ; display code f0h? (space) 466/ A33C : C0 RET NZ ; no 467/ A33D : E6 20 AND 20h ; yes, put space 468/ A33F : C9 RET ; goback 469/ A340 : 470/ A340 : ; test shift-break 471/ A340 : 472/ A340 : 3E F8 lC686: LD A,0F8h ; column brk/ctrl/shift 473/ A342 : 32 00 E0 LD (lE000),A ; Port A 8255 send keyboard f8h 474/ A345 : 00 NOP ; wait 1 nop 475/ A346 : 3A 01 E0 LD A,(lE001) ; Port B 8255 receive keyboard data 476/ A349 : FE 7E CP 7Eh ; shift + brk ? 477/ A34B : C9 RET ; goback 478/ A34C : 479/ A34C : ; hardcopy entry 480/ A34C : 481/ A34C : C5 lc692: push bc ; save caller's regs 482/ A34D : D5 push de 483/ A34E : E5 push hl 484/ A34F : ED 73 D7 A0 ld (stackptr),sp ; 485/ A353 : 21 00 D0 LD HL,screen ; address to screen area 486/ A356 : E5 PUSH HL ; save for futher use 487/ A357 : E1 lC6C4: POP HL ; addr. of current row in screen 488/ A358 : E5 PUSH HL ; back for further use 489/ A359 : 06 28 LD B,40 ; init loop counter (40 columns/row) 490/ A35B : 16 00 LD D,00h 491/ A35D : 58 LD E,B ; DE is displacement to next row 492/ A35E : 19 ADD HL,DE ; HL is address to next row on screen 493/ A35F : 3E D4 LD A,0D4h ; check for last row (starts at 494/ A361 : BC CP H ; address d410h) 495/ A362 : 20 08 JR NZ,lC6D6 ; not last 496/ A364 : 3E 10 LD A,10h 497/ A366 : BD CP L 498/ A367 : 20 03 JR nZ,lC6d6 ; not last 499/ A369 : A7 and a ; accu is 10h, 'and a' sets NZ=no brk 500/ A36A : 18 56 JR lC72Cn ; goback 501/ A36C : 502/ A36C : D1 lC6D6: POP DE ; exchange entries on stack 503/ A36D : E5 PUSH HL ; contains address of next row 504/ A36E : D5 PUSH DE ; contains address of current row 505/ A36F : 2B lC6D9: DEC HL ; skip backwards subsequent spaces 506/ A370 : 7E LD A,(HL) ; get char 507/ A371 : B7 OR A ; space? 508/ A372 : 20 05 JR NZ,lC6E3 ; no, start outputting, notice, 509/ A374 : ; b-reg contains # of char to output 510/ A374 : 10 F9 DJNZ lC6D9 ; yes,skip space 511/ A376 : E1 POP HL ; full space line rebuild stack 512/ A377 : 18 DE JR lC6C4 ; process next row AS V1.40r8 - Quelle MZ1571.ASM - Seite 10 - 23.8.1998 0:23:26 513/ A379 : 514/ A379 : E1 lC6E3: POP HL ; curr. column address in curr. row 515/ A37A : CB DC lc6e7: SET 3,H ; address to screen color 516/ A37C : 3E 17 LD A,17h ; color of char blue, backgrd. white 517/ A37E : 77 LD (HL),A ; set to invert value 518/ A37F : CB 9C RES 3,H ; address back to the char. screen 519/ A381 : 7E LD A,(HL) ; get char to output 520/ A382 : CD 35 A4 CALL lC78E ; convert displ. code to ascii 521/ A385 : B7 OR A ; 00h? 522/ A386 : 20 02 JR NZ,lC6FC ; no 523/ A388 : F6 20 OR 20h ; yes, force space on output 524/ A38A : CD 05 A4 lC6FC: CALL lC75B ; output 1 char 525/ A38D : CA BC A3 jp z,lc72c ; brk condition occured 526/ A390 : CB DC SET 3,H ; address to screen color 527/ A392 : 3E 71 LD A,71h ; color of char white, backgrd. blue 528/ A394 : 77 LD (HL),A ; reset to normal value 529/ A395 : CB 9C RES 3,H ; address back to the char. screen 530/ A397 : 23 INC HL ; next char 531/ A398 : 10 E0 DJNZ lC6E7 ; loop if length(contents of row)>0 532/ A39A : CD A2 A3 call lc713 ; set pen to next line 533/ A39D : CA C2 A3 jp z,lc72cn ; brk condition occured 534/ A3A0 : 18 B5 JR lC6C4 ; loop for next row 535/ A3A2 : 536/ A3A2 : ; skip to new line (for both, printer/plotter) 537/ A3A2 : 538/ A3A2 : 3A D5 A0 lc713: ld a,(prtsw) ; 539/ A3A5 : FE 50 cp 'P' ; plotter? 540/ A3A7 : 3E 0D ld a,cr ; cr for plotter 541/ A3A9 : 28 02 jr z,lc715 ; yes, do cr 542/ A3AB : 3E 0A ld a,lf ; no, lf for printer 543/ A3AD : CD 05 A4 lc715: call lc75b ; output cr or lf 544/ A3B0 : C9 ret 545/ A3B1 : 546/ A3B1 : ; goes back to monitor, if brk key used and started from monitor 547/ A3B1 : ; else returns if brk key used and called by program 548/ A3B1 : CD 40 A3 lC719: CALL lC686 ; test brk key 549/ A3B4 : C0 RET NZ ; no, continue 550/ A3B5 : CD 40 A3 lC71D: CALL lC686 ; test again and 551/ A3B8 : 28 FB JR Z,lC71D ; wait until unpressed 552/ A3BA : AF xor a ; zero flag indicates break 553/ A3BB : C9 ret 554/ A3BC : 555/ A3BC : CB DC lc72c: SET 3,H ; address to screen color 556/ A3BE : 3E 71 LD A,71h ; color of char white, backgrd. blue 557/ A3C0 : 77 LD (HL),A ; reset to normal value, may be inv. 558/ A3C1 : AF xor a ; set zflag (brk condition) 559/ A3C2 : F5 lC72Cn: push af ; save zero flag (z=brk, nz=no brk) 560/ A3C3 : 3A D6 A0 LD A,(lC401) ; 0 means jumped into program by mon. 561/ A3C6 : A7 AND A ; >0 means called by any program 562/ A3C7 : CA 8A A8 JP z,intrpt ; goback to monitor 563/ A3CA : AF XOR A ; prepare next execution parameters 564/ A3CB : 32 D6 A0 LD (lC401),A 565/ A3CE : F1 pop af ; notice zflag to caller 566/ A3CF : ED 7B D7 A0 ld sp,(stackptr) 567/ A3D3 : E1 pop hl ; restore caller's reg's 568/ A3D4 : D1 POP DE 569/ A3D5 : C1 POP BC 570/ A3D6 : C9 ret ; goback to caller 571/ A3D7 : 572/ A3D7 : ; plot 1 character AS V1.40r8 - Quelle MZ1571.ASM - Seite 11 - 23.8.1998 0:23:26 573/ A3D7 : 574/ A3D7 : C5 lC73B: PUSH BC ; save callers reg 575/ A3D8 : 0E 00 LD C,00h ; 00h=ready 576/ A3DA : 47 LD B,A ; save 577/ A3DB : CD F5 A3 CALL lC753 ; wait on ready 578/ A3DE : 28 13 jr z,lc738bn ; stop on brk 579/ A3E0 : 78 LD A,B ; restore char to plot 580/ A3E1 : D3 FF OUT (0FFh),A ; data to plotter 581/ A3E3 : 3E 80 LD A,80h ; RDP (strobe) high 582/ A3E5 : D3 FE OUT (0FEh),A ; to plotter 583/ A3E7 : 0E 01 LD C,01h ; RDA test 584/ A3E9 : CD F5 A3 CALL lC753 ; wait (ack) 585/ A3EC : 28 05 jr z,lc738bn ; stop on brk 586/ A3EE : AF XOR A 587/ A3EF : D3 FE OUT (0FEh),A ; RDP low 588/ A3F1 : 2F cpl 589/ A3F2 : A7 and a ; NZ=no brk 590/ A3F3 : C1 lc738bn: POP BC ; restore callers reg 591/ A3F4 : C9 RET ; goback to caller 592/ A3F5 : 593/ A3F5 : DB FE lC753: IN A,(0FEh) 594/ A3F7 : E6 0D AND 00Dh ; RDA only 595/ A3F9 : B9 CP C ; test busy 596/ A3FA : 20 03 jr nZ,lc753n ; not busy 597/ A3FC : 2F lc753v: cpl ; ffh/feh 598/ A3FD : A7 and a ; indicate no break (NZ) 599/ A3FE : C9 ret 600/ A3FF : 601/ A3FF : CD B1 A3 lc753n: call lc719 ; test break key 602/ A402 : 20 F1 JR nz,lC753 ; wait on ready 603/ A404 : C9 ret ; zflag=brk condition 604/ A405 : 605/ A405 : ; outputs 1 character to plotter if (lc3fc) = "P" 606/ A405 : ; else to printer 607/ A405 : 608/ A405 : 4F lC75B: LD C,A ; save char to output 609/ A406 : 3A D5 A0 LD A,(prtsw) ; get user's input char 610/ A409 : FE 50 CP 'P' ; "P"? 611/ A40B : 79 LD A,C ; get back char to output 612/ A40C : 28 C9 JR Z,lC73B ; yes, go plot 1 char 613/ A40E : DB FE lC764: IN A,(0FEh) ; get state of printer 614/ A410 : CB 47 BIT 0,A ; busy? 615/ A412 : 28 06 JR Z,lC772 ; no, continue 616/ A414 : CD B1 A3 CALL lC719 ; yes, busy, brk key? 617/ A417 : 20 F5 JR NZ,lC764 ; no. Wait on ready 618/ A419 : C9 Ret ; goback with brk condition 619/ A41A : 620/ A41A : ; print 1 char 621/ A41A : 622/ A41A : 79 lC772: LD A,C ; get back char to print 623/ A41B : D3 FF OUT (0FFh),A ; data out 624/ A41D : DB FE IN A,(0FEh) ; get state of printer 625/ A41F : E6 7F AND 7Fh ; set strobe 626/ A421 : D3 FE OUT (0FEh),A ; put strobe 627/ A423 : DB FE IN A,(0FEh) ; get state again 628/ A425 : F6 80 OR 80h ; reset strobe 629/ A427 : D3 FE OUT (0FEh),A ; put out 630/ A429 : DB FE lC781: IN A,(0FEh) ; get state 631/ A42B : CB 47 BIT 0,A ; test busy 632/ A42D : 28 CD jr Z,lc753v ; not busy, goback to caller AS V1.40r8 - Quelle MZ1571.ASM - Seite 12 - 23.8.1998 0:23:26 633/ A42F : CD B1 A3 CALL lC719 ; brk key? 634/ A432 : 20 F5 JR NZ,lC781 ; no, wait on ready (printed) 635/ A434 : C9 Ret ; yes, goback, brk 636/ A435 : 637/ A435 : ; display to ascii for printer or plotter 638/ A435 : 639/ A435 : F5 lC78E: PUSH AF ; save char to output 640/ A436 : 3A D5 A0 LD A,(prtsw) ; users input char 641/ A439 : FE 50 CP 'P' ; "P" (plotter)? 642/ A43B : 20 10 JR NZ,lC79D ; no, printer 643/ A43D : F1 POP AF ; char to plot 644/ A43E : CD 44 A4 CALL lC66B ; display to ascii (plotter) 645/ A441 : C3 3A A3 JP lC674 646/ A444 : 647/ A444 : ; display to ascii conversion for plotter 648/ A444 : ; returns from monitor to caller 649/ A444 : 650/ A444 : C5 lc66b: PUSH BC ; save own regs 651/ A445 : E5 PUSH HL 652/ A446 : D5 PUSH DE 653/ A447 : 21 36 A9 LD HL,lC402 ; my translation table for plotter 654/ A44A : C3 D4 0B JP dacn10 ; use monitor's conversion routine 655/ A44D : 656/ A44D : 657/ A44D : F1 lC79D: POP AF 658/ A44E : CD 54 A4 CALL lC7A4 ; display to ascii conversion 659/ A451 : C3 3A A3 JP lC674 ; if 0f0h conv. to spc, then goback 660/ A454 : 661/ A454 : ; diplay to ascii conversion for printer 662/ A454 : 663/ A454 : C5 lC7A4: PUSH BC ; save callers reg 664/ A455 : E5 PUSH HL 665/ A456 : D5 PUSH DE 666/ A457 : 21 36 AA LD HL,lC508 ; table display to ascii (printer) 667/ A45A : 4F LD C,A 668/ A45B : 06 00 LD B,00h ; bc is displacement into table 669/ A45D : 09 ADD HL,BC ; address to char 670/ A45E : 7E LD A,(HL) ; get translation char 671/ A45F : FE F0 CP 0F0h ; display code for space? 672/ A461 : 20 02 JR NZ,lC7B5 ; no, continue 673/ A463 : E6 20 AND 20h ; yes, translate to 20h 674/ A465 : D1 lC7B5: POP DE ; restore callers regs 675/ A466 : E1 POP HL 676/ A467 : C1 POP BC 677/ A468 : C9 RET ; goback to caller 678/ A469 : 679/ A469 : ; compute contents of HL to decimal and print up to 5 680/ A469 : ; chars without preceding nulls 681/ A469 : 682/ A469 : D5 HLtoASC: push de ; save callers reg 683/ A46A : 01 F0 A0 ld bc,ascwork ; workarea for me 684/ A46D : 11 10 27 ld de,10000 ; 10 exp 4 685/ A470 : CD A0 A4 call hltoa30 ; 5th power of 10 686/ A473 : 11 E8 03 ld de,1000 ; 10 exp 3 687/ A476 : CD A0 A4 call hltoa30 ; 4th power of 10 688/ A479 : 11 64 00 ld de,100 ; 10 exp 2 689/ A47C : CD A0 A4 call hltoa30 ; 3rd power of 10 690/ A47F : 11 0A 00 ld de,10 ; 10 exp 1 691/ A482 : CD A0 A4 call hltoa30 ; 2nd power of 10 692/ A485 : 7D ld a,l ; AS V1.40r8 - Quelle MZ1571.ASM - Seite 13 - 23.8.1998 0:23:26 693/ A486 : F6 30 or '0' ; comp to decimal 694/ A488 : 02 ld (bc),a ; 10 exp 0 695/ A489 : 11 F0 A0 ld de,ascwork 696/ A48C : 06 04 ld b,04h ; max. 4 preceding nulls to skip of 5 697/ A48E : 1A hltoa10: ld a,(de) ; get printable dec. number 698/ A48F : FE 30 cp '0' ; check for dec. 0 699/ A491 : 20 03 jr nz,hltoa20 ; no, go to print remaining numbers 700/ A493 : 13 inc de 701/ A494 : 10 F8 djnz hltoa10 ; yes, skip preceding 0 702/ A496 : 04 hltoa20: inc b ; adjust b 703/ A497 : 1A hltoa25: ld a,(de) ; get number (0-9) 704/ A498 : CD 12 00 call prnt ; print/plot number 705/ A49B : 13 inc de 706/ A49C : 10 F9 djnz hltoa25 ; do next number 707/ A49E : D1 pop de ; end, restore callers reg 708/ A49F : C9 ret ; goback to caller 709/ A4A0 : 710/ A4A0 : 3E FF hltoa30: ld a,0ffh ; init counter to ffh+1=00 711/ A4A2 : 3C hltoa35: inc a ; count up 712/ A4A3 : B7 or a ; clear carry 713/ A4A4 : ED 52 sbc hl,de ; subtract until negative value 714/ A4A6 : 30 FA jr nc,hltoa35 ; value is positive 715/ A4A8 : 19 add hl,de ; make positive 716/ A4A9 : F6 30 or '0' ; make ascii 717/ A4AB : 02 ld (bc),a ; store to workarea 718/ A4AC : 03 inc bc ; next free address in workarea 719/ A4AD : C9 ret ; goback to caller 720/ A4AE : 721/ A4AE : ; wait on any key 722/ A4AE : 723/ A4AE : C5 WaitKey: push bc ; save callers reg 724/ A4AF : CD 50 0A waitK010: call SWEP ; keyboard swep 725/ A4B2 : 78 ld a,b ; any key? 726/ A4B3 : E6 BF and 0bfh ; turn off d6=shift, brk only 727/ A4B5 : 28 F8 jr z,waitk010 ; no, wait 728/ A4B7 : 78 ld a,b 729/ A4B8 : C1 pop bc ; yes, ok, restore callers reg 730/ A4B9 : FE 88 cp 88h ; test brk key+shift 731/ A4BB : C9 ret ; done 732/ A4BC : 733/ A4BC : 734/ A4BC : ; ErrorChk: analyse errors and print dependent error message 735/ A4BC : ; 736/ A4BC : ; program logic: 737/ A4BC : ; save af (contents of accu and carry flag) 738/ A4BC : ; call errchk40 (prints err.msg load-/save-/verify-error first if any) 739/ A4BC : ; restore af (contents of accu and carry on entry) 740/ A4BC : ; if carry 741/ A4BC : ; if a=0 (accu on entry) 742/ A4BC : ; print "Break" 743/ A4BC : ; endif 744/ A4BC : ; endif 745/ A4BC : ; 746/ A4BC : ; 747/ A4BC : F5 ErrorChk: push af ; save carry flag 748/ A4BD : CD CF A4 call Errchk40 ; if carry output msg on error 749/ A4C0 : F1 errchk20: pop af ; get back contents of accu and carry 750/ A4C1 : D0 ret nc ; goback, done (no break) 751/ A4C2 : A7 and a 752/ A4C3 : C0 ret nz ; goback, if brk (accu=1bh) AS V1.40r8 - Quelle MZ1571.ASM - Seite 14 - 23.8.1998 0:23:26 753/ A4C4 : 11 5E A0 ld de,break ; address to msg 754/ A4C7 : CD 15 00 errchk30: call msg ; print msg 755/ A4CA : CD 06 00 call letnl 756/ A4CD : 37 scf ; set carry (brk info) 757/ A4CE : C9 ret ; goback 758/ A4CF : 759/ A4CF : ; ErrChk40: print load/save/verify error msg 760/ A4CF : ; program logic: 761/ A4CF : ; if no carry 762/ A4CF : ; turn off eof bit6 of st (set at time of eof, not at time of brk) 763/ A4CF : ; if accu=0 764/ A4CF : ; return 765/ A4CF : ; endif 766/ A4CF : ; endif 767/ A4CF : ; if lvflag=01h 768/ A4CF : ; print "Verifying error" 769/ A4CF : ; else if lvflag=02h 770/ A4CF : ; print "Save error" 771/ A4CF : ; else print "Load error" (lvflag=00h) 772/ A4CF : ; endif 773/ A4CF : ; endif 774/ A4CF : ; 775/ A4CF : ; 776/ A4CF : 38 06 errchk40: jr c,errchk50 ; no eof 777/ A4D1 : 3A DB A0 ld a,(ST) 778/ A4D4 : E6 BF and 0bfh ; turn off eof bit 779/ A4D6 : C8 ret z ; if eof bit only goback 780/ A4D7 : 3A DC A0 errchk50: ld a,(LVFlag) ; get flag 781/ A4DA : FE 01 cp 01h ; verify error? 782/ A4DC : 20 07 jr nz,errchk60 ; no 783/ A4DE : 11 64 A0 ld de,veriferr ; yes, address to verify error msg 784/ A4E1 : CD C7 A4 errchk55: call errchk30 ; print error msg 785/ A4E4 : C9 ret ; goback to caller 786/ A4E5 : 787/ A4E5 : FE 02 errchk60: cp 02h ; save error? 788/ A4E7 : 20 05 jr nz,errchk70 ; no 789/ A4E9 : 11 74 A0 ld de,saveerr ; address to save error msg 790/ A4EC : 18 F3 jr errchk55 ; go to print 791/ A4EE : 792/ A4EE : 11 7F A0 errchk70: ld de,loaderr ; address to load error msg 793/ A4F1 : 18 EE jr errchk55 ; go to print 794/ A4F3 : 795/ A4F3 : 796/ A4F3 : ; send Talk/Listen to floppy 797/ A4F3 : 798/ A4F3 : ed09: 799/ A4F3 : Talk: 800/ A4F3 : F6 40 sentTalk: or 40h ; set talker bit 801/ A4F5 : 18 02 jr ed11 802/ A4F7 : 803/ A4F7 : F6 20 Listen: or 20h ; set listener bit 804/ A4F9 : F5 ed11: push af ; save for further process 805/ A4FA : 3A DD A0 ld a,(iecflag) ; 806/ A4FD : CB 7F bit 7,a ; outputting end? (counter=0?) 807/ A4FF : 28 1B jr z,ed20 ; yes 808/ A501 : 37 scf 809/ A502 : 3A DF A0 ld a,(sta) 810/ A505 : 1F rra 811/ A506 : 32 DF A0 ld (sta),a 812/ A509 : CD 3C A5 call ed40 ; put byte on iec bus AS V1.40r8 - Quelle MZ1571.ASM - Seite 15 - 23.8.1998 0:23:26 813/ A50C : 3A DD A0 ld a,(iecflag) 814/ A50F : CB 3F srl a ; turns off bit 7 815/ A511 : 32 DD A0 ld (iecflag),a 816/ A514 : 3A DF A0 ld a,(sta) 817/ A517 : CB 3F srl a ; turns off bit 7 818/ A519 : 32 DF A0 ld (sta),a 819/ A51C : F1 ed20: pop af ; byte to put on iec bus 820/ A51D : 32 DE A0 ld (iecbuf),a ; put command to iec buffer 821/ A520 : CD 95 A6 call ee97 ; set data high 822/ A523 : 3A 08 E0 ld a,(le008) ; port LS367 823/ A526 : CB 5F bit 3,a ; data low? 824/ A528 : CC 83 A6 call z,ee85 ; yes, set clk high 825/ A52B : 3A 00 E0 ld a,(le000) ; 8255-port A 826/ A52E : F6 10 or 10h 827/ A530 : 32 00 E0 ld (le000),a ; set atn low (8255-port A) 828/ A533 : CD 8C A6 ed36: call ee8e ; set clk low (atn=clk=lo=listen) 829/ A536 : CD 95 A6 call ee97 ; set data high 830/ A539 : CD B6 A6 call eeb3 ; wait 1ms 831/ A53C : CD 95 A6 ed40: call ee97 ; set data high 832/ A53F : CD A7 A6 call eea9 ; get state of data line 833/ A542 : DA A5 A5 jp c,edad ; error, data is high (no dev. pres.) 834/ A545 : CD 83 A6 call ee85 ; data line low, set clk high 835/ A548 : 3A DF A0 ld a,(sta) 836/ A54B : CB 7F bit 7,a ; floppy status 837/ A54D : 28 0A jr z,ed5a 838/ A54F : CD A7 A6 ed50: call eea9 ; get state of data 839/ A552 : 30 FB jr nc,ed50 ; wait for data high 840/ A554 : CD A7 A6 ed55: call eea9 ; get state of data line 841/ A557 : 38 FB jr c,ed55 ; wait for data low 842/ A559 : CD A7 A6 ed5a: call eea9 ; get state of data 843/ A55C : 30 FB jr nc,ed5a ; wait for data high 844/ A55E : CD 8C A6 call ee8e ; set clk low 845/ A561 : 3E 08 ld a,08h 846/ A563 : 32 E0 A0 ld (bitcnt),a ; 8 bits 847/ A566 : 3A 08 E0 ed66: ld a,(le008) ; port LS367 848/ A569 : 47 ld b,a 849/ A56A : 3A 08 E0 ld a,(le008) ; port LS367 850/ A56D : B8 cp b 851/ A56E : 20 F6 jr nz,ed66 ; wait for stable state of iec bus 852/ A570 : CB 5F bit 3,a 853/ A572 : 28 34 jr z,edb0 ; if data low, error (timeout) 854/ A574 : 3A DE A0 ld a,(iecbuf) 855/ A577 : 1F rra 856/ A578 : 32 DE A0 ld (iecbuf),a 857/ A57B : 38 05 jr c,dath ; buffer bit is on 858/ A57D : CD 9E A6 call eea0 ; buffer bit is off, set data low 859/ A580 : 18 03 jr clkh 860/ A582 : 861/ A582 : CD 95 A6 dath: call ee97 ; set data high 862/ A585 : CD 83 A6 clkh: call ee85 ; set clk hi (data bit ready) 863/ A588 : CD 8C A6 call ee8e ; set clk low 864/ A58B : CD 95 A6 call ee97 ; set data high 865/ A58E : 00 nop ; wait 4 nop's 866/ A58F : 00 nop 867/ A590 : 00 nop 868/ A591 : 00 nop 869/ A592 : 21 E0 A0 ld hl,bitcnt 870/ A595 : 35 dec (hl) ; bit count - 1 871/ A596 : 20 CE jr nz,ed66 ; if not 8 bits sent process again 872/ A598 : 16 FB ld d,0fbh ; timer AS V1.40r8 - Quelle MZ1571.ASM - Seite 16 - 23.8.1998 0:23:26 873/ A59A : CD A7 A6 ed9f: call eea9 ; get state of data line 874/ A59D : CB 5F bit 3,a 875/ A59F : C8 ret z ; if data low, goback 876/ A5A0 : 15 dec d ; timer - 1 877/ A5A1 : 20 F7 jr nz,ed9f 878/ A5A3 : 18 03 jr edb0 ; error, time out, no ack 879/ A5A5 : 880/ A5A5 : ; set state to 80h/03h 881/ A5A5 : 882/ A5A5 : 3E 80 edad: ld a,80h ; status device not present 883/ A5A7 : 21 db 21h ; dummy instruction ld hl,3e03h 884/ A5A8 : 3E 03 edb0: ld a,03h ; status time out 885/ A5AA : CD 75 A8 edb2: call fe1c ; set status 886/ A5AD : A7 and a ; set/reset flags 887/ A5AE : 18 55 jr ee03 ; jump in unlisten 888/ A5B0 : 889/ A5B0 : ; send sec.address just behind sent of listen 890/ A5B0 : 891/ A5B0 : 32 DE A0 edb9: ld (iecbuf),a ; store sec.address 892/ A5B3 : CD 33 A5 call ed36 ; put it on iec bus 893/ A5B6 : 3A 00 E0 edbe: ld a,(le000) ; 8255-port A 894/ A5B9 : E6 EF and 0efh 895/ A5BB : 32 00 E0 ld (le000),a ; set atn high 896/ A5BE : C9 ret ; goback 897/ A5BF : 898/ A5BF : ; send sec.address just behind sent of talk 899/ A5BF : 900/ A5BF : edc7: 901/ A5BF : 32 DE A0 sentsadr: ld (iecbuf),a ; store sec.address 902/ A5C2 : CD 33 A5 call ed36 ; put it on iec bus 903/ A5C5 : CD 9E A6 call eea0 ; set data low 904/ A5C8 : CD B6 A5 call edbe ; set atn high 905/ A5CB : CD 83 A6 call ee85 ; set clk high 906/ A5CE : CD A7 A6 edd6: call eea9 ; get state of clk 907/ A5D1 : CB 4F bit 1,a ; test state of clk 908/ A5D3 : 28 F9 jr z,edd6 ; wait on clk high 909/ A5D5 : C9 ret ; goback 910/ A5D6 : 911/ A5D6 : ; IECOUT put 1 char on iec bus 912/ A5D6 : 913/ A5D6 : F5 eddd: push af ; save char to put on iec bus 914/ A5D7 : 3A DD A0 ld a,(iecflag) ; 915/ A5DA : CB 7F bit 7,a 916/ A5DC : 20 09 jr nz,ede6 917/ A5DE : 37 scf 918/ A5DF : ; ld a,(iecflag) 919/ A5DF : 1F rra 920/ A5E0 : 32 DD A0 ld (iecflag),a 921/ A5E3 : CB 7F bit 7,a 922/ A5E5 : 20 05 jr nz,edeb 923/ A5E7 : F1 ede6: pop af ; get callers reg 924/ A5E8 : F5 push af ; save 925/ A5E9 : CD 3C A5 call ed40 ; put byte out 926/ A5EC : F1 edeb: pop af ; restore char to output to bus 927/ A5ED : 32 DE A0 ld (iecbuf),a ; store in iec buffer 928/ A5F0 : A7 and a ; reset carry 929/ A5F1 : C9 ret ; goback 930/ A5F2 : 931/ A5F2 : ; send untalk 932/ A5F2 : AS V1.40r8 - Quelle MZ1571.ASM - Seite 17 - 23.8.1998 0:23:26 933/ A5F2 : CD 8C A6 edef: call ee8e ; set clk low 934/ A5F5 : 3A 00 E0 ld a,(le000) ; 8255-port A 935/ A5F8 : F6 10 or 10h 936/ A5FA : 32 00 E0 ld (le000),a ; set atn low 937/ A5FD : 3E 5F ld a,5fh ; command untalk 938/ A5FF : 21 db 21h ; dummy instr. ld hl,3e3fh 939/ A600 : 3E 3F unlisten: ld a,3fh ; command unlisten 940/ A602 : CD F9 A4 call ed11 ; put it on iec bus 941/ A605 : CD B6 A5 ee03: call edbe ; set atn high 942/ A608 : 06 0A ee06: ld b,0ah 943/ A60A : 05 ee09: dec b 944/ A60B : 20 FD jr nz,ee09 ; wait 40µs 945/ A60D : CD 83 A6 call ee85 ; set clk high 946/ A610 : C3 95 A6 jp ee97 ; set data high 947/ A613 : 948/ A613 : ; IECIN get 1 char from iec bus 949/ A613 : 950/ A613 : ee13: 951/ A613 : AF iecin: xor a 952/ A614 : 32 E0 A0 ld (bitcnt),a ; init bit counter 953/ A617 : CD 83 A6 call ee85 ; set clk high 954/ A61A : CD A7 A6 ee1b: call eea9 ; get state of clk 955/ A61D : CB 4F bit 1,a 956/ A61F : 28 F9 jr z,ee1b ; wait on clk high 957/ A621 : CD 95 A6 ee20: call ee97 ; set data high 958/ A624 : 16 FF ld d,0ffh ; init timer 959/ A626 : CD A7 A6 ee37: call EEA9 ; get clk bit from carry flag 960/ A629 : CB 4F bit 1,a ; test clk bit 961/ A62B : 28 1F jr z,ee56 ; wait on clk lo (then valid databit) 962/ A62D : 15 dec d ; timer - 1 963/ A62E : 20 F6 jr nz,ee37 ; loop 964/ A630 : 3A E0 A0 ld a,(bitcnt) ; get bit counter 965/ A633 : A7 and a ; test for zero 966/ A634 : 28 05 jr z,ee47 ; no bits received, force eof (?) 967/ A636 : 3E 02 ld a,02h ; timeout 968/ A638 : C3 AA A5 jp edb2 ; set status 969/ A63B : 970/ A63B : CD 9E A6 ee47: call eea0 ; set data low 971/ A63E : CD 83 A6 call ee85 ; set clk hi 972/ A641 : 3E 40 ld a,40h ; set state to eof 973/ A643 : CD 75 A8 call fe1c ; do it 974/ A646 : 21 E0 A0 ld hl,bitcnt ; when shall this condition occur??? 975/ A649 : 34 inc (hl) ; increment bit counter 976/ A64A : 20 D5 jr nz,ee20 ; wait until bit counter equals zero 977/ A64C : ; test for programmed loop or bug (no inc to bitcnt in this address range) 978/ A64C : 3E 08 ee56: ld a,08h 979/ A64E : 32 E0 A0 ld (bitcnt),a ; set bit count 980/ A651 : CD A7 A6 ee5a: call eea9 ; get state of clk 981/ A654 : CB 4F bit 1,a 982/ A656 : 28 F9 jr z,ee5a ; wait on clk high 983/ A658 : E6 08 and 08h ; 1st valid bit arrives, isolate data 984/ A65A : 28 01 jr z,ee65 ; data bit is zero, carry=0 985/ A65C : 37 scf ; data bit is one, carry=1 986/ A65D : 987/ A65D : ; test, no usage? 988/ A65D : 3A EE A0 ee65: ld a,(zwispei) ; 989/ A660 : 1F rra 990/ A661 : 32 EE A0 ld (zwispei),a 991/ A664 : CD A7 A6 ee67: call eea9 ; get state of clk 992/ A667 : CB 4F bit 1,a AS V1.40r8 - Quelle MZ1571.ASM - Seite 18 - 23.8.1998 0:23:26 993/ A669 : 20 F9 jr nz,ee67 ; wait on clk low 994/ A66B : 21 E0 A0 ld hl,bitcnt 995/ A66E : 35 dec (hl) ; bit count - 1 996/ A66F : 20 E0 jr nz,ee5a ; loop until 8 bits received 997/ A671 : CD 9E A6 call eea0 ; byte complete, set data low 998/ A674 : 3A DB A0 ld a,(st) 999/ A677 : CB 77 bit 6,a ; eof? 1000/ A679 : 28 03 jr z,ee80 ; yes, dont wait and... 1001/ A67B : CD 08 A6 call ee06 ; wait 40µs then set clk and data hi 1002/ A67E : 3A EE A0 ee80: ld a,(zwispei) ; ???? 1003/ A681 : A7 and a ; reset carry 1004/ A682 : C9 ret ; goback 1005/ A683 : 1006/ A683 : ; set clk line high 1007/ A683 : 1008/ A683 : ee85: 1009/ A683 : 3A 00 E0 clkhi: ld a,(le000) ; 8255-port A 1010/ A686 : E6 DF and 0dfh ; turn off bit 5 (clk high) 1011/ A688 : 32 00 E0 ld (le000),a 1012/ A68B : C9 ret ; goback 1013/ A68C : 1014/ A68C : ; set clk line low 1015/ A68C : 1016/ A68C : ee8e: 1017/ A68C : 3A 00 E0 clklo: ld a,(le000) ; 8255-port A 1018/ A68F : F6 20 or 20h ; set bit 5 (clk low) 1019/ A691 : 32 00 E0 ld (le000),a 1020/ A694 : C9 ret ; goback 1021/ A695 : 1022/ A695 : ; set data high 1023/ A695 : 1024/ A695 : ee97: 1025/ A695 : 3A 00 E0 datahi: ld a,(le000) ; 8255-port A 1026/ A698 : E6 BF and 0bfh ; turn off bit 6 (data high) 1027/ A69A : 32 00 E0 ld (le000),a 1028/ A69D : C9 ret ; goback 1029/ A69E : 1030/ A69E : ; set data low 1031/ A69E : 1032/ A69E : eea0: 1033/ A69E : 3A 00 E0 datalo: ld a,(le000) ; 8255-port A 1034/ A6A1 : F6 40 or 40h ; set bit 6 (data low) 1035/ A6A3 : 32 00 E0 ld (le000),a 1036/ A6A6 : C9 ret ; goback 1037/ A6A7 : 1038/ A6A7 : ; get state of all input lines and move bit of data to carry flag 1039/ A6A7 : 1040/ A6A7 : eea9: 1041/ A6A7 : 3A 08 E0 getbit: ld a,(le008) ; Port LS367 1042/ A6AA : 47 ld b,a 1043/ A6AB : 3A 08 E0 ld a,(le008) 1044/ A6AE : B8 cp b 1045/ A6AF : 20 F6 jr nz,eea9 ; wait for stable iec bus 1046/ A6B1 : CB 5F bit 3,a ; test bit 3 1047/ A6B3 : C8 ret z ; bit3=0, carry=0 1048/ A6B4 : 37 scf ; bit3=1, carry=1 1049/ A6B5 : C9 ret ; goback 1050/ A6B6 : 1051/ A6B6 : ; wait for 1ms 1052/ A6B6 : AS V1.40r8 - Quelle MZ1571.ASM - Seite 19 - 23.8.1998 0:23:26 1053/ A6B6 : eeb3: 1054/ A6B6 : 06 FF wait1ms: ld b,0ffh ; init loop counter 1055/ A6B8 : 05 eeb6: dec b ; b=b-1 1056/ A6B9 : C2 B8 A6 jp nz,eeb6 ; loop until b=0 1057/ A6BC : C9 ret ; goback 1058/ A6BD : 1059/ A6BD : 1060/ A6BD : ; IECOPEN 1061/ A6BD : 1062/ A6BD : f3d5: 1063/ A6BD : 3A E4 A0 IECOPEN: ld a,(secadr) 1064/ A6C0 : CB 7F bit 7,a ; secondary address? 1065/ A6C2 : 28 02 jr z,f3d9 ; yes, continue open 1066/ A6C4 : A7 and a ; no, primary address 1067/ A6C5 : C9 ret ; goback 1068/ A6C6 : 1069/ A6C6 : 3A E3 A0 f3d9: ld a,(filelen) ; test length of file name 1070/ A6C9 : A7 and A 1071/ A6CA : C8 RET Z ; if no filename goback 1072/ A6CB : AF XOR A 1073/ A6CC : 32 DB A0 LD (ST),a ; clear state 1074/ A6CF : 3A E5 A0 ld a,(gernr) ; get unit address (mormally 1075/ A6D2 : CD F7 A4 call listen ; send listen to this unit 1076/ A6D5 : 3A E4 A0 ld a,(secadr) 1077/ A6D8 : F6 F0 or 0f0h ; set open bits on 1078/ A6DA : CD B0 A5 call edb9 ; send open cmd with sec. address 1079/ A6DD : 3A DB A0 ld a,(ST) ; 1080/ A6E0 : CB 7F bit 7,a ; device ok? 1081/ A6E2 : 28 03 jr z,f3f6 ; yes 1082/ A6E4 : C3 55 A8 jp f707 ; no, error 1083/ A6E7 : 1084/ A6E7 : 3A E3 A0 f3f6: ld a,(filelen) ; test length of file name 1085/ A6EA : A7 and a 1086/ A6EB : CA 37 A8 jp z,f654 ; jump to unlisten 1087/ A6EE : 0E 00 ld c,00h ; init loop count 1088/ A6F0 : 21 9B A8 ld hl,filename+11 ; set hl to 1st char of file name 1089/ A6F3 : 79 iecope30: ld a,c 1090/ A6F4 : 32 EC A0 ld (asave),a ; save loop count 1091/ A6F7 : 22 ED A0 ld (hlsave),hl ; save current addr. of file name 1092/ A6FA : 7E ld a,(hl) ; get current char of file name 1093/ A6FB : CD D6 A5 call eddd ; IECOUT 1 char put on iec bus 1094/ A6FE : 3A EC A0 ld a,(asave) 1095/ A701 : 4F ld c,a ; restore c with loop count 1096/ A702 : 2A ED A0 ld hl,(hlsave) ; restore current address 1097/ A705 : 23 inc hl ; next address of char to send 1098/ A706 : 0C inc c ; inc loop count 1099/ A707 : 3A E3 A0 ld a,(filelen) 1100/ A70A : B9 cp c ; test loop count = length? 1101/ A70B : 20 E6 jr nz,iecope30 ; no, continue 1102/ A70D : C3 37 A8 jp f654 ; yes, send unlisten 1103/ A710 : 1104/ A710 : ; IECLOAD load/verify a file (secondary address 0) 1105/ A710 : 1106/ A710 : f4b8: 1107/ A710 : 3A E3 A0 IECLOAD: ld a,(filelen) 1108/ A713 : A7 and a 1109/ A714 : CA 65 A8 jp z,f710 ; error, no file name given 1110/ A717 : 3A E4 A0 ld a,(secadr) 1111/ A71A : 32 EF A0 ld (svsecadr),a ; save sec. addr. for futher use 1112/ A71D : CD A3 A7 call f5af ; put msg "searching for..." AS V1.40r8 - Quelle MZ1571.ASM - Seite 20 - 23.8.1998 0:23:26 1113/ A720 : 3E 60 ld a,60h ; sec. addr. 0 listen and talk 1114/ A722 : 32 E4 A0 ld (secadr),a 1115/ A725 : CD BD A6 call iecopen ; open file 1116/ A728 : 3A E5 A0 ld a,(gernr) 1117/ A72B : CD F3 A4 call talk ; force talking of (gernr) 1118/ A72E : 3A E4 A0 ld a,(secadr) 1119/ A731 : CD BF A5 call edc7 ; submit sec. addr. 1120/ A734 : CD 13 A6 call ee13 ; get low byte (IECIN) of load addr. 1121/ A737 : 32 E1 A0 ld (endptr),a ; save 1122/ A73A : 3A DB A0 ld a,(st) ; state of floppy drive 1123/ A73D : CB 3F srl a ; turn off bit 7 and bit 6 too 1124/ A73F : CB 3F srl a ; 1125/ A741 : 38 57 jr c,f530 ; if bit 6 was on jump 1126/ A743 : CD 13 A6 call ee13 ; get high byte of load address 1127/ A746 : 32 E2 A0 ld (endptr+1),a ; save, address is complete 1128/ A749 : 3A EF A0 mdfcmd02: ld a,(svsecadr) ; get back sec. addr. 1129/ A74C : A7 and a 1130/ A74D : 20 0C jr nz,f4f0 ; if zero take user's load address 1131/ A74F : 3A E8 A0 ld a,(adrload) ; see load routine for futher info 1132/ A752 : 32 E1 A0 ld (endptr),a ; not used if called by verify 1133/ A755 : 3A E9 A0 ld a,(adrload+1) 1134/ A758 : 32 E2 A0 ld (endptr+1),a 1135/ A75B : CD BE A7 f4f0: call f5d2 ; msg loading/verifying 1136/ A75E : 3A DB A0 f4f3: ld a,(st) 1137/ A761 : E6 FD and 0fdh ; clear timeout 1138/ A763 : 32 DB A0 LD (st),a 1139/ A766 : CD 13 A6 call ee13 ; get byte from IEC bus 1140/ A769 : 4F ld c,a ; save byte 1141/ A76A : 3A DB A0 ld a,(st) 1142/ A76D : CB 3F srl a 1143/ A76F : CB 3F srl a 1144/ A771 : 38 EB jr c,f4f3 1145/ A773 : 3A DC A0 ld a,(lvflag) ; test for load or verify 1146/ A776 : A7 and a 1147/ A777 : 2A E1 A0 ld hl,(endptr) ; ptr to current address in storage 1148/ A77A : 79 ld a,c ; restore byte read 1149/ A77B : 28 0B jr z,f51c ; jump if load active 1150/ A77D : 7E ld a,(hl) ; verify active, get byte of storage 1151/ A77E : B9 cp c ; verify byte read and storage 1152/ A77F : 28 08 jr z,f51e ; junp if okay 1153/ A781 : 3E 10 ld a,10h ; not ok 1154/ A783 : CD 75 A8 call fe1c ; set state to verify error 1155/ A786 : 18 01 jr f51e ; continue 1156/ A788 : 1157/ A788 : 77 f51c: ld (hl),a ; load byte read to starage 1158/ A789 : 23 f51e: inc hl 1159/ A78A : 22 E1 A0 ld (endptr),hl ; ptr to next 1160/ A78D : 3A DB A0 ld a,(st) 1161/ A790 : CB 77 bit 6,a ; eof? 1162/ A792 : 28 CA jr z,f4f3 ; no 1163/ A794 : CD F2 A5 f528: call edef ; yes, send untalk 1164/ A797 : CD 20 A8 call iecclose ; close 1165/ A79A : DA 45 A8 f530: jp c,f704 ; error, (file not found?) 1166/ A79D : A7 and a ; set/reset flags 1167/ A79E : ED 5B E1 A0 ld de,(endptr) 1168/ A7A2 : C9 ret ; goback 1169/ A7A3 : 1170/ A7A3 : ; put msg "searching for..." on screen 1171/ A7A3 : 1172/ A7A3 : 11 8A A0 f5af: ld de,searchfo ; address this msg AS V1.40r8 - Quelle MZ1571.ASM - Seite 21 - 23.8.1998 0:23:26 1173/ A7A6 : CD 15 00 call msg ; output this msg 1174/ A7A9 : 3A E3 A0 f5c1: ld a,(filelen) ; get length of filename 1175/ A7AC : A7 and a 1176/ A7AD : C8 ret z ; no filename 1177/ A7AE : 47 ld b,a ; b is counter 1178/ A7AF : 21 9B A8 ld hl,filename+11 ; address of filename 1179/ A7B2 : 7E f5c7: ld a,(hl) ; get filename char 1180/ A7B3 : CD 12 00 call prnt ; output char to screen 1181/ A7B6 : 23 inc hl ; point to next 1182/ A7B7 : 05 dec b ; length - 1 1183/ A7B8 : 20 F8 jr nz,f5c7 ; continue if not all 1184/ A7BA : CD 06 00 call letnl ; set cursor on next line on screen 1185/ A7BD : C9 ret ; goback 1186/ A7BE : 1187/ A7BE : ; put msg "Loading..." on screen 1188/ A7BE : 1189/ A7BE : 11 99 A0 f5d2: ld de,loading ; address to msg 1190/ A7C1 : 3A DC A0 ld a,(lvflag) ; get Load/verify flag 1191/ A7C4 : A7 and a 1192/ A7C5 : 28 03 jr z,f5da ; 00 means load active 1193/ A7C7 : 11 A2 A0 ld de,veryfing ; 01 means verify,address to this msg 1194/ A7CA : CD 15 00 f5da: call msg ; put msg on screen 1195/ A7CD : CD A9 A7 call f5c1 ; put filename on screen 1196/ A7D0 : C9 ret ; goback 1197/ A7D1 : 1198/ A7D1 : ; IECSTORE puts header & file on IEC bus (secondary address 1) 1199/ A7D1 : 1200/ A7D1 : f5fa: 1201/ A7D1 : 3A E3 A0 IECSTORE: ld a,(filelen) ; get length of filename 1202/ A7D4 : A7 and a 1203/ A7D5 : CA 65 A8 jp z,f710 ; missing filename if zero 1204/ A7D8 : 3E 61 ld a,61h ; sec. addr 1 listener and talker 1205/ A7DA : 32 E4 A0 ld (secadr),a 1206/ A7DD : CD BD A6 call iecopen ; open new file 1207/ A7E0 : CD 3C A8 call f68f ; msg "Saving.." 1208/ A7E3 : 3A E5 A0 ld a,(gernr) 1209/ A7E6 : CD F7 A4 call listen ; force listen for (gernr) 1210/ A7E9 : 3A E4 A0 ld a,(secadr) 1211/ A7EC : CD B0 A5 call edb9 ; send sec. addr. 1212/ A7EF : ED 5B E6 A0 ld de,(iostrt) 1213/ A7F3 : ED 53 EA A0 ld (biostrt),de ; save 1214/ A7F7 : 3A EA A0 ld a,(biostrt) ; low byte of begin 1215/ A7FA : CD D6 A5 call eddd ; put it on bus 1216/ A7FD : 3A EB A0 ld a,(biostrt+1) ; high byte of begin 1217/ A800 : CD D6 A5 call eddd ; put it on bus 1218/ A803 : A7 f624: and a 1219/ A804 : 2A E1 A0 ld hl,(endptr) ; ptr to end 1220/ A807 : ED 5B EA A0 ld de,(biostrt) ; current address of storage 1221/ A80B : ED 52 sbc hl,de 1222/ A80D : 38 0E jr c,f63f ; stop if negative 1223/ A80F : 1A ld a,(de) ; get next byte 1224/ A810 : CD D6 A5 call eddd ; output to iec bus 1225/ A813 : 21 EA A0 f63a: ld hl,biostrt ; save max. to ffffh 1226/ A816 : 34 inc (hl) 1227/ A817 : 20 EA jr nz,f624 ; continue if low byte not zero 1228/ A819 : 23 inc hl 1229/ A81A : 34 inc (hl) 1230/ A81B : 20 E6 jr nz,f624 ; continue if high byte not zero 1231/ A81D : CD 00 A6 f63f: call unlisten ; send unlisten 1232/ A820 : f642: AS V1.40r8 - Quelle MZ1571.ASM - Seite 22 - 23.8.1998 0:23:26 1233/ A820 : 3A E4 A0 iecclose: ld a,(secadr) 1234/ A823 : CB 7F bit 7,a ; test on secondary address 1235/ A825 : 20 13 jr nz,f657 ; no, primary address, done 1236/ A827 : 3A E5 A0 ld a,(gernr) 1237/ A82A : CD F7 A4 call listen ; force listen for (gernr) 1238/ A82D : 3A E4 A0 ld a,(secadr) 1239/ A830 : E6 EF and 0efh 1240/ A832 : F6 E0 or 0e0h 1241/ A834 : CD B0 A5 call edb9 ; close sec. addr. 1 1242/ A837 : CD 00 A6 f654: call unlisten ; send unlisten 1243/ A83A : A7 f657: and a ; set/reset flags 1244/ A83B : C9 ret ; goback 1245/ A83C : 1246/ A83C : ; put msg "Saving..." on screen 1247/ A83C : 1248/ A83C : 11 AD A0 f68f: ld de,saving ; address to msg 1249/ A83F : CD 15 00 call msg ; output msg 1250/ A842 : C3 A9 A7 jp f5c1 ; add filename to msg 1251/ A845 : 1252/ A845 : ; put msg "File not found" on screen 1253/ A845 : 1254/ A845 : 11 B5 A0 f704: ld de,filenfnd ; address to msg 1255/ A848 : CD C7 A4 call errchk30 ; output msg 1256/ A84B : CD BC A4 call ErrorChk 1257/ A84E : ED 7B D9 A0 ld sp,(stckptr) ; force stop on error 1258/ A852 : C3 15 A2 jp GetErSta 1259/ A855 : 1260/ A855 : ; put msg "device not present" on screen 1261/ A855 : 1262/ A855 : 11 4B A0 f707: ld de,devnpres ; address to msg 1263/ A858 : CD C7 A4 call errchk30 ; output msg 1264/ A85B : CD BC A4 call ErrorChk 1265/ A85E : ED 7B D9 A0 ld sp,(stckptr) ; force stop on error 1266/ A862 : C3 F5 A0 jp start 1267/ A865 : 1268/ A865 : ; put msg "Missing filename" on screen 1269/ A865 : 1270/ A865 : 11 C4 A0 f710: ld de,namemiss ; address to msg 1271/ A868 : CD C7 A4 call errchk30 ; output msg 1272/ A86B : CD BC A4 call ErrorChk 1273/ A86E : ED 7B D9 A0 ld sp,(stckptr) ; force stop on error 1274/ A872 : C3 F5 A0 jp start ; 1275/ A875 : 1276/ A875 : ; set state 1277/ A875 : 1278/ A875 : 47 fe1c: ld b,a 1279/ A876 : 3A DB A0 ld a,(st) 1280/ A879 : B0 or b 1281/ A87A : 32 DB A0 ld (st),a 1282/ A87D : C9 ret 1283/ A87E : 1284/ A87E : ; end of program, goback to monitor 1285/ A87E : CD 06 00 intbrk: call letnl 1286/ A881 : 11 5E A0 ld de,break 1287/ A884 : CD 15 00 call msg 1288/ A887 : CD 06 00 call letnl 1289/ A88A : 31 F0 10 intrpt: ld sp,10f0h ; init stackpointer 1290/ A88D : C3 AD 00 jp st1 ; goback to Monitor-ROM 1291/ A890 : 1292/ A890 : AS V1.40r8 - Quelle MZ1571.ASM - Seite 23 - 23.8.1998 0:23:26 mz1571.zip 1 Quote Link to comment Share on other sites More sharing options...
mister35mm Posted January 6, 2016 Author Share Posted January 6, 2016 Apparently, I am not the first person to come up with this idea! http://8bit.yarek.pl/interface/zx81.zx1541/ ZX1541 by Luis Claudio Grosso Interface that connects Timex Sinclair 1500 (in Argentina known as Czerweny CZ1500) or Sinclair ZX81 with Commodore 1541 disk drive. Technical description. The interface has two memory chips: - 62256 SRAM (32kB), - 28C64 EEPROM (8kB). The logic is made of following chips: - 74*174 latches 6 bits of data (port #BF), - 74*365 allows to read 6 bits of data (port #BF), - 74*139 decodes memory control signals, - 74*32 4×OR decodes port address and memory signals, - 74*06 6×NOT open collector drives IEC lines and LEDs. Beside some transistors and resistors are used to make simple gates, and 8×1N4148 diodes to protect IEC lines. 1. The port address is decoded on OR gate (74*32) from /IORQ and A6, exactly as in original design. The product is called /BF signal, what means #BF (#xxBF) address. Other addresses with A6=0 are possible, but not recommended. 2. /BF signal is used directly to control 74*366 buffer together with /RD signal (74*365 has internal OR gate). Second OR gate (74*32) used on /BF and /WR produces /BFWR signal to latch data into 74*174. 3. 74*174 has reset generator that works only on power-up. This enables the interface and selects memory bank 0. See below. 4. 8kB of 28C64 EEPROM is seen in #2000..#3FFF addresses. The EEPROM is write-protected, when its jumper is open. To update software close the jumper, then open it again. No extra voltage source is required to reprogram this EEPROM. 5. 32kB of 62256 SRAM is seen in #8000..#BFFF addresses, as two 16kB mutually exclusive banks. Only one of them can be used at a time - which is selected by bit 1 in port #BF. This bit generates MA14 signal that can be read back as bit 1 of #BF port. 6. Both SRAM and EEPROM access are disabled when bit 0 is set in value outed to #BF port. This allows to use other interfaces connected between ZX81 and ZX1541. The bit 0 generates signal called Q0. Q0 is inverted by NOT gate (74*06), giving /Q0 signal. 7. Memory addresses are decoded by third OR gate (74*32) and half of 74*139 decoder. A13 and A15 lines are ORed to give A13G signal that can be low only for A15=0. For A15=1 is high. In A14 line is inserted a resistor, this allows the "next" interface connected to through slot to disable ZX1541 memory. The "next" interface can pull up to +5V the DISIN (incoming /ROMCS on edge slot) line by a NPN transistor, exactly like with pure ZX81. The A13G, DISIN (A14 after resistor) and A15 lines are connected to the decoder. This produces three output signals: /000, /001, /10X - see this table (n.c. means not connected or not pulled up by "next" interface): DISIN A15 A14 A13 A13G /000 /001 /10X - addresses n.c. 0 0 0 0 0 1 1 - #0000..#1FFF n.c. 0 0 1 1 1 0 1 - #2000..#3FFF n.c. 0 1 0 0 1 1 1 - #4000..#5FFF n.c. 0 1 1 1 1 1 1 - #6000..#7FFF n.c. 1 0 0 1 1 1 0 - #8000..#9FFF n.c. 1 0 1 1 1 1 0 - #A000..#BFFF n.c. 1 1 0 1 1 1 1 - #C000..#DFFF n.c. 1 1 1 1 1 1 1 - #E000..#FFFF >+2V x x x x 1 1 1 - #xxxx..#xxxx 9. Interface disables internal ROM decoding of ZX81 by pulling up to +5V the DISOUT line (outgoing /ROMCS on edge slot) with NPN transistor. The transistor is controlled by the fourth OR gate (74*32). So two signals can disconnect internal ZX81 ROM independently. One of them is DISIN, which is used by "next" interface to disable both ZX1541 and internal ZX81 ROM. The second signal is generated by AND gate made from resistor and open collector inverter (74*06). So both /000 signal and /Q0 must be in high state to disable the internal ROM of ZX81. /000 is high for all addresses except #0000..#1FFF and /Q0 is high until 1 is written as bit 0 into #BF port. This means, the internal ZX81 ROM is not disabled only for addresses #0000..#1FFF as long as DISIS is not pulled up by "next" interface ("-" means high impedance, "0r" and "1r" means state set by resistor). DISIN Q0 /000 /Q0 OR DISOUT - addressess n.c. 0 0 0r 0 - - #0000..#1FFF n.c. 0 1 1r 1 1 - #2000..#FFFF n.c. 1 x 0 0 - - #0000..#FFFF >+2V x x x 1 1 - #0000..#FFFF 10. Signals /001 and /10X are used to activate EEPROM and SRAM. This is done with second half of 74*139 decoder and OR gate made from resistor and NPN transistor. Resistor is inserted in /MREQ line giving /MEM signal. /MEM signal can be pulled up by the Q0 line (and transisor) when the ZX1541 has to be disabled by setting bit 0 in #BF port. When not disabled, /MEM signal works like /MREQ: Q0 /MREQ /001 /10X /MEM /EEPROM /SRAM - adresses 0 0 0 1 0 0 1 - #8000..#BFFF 0 0 1 0 0 1 0 - #2000..#3FFF 0 0 1 1 1 1 1 - other than above 0 1 x x 1 1 1 - #0000..#FFFF 1 0 x x 1 1 1 - #0000..#FFFF 1 1 x x 1 1 1 - #0000..#FFFF 11. Bits 2, 3, 4, 5 of value outed to #BF ports can force low state on IEC lines /RESET, /ATN, /CLK, /DATA when are set to 1. When these bits are written as 0, IEC lines are in high state unless other IEC interface forces low state with open collector output gates. Lines are pulled up to +5V by 1kohm resistors, while 1N4148 diodes force the IEC voltage to be in range -0.7V to 5.7V. 12. IEC lines can be read in bits 4, 5, 6, 7 in #BF port, /RESET, /ATN, /CLK, /DATA respectively. In original design only /CLK and /DATA lines were available, so the ZX81 wasn't able to act as IEC slave device (as a controller, terminal device, perhaps 1541 simulator). 13. Two LEDs are added. One lights when DISIN is high, what means interface is disabled. It should blink very fast in normal using, get dark while IEC operations and ligh continously when "next" interface disables ZX1541. Second LED is connected to IEC data line and shows the IEC is sending data. Third diode could be connected to Q0 signal showing the interface is software disabled. Mounting ZX1541 on Split interface. (To be continued.) Quote Link to comment Share on other sites More sharing options...
+mizapf Posted January 6, 2016 Share Posted January 6, 2016 You've been talking about the electrical side of the problem. However, I think the software interface will be at least as hard to adapt. Commodore has a very *special* disk layout. The tracks are bundled in zones with specific numbers of sectors; some details can be found on http://unusedino.de/ec64/technical/formats/d64.html. For that reason, C64 disks are pretty difficult to dump, unlike TI disks, which are quite easy to be read in a PC floppy drive (because of the standard layout). The problem may be that the TI file system assumes a constant number of sectors per track, so you won't be able to use any existing low-level routines. Eventually, you will end up with a completely new DSR. Still, you won't be able to read any disk written by a TI floppy system. I'd say it's not impossible, but it may turn out to be a bigger project. Quote Link to comment Share on other sites More sharing options...
+OLD CS1 Posted January 6, 2016 Share Posted January 6, 2016 Sorry, tl;dr (for now) I have theorized and postulated on the idea of connecting a CBM serial drive to the TI. Even with the differences in file systems, encodings, sector layouts, etc., the DOS on the drives themselves is standard and offers mid- and high-level access to the disks. IMUO, it would take a competent DSR and a proper CBM serial interface to make it work native to the TI, or a utility program which can speak CBM's 488-serial protocol to do things like open and close files, read and write to files, and so on. At a middle level there are commands which can directly access contents of sectors (or "blocks" in CBM parlance) on the drive, which would require knowledge of the track layout schemes but I do not see it as any different than doing direct access on a real commodore. The GCR encoding need not be handled by the TI as a drive's on-board DOS can do that or be told to do that for the TI -- which is good since the 1581 uses MFM but the same DOS and block commands. The bigger question is what purpose this would serve. In theory one could use a 15x1 drive to store TI data, or use a TI to read Commodore data and programs. A program would have to convert CBMSCII to ASCII (not such a big deal) to make read data useful. Of course, this could be used to pull SIDs off long-lost CBM floppies to use with Marc's PEB SID card Quote Link to comment Share on other sites More sharing options...
carlsson Posted January 6, 2016 Share Posted January 6, 2016 As for number of sectors per track, that normally is something the drive handles on its own. Only if you specifically ask to read or write individual sectors, you have to bother with that. Regular load/save functions, as far as I can tell, will allocate available sectors as they go. 1541 type drives have been interfaced with many non-Commodore applications, besides the ZX-81 mentioned above I've heard about synthesizers wired to use a 1541 and other computers and devices too. When it comes to dumping floppy disks, you can use a ZoomFloppy interface or any of the X*1541-series cables. You could also use something like a Catweasel, Kryoflux, SuperCard Pro etc to connect a regular floppy drive to. So yes, it takes a bit more hardware than dumping MFM formatted floppy disks, but far from impossible. If you get a 1571, I believe it can be modified to take MFM formatted disks too, which means you might end up wiht a standalone, intelligent drive that both takes C64 and TI formatted disks, but it would not be automatical. Quote Link to comment Share on other sites More sharing options...
+OLD CS1 Posted January 6, 2016 Share Posted January 6, 2016 The 1571 supports MFM natively with the proper settings (a ton of U0 commands for this,) which programs like BigBlueReader and the CP/M+ OS exploited readily. I believe it can do FM, as well. That could make for an easy way to get odd formats which the TI cannot get using its interface, though the 1571 and the TI controller use the same family of chips (WD 177x.) Quote Link to comment Share on other sites More sharing options...
+mizapf Posted January 6, 2016 Share Posted January 6, 2016 Yes, you can certainly write a DSR which tries to hide all the specifics of the 1541/71. I'm not sure whether we have some specialties in the TI file system that imply a particular handling, though. If you can tell the 1541/71 to access single sectors you should be able to implement the whole file management on top. But I don't know enough about it. Quote Link to comment Share on other sites More sharing options...
mister35mm Posted January 6, 2016 Author Share Posted January 6, 2016 I just thought as Commodore and Atari 5.25 floppy drives are cheap, serial and available, it might make a good way of adding A floppy drive or two where a fully loaded PEB is no longer possible. Compatibility with TI-99 disks would be 'NICE' too, but not the end of the world. I have a heap of Commodore 1541, 1541-II and clones.,,,, collecting dust. Then there is the Atari drive 810 & 1050, Disk Drive, also cheap although not so commonly found? Quote Link to comment Share on other sites More sharing options...
+mizapf Posted January 6, 2016 Share Posted January 6, 2016 No, don't feel turned down ... it could be quite some fun to create such an adaptation and be able to say, look how I made the 1541 work for us. I'd just warn that it's not a weekend's job. Quote Link to comment Share on other sites More sharing options...
+OLD CS1 Posted January 6, 2016 Share Posted January 6, 2016 I am not familiar enough with how the Atari drives work to speak to those, but I am familiar with the 1541/71/81. A PEB card with a 6-pin DIN hanging off the back would be pretty cool. A DSR which would access say CBM8, CBM9, CBM10, etc. (based upon device number.) For that matter, a CBM4 for a printer. Such a DSR could use the native drive DOS or even access lower-level MFM functionality of the 1571 and 1581 to create TI-alike disks. I am curious if the drives would even read a TI disk. I suspect they will, again given that they use the same chips. hrmmmm... for that matter, maybe even a quick-n-dirty DOS to run on the drive to provide TI disk functionality. Imagine that, a TI DOS implemented in 6502 running on a Commodore floppy drive. I would have to check, but I believe the 1571 would be required over the 1541 as I am almost positive it has more RAM. Of course, the MFM functionality alone makes it a requirement over the 1541. If the 6581 can be implemented on the 9900 buss, then a 6522 or 6526 should be viable, as well. Of course, where to get a good supply of those. Probably be best to run some kind of FPGA (forgive me if I misuse the term) or other integrated controller which could talk to the TI and the CBM serial. OH!! It could implement burst-mode transfers, too, with the 1571 and 1581. Maybe JiffyDOS (since its disassembly is available) but I do not see the benefit in this scenario versus burst transfer with MFM. (walks off muttering excitedly to self) Quote Link to comment Share on other sites More sharing options...
mister35mm Posted January 6, 2016 Author Share Posted January 6, 2016 It's amazing what's out there ----> http://sta.c64.org/xcables.html http://blog.tynemouthsoftware.co.uk/2014/11/usb-to-1541-adapter.html Quote Link to comment Share on other sites More sharing options...
+OLD CS1 Posted January 7, 2016 Share Posted January 7, 2016 Yup. I have one for my Amiga and one for my Windows machine. Great stuff. Quote Link to comment Share on other sites More sharing options...
carlsson Posted January 7, 2016 Share Posted January 7, 2016 Ditto, I built both my "Amiga1541" and XM1541 myself. Very basic designs once you get into studying them. The reason they use parallel ports on the Amiga/PC is because the 1541 uses separate signals for clock, attention and data so a plain serial port usually isn't enough. 1 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.