|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T m
Length: 22082 (0x5642) Types: TextFile Names: »msyz10.asm«
└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit └─⟦71044c191⟧ »EurOpenD3/misc/kermit.ms-2.32.tar.Z« └─⟦31f2d420d⟧ └─⟦this⟧ »msyz10.asm«
name msyz10 ; File MSYZ10.ASM ; Last modification: 27 April 1986 ; Kermit system dependent module for Heath/Zenith Z100 public term include mssdef.h BIOS_SEG SEGMENT AT 40H ; Define segment where BIOS really is ORG 4*3 BIOS_PRINT LABEL FAR ; Printer output ORG 6*3 BIOS_AUXOUT LABEL FAR ; AUX output routine ORG 26*3 BIOS_AUXFUNC LABEL FAR ; AUX: function ORG 27*3 BIOS_CONFUNC LABEL FAR ; CON: function BIOS_SEG ENDS ; Function codes for BIOS_xxxFUNC CHR_WRITE EQU 0 ; Write character CHR_READ EQU 1 ; Read character CHR_STATUS EQU 2 ; Get status CHR_SFGS EQU 0 ; Get status subfunction CHR_SFGC EQU 1 ; Get config subfunction CHR_CONTROL EQU 3 ; Control function CHR_CFSU EQU 0 ; Set new configuration parameters CHR_CFCI EQU 1 ; Clear input buffer ; Scan code definitions used for translating back to Heath ESC sequences entscan equ 08dh ; enter key scan code f0scan equ 096h ; F0 key f1scan equ 097h ; F1 key f2scan equ 098h ; F2 key f3scan equ 099h ; F3 key f4scan equ 09ah ; F4 key f5scan equ 09bh ; F5 key f6scan equ 09ch ; F6 key f7scan equ 09dh ; F7 key f8scan equ 09eh ; F8 key f9scan equ 09fh ; F9 key f10scn equ 0a0h ; F10 key f11scn equ 0a1h ; F11 key f12scn equ 0a2h ; F12 key homscan equ 0a9h ; Home key upscan equ 0a5h ; Up arrow dnscan equ 0a6h ; Down arrow rtscan equ 0a7h ; Right arrow lfscan equ 0a8h ; Left arrow kpminus equ 0adh ; keypad minus kpdot equ 0aeh ; keypad period kp0 equ 0b0h ; keypad 0 kp1 equ 0b1h ; keypad 1 kp2 equ 0b2h ; keypad 2 kp3 equ 0b3h ; keypad 3 kp4 equ 0b4h ; keypad 4 kp5 equ 0b5h ; keypad 5 kp6 equ 0b6h ; keypad 6 kp7 equ 0b7h ; keypad 7 kp8 equ 0b8h ; keypad 8 kp9 equ 0b9h ; keypad 9 sentscn equ 0cdh ; shifted enter key sf0scan equ 0d6h ; shifted F0 key sf1scan equ 0d7h ; shifted F1 key sf2scan equ 0d8h ; shifted F2 key sf3scan equ 0d9h ; shifted F3 key sf4scan equ 0dah ; shifted F4 key sf5scan equ 0dbh ; shifted F5 key sf6scan equ 0dch ; shifted F6 key sf7scan equ 0ddh ; shifted F7 key sf8scan equ 0deh ; shifted F8 key sf9scan equ 0dfh ; shifted F9 key sf10scn equ 0e0h ; shifted F10 key sf11scn equ 0e1h ; shifted F11 key sf12scn equ 0e2h ; shifted F12 key shomscn equ 0e9h ; shifted Home key supscan equ 0e5h ; shifted Up arrow sdnscan equ 0e6h ; shifted Down arrow srtscan equ 0e7h ; shifted Right arrow slfscan equ 0e8h ; shifted Left arrow skpmins equ 0edh ; shifted keypad minus skpdot equ 0eeh ; shifted keypad period skp0 equ 0f0h ; shifted keypad 0 skp1 equ 0f1h ; shifted keypad 1 skp2 equ 0f2h ; shifted keypad 2 skp3 equ 0f3h ; shifted keypad 3 skp4 equ 0f4h ; shifted keypad 4 skp5 equ 0f5h ; shifted keypad 5 skp6 equ 0f6h ; shifted keypad 6 skp7 equ 0f7h ; shifted keypad 7 skp8 equ 0f8h ; shifted keypad 8 skp9 equ 0f9h ; shifted keypad 9 ; Miscellaneous scan codes used for functions prscan equ f12scn ; print-screen scan code (F12)... brkscan equ 0aah ; Break key modfrm struc ; format of mode line db 'Esc chr: ' m_echr db 2 dup (?) db ', Speed: ' m_baud db 4 dup (?) db ', Parity: ' m_par db 4 dup (?) db ', Echo: ' m_echo db 3 dup (?) db ', Prn: ' m_prs db 3 dup (?) db ', Type ' m_hlp db 2 dup (?) db '? for Help$' modfrm ends datas segment public 'datas' waste db 100h dup(?) ; assembler problem??? flags1 db 0 ; internal flags prtscr equ 80h ; print screen pressed flag ; Key translations - F12 is printscreen ckeys db brkscan,prscan,upscan,dnscan,lfscan,rtscan,homscan db entscan,f0scan,f1scan,f2scan,f3scan,f4scan,f5scan,f6scan db f7scan,f8scan,f9scan,f10scn,f11scn,kpminus db kpdot,kp0,kp1,kp2,kp3,kp4,kp5,kp6,kp7,kp8,kp9 db supscan,sdnscan,slfscan,srtscan,shomscn db sentscn,sf0scan,sf1scan,sf2scan,sf3scan,sf4scan,sf5scan,sf6scan db sf7scan,sf8scan,sf9scan,sf10scn,sf11scn,skpmins db skpdot,skp0,skp1,skp2,skp3,skp4,skp5,skp6,skp7,skp8,skp9 lckeys equ $-ckeys ;ckacts must parallel ckeys above... ckacts dw trnbrk,trnprs,trnupw,trndnw,trnlfw,trnrgw,trnhom,trnkpn dw trnf0,trnf1,trnf2,trnf3,trnf4,trnf5,trnf6,trnf7,trnf8,trnf9 dw trnf10,trnf11,trnkpn,trnkpn,trnkpn,trnkpn,trnkpn dw trnkpn,trnkpn,trnkpn,trnkpn,trnkpn,trnkpn,trnkpn dw trnupw,trndnw,trnlfw,trnrgw,trnhom,trnkps dw trnsf0,trnsf1,trnsf2,trnsf3,trnsf4,trnsf5,trnsf6,trnsf7 dw trnsf8,trnsf9,trnsf10,trnsf11,trnkps,trnkps dw trnkps,trnskp1,trnskp2,trnskp3,trnskp4,trnskp5,trnskp6 dw trnskp7,trnskp8,trnskp9 enascan db ESC,'y?$' ; Enable scan codes disscan db ESC,'x?$' ; Disable scan codes uptrn db esc,'A' dntrn db esc,'B' rgtrn db esc,'C' lftrn db esc,'D' enttrn db cr ; enter key translation homtrn db ESC,'H' ; home key translation dottrn db '.' ; keypad . translation mintrn db '-' ; keypad - translation kp0trn db '0' ; keypad 0 translation kp1trn db '1' ; keypad 1 translation kp2trn db '2' ; keypad 2 translation kp3trn db '3' ; keypad 3 translation kp4trn db '4' ; keypad 4 translation kp5trn db '5' ; keypad 5 translation kp6trn db '6' ; keypad 6 translation kp7trn db '7' ; keypad 7 translation kp8trn db '8' ; keypad 8 translation kp9trn db '9' ; keypad 9 translation senttrn db cr ; shifted enter key translation shomtrn db ESC,'H' ; home key translation sdottrn db '.' ; shifted keypad . translation smintrn db '-' ; shifted keypad - translation skp0trn db '0' ; shifted keypad 0 translation skp1trn db ESC,'L' ; shifted keypad 1 translation skp2trn db ESC,'B' ; shifted keypad 2 translation skp3trn db ESC,'M' ; shifted keypad 3 translation skp4trn db ESC,'D' ; shifted keypad 4 translation skp5trn db ESC,'H' ; shifted keypad 5 translation skp6trn db ESC,'C' ; shifted keypad 6 translation skp7trn db ESC,'@' ; shifted keypad 7 translation skp8trn db ESC,'A' ; shifted keypad 8 translation skp9trn db ESC,'N' ; shifted keypad 9 translation f0trn db ESC,'J' ; F0 translation f1trn db ESC,'S' ; F1 translation f2trn db ESC,'T' ; F2 translation f3trn db ESC,'U' ; F3 translation f4trn db ESC,'V' ; F4 translation f5trn db ESC,'W' ; F5 translation f6trn db ESC,'P' ; F6 translation f7trn db ESC,'Q' ; F7 translation f8trn db ESC,'R' ; F8 translation f9trn db ESC,'0I' ; F9 translation f10trn db ESC,'0J' ; F10 translation f11trn db ESC,'0K' ; F11 translation f12trn db ESC,'0L' ; F12 translation sf0trn db ESC,'E' ; shifted F0 translation sf1trn db ESC,'1A' ; shifted F1 translation sf2trn db ESC,'1B' ; shifted F2 translation sf3trn db ESC,'1C' ; shifted F3 translation sf4trn db ESC,'1D' ; shifted F4 translation sf5trn db ESC,'1E' ; shifted F5 translation sf6trn db ESC,'1F' ; shifted F6 translation sf7trn db ESC,'1G' ; shifted F7 translation sf8trn db ESC,'1H' ; shifted F8 translation sf9trn db ESC,'1I' ; shifted F9 translation sf10trn db ESC,'1J' ; shifted F10 translation sf11trn db ESC,'1K' ; shifted F11 translation sf12trn db ESC,'1L' ; shifted F12 translation ourarg termarg <> modbuf modfrm <> ; mode line buffer ; some static data for mode line unkbaud db 'Unk ' ; must be 4 chars... baudn db '45.5' db ' 50' db ' 75' db ' 110' db ' 135' db ' 150' db ' 300' db ' 600' db '1200' db '1800' db '2000' db '2400' db '4800' db '9600' db ' 19K' db ' 38K' baudnsiz equ 16 ; # of baud rates known (tbl size / 4) parnams db 'Even' db 'Mark' db 'None' db 'Odd ' ; must be 4 chars db 'Spc ' offmsg db 'Off' onmsg db 'On ' lclmsg db 'Lcl' remmsg db 'Rem' datas ends code segment public 'code' extrn prtchr:near,outchr:near,putmod:near,clrmod:near,sendbr:near assume cs:code,ds:datas ; This is from the dumb terminal emulator routine in MSXGEN.ASM. ; Had to use bios calls because DOS calls were losing chars. term proc near mov si,ax ; this is source mov di,offset ourarg ; place to store arguments mov ax,ds push es ; save caller's extra segment address mov es,ax ; address destination segment mov cx,size termarg rep movsb ; copy into our arg blk and flags1,not (prtscr) ; print screen mode disabled test ourarg.flgs,emheath ; Are we to use Heath sequences? jnz chkmod ; no, do something else mov ah,prstr mov dx,offset enascan ; enable scan codes int dos chkmod: call clrmod ; clear mode line test ourarg.flgs,modoff ; is mode line disabled? jnz term1 ; yes, skip it call modlin ; turn on mode line term1: call portchr ; char at port? jnc term3 ; no, keep going call outtty ; print on terminal term3: mov ah,chr_status mov al,chr_sfgs ; get number of characters call bios_confunc ; check console cmp bl,0 jz term1 ; no character, go on mov ah,chr_read call bios_confunc ; read it cmp al,ourarg.escc ; escape char? je term4 ; yes, exit push ax ; save char mov ah,al call trnout ; translate if nec., output to port pop ax jmp term1 ; else echo and keep going term4: call clrmod mov ah,prstr mov dx,offset disscan ; disable scan code generation int dos pop es ret term endp ; returns with carry on if a character is available portchr proc near call prtchr ; character at port? jmp short portc1 ; yes, go handle nop ; skip return is stupid clc ; no carry -> no character ret portc1: and al,7fh ; we don't worry about parity here stc ; have a character ret portchr endp ; put the character in al to the screen outtty proc near mov ah,chr_write call bios_confunc test ourarg.flgs,capt ; capturing output? jz outtt1 ; no, forget it call ourarg.captr ; else call the routine outtt1: test flags1,prtscr ; print screen? jz outtt2 ; no, try something else call bios_print outtt2: ret outtty endp ; send the character in al out to the serial port ; handle echoing also... outprt proc near test ourarg.flgs,lclecho ; echoing? jz outpr1 ; no, forget it push ax ; save char call outtty ; print it pop ax ; restore outpr1: mov ah,al ; this is where outchr expects it call outchr ; output to the port nop nop nop ; skip returns... ret outprt endp modlin proc near ; turn on mode line mov al,ourarg.escc mov modbuf.m_echr,' ' ; first char is initial space mov modbuf.m_hlp,' ' ; goes here too. cmp al,32 ; printable? jnb modl1 ; yes, keep going add al,40h ; made printable mov modbuf.m_echr,'^' ; note control char mov modbuf.m_hlp,'^' modl1: mov modbuf.m_echr+1,al ; fill in character mov modbuf.m_hlp+1,al mov al,ourarg.baudb ; get baud bits mov si,offset unkbaud ; assume unknown baud cmp al,baudnsiz ; too big? jnb modl2 ; yes, use default mov cl,2 ; each is 4 bytes long shl al,cl mov ah,0 add ax,offset baudn mov si,ax modl2: mov cx,size m_baud ; length of baud space mov di,offset modbuf.m_baud rep movsb ; copy in baud rate mov al,ourarg.parity ; get parity code mov cl,2 ; each is 4 bytes long... shl al,cl mov ah,0 add ax,offset parnams ; names of parity settings mov si,ax mov cx,4 ; each is 4 long mov di,offset modbuf.m_par rep movsb mov si,offset remmsg ; assume remote echoing test ourarg.flgs,lclecho ; echoing? jz modl4 ; no, keep going mov si,offset lclmsg modl4: mov cx,3 ; size of on/off mov di,offset modbuf.m_echo rep movsb ; mov al,'1' ; cmp portno,1 ; port 1? ; je modl5 ; yes, keep going ; mov al,'2' ;modl5: mov modbuf.m_prt,al ; fill in port number ; mov cx,size modfrm ; this is size of mode line ; mov si,offset modbuf ; mode line image mov si,offset offmsg ; assume printer off test flags1,prtscr ; print screen enabled? jz modl5 ; no, keep going mov si,offset onmsg modl5: mov cx,3 mov di,offset modbuf.m_prs rep movsb mov dx,offset modbuf call putmod ret ; and return modlin endp ; translate the scan code in ah according to the translate table ; given in ktrntab/krpltab, output to port. If no translation, ; use ascii char in al. (should probably include shift state ; somewhere). Shift state is in bl. trnout proc near test ourarg.flgs,havtt ; translate table given? jz trnou3 ; no, just output character cmp ourarg.klen,0 ; did they say we have one je trnou3 ; but we really don't? push ax ; save original value xor ah,ah ; Zero top half mov di,ourarg.ktab mov cx,ourarg.klen repne scasw ; look for our key pop ax ; recover character jne trnou3 ; not found, forget it sub di,ourarg.ktab sub di,2 ; (minus 2 for pre-increment) mov bx,ourarg.krpl mov si,[bx][di] ; and addr of replacement mov cl,[si] ; get first byte (length) xor ch,ch ; clear high-order byte inc si ; point to translation string trnou2: lodsb ; get a byte push si push cx ; save important registers call outprt ; send to port pop cx pop si loop trnou2 ; send all chars ret ; and return trnou3: xor ah,ah ; get scan code mov cx,lckeys ; length of table mov di,offset ckeys ; table address repne scasb ; mov al,0 ; ascii code was 0... jne trnou4 ; not found, keep going sub di,offset ckeys+1 ; get table offset shl di,1 ; shift for word offset jmp ckacts[di] ; jump to appropriate routine trnou4: call outprt ; just output single char ret ; and return ;trnmod: test flags,modoff ; mode line already off? ; jnz trnm1 ; yes, go turn on ; call clrmod ; no, clear mode line here ; or flags,modoff ; turn on flag ; ret ; and return ;trnm1: call modlin ; turn on mode line ; and flags,not modoff ; clear flag ; ret ; and return trnbrk: call sendbr ret trnprs: xor flags1,prtscr ; flip the flag and ourarg.flgs,not modoff ; turn on mode line call modlin ; write into mode line ret ; and return trn1ch: mov cx,1 ; length is always 1 jmp trnou2 ; common entry for arrow keys trn2ch: mov cx,2 ; length is always 2 jmp trnou2 ; go send definition trn3ch: mov cx,3 ; length is always 3 jmp trnou2 trnupw: mov si,offset uptrn jmp trn2ch trndnw: mov si,offset dntrn jmp trn2ch trnlfw: mov si,offset lftrn jmp trn2ch trnrgw: mov si,offset rgtrn jmp trn2ch trnhom: mov si,offset homtrn jmp trn2ch trnent: mov si,offset enttrn jmp trn1ch trnf0: mov si,offset f0trn jmp trn2ch trnf1: mov si,offset f1trn jmp trn2ch trnf2: mov si,offset f2trn jmp trn2ch trnf3: mov si,offset f3trn jmp trn2ch trnf4: mov si,offset f4trn jmp trn2ch trnf5: mov si,offset f5trn jmp trn2ch trnf6: mov si,offset f6trn jmp trn2ch trnf7: mov si,offset f7trn jmp trn2ch trnf8: mov si,offset f8trn jmp trn2ch trnf9: mov si,offset f9trn jmp trn3ch trnf10: mov si,offset f10trn jmp trn3ch trnf11: mov si,offset f11trn jmp trn3ch trnkpn: and al,07fh ; strip high bits jmp trnou4 ; now output it trnkps: and al,03fh ; strip high bits (special case) jmp trnou4 trnsf0: mov si,offset sf0trn jmp trn2ch trnsf1: mov si,offset sf1trn jmp trn3ch trnsf2: mov si,offset sf2trn jmp trn3ch trnsf3: mov si,offset sf3trn jmp trn3ch trnsf4: mov si,offset sf4trn jmp trn3ch trnsf5: mov si,offset sf5trn jmp trn3ch trnsf6: mov si,offset sf6trn jmp trn3ch trnsf7: mov si,offset sf7trn jmp trn3ch trnsf8: mov si,offset sf8trn jmp trn3ch trnsf9: mov si,offset sf9trn jmp trn3ch trnsf10: mov si,offset sf10trn jmp trn3ch trnsf11: mov si,offset sf11trn jmp trn3ch trnskp1: mov si,offset skp1trn jmp trn2ch trnskp2: mov si,offset skp2trn jmp trn2ch trnskp3: mov si,offset skp3trn jmp trn2ch trnskp4: mov si,offset skp4trn jmp trn2ch trnskp5: mov si,offset skp5trn jmp trn2ch trnskp6: mov si,offset skp6trn jmp trn2ch trnskp7: mov si,offset skp7trn jmp trn2ch trnskp8: mov si,offset skp8trn jmp trn2ch trnskp9: mov si,offset skp9trn jmp trn2ch trnout endp code ends end