IMD 1.18: 13/11/2012 19:56:23 source & cmd files nec-apc dev disk 10 turbodos format  -AREA- DR APCEQU A BACKUP CDBOOT CDBUFFERS CD CHANGE CD COMPARE CD CON192 A CON96 A COPY CD*CPMSUP O DEBUGAPCA DIRECT PO DREQUATEA DSKAPC A DSKAPC A :DSKAPC O DSKFMT A P !"#$DSKFMT O %EQUATE A 2&'()HDCAPC A ABTUVWHDCTST CMDJ+,-./SCRAPC O 35KBDAPC O 9MSTAPC A :MSTAPC O ;NITAPC A '<=>NITAPC O ?PATCH O @HDCAPC A "DEBUG SYS78IJKLMNRTCAPC A CDRTCAPC O ERTCNUL O FSAVE POGSCRTST CMD46DEBUG SYS9OPQRSCRAPC A SXYZ[\]^SCRAPC A HDCTST O 0SCRTST A _SCRTST GEN`SCRTST O 1SIOAPC A dbcdefghSOMAPC A iSOMAPC O jSTDLOADRO klmnopqrSTDLOADRO stSTDSPOOLO uvwxyz{|STDSPOOLO }~STDSPOOLO SUBMIT O APCEQU O TDOSAPC SYS1HDCTST A TSTPTN A TSTPTN O TYPE PO TDOSAPC SYSFDATE CDDEL CDDIR CDDO CDDRIVE CDDUMP CD ERASEDIRCD FIXDIR CD FIXMAP CD GEN CDGEN CD3LABEL CDOSLOAD CMDsOTOASM CD]PRINT CD PRINTER CD QUEUE CDRENAME CDSCRAPC A ASET CDSHOW CDSID86 CDSID86 CDHDCAPC O HDCTST GEN2KBDAPC A k !'0JUNK LIBSAVE LIBL()*+,TLINK CDTLINK CD3TLOADAPCGENTSTPTN CMDTYPE CDTZ80 CDQVERIFY CD  TLOADAPCPARTDOSAPC DO OSMASTERSYSa  OSMASTERSYS4 TDOSAPC SYSTDOSAPC SYSTPC2 CDO"#$%&TDOSAPC GENTDOSAPC O TDOSAPC PARTDOSAPC BAKHDCTST1 BAKHDCTST1 O *HDCTST1 CMDTDOSAPC SYS-PRINT- 001HDCTST1 A .; #INCLUDE "APCEQU" ; NEC-APC equivalences #NOLIST ; suppress listing ; ; Port addresses ; ; DMA controller (8237) ; CH0_ADR == 0X01 ; CH-0 address (RW) CH0_EXA == 0X38 ; CH-0 extended address (W) CH0_TC == 0X11 ; CH-0 terminal count (RW) CH1_ADR == 0X03 ; CH-1 address (RW) CH1_EXA == 0X3A ; CH-1 extended address (W) CH1_TC == 0X13 ; CH-1 terminal count (RW) CH2_ADR == 0X05 ; CH-2 address (RW) CH2_EXA == 0X3C ; CH-2 extended address (W) CH2_TC == 0X15 ; CH-2 terminal count (RW) CH3_ADR == 0X07 ; CH-3 address (RW) CH3_EXA == 0X3E ; CH-3 extended address (W) CH3_TC == 0X17 ; CH-3 terminal count (RW) DMA_ST == 0X09 ; status register (R) DMA_CMD == 0X09 ; command register (W) DMA_WRR == 0X19 ; write request register (W) DMA_WSM == 0X0B ; write single mask (W) DMA_MODE== 0X1B ; write mode (W) DMA_CFF == 0X0D ; clear flip flop (W) DMA_RTR == 0X1D ; read temp register (R) DMA_MC == 0X1D ; master clear (W) DMA_WAM == 0X1F ; write all mask (W) ; ; Interrupt controllers (8259) ; MIC_P0 == 0X20 ; master IC port 0 MIC_P1 == 0X22 ; master IC port 1 SIC_P0 == 0X28 ; slave IC port 0 SIC_P1 == 0X2A ; slave IC port 1 ; ; Interval timer (8253) ; IT_CNT0 == 0X29 ; counter 0 (RW) IT_CNT1 == 0X2B ; counter 1 (RW) IT_CNT2 == 0X2D ; counter 2 (RW) IT_MODE == 0X2F ; counter mode (W) ; ; Serial I/O controllers (8251) ; S0_DATA == 0X30 ; data (RW) S0_STAT == 0X32 ; status (R) S0_CMD == 0X32 ; command (W) S0_MSK == 0X34 ; mask (W) S0_RS == 0X34 ; read signal (R) S0_WS == 0X36 ; write signal (W) S1_DATA == 0X31 ; data (RW) S1_STAT == 0X33 ; status (R) S1_CMD == 0X33 ; command (W) S1_MSK == 0X35 ; mask (W) S1_RS == 0X35 ; read signal (R) S1_WS == 0X37 ; write signal (W) ; ; CRT controller ; CRT_STAT== 0X40 ; status (R) CRT_PARM== 0X40 ; parameter (W) CRT_DATA== 0X42 ; data (R) CRT_CMD == 0X42 ; command (W) CRT_IRST== 0X46 ; reset interrupt (W) ; ; Graphics display controller ; GRF_STAT== 0X41 ; status (R) GRF_PARM== 0X41 ; parameter (W) GRF_DATA== 0X43 ; data (R) GRF_CMD == 0X43 ; command (W) ; ; Keyboard controller ; KBD_DATA== 0X48 ; data (R) KBD_BZS == 0X48 ; buzzer set (W) KBD_STAT== 0X4A ; status (R) KBD_BZR == 0X4A ; buzzer reset (W) KBD_SIG == 0X4C ; read signal (R) KBD_BP == 0X4E ; read book/page (R) KBD_SH == 0X4E ; read shift (R) ; ; Floppy disk drive controller ; FDD_STAT== 0X50 ; read status (R) FDD_DATA== 0X52 ; data (RW) FDD_CMD == 0X52 ; command (W) ; ; Clock and calendar device ; CLK_DATA== 0X58 ; read data (R) CLK_SET == 0X58 ; set register (W) ; ; Arithmetic processing unit ; APU_DATA== 0X5A ; data register (RW) APU_STAT== 0X5E ; read status (R) APU_CMD == 0X5E ; write command (W) ; #RELIST ; restore listing status ff8COPYRIGHT 1984, SOFTWARE 2000, INC. (VERSION 01/24/84) `&b؎м` ŀu\ywlyd5tdi%m);frfkáf)=rowttywAqAf1F< t<ui u<u: ڊ:t*KJڊ*$tq.zsuik9smo9s sKsNjz)tYs9rӉ|~ttwFstt j1rtz|Ӊz^t <uFUxCxqKqt73H)^$z|vp7&u utX1`&b˻t C<;tItC8uuRZu0úv߄ðvأás0v1xA,xUw8tl8t b8uԄ ۠xñ'd )sӈut0 to begin copying  Read Write Copy aborted Successful copyz Non-privileged user_ No source drive specified> No destination drive specified Unable to lockout source drive Unable to lockout destination drive Source drive not ready Destination drive not ready Disk types not identical ` Insufficient memory for copy< error, Drive: (, Track:  (Retry, Ignore, Abort) S^U]^[ÜP.Ct2XSQR ZY[SQRZY[SQRtZY[PSQR$±ZY[X RSS8COPYRIGHT 1984, SOFTWARE 2000, INC. (VERSION 01/24/84) `&b؎м` ŀu ࢛\u ]< ulu m< uf5tfk%o);hrhmáh)=rqksmu;qs osqu]< t \rFu0Dr=u,m< tu%0Mu#H&^!t 4 1`&b˾\wktiwuK u㹀)r1Rs3].xwuZӇڄtĉd0þlw{ty?ww5uIRs3. w Zu€dK)swà\.ru{0dàlr u yyȢأ߄tU@yڋdr9ڋ.Sr(sڋu)r 0 *߄uuûtrIà PXÈRZ8tR Z8t . ؎ Operation successful Non-privileged useri No source drive or filename specified< No destination drive or filename specified  Can't find source file Can't read boot tracks Can't write destination file Can't write boot tracks Not enough memoryr Reading source file: V Writing destination file: 5 Reading boot tracks:  Writing boot tracks: S^U]^[ÜP.CtXPSQR$±ZY[X ,,8COPYRIGHT 1984, SOFTWARE 2000, INC. (VERSION 01/24/84) `&b؎м`߉fcsht ŀt:f߱߉fDgTfA0dz1RP X`&brj8t7k8tT r < t1<,t-<:t)<*t5,Ar"<sSu d[d!=ItCĠ8ufduRs SRZ[tXPy[t,SӋd!ӺsSRZ[y[o #dsSRZRZ[yfudQ`< t,Sds SRZ[tXPy[t 1`&b˰As  when change complete  Unable to free drive(s): S^U]^[ÜP.Ct'XSQRZY[SQRtZY[PSQR$±ZY[X$N$N$N$N#TITLE "TURBODOS OPERATING SYSTEM NULL CONSOLE DRIVER" #SUBTTL "COPYRIGHT 1984, SOFTWARE 2000, INC." ; ; COPYRIGHT 1984, SOFTWARE 2000, INC. ; ; VERSION: 01/03/84 ; MODULE "CON192" ;MODULE NAME ; #INCLUDE "DREQUATE" ;DRIVER SYMBOLIC EQUIVALENCES ; LOC Data# ;LOCATE IN DATA SEGMENT ; CONBR:: BYTE 0x8F ;CONSOLE BAUD RATE CODE (19200 BAUD) FFCHR:: BYTE AFF ;FORM FEED CHARACTER INITC: BYTE 0 ;INITIALIZATION COMPLETE FLAG ; LOC Code# ;LOCATE IN CODE SEGMENT ; CONDR_::MOV AL,INITC ;GET INIT COMPLETE FLAG TEST AL,AL ;INITIALIZATION COMPLETE FLAG SET? JNZ __CDRV ;IF SO, CONTINUE CALL __INIT ;ELSE, INITIALIZE CONSOLE CHANNEL __CDRV: MOV AL,DL ;GET FUNCTION NUMBER SUB AL,=8 ;FUNCTION NUMBER=8? JZ CONSO ;IF SO, ERROR SHIFT OUT DEC AL ;FUNCTION NUMBER=9? JZ CONSI ;IF SO, ERROR SHIFT IN JMP SERIAL# ;ELSE, CONTINUE __INIT: MOV INITC,=0xFF ;SET INIT COMPLETE FLAG PUSH DX ;SAVE FUNCTION NUMBER PUSH CX ;SAVE CHANNEL NUMBER/CHARACTER MOV CL,CONBR ;GET CONSOLE BAUD RATE CODE MOV DL,=3 ;SET FUNCTION NUMBER=3 CALL SERIAL# ;SET CHANNEL BUAD RATE MOV AL,FFCHR ;GET FORM FEED CHARACTER TEST AL,AL ;FORM FEED CHARACTER=0? JZ __NITX ;IF SO, CONTINUE POP CX ;ELSE, RESTORE CHANNEL NUMBER PUSH CX ;SAVE CHANNEL NUMBER MOV CL,AL ;FORM FEED CHARACTER TO C-REG MOV DL,=2 ;SET FUNCTION NUMBER=2 CALL SERIAL# ;OUTPUT FORM FEED __NITX: POP CX ;RESTORE CHANNEL NUMBER/CHARACTER POP DX ;RESTORE FUNCTION NUMBER RET ;DONE ; CONSO: CONSI: CALL DMS# ;POSITION TO NEXT LINE BYTE ACR,ALF,0 RET ;DONE ; END #TITLE "TURBODOS OPERATING SYSTEM NULL CONSOLE DRIVER" #SUBTTL "COPYRIGHT 1984, SOFTWARE 2000, INC." ; ; COPYRIGHT 1984, SOFTWARE 2000, INC. ; ; VERSION: 01/03/84 ; MODULE "CON96" ;MODULE NAME ; #INCLUDE "DREQUATE" ;DRIVER SYMBOLIC EQUIVALENCES ; LOC Data# ;LOCATE IN DATA SEGMENT ; CONBR:: BYTE 0x8E ;CONSOLE BAUD RATE CODE (9600 BAUD) FFCHR:: BYTE AFF ;FORM FEED CHARACTER INITC: BYTE 0 ;INITIALIZATION COMPLETE FLAG ; LOC Code# ;LOCATE IN CODE SEGMENT ; CONDR_::MOV AL,INITC ;GET INIT COMPLETE FLAG TEST AL,AL ;INITIALIZATION COMPLETE FLAG SET? JNZ __CDRV ;IF SO, CONTINUE CALL __INIT ;ELSE, INITIALIZE CONSOLE CHANNEL __CDRV: MOV AL,DL ;GET FUNCTION NUMBER SUB AL,=8 ;FUNCTION NUMBER=8? JZ CONSO ;IF SO, ERROR SHIFT OUT DEC AL ;FUNCTION NUMBER=9? JZ CONSI ;IF SO, ERROR SHIFT IN JMP SERIAL# ;ELSE, CONTINUE __INIT: MOV INITC,=0xFF ;SET INIT COMPLETE FLAG PUSH DX ;SAVE FUNCTION NUMBER PUSH CX ;SAVE CHANNEL NUMBER/CHARACTER MOV CL,CONBR ;GET CONSOLE BAUD RATE CODE MOV DL,=3 ;SET FUNCTION NUMBER=3 CALL SERIAL# ;SET CHANNEL BUAD RATE MOV AL,FFCHR ;GET FORM FEED CHARACTER TEST AL,AL ;FORM FEED CHARACTER=0? JZ __NITX ;IF SO, CONTINUE POP CX ;ELSE, RESTORE CHANNEL NUMBER PUSH CX ;SAVE CHANNEL NUMBER MOV CL,AL ;FORM FEED CHARACTER TO C-REG MOV DL,=2 ;SET FUNCTION NUMBER=2 CALL SERIAL# ;OUTPUT FORM FEED __NITX: POP CX ;RESTORE CHANNEL NUMBER/CHARACTER POP DX ;RESTORE FUNCTION NUMBER RET ;DONE ; CONSO: CONSI: CALL DMS# ;POSITION TO NEXT LINE BYTE ACR,ALF,0 RET ;DONE ; END CPMSUPOriginUnitDataCodeXTNTRYIOBYTERIBFCNSIBFCNRLIFCN.WPDFCN<RROFCN\DPBFCNRDFCNRSNFCN`DOÊDU`ú  RS[tZy\OÊTiDOú  RS[tZy\OÊTi xڻ`\O\_QSTiK[$PG0ug̀ẗgWʶXuJW uW G XG Ë\U s RS [ZyË\UD] &C; DEBUGM: POP AX PUSH BX MOV BX,AX CALL DEBUGMBX MOV AX,BX POP BX JMPI AX ; DEBUGMBX: CS MOV AL,[BX] ; load message byte INC BX ; bump pointer TEST AL,AL ; end of message JZ __X ; if so, exit PUSH BX MOV CL,AL ; char to reg CALL SCREEN# POP BX JMPS DEBUGMBX ; __X: RET ; ó!" " 2 >2 22#~:#~ 6*++~ 6*23!^ ! rDirectory for $!~5<@ >: #~ # C>. ~ # Sr, user $ o&ͨ9! Ö­: 2 !4Ã_!3Îr Total of $* ͨͷrkb$r in $* ͨr file$->s !^ >2 ~O0 yO&*  " :J* #"  ~d>:2i>.2#~ux#~  {>. #~  ‹:2 Pү>  ¥ɯ2!K~==!4f. ! rHit any key to continue, ^C to abort$> ! 9>2*|:!JG> x<(*|:KO h:JW> R> > J! ~#$ʀ sa{ 0 ?))) O Ñ ڱ |Ĩ{0_ :\#~:+~͂@##~͂.*̛; y͛!#>  ~#.6!X~# *\~͂*̛ T;TT#V>  8~͂#;\ ʎS͍} \2\P\>2\!6# “>2 >? › *(}'*%}$*"}!*} 8~͂#;\ ʎS͍} \2\; #INCLUDE "DREQUATE" ;DRIVER SYMBOLIC EQUIVALENCES #NOLIST ;SUPPRESS LISTING ; ; ASCII EQUIVALENCES ; ANUL == BYTE 0x00 ;NULL ASOH == BYTE 0x01 ;SOH ASTX == BYTE 0x02 ;STX AETX == BYTE 0x03 ;ETX AEOT == BYTE 0x04 ;EOT AENQ == BYTE 0x05 ;ENQ AACK == BYTE 0x06 ;ACK ABEL == BYTE 0x07 ;BELL ABS == BYTE 0x08 ;BS AHT == BYTE 0x09 ;HT ALF == BYTE 0x0A ;LF AVT == BYTE 0x0B ;VT AFF == BYTE 0x0C ;FF ACR == BYTE 0x0D ;CR ASO == BYTE 0x0E ;SO ASI == BYTE 0x0F ;SI ADLE == BYTE 0x10 ;DLE ADC1 == BYTE 0x11 ;DC1 ADC2 == BYTE 0x12 ;DC2 ADC3 == BYTE 0x13 ;DC3 ADC4 == BYTE 0x14 ;DC4 ANAK == BYTE 0x15 ;NAK ASYN == BYTE 0x16 ;SYN AETB == BYTE 0x17 ;ETB ACAN == BYTE 0x18 ;CAN AEM == BYTE 0x19 ;EM ASUB == BYTE 0x1A ;SUB AESC == BYTE 0x1B ;ESC AFS == BYTE 0x1C ;FS AGS == BYTE 0x1D ;GS ARS == BYTE 0x1E ;RS AUS == BYTE 0x1F ;US ASP == BYTE 0x20 ;SPACE ARUB == BYTE 0x7F ;RUBOUT (DEL) ; LOC 0 ;SYMBOLIC DEFINITIONS RELATIVE TO 0 ; PDRDP: ;PD REQUEST DESCRIPTOR PACKET PDRFCN: RES BYTE 1 ;PD REQUEST FUNCTION NUMBER PDRDRV: RES BYTE 1 ;PD REQUEST DRIVE NUMBER PDRTRK: RES WORD 1 ;PD REQUEST TRACK NUMBER PDRSEC: RES WORD 1 ;PD REQUEST SECTOR NUMBER PDRSC: RES WORD 1 ;PD REQUEST SECTOR COUNT PDRTC: RES WORD 1 ;PD REQUEST TRANSFER COUNT PDRDMA: RES WORD 1 ;PD REQUEST DMA OFFSET PDRBAS: RES WORD 1 ;PD REQUEST DMA BASE PDRDST: RES WORD 1 ;PD REQUEST DRIVE SPEC TABLE ADDR PDRLEN == BYTE .-PDRDP ;PD REQUEST DESCRIPTOR PACKET LENGTH DSKNFO: ;DISK TYPE INFORMATION BLKSIZ: RES BYTE 1 ;BLOCK SIZE NMBLKS: RES WORD 1 ;NUMBER OF BLOCKS NMBDIR: RES BYTE 1 ;NUMBER OF DIRECTORY BLOCKS SECSIZ: RES BYTE 1 ;PHYSICAL SECTOR SIZE (2^N*128) SECTRK: RES WORD 1 ;PHYSICAL SECTORS PER TRACK TRKDSK: RES WORD 1 ;PHYSICAL TRACKS PER DISK RESTRK: RES WORD 1 ;NUMBER OF RESERVED TRACKS DNFOL == BYTE .-DSKNFO ;DISK INFO LENGTH ; RELOC ;RESTORE PREVIOUS LOCATION ; #RELIST ;RESTORE PREVIOUS LISTING STATUS  #TITLE "NEC-APC FLOPPY DISK DRIVER" #SUBTTL "Copyright (c) Multi-Micro Corp." #PAGE 132,66 ; ; DSKAPC.A ; Floppy disk driver for the NEC-APC and TurboDOS. ; ; Version: 6/23/84 ; ; Edit History: ; 6/23/84 jl - Module created. ; 6/24/84 jl - Module assembling but not debugged. ; MODULE "DSKAPC" ; module ID ; #INCLUDE "DREQUATE" ; common driver equivalences #INCLUDE "APCEQU" ; NEC-APC equivalences ; RETRYS == 5 ; number of retrys FDDIREQ == 11 ; FDD Interrupt request number INTRPS == 0 ; -1=interrupts, 0=polled ; ; NEC 765 timer equates ; ND == 0 ; set 765 DMA mode HUT == 240 ; head unload timeout HLT == 38 ; head load delay HUTVAL == HUT/16 ; prep for specify command HLTND == ((HLT/2)<<1)|ND ; prep also ; ; NEC 765 intructions ; SCYCMD == 0X03 ; specify drive parameters SDSCMD == 0X04 ; sense drive status WRCMD == 0X05 ; write sector RDCMD == 0X06 ; read sector RECCMD == 0X07 ; recalibrate SISCMD == 0X08 ; sense interrupt status RIDCMD == 0X0A ; read sector ID FMTCMD == 0X0D ; format a track SKCMD == 0X0F ; seek command ; ; DMA instructions ; DMAWR == 0X15 ; memory write (FDD read) DMARD == 0X19 ; memory read (FDD write) DMAVFY == 0X11 ; memory verify (FDD read) DMAENA == 0X01 ; channel 1 enable DMADIS == 0X05 ; channel 1 disable ; ; Status register 3 bit definitions ; ST3TS == 1<<3 ; two-sided disk ST3RDY == 1<<5 ; drive ready ; ; Pre-defined type code bits ; TSD == 1<<2 ; two-sided disk DDD == 1<<3 ; double density disk MINI == 1<<4 ; mini-floppy disk TPI96 == 1<<5 ; quad density mini floppy ; LOC Data# ; locate in data segment ; DMXSPH: ; mutual exclusion semaphore WORD 1 ; semaphore count WORD . ; semaphore P/D head WORD .-2 ; DWTSPH: ; disk wait semaphore WORD 0 ; semaphore count WORD . ; semaphore P/D head WORD .-2 ; ; 765 read/write table ; RWTBL: DRIVE: BYTE 0 ; drive number TRACK: BYTE 0 ; track number HEAD: BYTE 0 ; head number SECTOR: BYTE 0 ; sector number N: BYTE 0 ; bytes/sector code EOT: BYTE 0 ; end of track GPL: BYTE 0 ; gap length DTL: BYTE 0 ; data length ; ; 765 format table ; FMTBL: FDRV: BYTE 0 ; format drive number FN: BYTE 0 ; format bytes/sector FSC: BYTE 0 ; format sectors/track FGPL: BYTE 0 ; format gap length (3) BYTE 0XE5 ; format filler byte ; RWSTBL: RES 7 ; read/write status table ; ; read/write GAP length table ; RWGAPS: BYTE 0X07 ; 128 bytes BYTE 0X0E ; 256 bytes BYTE 0X1B ; 512 bytes BYTE 0X35 ; 1024 bytes ; TRKTBL: BYTE 0,0,0,0 ; track table (support four drives) ; IOERR: BYTE 0 ; I/O error status byte CURSC: BYTE 0 ; current sector count CURSEC: BYTE 0 ; current sector number CURADR: WORD 0 ; current DMA address ; SECTC: WORD 0 ; sector terminal count RTYCNT: BYTE 0 ; retry counter (set to number of retrys) RECFL: BYTE 0 ; recal flag (set to number of recals) DMAOP: BYTE 0 ; DMA read, write or verify command FDCOP: BYTE 0 ; FDC read or write command ; FLSRT_::BYTE 6 ; drive step rate (patchable) ; ; Function branching table. ; FCNTBL: WORD READ ; function=0, disk read WORD WRITE ; function=1, disk write WORD RETDST ; function=2, return specifications WORD RETRDY ; function=3, return ready WORD FMTTRK ; function=4, format track NMBFCN == (.-FCNTBL)/2 ; number of supported functions ; ; LOC Code# ; locate in code segment ; ; Driver initialization. ; This entry point is called once at system cold boot time and may ; be used to perform any neccessary device initialization. ; DSKIN_:: ; #IF INTRPS ; if interrupts MOV DX,&FDCISR ; get ISR routine address MOV AL,=FDDIREQ ; get FDD interrupt request number CALL INTENA# ; enable interrupts from this device #ENDIF ; INTRPS ; IN AL,FDD_STAT ; read 765 status port INC AL ; is it present? JZ __X ; if not, skip init ; MOV BX,&RWTBL ; use RWTBL for transfer MOV AL,FLSRT_ ; get floppy disk step rate DEC AL NOT AL ; adjust for device MOV CL,=4 ; get shift count SHL AL,CL ; move step value to bits 4-7 OR AL,=HUTVAL ; add in head unload value MOV [BX],AL ; place in table INC BX MOV BYTE [BX],=HLTND ; set HLT and ND MOV CX,=(SCYCMD<<8)|3 ; get command and length CALL CMDRDY ; issue it ; __X: RET ; end of initialization ; ; ; Driver entry point. ; DSKDR_:: MOV BX,&DMXSPH ; get mutual exclusion semaphore CALL WAIT# ; dispatch if necessary CALL __E ; call the disk driver PUSH AX ; save results MOV BX,&DMXSPH ; get mutual exclusion semaphore CALL SIGNAL# ; signal process as ready POP AX ; restore results RET ; done ; __E: MOV BL,PDRFCN[SI] ; get PD request function number CMP BL,=NMBFCN ; check max function number JB __C ; if valid, continue XOR AL,AL ; set error status RET ; and exit ; __C: XOR BH,BH ; make double word ADD BX,BX ; times 2 for table lookup JMPI FCNTBL[BX] ; off to the driver function ; ; ; Function=2, Return disk specifications. ; RETDST: CALL RETRDY ; select and return ready condition TEST AL,AL ; drive ready? JNZ __C1 ; if so, continue RET ; else, exit here ; __C1: ; ; Issue a read ID field in single-density and branch to ; good ID read with AL equal to sector code if successful. ; MOV RECFL,=1 ; set recal flag __DST1: MOV CH,=RIDCMD ; get Read ID command CALL READID ; issue it MOV AL,RWSTBL+6 ; get returned sector size (N) JZ __GID ; if good read ID ; ; Now try a read ID field in double-density and branch to ; good ID read with AL equal to sector code if successful. ; MOV CH,=RIDCMD|(1<<6) ; try double-density next CALL READID ; issue it MOV AL,RWSTBL+6 ; get returned N for FMT sector size PUSHF ; save flags OR AL,=DDD ; set double-density type POPF ; restore flags JZ __GID ; if good read ID ; ; Check the recalibrate flag, and recalibrate the drive if first pass ; through this routine. set recal flag to show recal done. ; DEC RECFL ; check recal flag JS FMTERR ; if retries up, continue error CALL RECAL ; do one recalibrate JMPS __DST1 ; and try format look-up again ; ; AL reg contains the format type as far as density and sector size go. ; Now use the sense drive status command to test for a two sided disk. ; __GID: MOV DL,AL ; hold in register TEST AL,AL ; single density? JNZ __GID1 ; if not, continue MOV AL,RWSTBL+3 ; get cylinder number from results CMP AL,=1 ; track 0 or 1? JA __GID1 ; if not, continue MOV AL,=2 ; load track 2 CALL SEEK1 ; and seek to it JMPS __DST1 ; then check density again ; __GID1: PUSH DX ; save sector type CALL SDS ; sense drive status POP DX ; restore sector type TEST AL,=ST3TS ; test two sided bit JZ __GID2 ; no, FMT correct OR DL,=TSD ; yes, set two-sided type bit __GID2: ; ; Find proper DPB in list ; MOV BX,&DSTBLS# ; get disk spec tables ; __1: CMP DTCO#[BX],DL ; type code correct? JZ __2 ; if so, continue MOV BX,[BX] ; load spec table link TEST BX,BX ; end of list? JNZ __1 ; if not, continue JMPS FMTERR ; format type not found ; __2: ADD BX,=2 ; skip past table linkage MOV PDRDST[SI],BX ; set disk spec table address OR AL,=0XFF ; set return code=FF RET ; done ; ; Branch here if device read errors or format cannot be found ; FMTERR: XOR AL,AL ; force error status RET ; and exit ; ; ; Function=4, format a track ; FMTTRK: CALL RETRDY ; select drive and return ready TEST AL,AL ; drive ready? JNZ __C1 ; if so, continue NOT AL ; else, set AL=FF RET ; and exit here ; __C1: TEST BYTE PDRTRK[SI],=0XFF ; PD requested track=0? JNZ __C2 ; if not, continue CALL RECAL ; else, recalibrate drive __C2: CALL SEEK ; seek to requested track ; MOV BX,&FDRV ; point to drive number in format table TEST BYTE PDRSEC+1[SI],=0X80 ; head number 1 flag set? JZ __C3 ; if not, continue OR BYTE [BX],=1<<2 ; select head 1 in drive field __C3: INC BX ; point to bytes/sector field MOV AL,BYTE PDRSEC[SI] ; get req sector value AND AL,=3 ; extract format sector size MOV [BX],AL ; store in format table INC BX ; point to sectors/track field MOV AL,BYTE PDRSC[SI] ; get req sector count MOV [BX],AL ; store in format table INC BX ; point to gap field MOV AL,BYTE PDRSEC+1[SI] ; get req sector value AND AL,=0X7F ; extract format gap length MOV [BX],AL ; store in format table ; MOV RTYCNT,=RETRYS ; set retry counter __RETRY: MOV AX,PDRBAS[SI] ; get PD request base PUSH AX ; save it MOV CL,=12 SHR AX,CL ; calc extended page MOV DL,AL ; save it POP AX MOV CL,=4 SHL AX,CL ; calc base address ADD AX,PDRDMA[SI] ; add in offset ADC DL,=0 ; add CY into page addr OUT CH1_ADR,AL ; send LSB first MOV AL,AH OUT CH1_ADR,AL ; and MSB second MOV AX,PDRTC[SI] ; get PD request transfer count OUT CH1_TC,AL ; send LSB first MOV AL,AH OUT CH1_TC,AL ; and MSB second MOV AL,DL ; get page addr OUT CH1_EXA,AL ; send page addr MOV AL,=DMARD ; get DMA read memory command OUT DMA_MODE,AL ; send to mode register MOV AL,=DMAENA ; get DMA enable mask OUT DMA_WSM,AL ; send to mask register ; MOV CX,=(FMTCMD<<8)|6 ; get command and length TEST BYTE PDRSEC[SI],=0X80 ; double density flag set? JZ __1 ; if not, continue OR CH,=1<<6 ; set 765 double density bit __1: CALL CMDRDY ; output command to 765 CALL FLWAIT ; wait for completion MOV AL,RWSTBL ; get returned ST-0 AND AL,=0XC0 ; mask error bits JZ __X ; done if no errors DEC RTYCNT ; another retry? JP __RETRY ; if so, loop OR AL,=0XFF ; else get error return __X: RET ; done ; ; ; Function=0, read disk ; READ: MOV DMAOP,=DMAWR ; set DMA mode to write memory MOV DL,=RDCMD ; get FDC read command JMPS RWCOM ; and join common code ; ; ; Function=1, write disk ; WRITE: MOV DMAOP,=DMARD ; set DMA mode to read memory MOV DL,=WRCMD ; get FDC write command CALL RWCOM ; use common routines TEST AL,AL ; test results JZ __C1 ; if good, continue RET ; else, exit here ; __C1: MOV DMAOP,=DMAVFY ; set DMA verify command MOV DL,=RDCMD ; FDC read command ; ; Common routines to both reading and writing. ; RWCOM: ; ; Set up the read or write operation for single- or double- ; density as specified by DDD bit of the format type code in ; the drive specification table. ; CALL RETTCA ; return type code address TEST BYTE [BX],=DDD ; test double-density type bit JZ __SD ; if single-density, continue OR DL,=1<<6 ; set MFM bit-6 in FDC command __SD: TEST BYTE [BX],=TSD ; test double-sided type bit JZ __SS ; if single-sided, continue OR DL,=1<<7 ; set MT bit-7 in FDC command __SS: MOV FDCOP,DL ; store FDC command ; MOV AL,BYTE PDRSEC[SI] MOV CURSEC,AL ; set current sector MOV AX,PDRDMA[SI] MOV CURADR,AX ; set current address MOV AL,BYTE PDRSC[SI] MOV CURSC,AL ; set current sector count ; ; Lookup the values for the GPL and DTL based on the current sector size. ; MOV BL,SECSIZ[SI] ; get the sector size value AND BL,=3 ; mask the sector size bits 0&1 MOV N,BL ; set the N field XOR BH,BH ; make double length MOV AL,RWGAPS[BX] ; get GPL entry MOV GPL,AL ; and patch it MOV DTL,=128 ; preset DTL for single-density TEST BL,BL ; sector size=0? JZ __SD1 ; if so, continue MOV DTL,=0XFF ; set for other sector sizes __SD1: MOV IOERR,=0 ; clear I/O error status byte MOV RECFL,=1 ; set the recal flag ; ; Select in drive through ready test routine (RETRDY) ; RWLOOP: CALL RETRDY ; use subroutine TEST AL,AL ; drive ready? JNZ __C1 ; if so, continue NOT AL ; set AL=FF RET ; __C1: CALL SEEK ; seek to proper track ; ; Select either head-0 or head-1 from the format type value. ; MOV DL,CURSEC ; get current sector CALL RETXLT ; return translation table address JZ __NT ; if no translation required XOR DH,DH ; make sector double length ADD BX,DX ; index into table MOV DL,[BX] ; get translated sector __NT: INC DL ; set sector base to 1 MOV DH,BYTE SECTRK[SI] ; get sectors per track value CALL RETTCA ; return type code address TEST BYTE [BX],=TSD ; test double sided disk JZ __SS ; if not, continue SHR DH,=1 ; find number of sectors per side __SS: MOV BX,&DRIVE AND BYTE [BX],=3 ; reset head select bit MOV HEAD,=0 ; and head match field for 0 CMP DH,DL ; on side 0? JNB __S0 ; if side 0 selected SUB DL,DH ; remove side 1 bias OR BYTE [BX],=1<<2 ; set drive number for head 1 MOV HEAD,=1 ; set head match field for 1 __S0: MOV SECTOR,DL ; set sector MOV EOT,DH ; use as EOT value ; ; Start of reading and writing. NOTE: retry entry point also. ; MOV RTYCNT,=RETRYS ; set retry counter __RETRY: CALL DMANIT ; setup the DMA device MOV CH,FDCOP ; get FDC command MOV CL,=9 ; length of command CALL CMDRDY ; issue command CALL FLWAIT ; wait for completion interrupt MOV AL,RWSTBL ; get ST-0 AND AL,=0XC0 ; mask error bits JZ RWNXT ; if successful operation ; ; Test for a drive not ready condition and branch ; to the error exit routine with the proper result if true. ; TEST BYTE RWSTBL,=1<<3 ; drive not ready? JNZ RWNXT ; if so, continue ; ; Now check the wrong cylinder bit in ST-2. If not true, then branch ; to more error routines. If true, then recalibrate the drive and perform ; a re-seek to the selected track. ; TEST BYTE RWSTBL+2,=1<<4 ; wrong cylinder error set? JZ __E1 ; if not, continue DEC RECFL ; recal done? JS __E1 ; if so, skip it CALL RECAL ; recalibrate the drive JMP RWLOOP ; and re-seek selected track ; ; Check the retry counter for zero and perform preset number ; of retrys to read or write a sector. ; __E1: MOV CL,=ABEL ; get bell character CALL CONOUT# ; output to console DEC RTYCNT ; one less retry JP __RETRY ; if not zero ; RWNXT: MOV AL,RWSTBL OR IOERR,AL ; update I/O error flag CALL RETXLT ; return translate table and status JZ __X1 ; if not present, continue exit ; CALL RETSSZ ; return current sector size ADD CURADR,AX ; set new DMA address INC CURSEC ; bump current sector number DEC CURSC ; check sector count JZ __X1 ; if done, continue exit JMP RWLOOP ; else, continue loop ; __X1: MOV AL,IOERR ; get error status AND AL,=0XC0 ; mask error bits JZ __X2 ; done if no errors OR AL,=0XFF ; set AL=FF __X2: RET ; done ; ; ; Setup DMA controller ; DMANIT: MOV AX,PDRBAS[SI] ; get PD requested base PUSH AX ; save it MOV CL,=12 SHR AX,CL ; calc the extended page MOV DL,AL ; save it POP AX ; restore base MOV CL,=4 SHL AX,CL ; calc page offset ADD AX,CURADR ; add in DMA offset ADC DL,=0 ; add CY to page addr OUT CH1_ADR,AL ; send LSB addr first MOV AL,AH OUT CH1_ADR,AL ; send MSB second CALL RETSSZ ; return current sector size CALL RETXLT ; return translate table and status JNZ __C1 ; if present, cont' with single length MOV AX,PDRTC[SI] ; load PD request transfer count __C1: DEC AX OUT CH1_TC,AL ; send LSB first MOV AL,AH OUT CH1_TC,AL ; send MSB second MOV AL,DL ; get DMA page back OUT CH1_EXA,AL ; send to extended page select MOV AL,DMAOP ; get DMA operation OUT DMA_MODE,AL ; send current DMA mode MOV AL,=DMAENA ; get channel 1 enable command OUT DMA_WSM,AL ; enable DMA controller RET ; done ; ; ; Function=3, return drive ready status ; RETRDY: MOV AL,PDRDRV[SI] ; get disk number CMP AL,=4 ; test for valid drive number JAE __NR ; if invalid, return not ready IN AL,FDD_STAT ; read 765 status port INC AL ; is it present? JZ __NR ; if not, return not ready status CALL DSKSEL ; select in drive CALL SDS ; test drive status TEST AL,=ST3RDY ; test ready status JZ __NR ; if not, return not ready OR AL,=0XFF ; set drive ready status RET ; and exit ; __NR: XOR AL,AL ; clear AL for not ready RET ; and exit ; ; ; Drive select subroutine. ; The new drive is checked against the current drive selected ; on the board and if not the same, the track table is used to store the ; old track number and get the new drives track number, then the new drive ; is selected on the board. ; DSKSEL: MOV DL,PDRDRV[SI] ; get drive number AND DL,=3 ; mask valid bits MOV AL,DRIVE ; get current drive AND AL,=3 ; mask to drive number CMP AL,DL ; same as new? JZ __X ; if so, skip select MOV BL,AL ; old disk to reg XOR BH,BH ; prep for double add MOV AL,TRACK ; get track from RW table MOV TRKTBL[BX],AL ; and place in track table MOV BL,DL ; get new disk to reg MOV AL,TRKTBL[BX] ; get entry from track table MOV TRACK,AL ; and place in RW table MOV DRIVE,BL ; set drive number in RW table MOV FDRV,BL ; and drive number in FORMAT table __X: AND DRIVE,=~(1<<2) ; select head 0 in drive field AND FDRV,=~(1<<2) ; select head 0 in drive field RET ; done ; ; ; Recalibrate the current board selected drive. The 765 recalibrate ; command is issued and the track field in the RW table set to 0. ; RECAL: MOV CX,=(RECCMD<<8)|2 ; get recal command and length CALL CMDRDY ; issue command CALL FLWAIT ; wait for completion XOR AL,AL MOV TRACK,AL ; reset track field in RW table RET ; done ; ; ; Seek to PD requested track number. ; SEEK: MOV AL,BYTE PDRTRK[SI] ; get selected track CMP AL,TRACK ; same as current? JZ SKX ; if so, continue exit SEEK1: MOV TRACK,AL ; put in RW table MOV CX,=(SKCMD<<8)|3 ; get seek command and length CALL CMDRDY ; send command CALL FLWAIT ; wait for completion SKX: RET ; ; ; Issue sense drive status command and retreive results. ; SDS: MOV CX,=(SDSCMD<<8)|2 ; get sense drive status command CALL CMDRDY ; issue it CALL CMDRES ; read results MOV AL,RWSTBL ; get ST-3 RET ; with it ; ; ; Read sector ID field. The B register contains either a single- ; or a double-density read ID command. The command is issued and ; ST-0 error bits mask. ZERO flag is set if no error occured. ; READID: MOV CL,=2 ; length in C CALL CMDRDY ; issue command CALL FLWAIT ; wait for completion MOV AL,RWSTBL ; get status AND AL,=0XC0 ; mask error bits RET ; with Z set for success ; ; ; Send command to NEC 765 subroutine. ; initial command in CH reg, additional bytes are sent from the ; beginning of the READ/WRITE table as requested by the 765. ; If command in CH reg is a format command, the FORMAT table is used. ; reg CL contains the number of bytes that should be transfered. ; CMDRDY: IN AL,FDD_STAT ; get main status register TEST AL,=1<<4 ; mask FDC busy bit-4 JNZ CMDRDY ; loop if busy PUSHF ; save flags CLI ; and disable interrupts MOV BX,&RWTBL ; point to RW table MOV AL,CH ; get 765 command AND AL,=0X0F ; mask command bits CMP AL,=FMTCMD ; format command? JNZ __C1 ; if not, continue MOV BX,&FMTBL ; point to FORMAT table ; __C1: IN AL,FDD_STAT ; get main status register TEST AL,=1<<7 ; test RQM JZ __C1 ; loop if not ready TEST AL,=1<<6 ; test DIO for direction JNZ __X ; if 765 full MOV AL,CH ; get byte for output OUT FDD_DATA,AL ; send it MOV CH,[BX] ; get next byte for output INC BX ; bump RW table pointer DEC CL ; count=count-1 JNZ __C1 ; loop if more to send __X: POPF ; restore intrp status RET ; done ; ; ; Receive NEC 765 result phase subroutine. ; The results of an operation are read out of the 765 as ; requested to be read by the DIO bit-6. The results are loaded ; into the RW status table. ; CMDRES: PUSHF ; save machine status CLI ; disable interrupts MOV BX,&RWSTBL ; set result table pointer ; __C1: IN AL,FDD_STAT ; get main status register TEST AL,=1<<7 ; test RQM JZ __C1 ; loop if not ready TEST AL,=1<<6 ; test DIO JZ __X ; if done receiving IN AL,FDD_DATA ; get result byte MOV [BX],AL ; store data in table INC BX ; bump table pointer JMPS __C1 ; and loop for more __X: POPF ; restore intrp status RET ; ; ; Disk wait subroutine. This is called when waiting on the 765 ; to perform an operation in which it will interrupt when completed. ; FLWAIT: #IF INTRPS ; if interrupts ; MOV BX,&DWTSPH ; get disk wait semaphore JMP WAIT# ; wait for completion ; #ELSE ; MOV DX,&FDCPOL ; get poll routine addr CALL LNKPOL# ; add to poll list MOV BX,&DWTSPH ; get disk wait semaphore JMP WAIT# ; wait for completion ; #ENDIF ; INTRPS ; ; ; Get translate table address. Z flag set if no table. ; RETXLT: MOV BX,PDRDST[SI] ; get disk specifications offset MOV BX,XLTBL#[BX] ; get translation table offset TEST BX,BX ; translation required? RET ; exit with status ; ; ; Return current drive type code address as [BX]. ; RETTCA: MOV BX,PDRDST[SI] ; get disk specifications offset ADD BX,=TYPCOD# ; index to type code address RET ; all done ; ; ; Return the current sector size in bytes. ; RETSSZ: PUSH CX ; save reg MOV CL,SECSIZ[SI] ; get PD request size code MOV AX,=128 ; get base sector size SHL AX,CL ; calc physical byte count POP CX ; restore reg RET ; and exit ; ; #IF INTRPS ; if interrupts ; ; TurboDOS floppy disk interrupt service routine ; FDCISR: PUSH AX PUSH BX PUSH CX PUSH DX ; save regs PUSH DS ; save user data seg CALL GETSDS# ; get system data seg CALL FLINT ; process 765 interrupt request JC __NSIG ; if ready change int, no signal MOV BX,&DWTSPH ; get disk wait semaphore CALL SIGNAL# __NSIG: MOV AL,=FDDIREQ ; get interrupt request level CALL SIGEOI# ; do specific EOI command POP DS POP DX POP CX POP BX POP AX ; restore regs JMP ISRXIT# ; continue with interrupt ; #ELSE ; ; TurboDOS polling routine for FDD interrupts. ; FDCPOL: WORD 0 WORD 0 ; poll linkages ; PUSHF ; save machine status CLI ; disable interrupts MOV AL,=0X0A OUT SIC_P0,AL ; OCW3=read IRR IN AL,SIC_P0 ; read IRR POPF ; restore intrp status TEST AL,=1<<4 ; test FDD IREQ JZ __X ; if not ready, continue CALL FLINT ; process end of operation JC __X ; if false alarm, continue MOV BX,&FDCPOL ; get poll routine addr CALL UNLINK# ; and remove it MOV BX,&DWTSPH ; get disk wait semaphore CALL SIGNAL# ; signal process ready __X: RET ; #ENDIF ; INTRPS ; ; Now the 765 result phase must be performed for any interrupting ; type of command. If the 765 busy bit is set, the results from a ; read or a write type command must be read. If the 765 busy bit is ; not set, then a sense interrupt status command is sent and the ; results of a seek, recal, or drive ready change interrupt are read out. ; FLINT: IN AL,FDD_STAT ; get main status register TEST AL,=1<<4 ; busy? (read or write in process) JNZ __RWD ; yes, read results out MOV CX,=(SISCMD<<8)|2 ; get command and length CALL CMDRDY ; issue sense interrupt status command __RWD: CALL CMDRES ; read the results MOV AL,RWSTBL ; get ST-0 AND AL,=0XC0 ; mask error bits CMP AL,=0XC0 ; drive ready change? STC ; preset CY flag JZ __X ; if so, continue exit MOV AL,=DMADIS ; get DMA disable command OUT DMA_WSM,AL ; disable DMA device XOR AL,AL ; clear CY flag __X: RET ; exit ; END DSKAPC>DataCodeWAITSIGNALDSTBLSDTCOCONOUTLNKPOL XLTBL TYPCOD UNLINK3FLSRT_DSKIN_#DSKDR_ a a  5!dCLGPt` `3б C&  û` P`XÊr00`4 ^u`0 `tJ ` t `0x? ݈„u`<w R Zt`8`tu \ 0  uDu 4 @`DtCD$CDCD$`/D P XD D:  Dt@  M`$t`/z `1`1 t`1 1t@tʀ`2D`*D `+D`)\`0` ``t``(`0 u G`*  t0ӊŠt t` '` 8s (``6``/ b.`2 ( j`$t%`u`t `0x `/zŠ``( @t M`+`*`)t T`($t ËD P X`+   uDH:`1 ÊD<sPt e t 0ÊT` $8t0` `$ӊ`$` ` `&` &`ù  : |0` ÊD:` t `   aù   ?`ñ K` $Pu` $< u`Pt@u R/CuÜ`Pt@tRCú``\ `Ë\ `QL Y! ((t r ` `Pu  c ` $`$ : 1 , 䢨 t䠪  䢨u`$$`<@_0ÊD22 6(0械0橰0昍(!û! P!XÊr00U!J!D0 !!DD41)э:!GWD9ȉGGDGD G D G V.u&[D+GtL DD؉DDS[!TDƀ:!u;!tCPSR%!&'!'!&)!)!!$!t!t (!Z[X6+!6.!,!1!!t |u| t/1!!e*!t!t(!$!yW !|L\ !\ u ،Žڎs_!"!0#!!"0QY00/@䢨 tCI 䢨uC撈䖨ttH䢨uz䖨tq䒨te`䢨uWP䖨tێW>2!; 2-䢨 t䠪䢨u2!$`<@_0ÊD !!!!hP @jqZg XHDCTST DataCodeDSKINXDSKDRXWAITSIGNAL#` ` 6``  (REBUILD DISK MAP) ; #RELIST ;RESUME PREVIOUS LISTING STATUS  ; Segment containing track buf DIRTYBUF: BYTE 0 ; Flag set 1 if track buf dirty CLKCHK: BYTE 0 ; Number of ticks since check ; ; Command blocks and related declarations ; SEEKOP == 0X68 ; Seek operation command SEEKCMD == . ; Seek command block BYTE 2 ; Number of parameters to seek SEEKCYL: WORD 0 ; Hi byte, Lo byte of cylinder SEEKCDRV: BYTE SEEKOP ; Seek command with drive ; RECALOP == 0X50 ; Recalibrate operation command RECALCMD == . ; Recalibrate command block BYTE 0 ; Number of parameters to recal RCDRV: BYTE RECALOP ; Recal command with drive ; READCMD == 0XB0 ; Read operation command DMAREAD == 0X15 ; DMA read mode command XFERCMD == . 8C;0..&.8C.& ..&τt2u.t4u.t.u7*V.A;^0.u.&.8C.&Dg0\m$nT  sAtRST[T[U[OAt.[\UYu.YYu؎ڱ3຀.o. .u , k@   : @T utVtXtNtP<t,tBt0ttt>Read>Write >Not ready> error, Drive: DA,0<t?>, Track: \>t>, Sector: \S>[TJtSS> - [=H> (Retry, <t 5>Ignore, )>Abort) I/te/`/P/X >(t"(sUsUtbfUR /[Cu\ChUxhUbUulUU< uU< u CCMCDUUUtUUtU;@ujUU"6t!tU &t tUUlU"rڈCځGVrsKUUػU.jU\S< UxUt UKlUs? UNUu#qUt;CuhUð  >sUu±>sUu  0MHDCTST,HDCAPC epare to write and seek PUSH BX PUSH DX CALL DISKFLS ; Write track buffer if dirty MOV SEEKCYL,BX ; Setup seek command block AND SEEKCDRV,=0XF8 ; Eliminate drive from block OR SEEKCDRV,DL ; Include new drive AND RCDRV,=0XF8 ; Eliminate drive for recal cmd OR RCDRV,DL ; Include new drive MOV RETRIES,=MAXRTRY ; Setup retry counter __C: LEA BX,SEEKCMD ; Issue seek command CALL SENDCMD JE STREAD ; Was seek successful ? DEC RETRIES ; No, are there more retries ? JE SEEKERR LEA BX,RECALCMD ; Yes, recalibrate disk CALL SENDCMD JMP __C ; Go reissue seek command SEEKERR: ADD SP,=6 ; Trash saved parameters XFERERSCRAPC3DataCodeWAITSIGNALTABSIZCURSORSLFLAGSCREENCSRCHKCSRENA! a!:  ibEQ=*TYCjk^_qlm.[(olQ fHCABDJKmMh>k-'!UOhLlhKB@N@R@@@@@E@oBFB@GBP@JB@@KB@!@@IB@@ B@@0B@B pB@@@@@@@@LB@@@!.VWQ`Y ` _^؎`uQ` f  `Y`&`` J``` u'>`u$ s`:ȹ u )`D #` r`  y` ` ` TÀ>`t`u```` ``` !`  (`   >`u` 0ty `tu0PrOy `t0:` r:` v` `t  uƀPr)0>`u `@t O:` v `t` `t  u` >` r`  R ZÈ0`` (u$ s:ȹ u )D#t{VÀ>tut !( >u0ty tu0PrOy t0: r: v t uƀPr)0>u @tO: v t t u > r R ZÈ0(RxZR0€rZ/&&rf rP0à P&* &1& &* !R'C0t@uWCCZ@t@t@ 7co =*TYCjk^_qlm.[(ofHCABDJKmMh>9KE? &`` R0  ZR00 Zø P(Ȣ`#&`% B` ` ` >` ` Rx ZR 0€rZ /`&``  `&`` r ` f ` rP0à` P`&`*` `&`1`&`` `&` *`   !R'C0t@uWCCZ@t@t@ sequence BEGROW: BYTE 0 ; beginning row number ENDROW: BYTE NMBROWS-1 ; ending row number TOPROW: BYTE 0 ; current top row number TMPROW: BYTE 0 ; temp row storage area CSRDLY: BYTE 0 ; cursor delayed enable counter ; SMXSPH: WORD 1 ; screen mutual exclusion semaphore WORD . WORD .-2 ; ; ANSII sequence variables ; ASCSIZ == 32 ; number of bytes to buffer ASCBP: WORD 0 ; index of next char to store ASCADR: WORD 0 ; address of cursor move rtn ASCOPT: BYTE 0 ; True if in ANSII option mode ASCBUF: RES ASCSIZ ; buffer for ANSII sequences ASCBUFE == . ; end of ANSII buffer ACSPRM == 0X05 ; cursor option parameter # ; ; ; ; ASCII control code lookup table. ; CTLTBL == . ; base of the lookup table BYTE 0X07 ; #1 BYTE 0X08 ; #2 BYTE 0X09 ; #3 BYTE 0X0A ; #4 BYTE 0X0B ; #5 BYTE 0X0C smhLliB@N@R@@@@@E@oBFB@GBP@JB@@KB@!@@IB@@ B@@0B@B pB@@@@@@@@LB@@@!.ess DMA == 1<<4 ; DMA execute VS == 1<<5 ; vertical sync active HB == 1<<6 ; horizontal blank active ; ; GDC commands ; RESET == 0X00 ; reset controller SYNC == 0X0E ; SYNC format specify VSYNC == 0X6E ; vertical SYNC mode CCHAR == 0X4B ; cursor and char characteristics START == 0X6B ; start display and end idle mode BCTRL == 0X0C ; display blanking control ZOOM == 0X46 ; zoom factor control CURS == 0X49 ; cursor position specify PRAM == 0X70 ; parameter RAM load PITCH == 0X47 ; pitch specification WDAT == 0X20 ; write DATA into display memory MASK == 0X4A ; mask register load FIGS == 0X4C ; figure drawing parameters specify FIGD == 0X6C ; figure draw start RDAT == 0XA0 ; data read commands CURD == 0XE0 ; cursor address read DMAR == 0XA4 ; DMA read request DMAW == 0X24 ; DMA write request ; ; LOC Data# ; locate in data segment ; ; User defined tab size. ; NOTE: Set to desired tab size 2 through 16. ; TABSIZ::BYTE 8 ; default tab si8C;0..&.8C.& ..&τt2u.t4u.t.u7*V.A;^0.u.&.8C.&Dg0\m$nzQ  sAtRSQ[Q[QpXOAt.nXRVu.VVu؎ڱ3຀.o. .u , k@   : @T utVtXtNtP<t,tBt0ttt>Read>Write >Not ready> error, Drive: DA,0<t?>, Track: \>t>, Sector: \S>[TJtSS> - [=H> (Retry, <t 5>Ignore, )>Abort) I/te/`/P/X >(t"(%R%RtbRR /[Cu\CRxRRuR7R< u?R< u CCMCD;CuRð  >%Ru±>%Ru  0MDS\UD]&&_S[&RTDU&< uCڻ'RSQ[rEtu)r:t"<.tG<:tK/Rr#t6uru+< u r uJZS&R،{:[[\Oð(t'RC<0r<:s<,0Ġ5Rt5RQ3Rrrrrr< s 3RYt$Y/?;:'"^"OOOPOQOROSOTOUOVOWOXOYOZHH`````È< tttt ,t t0  u` t``Ë` ۊ`t t  B10;`tC``9u`C/S`t`À>`t`` J$tH`(L$/Nt@tʀH`uԀt{1Ў .``C``9u`;`tC``R Zð t`2r` ZY[X #RELIST ; restore listing status RTCNULOriginUnitDataVCodeLNKPOLDLYTICSETDRFRTCNITSETDR1%SETDR2`!`uð u0LSTUt$ttt us `` t`J* ~* ~@* ~2I!\ {* & { !\y* !&y * ^\ * ^* :I   ! ͢Loading: $ͭ͘͢* 6͎ Cannot SAVE, Disk Read Only.$͎͢ Cannot SAVE, File Read Only.$͢*|:KO o:JW> Y> > Q! # ~#{*(}'*%}$*"}!*}!]Ϳ>. ÿ ~#!ڿ ÿ~#$ *|>GyPG> x< ~#SCRAPCDataCodeWAITSIGNALTABSIZCURSORSLFLAGSCREENCSRENACSRCHK! a 7  i~?" =*TYCjk^_qlm.[m'8>DJP[ag!`B@N@R@@@@@E@oBFB@GBP@JB@@KB@!@@IB@@ B@@0B@B pB@@@@@@@@LB@@@ !.VWQ`Y ` _^؎`uQ`   `Y`&`` ``` u s`7ȹ ``ÿ`` ``õ r ` `` õP rΊ` 8``!õ rȱ&``À`À&`À`À&`À&``À`À&```nõ 8r,&`r#` 0`` C À r8À0r`  1҉` vPH`&`` ` ` d` &`` @ P(Ȣ`&`` ` ` .` ` R 0€rZ /`&``  `&`` r ` f ` rP0à` P`&`*` `&`1`&`` `&` *`  !R'C0t@uWCCZ@t@t@<D_D]D[DYDWDUDSDQDOtËdaDODetP',D_t]l[|YtWTULS\QDOt^2V[-Ɖ\QLSTUDW|Yl[D]D_DO1rKDSuT<+%T3uTs(Tt)r(WSZڄuWO QR[ZYFYT(uTx5TD&u_!TTՊD( ȈD0D( D(tuvuD0u/D/@u)\(ST0)Ӊ\(r{[\(t {y5TT9t T1A2LT\1Uy\1WT9Ӊutw-@ttkt!lmtDt\1G_t0D&t\+D-T+l-D&tڕVD&t@KD0:rD( D0D(CD(CD)CD*CTD/tD0C':DU$TDV<sTT&TDQÊDUtÊDUolVt  ӉTTt S[uT9trӉ\1t:Ouŀu uPxGu@t2Q%tuY@ Y@tQgY utw\1ttAŀt<t$`<`u/QTˋtSQY[DujTYTT9t Ӏ'߉tuËTQYŀt QY0ûTT09tS [t\1Ãd'D'VD':uFC0^d'uD0:r uD/tDmÀ'XtJD$T:Dsu tu%_VCDF^\1GD"GD 0/\1xT{\1dTo #uú   \1ÊD'"TT9TQSTˉTTTڊ:uBCB['KYyË\UD]"t6TDDDOt.<u(\UD]T&ӋT l <s<sDOÈDDD,r uu;ËL$IDxAL\$ \TDdx\ǀuڹA)syIAx )sڋ\ˋL D"D L \TڋLˇڋ\)s,Sˉ\Q ZuH\ LډӉ\7\C뻊D\T0)s؎otDtt<Dx\ÊD$¶TӋu%S*uDtjUVu؋jUQ\jUEY[ ÌػV.V0<V?HVGt'QVW@u¹VVS[Y͸DO=ta>V1rZVtSUUlU!ބu?u: Ut.SPWXG[GS_&[lU:ޏDlDj|OuQrTtjtlPDjllQXUHP$X@Q1Ƅ@DlY]XDlDjU jUU]YúlU݄$VúV9ݠTVDO\_Ë\UD]&R&G&G[* eP$X$t DO&Gñ 6݁*؋\UD]&&G&G, s ËDU=tVáVDOÀDS0t DTDUDQË\QLjTUDl1TULS\QDO< s< t < t< t<uPXDOÊDU< s(< t < u$VV$*VQ YVDOÊLUDUtttl gteDOË\UD]&C:Vt S[Ë\UD]i6DOË\UtVàVDOË\UD]&O&&CIQS@[Yò :Vt&ut`t:VtVt::Vt!:Vt:Vt:Vuڀu;tQY DgtȴVÊ/gVuFCtjtl\j\lTnRVDnƄVZTnDlDjVtG*Ê< t<utVV Vհ ËDUuDnVuWVt WVPPu:V%Au+Vڌ݋\UD] VG G ڱ&ڄtDOÃV z#`tVS1[ Vt Vt4/SDnPVDnڱXDn[ËVËVV)VV&/C&SC0P<t<< s<t4< t5<t<<t8XP8s&CXP< s@Q^VYNX[&uZXtPK&< sXPRSQR  ZY[SQ;Y[SQY[Ë\UD]&O&IQ&CS[YË\UDT tLQS[Yt <sDhbWtbWTUt \Q&DOñ8*PW@؎мWlW[ SR[uZYu5QS[C[WGNWYODYYGF_HW3RlW[0ËTQ\US[\U\Qq_ûxWPVW@uD7@u DLlWb%^Xπd7D7@tL7L7@D7ud7ÀWWuÀ&WlWx0\Ut\8rW\LW@D:\T@lB|DdFTHDJ؎мW&WtxWxWt 7G[W u#ƻlW\LxlWW lWtƎDJTHdF|DlBT@L>\Wt 9WsWr)+XuHWûX)G)ȱË\U\QDOÉW)sWWWWWtWW@@)t/r9WrWWڋWtW=r GËWBB$'0ËWWBB)Ӱr;Wr WCCW0Ë\UWWWWt5W9tG;WtWRZWWRZW뺋WWWWtHH;WtGW0ý"uVýuaý3tBý*tODSttW)G(XڰDODStDOËG+GG)GAOڋ+G7wG)OSWPWڻWXW[GڻW/DSTUT]WGt ;r9r DOàWPGW>(Xu(WGtW:Gs SQLY[GXWorKOGGW7wG)OSڻW^[GWPWڻWBXWDOXWûW$WWXXRQWYZù(CWt/W:Gu2G;tG;u)ËGGáWuW⻋WtWGڋOډOU]W$XWuډwr0G+Gs/>Wt؀>WWu;WsWW⺠WWt>WWuWûW$XW:Gs rtËGtڋ+rPG++GXr9 ڕ\UD]$XݹWW00*XùCty$8u ;uCCQYô'd ĺ)sӄut 0PS[XËGډGË_OWډO[.CtS[X2rXZY[XHHF*XXXXÈ< tttt ,t t0$ uMX tXËX0;XtCXX9uX PSQR#;ZY[XX9XuLt >XtXÀ>XtXXJ$tHX(L$/Nt@tʀH<^r sXZu. s)Q~#YYȹ u )Y#ZtZ{ZZYVÀ>YtYuYYt ZZY%IZ!Z(Z >YuY0ty Ytu0PrOy Yt0:Yr:YvYYt uƀPr)0>Yu Y@tO:Yv YtYYt uY>YrYR ZÈ0YY(ZZRxZR0€rZ/Z&ZZZ&ZZrZfYrP0àYPᢺZ&Z*YࢾZ&Z1Z&ZYZ&Z*Z!R'C0t@uWCCZ@t@t@PtZ[б C&ûZ7 PZ2XÊr00[^u[ ZtJZ t [x?݈„uZ<wRZt[8tu \ 0uDu4@ZDtCD$CDCD$[D P XD D:  Dt@ MZ$t[z [[ t[1t@tʀ[D [D [D [\Z0[ZZtZ[[uG [t0ӊŠttZ'Z8s (ZZ6Z[b.[ (jZ$t%ZuZt [x[zŠZ[@tM [ [ [tT[$t ËD P X [uDH:[ ÊD<sPt e t 0ÊTZ$8t0Z[ӊ[ZZZ&Z&Zù:|0ZÊD:Zt Zaù?Zñ KZ$PuZ$< uZPt@u R/CuÜZPt@tRCúPrZ\ Ë\ QLY ((tr PZPucZ$>;<&&(;;;2$'&;5L !=,*.**X9*779*X::::: ;;3DIRDSKTTTTQMQM..../.. //////#/w/z/~////$ DSK1$ EVV*X-PRINT-?000nWnWtWtWxWxW`WW C2NEC-APCC3 SINGLE USERC6 (10/05/84)C5$@?@XX(-*+-./0123456789   -=@`:;;'1!2#3@4$5%67&8*9(0)-_=+`~[{]}\|,<.>/?;:'"^YY ?HmH IHHH]HK8HYH=*TYCjk^_qlm.[(JKLVLK=KCKIKOKUK`KfKlK>I KKfHCABDJKmMh>`J`JJJJJJJII`J2JhLl>JOJOJVLFLKL LLB@N@R@@@@@E@oBFB@GBP@JB@@KB@!@@IB@@ B@@0B@B pB@@@@@@@@LB@@@!.ZZZZ5qNzNuMOM/[hM5@[ P?5Q[ (5b[4M 5s[P;5[(5[4M[M[[@[4M\ M[         #&),/2!$'*-03"%(+.1 #TITLE "NEC-APC Smart Screen Driver Interface" #SUBTTL "For the TurboDOS operating system" #PAGE 132,66 ; ; SCRAPC.A ; ; Version date: 8/18/84 ; ; Edit History: ; 7/12/84 jl - Module Created. ; 8/18/84 jl - Added cursor delayed enable feature ; MODULE "SCRAPC" ; module ID ; #INCLUDE "DREQUATE" ; common driver equivalences #INCLUDE "APCEQU" ; common NEC-APC equivalences ; PEEKNG == 00 ; if desperation debugging SCRTST == 00 ; if screen test version ; ; Some screen parameters ; NMBROWS == 26 ; number of user rows NMBCOLS == 80 ; number of user columns STATROW == 25 ; status row CSRCNT == 2 ; delay in ticks for cursor displaying ; DEFATTR == 0X80 ; green with no special attr ALTFONT == 0X89 ; alternate character set ATTROFF == 0X1000 ; attribute memory offset constant ; A0 == 0X30 ; constant 0 A1 == 0X31 ; constant 1 A9 == 0X39 ; constant 9 ASC == 0X3B ; constant ; ; ; GDC status register definition ; DR == 1<<0 ; data ready in FIFO FF == 1<<1 ; FIFO full FE == 1<<2 ; FIFO empty DW == 1<<3 ; drawing in progress DMA == 1<<4 ; DMA execute VS == 1<<5 ; vertical sync active HB == 1<<6 ; horizontal blank active ; ; GDC commands ; RESET == 0X00 ; reset controller SYNC == 0X0E ; SYNC format specify VSYNC == 0X6E ; vertical SYNC mode CCHAR == 0X4B ; cursor and char characteristics START == 0X6B ; start display and end idle mode BCTRL == 0X0C ; display blanking control ZOOM == 0X46 ; zoom factor control CURS == 0X49 ; cursor position specify PRAM == 0X70 ; parameter RAM load PITCH == 0X47 ; pitch specification WDAT == 0X20 ; write DATA into display memory MASK == 0X4A ; mask register load FIGS == 0X4C ; figure drawing parameters specify FIGD == 0X6C ; figure draw start RDAT == 0XA0 ; data read commands CURD ==TAT == 0X92 ; Controller status register ; ; ; ; Function branching table. ; FCNTBL: WORD READ ; function=0, disk read WORD WRITE ; function=1, disk write WORD RETDST ; function=2, return specifications WORD RETRDY ; function=3, return ready WORD FMTTRK ; function=4, format track NMBFCN == (.-FCNTBL)/2 ; number of supported functions ; ; INMSG: BYTE "Into drvr",13,10,0 OUTMSG: BYTE "Out of drvr",13,10,0 LOC Code# ; locate in code segment PRINT: PUSH AX PUSH CX PUSH DX __1: MOV CL,[BX] OR CL,CL JZ __2 PUSH BX CALL SCREEN# POP BX INC BX JMP __1 __2: POP DX POP CX POP AX RET ; ; Driver initialization. ; This entry point is called once at system cold boot time and may ; be used to perform any neccessary device initialization. ; #IF DEBUG DSKINX:: #ELSE DSKIN_:: #ENDIF XOR AL,AL ; Reset hard disk OUT RESET,AL OUT FMTREG,AL MOV AL,=0X80 ; Perform black magic OUT FMTREG,AL XOR AL,AL OUT FMTREG,AL OUT DMACMD,AL ; Clear out DMA command reg MOV AL,=0X0E ; Clear out DMA mask reg OUT DMAMK,AL XOR AL,AL ; Clear out interrupt mask OUT DMAIMK,AL LEA BX,RECALCMD ; Issue recalibrate command CALL SENDCMD ; RET ; end of initialization ; ; ; Driver entry point. ; #IF DEBUG DSKDRX:: #ELSE DSKDR_:: #ENDIF MOV BX,&DMXSPH ; get mutual exclusion semaphore CALL WAIT# ; dispatch if necessary CALL __E ; call the disk driver PUSH AX ; save results MOV BX,&DMXSPH ; get mutual exclusion semaphore CALL SIGNAL# ; signal process as ready POP AX ; restore results RET ; done ; __E: MOV BL,PDRFCN[SI] ; get PD request function number CMP BL,=NMBFCN ; check max function number JB __C ; if valid, continue XOR AL,AL ; set error status RET ; and exit ; __C: XOR BH,BH ; make double word ADD BX,BX ; times 2 for table lookup JMPI FCNTBL[BX] ; off to the driver function ; ; ; Function=2, Return disk specifications. ; RETDST: LEA AX,DSTTBL ; Get address of descriptor MOV PDRDST[SI],AX JMP RETRDY ; Return ready status ; ; Branch here if device read errors or format cannot be found ; FMTERR: XOR AL,AL ; force error status RET ; and exit ; ; ; Function=4, format a track ; FMTTRK: OR AL,=0XFF ; force result error RET ; and exit unsupported routine ; ; ; Function=0, read disk ; READ: MOV WRFLAG,=00 ; Clear write flag JMPS RWCOM ; and join common code ; ; ; Function=1, write disk ; WRITE: MOV WRFLAG,=01 ; Set write flag ; ; Common routines to both reading and writing. ; RWCOM: LEA BX,INMSG CALL PRINT MOV CL,=06 ; Multiply track by 64 for MOV AX,PDRTRK[SI] ; ...virtual sector # SHL AX,CL ADD AX,PDRSEC[SI] MOV CX,=52 ; Calculate actual track/sector XOR DX,DX DIV CX ; AX := Track, DX := Sector SUB CX,DX ; CX := Sectors left in track LEA BX,LOCPDR ; Get address of local PDR MOV PDRTRK[BX],AX ; Save actual track number MOV PDRSEC[BX],DX ; Save actual sector number MOV AX,PDRSC[SI] ; Get sector transfer count CMP CX,AX ; Does I/O go off track ? JG __1 MOV AX,CX ; Yes, use actual count __1: MOV PDRSC[BX],AX ; Save new sector count MOV CL,=07 ; Calculate byte count as SHL AX,CL ; ... sector count * 128 MOV PDRTC[BX],AX ; Save new byte count MOV AL,PDRDRV[SI] ; Move drive number across MOV PDRDRV[BX],AL MOV AX,PDRDMA[SI] ; Move DMA start address across MOV PDRDMA[BX],AX MOV AX,PDRBAS[SI] ; Move DMA segment across MOV PDRBAS[BX],AX PUSH SI ; Save address of real PDR MOV SI,BX ; Pass in fako PDR CALL __COMN ; Perform actual I/O OR AL,AL ; Was I/O operation good ? JNZ __99 POP BX ; Yes, see about more I/O MOV AX,PDRTC[SI] ; Get old transfer count MOV CX,AX SUB AX,PDRTC[BX] ; Is there anything left ? JZ __98 ADD PDRDMA[SI],CX ; Yes, move buffer pointer up INC WORD PDRTRK[SI] ; Move to next track MOV WORD PDRSEC[SI],=0000 ; Move to first sector NEG AX ; Get number of bytes left MOV PDRTC[SI],AX ; Save new number of bytes MOV CL,=07 ; Calculate number of sectors SHR AL,CL MOV PDRSC[SI],AX ; Save new number of sectors PUSH BX ; Save original PDR again CALL __COMN __99: POP BX ; Restore original PDR __98: MOV SI,BX LEA BX,OUTMSG CALL PRINT RET __COMN: MOV DRVRBUSY,=01 ; Do not let clock in MOV DL,PDRDRV[SI] ; Get new drive number MOV AX,PDRTRK[SI] ; Get new track number MOV DH,AL ; New head is bits 0:2 AND DH,=07 MOV BX,AX ; New cylinder is bits 3:15 SHR BX,=1 SHR BX,=1 SHR BX,=1 XCHG BH,BL ; NEC wants hi byte, low byte CMP DL,CURDRIVE ; Are we accessing buffered trk? JNE __FLUSH CMP BX,CURCYLDR JE LOOPIO __FLUSH:PUSH AX ; No, prepare to write and seek PUSH BX PUSH DX CALL DISKFLS ; Write track buffer if dirty MOV SEEKCYL,BX ; Setup seek command block AND SEEKCDRV,=0XF8 ; Eliminate drive from block OR SEEKCDRV,DL ; Include new drive AND RCDRV,=0XF8 ; Eliminate drive for recal cmd OR RCDRV,DL ; Include new drive MOV RETRIES,=MAXRTRY ; Setup retry counter __C: LEA BX,SEEKCMD ; Issue seek command CALL SENDCMD JE STREAD ; Was seek successful ? DEC RETRIES ; No, are there more retries ? JE SEEKERR LEA BX,RECALCMD ; Yes, recalibrate disk CALL SENDCMD JMP __C ; Go reissue seek command SEEKERR: ADD SP,=6 ; Trash saved parameters XFERERR: MOV AL,=0XFF ; Return bad result RET STREAD: POP DX ; Restore saved parameters POP BX POP AX LOOPIO: MOV XPHEAD,DH ; Setup parameters for xfer cmd MOV XLHEAD,DH OR BL,=0XFE ; Set unused bits in cylinder MOV XCYL,BX MOV XCDRV,DL ; Set drive, but mash command TEST WRFLAG,=01 ; Is it a write command ? JZ 0XE0 ; cursor address read DMAR == 0XA4 ; DMA read request DMAW == 0X24 ; DMA write request ; ; LOC Data# ; locate in data segment ; ; User defined tab size. ; NOTE: Set to desired tab size 2 through 16. ; TABSIZ::BYTE 8 ; default tab size ; ; User defined start up cursor mode. ; NOTE: 0 = non-displayed, 1&2 = blinking block, 3&4= blinking underline. ; CURSOR::BYTE 2 ; default cursor mode ; ; User defined status line enable. ; NOTE: Set to 0XFF for enable and 0 for disable. ; SLFLAG::BYTE 0XFF ; default status line enable ; FLAGS: BYTE CSRFL ; driver flag byte (def follows) INIT == 1<<0 ; initialization flag WRPFL == 1<<1 ; write protected flag ANSFL == 1<<2 ; ANSII mode flag ULRFL == 1<<6 ; user line load (reverse) flag CSRFL == 1<<7 ; cursor display flag ; CURSCR: BYTE 1 ; current screen number SAVSCR: BYTE 0 ; save screen variable ROWCOL: WORD 0 ; current row/column (low/high) NXTSEQ: WORD 0 ; next routine in escape sequence BEGROW: BYTE 0 ; beginning row number ENDROW: BYTE NMBROWS-1 ; ending row number TOPROW: BYTE 0 ; current top row number TMPROW: BYTE 0 ; temp row storage area CSRDLY: BYTE 0 ; cursor delayed enable counter ; SMXSPH: WORD 1 ; screen mutual exclusion semaphore WORD . WORD .-2 ; ; ANSII sequence variables ; ASCSIZ == 32 ; number of bytes to buffer ASCBP: WORD 0 ; index of next char to store ASCADR: WORD 0 ; address of cursor move rtn ASCOPT: BYTE 0 ; True if in ANSII option mode ASCBUF: RES ASCSIZ ; buffer for ANSII sequences ASCBUFE == . ; end of ANSII buffer ACSPRM == 0X05 ; cursor option parameter # ; ; ; ; ASCII control code lookup table. ; CTLTBL == . ; base of the lookup table BYTE 0X07 ; #1 BYTE 0X08 ; #2 BYTE 0X09 ; #3 BYTE 0X0A ; #4 BYTE 0X0B ; #5 BYTE 0X0C  ; #6 BYTE 0X0D ; #7 BYTE 0X1A ; #8 BYTE 0X1B ; #9 BYTE 0X1E ; #10 CTBLEN == .-CTLTBL ; length of lookup table ; ; ASCII control code branch table. ; CTBLXEC == . ; base of execution table WORD BELL ; #1 ring the terminal bell WORD BACKSP ; #2 back space WORD HZTAB ; #3 horizontal tab WORD LINE ; #4 line feed WORD RLINE ; #5 reverse line feed WORD NFSP ; #6 non-destructive forward space WORD RETURN ; #7 carrige return WORD CUPSCR ; #8 clear unprotected screen WORD ENAESC ; #9 enable escape sequence WORD HOME ; #10 home cursor ; ; ESCAPE sequence lookup table. ; ESCTBL == . ; base of the lookup table BYTE "=" ; #1 direct cursor addressing BYTE "*" ; #2 clear unprot screen BYTE "T" ; #3 clear unprot, end of line BYTE "Y" ; #4 clear unprot, end of page BYTE "C" ; #5 set terminal display color BYTE "j" ; #6 begin reverse video fields BYTE "k" ; #7 end reverse video fields BYTE "^" ; #8 begin blinking fields BYTE "_" ; #9 begin blank fields BYTE "q" ; #10 end blink/blank fields BYTE "l" ; #11 begin underline fields BYTE "m" ; #12 end underline fields BYTE "." ; #13 set cursor attribute BYTE "[" ; #14 begin of ANSII sequence BYTE "(" ; #15 enable alternate font BYTE 0X01 ; #16 set attribute directly ETBLEN == .-ESCTBL ; length of lookup table ; ; ESCAPE sequence branch table. ; ETBLXEC == . ; base of execution table WORD SETXY ; #1 WORD CUPSCR ; #2 WORD CUPEOL ; #3 WORD CUPEOP ; #4 WORD BEGCOLOR ; #5 WORD BEGRV ; #6 WORD ENDRV ; #7 WORD BEGBLINK ; #8 WORD BEGBLANK ; #9 WORD ENDBB ; #10 WORD BEGUND ; #11 WORD ENDUND ; #12 WORD SETCSRA ; #13 WORD BEGANS ; #14 WORD SETFONT ; #15 WORD ATTDIR ; #16 ; ; ANSII command lookup table ; ANSTBL == . ; Base of lookup table BYTE "f" ; #1 BYTE "H" ; #2 BYTE "C" ; #3 BYTE "A" ; #4 BYTE "B" ; #5 BYTE "D" ; #6 BYTE "J" ; #7 BYTE "K" ; #8 BYTE "m" ; #9 BYTE "M" ; #10 BYTE "h" ; #11 BYTE ">" ; #12 ATBLEN == .-ANSTBL ; Length of lookup table ; ; ANSII command branch table ; ATBLXEC == . ; Base of execution table WORD ASETXY ; #1 direct cursor addressing WORD ASETXY ; #2 direct cursor addressing WORD ARIGHT ; #3 move cursor right WORD AUP ; #4 move cursor up WORD ADOWN ; #5 move cursor down WORD ALEFT ; #6 move cursor left WORD APAGE ; #7 clear page WORD ALINE ; #8 clear line WORD AATTR ; #9 set attribute WORD AATTR ; #10 set attribute WORD ASETXY ; #11 direct cursor addressing WORD ASETOPT ; #12 set options ; ; ANSII option sequence lookup table ; OPTTBL == . ; Base of lookup table BYTE "h" ; #1 BYTE "L" ; #2 BYTE "l" ; #3 OPTLEN == .-OPTTBL ; Length of lookup table ; ; ANSII option branch table ; OPTXEC == . ; Base of execution table WORD ADISABLE ; #1 disable mode WORD AENABLE  ; #2 enable mode WORD AENABLE ; #3 enable mode ; ; ANSII page command branch table ; APGEXEC == . ; Base of execution table WORD CUPEOP ; #0 erase to end of page WORD CUPEOP1 ; #1 erase from begin of page WORD CUPSCR1 ; #2 erase entire page ; ; ANSII line command branch table ; ALNEXEC == . ; Base of execution table WORD CUPEOL ; #0 erase to end of line WORD CUPEOL1 ; #1 erase from begin of line WORD CUPEOL2 ; #2 erase entire line ATTRTBL == . ; Base of attribute table BYTE 0X00 ; ANSII attribute 0 -- default BYTE 0X00 ; ANSII attribute 1 -- default BYTE 0X04 ; ANSII attribute 2 -- vertline BYTE 0X02 ; ANSII attribute 3 -- overline BYTE 0X01 ; ANSII attribute 4 -- undrline BYTE 0X08 ; ANSII attribute 5 -- blink BYTE 0X00 ; ANSII attribute 6 -- unused BYTE 0X10 ; ANSII attribute 7 -- inverse ; ; NITCMD: BYTE __LEN ; CRT initialization command BYTE SYNC|0X01,CRT_CMD ; Character display mode '0': no BYTE 0X10,CRT_PARM ; interlace, flashless drawing, static BYTE 0X4E,CRT_PARM ; RAM, 80 character per row. BYTE 0X52,CRT_PARM BYTE 0X0E,CRT_PARM BYTE 0X06,CRT_PARM BYTE 0X13,CRT_PARM BYTE 0XEE,CRT_PARM BYTE 0X45,CRT_PARM BYTE VSYNC|0X01,CRT_CMD ; master video sync BYTE ZOOM,CRT_CMD ; zooming disabled BYTE 0X00,CRT_PARM BYTE PITCH,CRT_CMD ; 80 character per row BYTE 0X50,CRT_PARM BYTE MASK,CRT_CMD BYTE 0XFF,CRT_PARM BYTE 0XFF,CRT_PARM __LEN == (.-NITCMD-1)/2 ; CCHRCMD:BYTE CCHRCLN ; cursor char command BYTE CCHAR,CRT_CMD CCHRP1: BYTE 0X12,CRT_PARM BYTE 0X21,CRT_PARM BYTE 0X8A,CRT_PARM CCHRCLN == (.-CCHRCMD-1)/2 ; CSRCMD: BYTE CSRCLN ; specify cursor command BYTE CURS,CRT_CMD CSRLOW: BYTE 0X00,CRT_PARM CSRHI: BYTE 0X00,CRT_PARM CSRCLN == (.-CSRCMD-1)/2 ; WDATCMD: ; write single char command BYTE WDATCLN BYTE WDAT,CRT_CMD FONT: BYTE 0X00,CRT_PARM CHAR: BYTE 0X00,CRT_PARM WDATCLN == (.-WDATCMD-1)/2 ; WATTCMD: ; write attribute command BYTE WATTCLN BYTE WDAT|0X10,CRT_CMD CURATTR:BYTE DEFATTR,CRT_PARM WATTCLN == (.-WATTCMD-1)/2 ; RDATCMD: BYTE RDATCLN BYTE RDAT|0X10,CRT_CMD RDATCLN == (.-RDATCMD-1)/2 ; PRAMCMD: ; Write parameter RAM command BYTE PRAMCLN BYTE PRAM,CRT_CMD PRAM1: BYTE 0X00,CRT_PARM PRAM2: BYTE 0X00,CRT_PARM PRAM3: BYTE 0X00,CRT_PARM PRAM4: BYTE 0X00,CRT_PARM PRAM5: BYTE 0X00,CRT_PARM PRAM6: BYTE 0X00,CRT_PARM PRAM7: BYTE 0X00,CRT_PARM PRAM8: BYTE 0X00,CRT_PARM PRAMCLN == (.-PRAMCMD-1)/2 ; ; FIGSCMD: BYTE FIGSCLN BYTE FIGS,CRT_CMD BYTE 0X02,CRT_PARM FIGSP2: BYTE 0X00,CRT_PARM FIGSP3: BYTE 0X00,CRT_PARM FIGSCLN == (.-FIGSCMD-1)/2 ; ; ; Cursor character table. ; CCHRTBL: BYTE 0X12,0X01,0X8A ; blinking block BYTE 0X12,0X21,0X8A ; steady block BYTE 0X12,0X0E,0X8A ; blinking underline BYTE 0X12,0X2E,0X8A ; steady underline ; ; LOC Code# ; locate in code segment ; ; Screen entry point. Output char passed in CL register. ; SCREEN:: PUSH SI PUSH DI ; save regs PUSH CX ; save output char MOV BX,&SMXSPH ; get exclusion semaphore addr CALL WAIT# ; dispatch if neccessary POP CX ; restore output char CALL __SCR ; call the driver MOV BX,&SMXSPH ; get exclusion semaphore addr CALL SIGNAL# ; signal process completed OR AL,=0XFF ; set status POP DI POP SI ; restore regs RET ; and exit ; __SCR: CLD ; set direction = increment MOV AX,DS MOV ES,AX ; copy DS into ES seg reg TEST FLAGS,=INIT ; test initialization flag JNZ __C1 ; if done, continue PUSH CX ; save output char MOV BX,&NITCMD ; get init table addr CALL GDCOUT ; and output it CALL SLINIT ; initialize status line CALL CUPSCR ; clear user screen area OR FLAGS,=INIT ; set init flag for further entry POP CX ; restore output char __C1: MOV CSRDLY,=CSRCNT ; pre-set cursor delay count AND CCHRP1,=~0X80 ; reset cursor display bit MOV BX,&CCHRCMD CALL GDCOUT ; disable cursor display MOV DX,ROWCOL ; load current row/column address MOV AX,NXTSEQ ; get possible next escape sequence MOV NXTSEQ,=0 ; always clear it TEST AX,AX ; sequence present? JNZ SEQCOM ; if so, continue CMP FONT,=00 ; Is this alternate font mode? JNE DISPLAY ; If so, display regardless CMP CL,=ASP ; displayable char? JNB DISPLAY ; if so, continue #IF PEEKNG ; Desperation debugging PUSH CX MOV CL,=0X7E CALL DISPLAY POP CX JMP DISPLAY #ENDIF MOV DI,&CTLTBL ; get control char lookup table MOV AL,CL ; load char MOV CX,=CTBLEN ; get table length REPNZ SCAS BYTE ; look for a match JNZ __X ; if not found, cont MOV BX,=CTBLEN-1 SUB BX,CX ; calc length into table ADD BX,BX ; time 2 for execute table CALLI CTBLXEC[BX] ; execute the function __X: CALL UPDCSR ; do cursor update stuff RET ; and exit ; SEQCOM: CALLI AX ; continue escape sequence JMPS UPDCSR ; do cursor update stuff ; DISPLAY: MOV CHAR,CL ; set char in command string CALL PNTCHAR ; point cursor at char memory MOV BX,&WDATCMD CALL GDCOUT ; write single char CALL PNTATTR MOV BX,&WATTCMD CALL GDCOUT ; write single attribute MOV FONT,=00 ; Cancel alternate font CALL NFSP ; do non-destructive forword space ; UPDCSR: MOV ROWCOL,DX ; update current row/column CALL PNTCHAR ; point cursor at character memory ; #IF SCRTST ; if screen test version JMPS CSRENA ; enable cursor #ELSE RET ; and exit #ENDIF ; ; The following routine is called from the real-time-clock driver to ; check for the cursor enable delay count. When count of zero is reached, ; the cursor is re-enabled. ; CSRCHK:: CMP CSRDLY,=0 ; check for count reached JZ _X1 ; if so, continue DEC CSRDLY ; decrement the count JNZ _X1 ; if count still going ; ; This entry is called from the keyboard input routine to enable the cursor ; unconditionally when waiting on a character. ; CSRENA:: MOV CSRDLY,=0 ; force count to zero TEST FLAGS,=CSRFL ; cursor enabled? ; JZ _X1 ; if not, continue OR CCHRP1,=0X80 ; set cursor display bit MOV BX,&CCHRCMD CALL GDCOUT ; re-enable the cursor _X1: RET ; exit ; ; ; CONTROL CHARACTER FUNCTIONS. ; ENAESC: ; start escape sequence. CONTROL-[ MOV NXTSEQ,&BEGESC ; set sequence function number RET ; and exit ; BELL: ; ring the terminal bell. CONTROL-G MOV CHAR,=ABEL CALL PNTCHAR ; point cursor at char memory MOV BX,&WDATCMD  CALL GDCOUT ; write single char CALL PNTATTR MOV BX,&WATTCMD CALL GDCOUT ; write single attribute JMP UPDCSR ; HOME: ; home cursor function. CONTROL-^ MOV DL,=0 ; get starting row number JMPS RETCOM ; and join common ; RETURN: ; carrige return function. CONTROL-M CMP CURSCR,=0 ; screen = user line load? JNZ RETCOM ; if not, continue common MOV CL,SAVSCR ; get restore screen number ;;; CALL SETULS ; and do user line stuff RET ; and exit ; RETCOM: XOR DH,DH ; cursor to starting column JMPS FCKWP ; check write protect stuff ; BACKSP: ; back space function. CONTROL-H DEC DH ; decrement column number JNS __C ; Did we go off left margin ? TEST FLAGS,=ANSFL ; Yes, are we in ANSII mode ? JZ __C OR DL,DL ; Yes, and is this line 0 ? JNZ __C XOR DH,DH ; Yes, so freeze cursor pos __C: CMP DH,=NMBCOLS ; curs #TITLE "Screen routine tester" #SUBTTL "Copyright (C) John E. Lauber" #PAGE 132,66 ; MODULE "SCRTST" ; TLINK "X" ; #INCLUDE "EQUATE" ; LOC Code# ; START: MOV CL,=0 CALL SCREEN# ; initialize the screen ; __LOOP: MOV CL,=DCFCN MOV DL,=0XFF INT OPSYSC OR AL,AL JZ __LOOP MOV CL,AL CMP AL,='~' JZ __EXIT CALL SCREEN# JMPS __LOOP ; __EXIT: RETF ; KBDLOK:: KBDULK:: WAIT:: SIGNAL:: RET ; END START SCRTST,SCRAPC 8C;0..&.8C.& ..&τt2u.t4u.t.u7*V.A;^0.u.&.8C.&Dg0\m$nhO  sAtRSO[O[O^VOAt.\VOTu.TTu؎ڱ3຀.o. .u , k@   : @T utVtXtNtP<t,tBt0ttt>Read>Write >Not ready> error, Drive: DA,0<t?>, Track: \>t>, Sector: \S>[TJtSS> - [=H> (Retry, <t 5>Ignore, )>Abort) I/te/`/P/X >(t"(PPtbPR /[Cu\CPxPPu P%P< u-P< u CCMCD*P0P3Pt1P$Pt$P;@u PDP"6t!tDP &t tTPiP P"rڈCځPrsKhPhPػDP. P\S< $Px3Pt 1PK Ps?ON$Pu#Pt;CuPð  >Pu±>Pu  0M #TITLE "Serial I/O for the NEC-APC" #SUBTTL "Equates and Definitions" #PAGE 132,66 ; ; SIOAPC.A ; Written by: John E. Lauber ; MODULE "SIOAPC" ; module ID ; #INCLUDE "APCEQU" ; common APC equivalences #INCLUDE "DREQUATE" ; common driver equivalences ; ; Bit definition of the status word. ; RXRDY == 1<<0 ; receiver ready TXRDY == 1<<1 ; transmitter ready TXE == 1<<2 ; transmitter empty PE == 1<<3 ; parity error OE == 1<<4 ; overrun error FE == 1<<5 ; framing error SYNDET == 1<<6 ; sync detect DSR == 1<<7 ; data set ready ; ; Befault configuration of the mode instruction word. ; M8251 == 0X4E ; 1 stop, no parity, 8-bit word, X16 ; ; Bit definition of the command instruction word. ; TXEN == 1<<0 ; transmit enable DTR == 1<<1 ; data terminal ready RXE == 1<<2 ; receiver enable SBRK == 1<<3 ; send break ER == 1<<4 ; error reset RTS == 1<<5 ; request to send IR == 1<<6 ; internal reset EH == 1<<7 ; enter hunt mode ; ; Default configuration of the command instruction word. ; C8251 == RTS|ER|RXE|DTR|TXEN ; refer to above symbols ; #SUBTTL "Driver Data Area" #PAGE ; LOC Data# ; locate in data segment ; FCNTBL == . ; driver function lookup table WORD SERST ; serial status WORD SERIN ; serial input WORD SEROUT ; serial output WORD SERSBR ; serial set baud rate WORD SERRBR ; serial return baud rate WORD SERSMC ; serial set MODEM controls WORD SERRMC ; serial return MODEM controls NMBFCN == (.-FCNTBL)/2 ; number of valid functions ; LOC 0 ; IOTMOD == . ; I/O table entry model DATA: RES WORD 1 ; uart data port addr STAT: RES WORD 1 ; uart status port addr MSKRS: RES WORD 1 ; uart mask/read signal port addr WSIG: RES WORD 1 ; uart write signal port addr TIMER: RES WORD 1 ; timer port addr TMRSET: RES BYTE 1 ; set timer value for mode port RDAMSK: RES BYTE 1 ; receive data available mask RDACP: RES BYTE 1 ; receive data available ready TBEMSK: RES BYTE 1 ; trans buffer empty mask TBECP: RES BYTE 1 ; trans buffer empty ready SINSPH: RES WORD 3 ; serial input semaphore SINPOL: RES WORD 1 ; serial input poll routine addr BUFSIZ: RES WORD 1 ; serial buffer size BUFPNT: RES WORD 1 ; base of serial input buffer SINPNT: RES WORD 1 ; serial buffer in pointer SOTPNT: RES WORD 1 ; serial buffer out pointer SOTSPH: RES WORD 3 ; serial output semaphore SOTPOL: RES WORD 1 ; serial output poll routine addr SOCHAR: RES BYTE 1 ; output char buffer SERBRT: RES BYTE 1 ; current baud rate setting CURMOD: RES BYTE 1 ; current device operating mode SFLAGS: RES BYTE 1 ; serial channel flags IOTLEN == .-IOTMOD ; length of one entry ; ; Bit definition of serial channel flag byte. ; UACT == 1<<0 ; uart active flag ; RELOC ; ; Base of serial I/O tables. ; IOTBL == . ; SIOCH0 == . ; serial channel 0 WORD S0_DATA,S0_STAT ; data and status/command ports WORD S0_RS,S0_WS ; mask/read signal and write signal WORD IT_CNT1 ; timer port addr  BYTE 0X76 ; set timer value for mode port BYTE RXRDY,RXRDY ; mask, value BYTE TXRDY,TXRDY ; mask, value WORD 0 ; input semaphore WORD . WORD .-2 WORD SI0POL ; input poll routine S0BSZ: WORD 64 ; buffer size WORD 0,0,0 ; base, in and out pointers WORD 0 ; output semaphore WORD . WORD .-2 WORD SO0POL ; output poll routine BYTE 0 ; output char BYTE 0XAF ; current baud rate S0MODE: BYTE M8251 ; line control value BYTE 0 ; serial channel flags ; SIOCH1 == . ; serial channel 1 WORD S0_DATA,S0_STAT ; data and status/command ports WORD S0_RS,S0_WS ; mask/read signal and write signal WORD IT_CNT2 ; timer port addr WORD 0XB6 ; set timer value for mode port BYTE RXRDY,RXRDY ; mask, value BYTE TXRDY,TXRDY ; mask, value WORD 0 ; input semaphore WORD . WORD .-2 WORD SI1POL ; serial input poll routine S1BSZ: WORD 64 ; buffer size WORD 0,0,0 ; base, in and out pointers WORD 0 ; output semaphore WORD . WORD .-2 WORD SO1POL ; output poll routine BYTE 0 ; output char BYTE 0XAF ; current baud rate S1MODE: BYTE M8251 ; line control value BYTE 0 ; serial channel flags ; NMBSIO == (.-IOTBL)/IOTLEN ; number of channels supported ; #SUBTTL "Driver Routines" #PAGE ; LOC Code# ; locate in code segment ; SPINIT:: PUSH DI ; save index reg MOV DI,&IOTBL ; get I/O table base MOV CX,=NMBSIO ; get number of serial channels __LP: PUSH CX ; save count reg CALL INIT8251 ; initialize the channel MOV DX,STAT[DI] ; get uart status port addr IN AL,DX ; read it TEST AL,=0X38 ; device present in system? JNZ __C ; if not, continue OR SFLAGS[DI],=UACT ; set uart active flag MOV BX,BUFSIZ[DI] ; get buffer size CALL ALLOC# ; allocate some memory MOV BUFPNT[DI],BX ; set buffer base address MOV SINPNT[DI],BX ; set buffer input pointer MOV SOTPNT[DI],BX ; set buffer output pointer MOV DX,SINPOL[DI] ; get input poll routine addr CALL LNKPOL# ; and attach to poll list __C: POP CX ; restore the count ADD DI,=IOTLEN ; index to next table entry LOOP __LP ; and loop for number of channels POP DI ; restore index reg RET ; and exit ; INIT8251: MOV DX,MSKRS[DI] ; get uart mask port addr XOR AL,AL ; zero reg OUT DX,AL ; dissable all interrupts MOV DX,STAT[DI] ; get uart command/mode port addr MOV AL,=0XAA ; get dummy command OUT DX,AL ; send it MOV AL,=IR ; get internal reset bit OUT DX,AL ; clear device to known state MOV AL,CURMOD[DI] ; get current operating mode OUT DX,AL ; and send it MOV AL,=C8251 ; get default command word OUT DX,AL ; and send it RET ; all done ; ; ; Driver entry point. ; COMDRV:: SERIAL:: CMP CH,=NMBSIO ; test for valid channel number JAE __X ; if invalid, continue PUSH DI ; save index reg MOV DI,=IOTBL ; get base of tables MOV AL,=IOTLEN ; get entry length MUL CH ; index as per channel ADD DI,AX ; point to channel's entry CALL __O ; do the operation POP DI ; restore index reg __X: RET ; all done ; __O: CMP DL,=10 ; function = 10? JZ SEROUT ; if so, continue CMP DL,=NMBFCN ; check for valid function JAE __X ; if invalid, continue MOV BL,DL ; move to reg XOR BH,BH ; make double length ADD BX,BX ; times 2 for addr table JMPI FCNTBL[BX] ; execute function ; ; Serial status entry point. ; SERST: CALL CHKBUF ; check the buffer RET ; done ; ; Serial input entry point. ; SERIN: MOV BX,&SINSPH ; get input semaphore offset ADD BX,DI ; point to it CALL WAIT# ; dispatch if neccessary CALL CHKBUF ; check the buffer OR AL,AL ; set flags JZ SERIN ; if false alarm, try again MOV SOTPNT[DI],BX ; update output pointer MOV AL,CL ; input char to reg RET ; done ; ; Serial output entry point. ; SEROUT: AND TBEMSK[DI],=~DSR AND TBECP[DI],=~DSR ; clear CTS checker TEST SERBRT[DI],=0X40 ; CTS enabled? JZ __1 ; if not, continue OR TBEMSK[DI],=DSR OR TBECP[DI],=DSR ; enable CTS checker __1: PUSH DX ; save function number MOV DX,STAT[DI] ; get uart status port addr IN AL,DX ; and read it POP DX ; restore reg AND AL,TBEMSK[DI] ; mask status CMP AL,TBECP[DI] ; check ready value JNZ __2 ; if not ready, continue MOV DX,DATA[DI] ; get uart data port addr MOV AL,CL ; get output char OUT DX,AL ; and send it OR AL,=0XFF ; set good status __X: RET ; and exit ; __2: MOV AL,=10 ; load constant SUB AL,DL ; function = 10? JZ __X ; if so, exit with AL=0 MOV SOCHAR[DI],CL ; save output char MOV DX,SOTPOL[DI] ; get output poll routine addr CALL LNKPOL# ; and attack to poll list MOV BX,&SOTSPH ; get semaphore offset ADD BX,DI ; point to it JMP WAIT# ; and dispatch untill ready ; ; Serial output polling routines. ; SO0POL: WORD 0 WORD 0 ; PUSH DI ; save reg MOV DI,&SIOCH0 ; load channel table addr JMPS SOPCOM ; and join common ; SO1POL: WORD 0 WORD 0 ; PUSH DI ; save reg MOV DI,&SIOCH1 ; load channel table addr ; SOPCOM: MOV DX,STAT[DI] ; get uart status port addr IN AL,DX ; read it AND AL,TBEMSK[DI] ; mask it CMP AL,TBECP[DI] ; compare with ready value JNZ __X ; if not ready, continue MOV DX,DATA[DI] ; get uart data port addr MOV AL,SOCHAR[DI] ; get waiting char OUT DX,AL ; and send it MOV BX,SOTPOL[DI] ; get poll routine addr CALL UNLINK# ; and remove from poll list MOV BX,&SOTSPH ; get semaphore offset ADD BX,DI ; point to it CALL SIGNAL# ; and signal the event __X: POP DI ; restore index reg RET ; and exit ; ; Check the input buffer. ; CHKBUF: MOV BX,SOTPNT[DI] ; get output pointer MOV AX,SINPNT[DI] ; and input pointer SUB AX,BX ; compare the values JZ __X ; if equal, continue INC BX ; bump the pointer MOV AX,BUFPNT[DI] ; get buffer base addr ADD AX,BUFSIZ[DI] ; point to last addr+1 CMP AX,BX ; buffer wrap? JNZ __1 ; if not, continue MOV BX,BUFPNT[DI] ; else, wrap the buffer __1: MOV CL,[BX] ; get the char OR AL,=0XFF ; set ready status __X: RET ; done ; ; Serial input polling routines. ; SI0POL: WORD 0 WORD 0 ; PUSH DI ; save reg MOV DI,=SIOCH0 ; load table addr JMPS SIPCOM ; and join common code ; SI1POL: WORD 0 WORD 0 ; PUSH DI ; save reg MOV DI,=SIOCH1 ; load table addr ; SIPCOM: MOV DX,STAT[DI] ; get uart status port addr IN AL,DX ; read it AND AL,RDAMSK[DI] ; mask it CMP AL,RDACP[DI] ; compare to ready value JNZ __X ; if not ready, continue MOV DX,DATA[DI] ; get uart data port addr IN AL,DX ; read the data MOV CL,AL ; hold in reg TEST SERBRT[DI],=1<<5 ; receive only device? JNZ __X ; if so, just eat the char MOV BX,SINPNT[DI] ; get buffer input pointer TEST SERBRT[DI],=1<<7 ; attention char enabled? JZ __1 ; if not, continue AND CL,=0X7F ; strip parity bit CMP CL,ATNCHR# ; attention request? JNZ __1 ; if not, continue MOV SOTPNT[DI],BX ; flush the buffer __1: INC BX ; bump input pointer MOV AX,BUFPNT[DI] ; get buffer base addr ADD AX,BUFSIZ[DI] ; calc last addr+1 CMP AX,BX ; buffer wrap? JNZ __2 ; if not, continue MOV BX,BUFPNT[DI] ; else, wrap the buffer __2: MOV AX,SOTPNT[DI] ; get output pointer CMP AX,BX ; buffer full? JZ __X ; if so, exit without signalling MOV [BX],CL ; write char into buffer MOV SINPNT[DI],BX ; update input pointer MOV BX,&SINSPH ; get semaphore offset addr ADD BX,DI ; point to it CALL SIGNAL# ; signal the char __X: POP DI ; restore reg RET ; and exit ; ; Set serial baut rate entry point. ; SERSBR: MOV SERBRT[DI],CL ; set table variable ; ; Set uPD8253 counter routine. ; MOV BL,SERBRT[DI] ; get baud rate variable AND BL,=0X0F ; mask to baud rate bits XOR BH,BH ; make double length ADD BX,BX ; times 2 for table lookup CS MOV BX,BRTBL[BX] ; load timer constant MOV DX,=IT_MODE ; get timer mode set reg MOV AL,TMRSET[DI] ; get timer set value OUT DX,AL ; and send it MOV DX,TIMER[DI] ; get timer port addr MOV AL,BL ; get LSB of count OUT DX,AL ; send it MOV AL,BH ; get MSB of count OUT DX,AL ; send it RET ; all done ; ; Baud rate divisor constants table. ; BRTBL: WORD 3072 ; 50 baud WORD 2048 ; 75 baud WORD 1396 ; 110 baud WORD 1142 ; 134.5 baud WORD 1024 ; 150 baud WORD 512 ; 300 baud WORD 256 ; 600 baud WORD 128 ; 1200 baud WORD 85 ; 1800 baud WORD 76 ; 2000 baud WORD 64 ; 2400 baud WORD 42 ; 3600 baud WORD 32 ; 4800 baud WORD 21 ; 7200 baud WORD 16 ; 9600 baud WORD 8 ; 19200 baud ; ; Return serial baud rate entry point. ; SERRBR: MOV AL,SERBRT[DI] ; get current setting RET ; all done ; ; Set MODEM controls entry point. ; SERSMC: MOV DX,STAT[DI] ; get uart status port addr MOV AL,CURMOD[DI] ; get current uart mode setting AND AL,=~(DTR|RTS) ; clear current bits TEST CL,=1<<7 ; RTS flaged? JZ __1 ; if not, continue OR AL,=RTS ; set RTS bit __1: TEST CL,=1<<6 ; DTR flaged? JZ __2 ; if not, continue OR AL,=DTR ; set DTR bit __2: OUT DX,AL ; update the uart RET ; all done ; ; Return MODEM controls entry point. ; SERRMC: MOV DX,STAT[DI] ; get uart status port addr IN AL,DX ; read it MOV CL,AL ; move to reg XOR AL,AL ; clear reg TEST CL,=DTR ; DSR active? JZ __X ; if not, continue OR AL,=0XF0 ; set all indicator flags __X: RET ; all done ; END  #TITLE "Sign-on Message Area" #SUBTTL "For the NEC-APC" ; ; SOMIPC.A ; MODULE "SOMAPC" ; module ID ; #INCLUDE "EQUATE" ; oommon OS equivalences ; LOC Data# ; locate in data segment ; USRSOM:: #REPEAT 6 ; allocate 60 user bytes BYTE 0,0,0,0,0,0,0,0,0,0 #ENDREP ; ; BYTE ACR,ALF ; BYTE "System Memory Size = " MEMKSZ: BYTE 0,0,0,0 ; range = 64-610k ; ; BYTE ACR,ALF ; BYTE "Circuit: " CKTNO: BYTE 0,0,0 ; range = 0-255 ; ; BYTE ", Node: " NODNO: BYTE 0,0,0 ; range = 0-255 ; BYTE "$" ; LOC Code# ; locate in code segment ; ; Routines to patch system sign on message. ; PTMKSZ:: PUSH DI ; save reg MOV DI,&MEMKSZ ; get msg offset CALL DECMSG ; do common code MOV [DI],='k' ; append kilobyte char POP DI ; restore reg RET ; and exit ; PTMCKT:: PUSH DI ; save reg MOV DI,&CKTNO ; get msg offset XOR AH,AH ; make double length CALL DECMSG ; do common code POP DI ; restore reg RET ; and exit ; PTMNOD:: PUSH DI ; save reg MOV DI,&NODNO ; get msg offset XOR AH,AH ; make double length CALL DECMSG ; do common code POP DI ; restore reg RET ; and exit ; DECMSG: XOR BL,BL ; clear zero print flag MOV CX,=100 CALL __DM ; write 100's digit MOV CX,=10 CALL __DM ; write 10's digit MOV CX,=1 OR BL,=0XFF ; set zero print flag __DM: XOR DX,DX ; clear remainder register DIV CX ; divide the number OR AL,AL ; did it go? JNZ __1 ; if not, continue OR BL,BL ; zero print enabled? JZ __X ; if not, continue __1: ADD AL,='0' ; add ASCII bias MOV [DI],AL ; move to message area INC DI ; bump pointer OR BL,=0XFF ; set zero print flag __X: XCHG AX,DX ; swap remainder with quotient RET ; all done ; END SOMAPCGDataLCodeUSRSOMPTMKSZ PTMCKTPTMNOD$W`< k_W`@0 _W`C0 _0۹ d  1ut0G8DOSLOADOriginUnitData|CodeRESUMEOTNTRYOCNTRYMSG001MSG002TSTUND USRSOM MSG004 MSG003 EndData HDWNITCRPROCDSKNITBMINITLOADFN SCANDNLODSEG9SYSDATLDRDMSnALLOCyDEALOC OSMASTERSYS" @COPYRIGHT 1984, SOFTWARE 2000, INC. (VERSION 03/29/84) ".`9Ȏ؎м` Dg`C  Or o.`.`=`y..`; RZy |  s <t< u 0 뫉&` ``uW` t± }u 1  sK &` `u:` ty<r  w  V -u  ðú`?V`` ؎ t \`< t < t ^  Copyright 1984, Software 2000, Inc. t(RS [([ R/[ I) `tڱ  4  `  #: S [r.`&&:uC  ] r ,û` uڱ3`7`uû``)0` C``ú`à`yA :`   q.  C$ to retry not found, bad memory loading at OSNTRYOriginUnitDataCLOFCNCIFCNCOFCNRCIFCNRCOFCNLOFCNDCFCN RIBFCN SIBFCN PBFCN CIBFCN CSFCNRVNFCNRDSFCNSELFCNOFFCNCFFCNSFFFCNSNFFCNDFFCNRSFFCNWSFFCNMFFCNRFFCNRLIFCNRCDFCNSDFCNWPDFCNRROFCNSFAFCN DPBFCN!SRUFCN"RRFFCN#WRFFCN$CFSFCN%SRRFCN&RDFCN'LKRFCN(FRRFCN)SSCFCN*DFSFCN+CHNFCN,SDBFCN-RDBFCN.RRMFCN/RAMFCN0ARMFCN1AAMFCN2FMSFCN3FAMFCN4PLFCN5DT1FCN6DT2FCN7RSNFCN8SRCFCN9SRTFCN:PBCFCN;PBLFCN<ROSFCN=CTPFCN>DPFCN?AMFCN@DMFCNASMFCNBRMFCNCSESFCNDSERFCNESDTFCNFRDTFCNGRDMFCNHROUFCNISCFFCNJLOGFCNKLFFCNLADFFCNMALDFCNNSCLFCNORAVFCNPRDPFCNQSRSFCNRPDAFCNSSBPFCNTRBPFCNULFDFCNVFFBFCNWSRPFCNXEOPFCNYSRDFCNZQPFFCN[FLBFCN\RCFCN]CCSFCN^CCIFCN_CCOFCN`SCBFCNaRCBFCNbSMCFCNcRMCFCNdEXTFCNeRDDFCN;fCodegDISDSPhSETDR1iCKATTNjENADSPkGETSDSlGETWSBmNETREQnPFNFCNoDT3FCNpMPMFCNqTSTUNDfOCNTRY fOTNTRY#fXCNTRY0fXTNTRYfERRXIT``````` ` ` ` ` ```````````````` ``` `!`"`#`$`%`&`!#` '`(`)` *`+`",`-`.`/`0`1`2`3`4`5`6` 7`8` 9`:`;`<`=`>`?`@`A`B`C`D`E`F`G`H`I`J`K`L`M`N`O`P`Q`R`S`T`U`V`W`X`Y`Z`[` \`]`^`_```a`b`c`d`e`f    daghi u    tOtQtStUtWtYt[t]t_ i <D_D]D[DYDWDUDSDQDO t ËdaDO DetPjD_t]l[|YtWTULS\QDO t^kVlƉ\QLSTUDW|Yl[D]D_DO mrKDS u`<+%GETXDR?CALCBV@CKOPNDACKDRVLBDSKMGRCCKDRODGETLSAEZERODNFALVNITGADVDNOHCLSFPICRFCBPJGETDLSKFNDNDELFNDDDEROVECTOFFCN OPNFIL~CFFCNCLSFILSFFFCNSNFFCNDFFCNDELFILRSFFCNWSFFCNMFFCNRFFCN CQMCOMSFAFCN CKLEXT$RDRAND)RRFFCNjWRRANDoWRFFCNCKLERRCFSFCNSRRFCNLFFCNRAVFCN?RDPFCN[SRSFCNRDMFCNRDDFCN  DOult# JtEuVu4\UD]&G t'u &uS G [&0 tDnt & u P uXDOu: &@t1&&Gt'&gQYt DnP tDn  XDn0ËDUDz -t yËDzDUD|DoD~Dq uDOS\UD]&$?` DVt'RSDU@[ZuLVu !Ӊ`ÈDO Ӊ`ðtȈSDUDDAtB[É\Q:CrDrEFDO:E T 3u Ts( `t)r(WSZڄuWO QR [ZYY`(u`x 5`D&u !``ՊD( ȈD0D( D( tuv u  D0u/D/@u)\(S` 0)Ӊ\(r {[\(t {y5``9t T1 A 2L` \1 U y\1W` 9Ӊu t w  -@t  t kt  ! l mtD t \1G_t0D&t\+D-T+l-D&tڕ D&t @KD0:rD( D0D(   CD(CD)CD*C`D/tD0C' :DU$` DV<s` `&`DQÊDU tÊDU lV t  Ӊ`` t S [u ` 9trӉ\1t:Ouŀu  uP xG u @t2Q %t uY   @ Y@tQ gY u t w\1 ttAŀt<t$`<`u/Q `ˋtSQ Y[Du `Y` ` 9t Ӏ'߉tuË`Q Yŀt Q Y0û` ` 09tS [t\1Ãd' D'V D':uFC0^d'uD0:r u D/tD À'  tJD$`:Ds u tu % _ VCDF^\1GD"GD 0 / \1 `\1`   uú    \1ÊD' ` ` 9DSKMGROriginUnit2Data8CodeDSKASTLDIRSHL7BXDSKERRERRXITDSTPTDSKNITBPDAFCNSELDRVDSKMGRGETXDR `1 QS`ˉ``` ڊ:uBCB['KYyB\U D] t6T DD DOt.<u(\UD]T&ӋT l <s<sDOÈDDD,r u u ;ËL$IDxAL\$\TDdx\ǀuڹ A)syIAx )sڋ\ˋL D"D L \TڋLˇڋ \)s,Sˉ\ Q ZuH\ LډӉ\ 7 \C뻊D\T0)s؎ otD  ttDx\ÊD$¶` Ӌu%S *uD t`u.` `` u؎ڱ3 .` o.` .`  u,`` :@u tVtXtNtP<t,tBt``t b`R /[CuC`  x` ` u ``'< u `/< u CCMCD`,`2`5t`3 `& t `&; @u ` ` `F   " 6t !t`F  &t t`V `k` " rڈCځ`r  sK`j`j ػ`F.` \  `&x``5t `3 K`` s  `N`&u#`t` u±>`u  0DS \UD]&&_S [` TDU &< uCڻ`S Q[  rEtu) r:t"<.tG<:tK`  r#t6u ru+< u r uJ ZS` ،[[ \Oð(t`C<0r<:s<,0Ġ`%t`%Q`#rrrrr< s `#Yt$YDPFCN?AMFCN@DMFCNASMFCNBRMFCNCSESFCNDSERFCNESDTFCNFRDTFCNGRDMFCNHROUFCNISCFFCNJLOGFCNKLFFCNLADFFCNMALDFCNNSCLFCNORAVFCNPRDPFCNQSRSFCNRPDAFCNSSBPFCNTRBPFCNULFDFCNVFFBFCNWSRPFCNXEOPFCNYSRDFCNZQPFFCN[FLBFCN\RCFCN]CCSFCN^CCIFCN_CCOFCN`SCBFCNaRCBFCNbSMCFCNcRMCFCNdEXTFCNeRDDFCN;fCodegDISDSPhSETDR1iCKATTNjENADSPkGETSDSlGETWSBmNETREQnPFNFCNoDT3FCNpMPMFCNqTSTUNDfOCNTRY fOTNTRY#fXCNTRY0fXTNTRYfERRXIT``````` ` ` ` ` ```````````````` ``` `!`"`#`$`%`&`!#` '`(`)` *`+`",`-`.`/`0`1`2`3`4`5`6` 7`8` 9`:`;`<`=`>`?`@`A`B`C`D`E`F`G`H`I`J`K`L`M`N`O`P`Q`R`S`T`U`V`W`X`Y`Z`[` \`]`^`_```a`b`c`d`e`f    daghi u    tOtQtStUtWtYt[t]t_ i <D_D]D[DYDWDUDSDQDO t ËdaDO DetPjD_t]l[|YtWTULS\QDO t^kVlƉ\QLSTUDW|Yl[D]D_DO mrKDS u`<+%GETXDR?CALCBV@CKOPNDACKDRVLBDSKMGRCCKDRODGETLSAEZERODNFALVNITGADVDNOHCLSFPICRFCBPJGETDLSKFNDNDELFNDDDEROVECTOFFCN OPNFIL~CFFCNCLSFILSFFFCNSNFFCNDFFCNDELFILRSFFCNWSFFCNMFFCNRFFCN CQMCOMSFAFCN CKLEXT$RDRAND)RRFFCNjWRRANDoWRFFCNCKLERRCFSFCNSRRFCNLFFCNRAVFCN?RDPFCN[SRSFCNRDMFCNRDDFCN  DOult# JtEuVu4\UD]&G t'u &uS G [&0 tDnt & u P uXDOu: &@t1&&Gt'&gQYt DnP tDn  XDn0ËDUDz -t yËDzDUD|DoD~Dq uDOS\UD]&$?` DVt'RSDU@[ZuLVu !Ӊ`ÈDO Ӊ`ðtȈSDUDDAtB[É\Q:CrDrEFDO:E T 3u Ts( `t)r(WSZڄuWO QR [ZYY`(u`x 5`D&u !``ՊD( ȈD0D( D( tuv u  D0u/D/@u)\(S` 0)Ӊ\(r {[\(t {y5``9t T1 A 2L` \1 U y\1W` 9Ӊu t w  -@t  t kt  ! l mtD t \1G_t0D&t\+D-T+l-D&tڕ D&t @KD0:rD( D0D(   CD(CD)CD*C`D/tD0C' :DU$` DV<s` `&`DQÊDU tÊDU lV t  Ӊ`` t S [u ` 9trӉ\1t:Ouŀu  uP xG u @t2Q %t uY   @ Y@tQ gY u t w\1 ttAŀt<t$`<`u/Q `ˋtSQ Y[Du `Y` ` 9t Ӏ'߉tuË`Q Yŀt Q Y0û` ` 09tS [t\1Ãd' D'V D':uFC0^d'uD0:r u D/tD À'  tJD$`:Ds u tu % _ VCDF^\1GD"GD 0 / \1  `\1`   uú    \1ÊD' ` ` 9DSKMGROriginUnit2Data8CodeDSKASTLDIRSHL7BXDSKERRERRXITDSTPTDSKNITBPDAFCNSELDRVDSKMGRGETXDR `1 QS`ˉ``` ڊ:uBCB['KYyB\U D] t6T DD DOt.<u(\UD]T&ӋT l <s<sDOÈDDD,r u u ;ËL$IDxAL\$\TDdx\ǀuڹ A)syIAx )sڋ\ˋL D"D L \TڋLˇڋ \)s,Sˉ\ Q ZuH\ LډӉ\ 7 \C뻊D\T0)s؎ otD  ttDx\ÊD$¶` Ӌu%S *uD tau ؋` Q ` EY[ Ìػ`&.`/ 0`/? H`& Gt'Q`V W@u¹ `X`ZS [Y͸ DO= ta>`1rZ`#tS`#`%`!u? u: `&t.SP WX G[GS_&[` DlDj|OuQrTtjtl PDj llQ XUHP$ X@Q 1 Ƅ @DlY]X DlDjU a&]Y ú` $`&ú`V9NONFILOriginUnitDataCodeCOMPATCLSAFPFREDRVXTNTRYUnitOrigin USRFCNCPMVERROSFCN RVNFCNDT1FCNZDT2FCNaDT3FCNSRCFCNCLOFCNROUFCNEXTFCN1 ` `DO\_Ë\UD]&R&G &G [ * P$X$t DO &Gñ  * ؋\UD]& &G &G, s ËDU= t`á`DOÀ DS0 t DTDU`DQ` Ë\QLjTUDl TULS\QDOCONMGROriginUnitDataCodeINPLNATNCHRCKDOSTDOCONIATNBELRESCHR ABTCHR PRTCHR ECOCHR EOPFCN ERRXITLSTOUTCONASTCOLCNTCIFCNCONIN#ECHO COFCNYCONOUTXRCIFCN_RCOFCNeDCFCNCONSTPBFCNCIBFCNCSFCNSRTFCNPBCFCNoXFRCD CONINICKATTNeCONOIiCONSOmCONSI$ < s< t < t< t<uP XDOÊDU< s(< t < u$``$*`Q Y`  DOÊLU DUttt l gt eDOË\UD]&C:`t S [Ë\UD] 6 DOË\Ut`à`DOË\UD]&O&&CIQS @[Yò :`t & ut` t:`t `t : :`t!: `t: `t: `uڀ  u   tQY Dgtȴ` Ê/gCONTBLOriginUnit DataCONDRAATNCHRRESCHRABTCHRECOCHRPRTCHRCONASTATNBEL `DOMGROriginUnit DataCodeXCNTRYSETCBFUNLINKSAVCLBLDIRCLRCLB LNKBEG ALLOC DEALOCDOCONIADFFCNoCKDOSTa!`uFCtjtl\j\lTn R`DnƄ `ZTn DlDj`tG*Ê< t<u t `` `  ËDUu Dn`uW`t W` P Pu:` % Au+` ڌ݋\UD] ` G G ڱt DOÃ`  # `t `S 1[   `t  `t4 / SDnP`DnڱXDn[Ë`Ë``)` ` INPLNOriginUnitCodeECHODMSCONINCONOUTINPLN &/C&SC0P <t<< s<t4< t5<t<<t8XP8s&CXP< s@Q^ VY N X[&  uZXtP K&< s  XPRSQR  ZY[SQY[SQY[LSTMGROriginUnit8CodeEOPCHRSPLOUTCONOISPLEOPCALCBVDSPINPPTRASTPBLFCNLSTOUTSRPFCNEOPFCNLOFCNXFRLD\UD]&O&IQ&CS [YË\UDT tLQS [Yt <sDh` t`DSPCHROriginUnitVDataOCodeXTNTRY!DEALOCALLOCLNKENDUNLINKLNKBEG GETSDSTICCNTRDYSPHCTPFCN3CRPROCCGETWSBwSMFCN}SNDMSG SIGNALRMFCNRCVMSGWAITLNKPOLISRXITSETDRFDISDSPDSPIFRENADSPDPFCNDELAYRESUMEDLYTIC<GETTOSJSETDDF"a c T` TUt \Q &DOñ *P`U@؎м`T` [ SR [ZYu5QS [C[`TGN`TYOD Y Y GF_HW3R` [0ËTQ\US[ \U \Q q_û`PV `U@u  D7@u DL` b %^Xπd7D7@tL7L7@  D7ud7À`U`UuÀ&`U`x0\Ut\8` \L`U@D:\T@lB|DdFTHDJ؎м`T&`U t`` t 7G[`U u# ƻ` \Lx` `U `t ƎDJTHdF|DlBT@L>\`t 9`s` r)+` uH` û`)G)ȱS\U \QDOÉ` )s` ` ` ``tW` @@)t/r9`r``ڋ`t`= r GË` BB$0Ë` ` BB)Ӱr;`r ` CCW0Ë\U`W``t5` 9tG;` tWRZ`WR ZW뺋````tHH;` tG` 0ý "uVý  uaý 3tBý  *tODS  tt`)G`j ڰDODS tDOËG+GG)GAOڋ+G7wG)OS`P`ڻ` X`[Gڻ`>  /DS TUT]`> Gt ;r9r DOà`PG` >`ju(`> Gt`:Gs SQ LY[G X` o rKOGG`7wG)OSڻ`> ^[G `P`ڻ` BX`DOX`û`> $` ```RQ` YZù (C` t/`:Gu2G;tG;u  )ËGGá`u`⻋`t`GڋOډOU ]``f`  uډ wr0G+Gs/>`t؀>``u;`s``⺠``t>``u` û`>`f `:Gs rtËGtڋ+rPG++GXr9  ڕ\UD]`fݹ ``COMSUBOriginUnitDataCodeCONOUTSYSDATUndDataUndCodeTSTUND DEXLAT0SHL7BX7DECOUTuUNLINKLNKENDLNKBEGDMSDMSBXUPRCASCALCBVLDIRLDDRGETSDS!00`ù Cty$8u ;uCC QYô '    d ĺ )sӄut 0PS[XËGډGË_OW ډO[  .CtS[2 22#~:#~ ʅ++~B2#+~ ʅI:O*!^ *}=22! «!*~ʫ  ʥ ˜!:K=G:xzګ! >2Ï! =go Ó!42:<2O~Ҹ ʸګ>#7(! +Hit any key to continue, ^C to abort$7> ͽ:=o:g > :<2Pʸʸ! File not found !$ë! Wild card file specification not allowed.$ë! Illegal file specification !$!^ *|>!JG> x<*|:KO :JW> > > ! ~#$! a{ 0 ?))) O 2:\#~:+f~#@d##~#.ʅ*;ʅ!څ#Ç>  i~.–#~#* ʴ;ʴڴ#ö>  ˜~##;ʼ S.} Ҽ2üP¼>2ü!6# >2>?  *(}'*%}$*"}!*} ˜~##;ʼ S.} Ҽ2üP¼>2ü!6# >2,=0 ; reset top row __C1: CALL PRAMOUT ; send scrolling command PUSH DX ; SAVE CURRENT ROW/COLUMN MOV DH,=0 ; SET COLUMN ONE CALL CUPEOL ; clear unprotected end of line POP DX ; RESTORE ROW/COLUMN RET ; all done ; HZTAB: ; horizontal tab. CONTROL-I MOV AL,DH ; get current column XOR AH,AH ; make double length MOV CL,TABSIZ ; get the tab size DIV CL ; calc last tab column MOV AL,TABSIZ SUB AL,AH ; calc length to next stop ADD AL,DH ; calc next tab stop CMP AL,=NMBCOLS ; test against number of columns JNC __X ; if over limit, continue, no change MOV DH,AL ; set new column number __X: RET ; all done ; ; BEGESC: MOV DI,&ESCTBL ; get control char lookup table MOV SI,&ETBLXEC ; get pointer to execution tbl MOV BX,=ETBLEN-1 ; get length of excape table TBLOOKX: MOV AL,CL ; load char MOV CX,BX ; get table length INC CX REPNZ SCAS BYTE ; look for a match JZ __C ; if found, continue RET ; else just exit ; __C: SUB BX,CX ; calc length into table ADD BX,BX ; time 2 for execute table JMPI [BX+SI] ; execute the function ; ; ; +-----------------------------------+ ; | ANSII SEQUENCE FUNCTIONS | ; +-----------------------------------+ ; ; Start up ANSII sequence ; BEGANS: MOV NXTSEQ,&ANSPARS ; setup ANSII buffer routine MOV ASCBP,&ASCBUF ; initialize ANSII buffer MOV ASCOPT,=0 ; clear ANSII option boolean RET ; ; Buffer characters in ANSII buffer ; ANSPARS: CMP CL,=A0 ; Is the character < 0 ? JB __X1 CMP CL,=ASC ; No, is it a ";" ? JE __X CMP CL,=A9 ; No, is it > 9 ? JA __X1 __X: MOV BX,ASCBP ; No, it's in [0..9, ;] CMP BX,&ASCBUFE ; Is there room in buffer ? JE __X2  MOV [BX],CL ; Yes, store char INC BX ; Move to next buffer pos MOV ASCBP,BX MOV NXTSEQ,&ANSPARS ; Continue to accumulate chars __X2: RET ; ; Process ANSII command in CL ; __X1: TEST ASCOPT,=1 ; Is this an option command ? JZ __X3 MOV DI,&OPTTBL ; Yes, look for char in OPTTBL MOV SI,&OPTXEC ; Execute off OPTXEC MOV BX,=OPTLEN-1 ; OPTTBL length JMP TBLOOKX __X3: MOV SI,&ATBLXEC ; Execute off of ATBLXEC MOV DI,&ANSTBL ; Look for char in ANSTBL MOV BX,=ATBLEN-1 ; ANSTBL length JMP TBLOOKX ; ; Convert ASCII parameter to binary ; ; Assume SI = ^Buffer, BX = Default value, DX = Minimum value ; Return CX = binary value ; ASCTOBIN: XOR AX,AX ; Clear out high byte for later MOV CX,BX ; Setup default value CALL ATBGET ; Get first character into AL JE __X ; IS there a character ? XOR CX,CX ; No, start accumulating __X0: MOV DI,CX ; Multiply accumulator by 10 SHL CX,=1 SHL CX,=1 JC __X1 ; Overflow ? ADD CX,DI JC __X1 ; Overflow ? SHL CX,=1 JC __X1 ; Overflow ? SUB AL,=A0 ; Convert ASCII to binary ADD CX,AX ; Add in new digit JC __X1 ; Is this an overflow ? CALL ATBGET ; Get new character into AL JNZ __X0 ; Is there a valid character ? CMP CX,DX ; No, is return > minimum ? JAE __X MOV CX,DX  ; No, return minimum __X: RET __X1: MOV CX,BX ; Overflow, flush parameter __X2: CALL ATBGET ; Get next parameter char JNE __X2 ; End of parameter ? RET ATBGET: ; Get char in AL, return Z set ; if character invalid CMP SI,ASCBP ; Is the buffer empty ? JE __X LODS BYTE ; Get character into AX CMP AL,=ASC ; Is it a ";" ? __X: RET ; ; Get a 1-based parameter and return it in CX ; GET1PRM: PUSH DX ; Save current cursor position MOV SI,&ASCBUF ; Start at beginning of buffer MOV DX,BX ; Set default to minimum CALL ASCTOBIN ; Get parameter value POP DX ; Recover cursor position RET ; ; Multiple parameter read and dispatch ; Assume AX = ^handler routine ; ADISP: MOV ASCADR,AX ; Save parameter handler addr MOV SI,&ASCBUF ; Get pointer to param buffer PUSH DX ; Save current position XOR DX,DX ; Set minimum parameter __C: CMP SI,ASCBP ; Are there any parameters left? JE __X MOV BX,DX ; Make default parameter 0 CALL ASCTOBIN ; Get parameter value CALLI ASCADR ; Call handler routine JMP __C ; Go get next parameter __X: POP DX ; Recover cursor position RET ; ; ANSII Set attribute ; AATTR: MOV CURATTR,=DEFATTR ; Set attribute to green MOV AX,&AATRHAN ; Get address of attr handler JMP ADISP ; Go handle attributes AATRHAN: T$EST CX,=0XFFE8 ; Is this a valid parameter ? JNZ __C TEST CL,=0X10 ; Yes, is the color bit set ? JNZ __CLR MOV BX,CX ; No, assemble special attrib. MOV AL,ATTRTBL[BX] ; Get attribute bit OR CURATTR,AL ; Include it in new attribute __C: RET ; Get another attribute __CLR: AND CURATTR,=0X1F ; Clear out old color SHL CL,=1 ; Shift new color into position SHL CL,=1 SHL CL,=1 SHL CL,=1 SHL CL,=1 OR CURATTR,CL ; Include new color RET ; Get another attribute ; ; ANSII option set ; ASETOPT: MOV ASCOPT,=1 ; Set ANSII option mode MOV NXTSEQ,&ANSPARS ; Continue parsing parameters RET AENABLE: MOV AX,&AENHAN ; Setup to handle option #'s JMP ADISP ; Start parsing parameters AENHAN: CMP CX,=ACSPRM ; Is this a cursor enable ? JNE __X OR FLAGS,=CSRFL ; Yes, enable the cursor __X: RET ADISABLE: MOV AX,&ADISHAN ; Setup to handle option #'s JMP ADISP ; Start parsing parameters ADISHAN: CMP CX,=ACSPRM ; Is this a cursor disable ? JNE __X AND FLAGS,=~CSRFL ; Yes, disable the cursor __X: RET ; ; ANSII Set X-Y coordinate ; ASETXY: MOV SI,&ASCBUF ; Get pointer to param buffer PUSH DX ; Save current position MOV DX,=0X0001 ; Minimum line number to 1 MOV BX,DX ; Default line number to 1 CALL ASCTOBIN ; Convert parameter to binary CMP CX,=NMBROWS ; Is this beyond last row ? JA __X PUSH CX ; No, save this for later CALL ASCTOBIN ; Convert next parameter POP DX ; Get row back into DL CMP CX,=NMBCOLS ; Is this beyond last column ? JA __X MOV DH,CL ; Get column in DH SUB DX,=0X0101 ; Convert to 0-based coords POP AX ; Trash old position JMP FCKWP ; Go set position __X: POP DX ; Return with old position RET ; ; ANSII Cursor right ; ARIGHT: MOV AX,&NFSP ; Get address of cursor mover JMP ANSCSR ; Go move cursor ; ; ANSII Cursor left ; ALEFT: MOV AX,&BACKSP ; Get address of cursor mover JMP ANSCSR ; Go move cursor ; ; ANSII Cursor down ; ADOWN: MOV AX,&LINE ; Get address of cursor mover JMP ANSCSR ; Go move cursor ; ; ANSII Cursor up ; AUP: MOV AX,&RLINE ; Get address of cursor mover ANSCSR: MOV ASCADR,AX ; Save address of cursor mover MOV BX,=0X0001 ; Set minimum and default to 1 CALL GET1PRM ; Get move count into CX PUSH FLAGS ; Save flags OR FLAGS,=ANSFL ; Set ANSII mode __X: PUSH CX ; Save count just in case CALLI ASCADR ; Move cursor up POP CX ; Get count back LOOP __X ; Go as many times as specified POP FLAGS ; Restore flags RET ; ; ANSII Line clear sequences ; ALINE: MOV SI,&ALNEXEC ; Get jump table for line code JMP APLXEC ; Get param and execute ; ; ANSII Page clear sequence__R: MOV SI,BX ; Recover critical registers POP DI ; Pop destination register POP DS MOV AL,WRFLAG ; Set dirty bit if write OR DIRTYBUF,AL XOR AL,AL ; Reset clock timeout MOV CLKCHK,AL MOV DRVRBUSY,AL RET SETDMA: OUT DMAMODE,AL ; Setup read/write mode CALL DELAY ; Couldn't hurt XOR AL,AL ; Transfer at start of buffer OUT DMAADDR,AL ; Setup low part of address CALL DELAY OUT DMAADDR,AL ; Setup high part of address CALL DELAY MOV AL,=0X1FFF % 0X100 ; Get low part of track size OUT DMATC,AL CALL DELAY MOV AL,=0X1FFF / 0X100 ; Get high part of track size OUT DMATC,AL CALL DELAY  MOV AL,=01 ; Set DMA mask OUT DMAMASK,AL CALL DELAY RET DELAY: PUSH CX ; Save counter register PUSHF ; Save flags MOV CX,=0X10 ; Setup count __L: LOOP __L ; Wait for a while POPF ; Restore flags and counter POP CX RET SENDCMD: XOR AL,AL ; Reset completion status OUT INTREG,AL CALL DELAY ; Couldn't hurt XOR CH,CH ; Get number of parameters MOV CL,[BX] JCXZ __CMD ; Are there any parameters ? MOV AL,=0X40 ; Write CLDB to formatter OUT FMTREG,AL CALL DELAY __FWT: IN AL,FMTREG ; Can formatter accept byte ? TEST AL,=0X20 JZ __FWT __PMOR$$8COPYRIGHT 1984, SOFTWARE 2000, INC. (VERSION 04/30/84) `&b؎м` ࢃ\u6]< u/e< u(ku!lum< uu< u {ut؎t`  - { u ]< ue< u\uktO]?m< uu< ulu{t3m&] C$t G$'C8ujrn lCjnluruoKrpz Ӈڋ)rTpj)tSphBKYމ׌؎p>ߋ6t ؎j:pBpLdSYf *  ໌C~t `&b when change complete ( Unable to lock out destination drive  Unable to free drive  Insert next destination disk in drive:  Unable to open source file Unable to create destination filed Unable to read source fileB Unable to write destination file Unable to close source file Unable to close destination file Unable to set attributes on source file Unable to set attributes on destination filel Insufficient memory for copy F Non-privileged user+ Insufficient memory not found S^U]^[ÜP.Ct2XSQR ZY[SQRZY[SQRtZY[PSQR$±ZY[XHYNABCERXNN""7COPYRIGHT 1984, SOFTWARE 2000 INC. (VERSION 01/24/84) `&b؎м`uWCߋd~u/9ud VP 5u du5d%qu!qCCqquu$ttuuduu .sr6qd6qr.s =Evdf`.WqHB1`&bdu#.sr6qñ ûڱ ࠀú뵱 S0fghji\kG<0r%<9w!,0>iuh>iuif (it>iui>jsCj[->itnfjtNv kj9s$3Ċ,8uEj9rݸ )ȢgӀ>guFFF>gtxoghuphgt\htUf$u>f0twf)fff۾0gtFhȴCûÊ$$Ĉ$?u *GÉpL CoȴƹvFC Cn$1nopttKn0nycSy9[|ynn)ԅy nn5àn$uڻ9| o)CoBp$mu@õt>ttFNtKs >tt6QtutY<r G$'C8uhrl jChljupurKpn6 Ӈڋ)rWnh)tSn$BKYމ׌؎nߋ6r ؎hnBnrËnuaÉt&] C$PMພtx G$'C8un1 znrr pCnrpuvuKvtӇڋ)r}tn)tStBKYމ׌؎tߋ6x ؎zRntBtZ|zˉ|S~)[r~&) ZtuÉ&~r u)rtȢuu)rKB)sBӉӉӉ  t QUY uËKu7<u< t.dt*RB^St)[s5CMst[CC?6 t (H)    htqz 0trtu i 0\yAy:]Jn | "X Éڊ0sf2 ËdDt2 KӺӹC   * 1ttK0ycSy9[|y)ԅy 5à$uڻ9| )CB$mu@àL:A:/, y:PNXJùt:.ÊC%t.t ñT@BL3A'91d& 0Pt, Xõ)sPu u 0XjSSYYlà PXÈRZ8tR Z8t S^U]^[ÜP.CtXu/SQRZY[SQRtZY[PSQR$±ZY[XPSQR$±ZY[X to Continue qKkREMAINING] DISK READ ONLYF FILE>88:{}COPYRIGHT 1984, SOFTWARE 2000, INC. (VERSION 01/24/84) *&,؎м 78kti8"0@(t)#\u \ûe$< uDCO(taCCtO< tCtD< uCt9< tC<'t<"t KS(C(ۺZKCt 8uþ\ ؎096ttûeC< t <$uW$h؎0\\t*...<u8t<tzdu3 ߄u';u.!(1P X`&b˱ ñ tڀ>bu~ 5bP>>u ~ 5VP.먀>bu VP.G+D bPn+F }D F bP+J }3+J P@+H }F H P+F }J FP+~=ubP+~=u VP6.P ,~=ubP+~=uFvvv6H +PP=bPg+FPv6J 6F +PbPr=Pv6J 6F +PvPR=]_^VWU R 6F )PbP,P.< >< t36< PP! u 6< -PPs7Pg7P5<uP tFP tR R .b FP u P uFFGFvT)F }F Fv)F }J Fv)FvI*F^?tvPvvvE*Pv;P: u]_^VWUf~,t ~t ~ +]_^VWUf~t~;u+]_^VWUv+F<tFP;Fu+]_^VWU~A|~ZF F]_^VWU>R u Pj+PP4 u PP+6Pl4 u *P2+6T P V<$>.>MrP' u*mP usP  uuP t:cP tFYF^cPv6,B ueP*B N L ]_^VWU#zP4+FFrP t)+Ps)P6B 4.L F~}~F>V FFF;R |wF.b P&PD&PF.b Pt(PV+: uF.b PP3P)]jFF%=tF%@FfF~tF.>MFN u ~tF.>MFN u(FPwFP8P8=|aFPP98=F~>F7FF~>FFPcP trP uFPP2rP uP'FPP6B 2FIFCFFPPFP7 uQF~u+P$;Ft P(FP F=uF.>Eu8PFPD7 uPFFP F=uF.>Etx~uv;FuPt'UFPH7HF ~C~}_u8~EAFP3 F=tF.>Et ~EэFP F=t(F.>Et%FPP01FFPF=~uF.>MF.>FE ~>F=tAF.>FE F.>Et)F.>vE FPP0rPd u~u.P6B |0L +P<%P6B a0F FP5@F~UFPP6B 60:P6B %0L +P$FP!P6B 0FP5@FFFFPFPiF=uFPF=uF.>F@%E~tF.>M~}#~>FF;V pFV g%P$ZFF~u ~uF?~݀ v=t HP.vX =tnX .>MX .6~>FD X .>FE F.>EtX .>vE ~t~u P!$+FFFFFF;V ~~>F=tދF.6F.>ED rP tF.>Eu~u._P6B -L +P"aP6B -F F.Fv=3@F~UvݸnP6B -4rP6B -L +PN"vݸtP6B p-v2@FrP# txP6B D-.L F~}~F>V v{P,CC;ug~t6: &#zP,]_^VWU+FFFF~}HFF^v~+Љ<>8:46~쉅02미PF~tF.>EuF~tFFhP ubP u+FFhP uA8P u3FFF;T } F;FtF.>EtF~t ~t+>Z ǙFV~uF.>EF.>Z E F.>E +FV>X u6X + FX .>E FF.>Euv FF̋F;Fu!~t1F.>E FV >X tP*X ~uXFFF;T }kF.>E%=uۋF.>}uȋF.>FE F.>EF.>E +FVvvǙFV@BFFF;T }kF.>E%=uۋF.>}uȋF.>FE F.>EF.>E +FVvv}ǙFVDFdPB uHJvv?ǙDF@BPF~tF.>EuF~tuF.>EF.>E F.>E +҉FVvvǙdfF.>Etdf`bP$F~tF.>EuF~tuF.>EF.>E F.>E +҉FVvv ǙtvF.>Ettvpr~t+ǙFVFFF;T }xF.>E%=uۋF.>}uȃ~uFFF.>FE F.>EF.>E +FV|vv3ǙFVPRFFF;T }kF.>E%=uۋF.>}uȋF.>FE F.>EF.>E +FVvvǙFVTVdP\ t XZ\ ^ FFF~}/~\ ^ <>~狅02\ ^ FFF;T }zF.>EtF.>E FF.>EuF.>vE F.>E FF.>FE FFF;T |F.>Et$F.6F.>+ED 뺋F.>EtF.>E FF.6F.>E D qPF=t\F.>EuIF.>DE F.>E F.>FE F.>MP(F=toF.>Eu\F.6~t狅4D F.>E F.>FE F.>M]_^VWUFV ؋ʁ]_^VWU\ W"` u PsO tF]_^VWUP#mPn t+P^$P6B #.L >X t7>` >Z >Z G>` 6Z 6X >+Ɖ>Z >` F~}~F>V 9PFAP)FFFF;R |pF.b P2PIPF.b PP: uF.b PLP"QP5FF%=tF%@FfF~tF F FFF =@t=tFN uFFv F@)FvF =@t=tv~F>` F뢃~tF F FFF =`t=tFN uOFFvF@@)FvwF =`t=tv~>` FFF~>FF.>EtFFF~>FFFrFPcP tmP uFPhP mP u-PFPoP6B L <F6FFP#FFFPkFPF=uF.>F@%E~>FF;V ~FV xP uF.>EtkFPzGFFFFF;V ~~>F=tދF.>EumPl u+P\F.PP6B uF.>E P6B FH=w>vPP6B F.>uP6B L F.6F.>ED F~}~F>V vPDCC;ug~t6: FFF;T }BF.>EuF.6F.>E &>ED벸P]_^VWU~t F;T |+F.D D ]_^VWU~t F;T |+8F.|狅<>FV| | +FV؋ʋË]_^VWU6: : W F=u P F]_^VWU6: : W F=u P6: : W F=u PF F]_^VWU6: : W F=u P~FF uЋ]_^VWUlP te6H PPP@ u P"P!PZhP4 tF|ޱ㋇6 4tVޱ㋇02FVFV؋ʋÉFv+Pޱ㋇46FVFV؋ʋÉFvޱ㋇8:FVFV؋ʋÉFvx 2O t +P9` F\ O t^FP6@ ]_^VWU6@ v@ W=u ;P]_^VWU6@ F%P@ W=u SP6@ F%P@ W=u kPm]_^VWU>B t 6B 6D ]_^VWUPPe tPPS=u P]_^VWU 6F W PvPPp> uvPP6> PP u.,PP tɸP u>,=t6>,="t->uvF+FV؋ʋ>` ,.>,=t ,. P+P>uPPPaFPP t_~uPPm,~F;2wr ;0r΋~狅<>FVFF>uPP tFbvF+FV؋ʋ>` FNF+FV؋ʋ>` FF+FV؋ʋ>` vFFF+ƉF =w6> ]_^VWUvvFP uFP teFPFPt~F;E~ F~E~F;E~ F~E~F~됋F~)=+t=-ty~}u~t~E]_^VWU P t2v#~E=}~EP t3 P t2v~EP tP+P;P tvd~؋~FP tJFPGF~u PNv~F.>E~E~E-v u v  u(P+P]_^VWU+~E~E~]_^VWU~v ^ W =t5 t0 uN ~G +Nu˃ |N ~Gƈu;~t+]_^VWU.-Fv &;|-v }v +-PV57P["-PV:PDv =P7]_^VWUFN tPv ]_^VWU(6,P> u<_ubO ~ ^FFފFP uۊFP* ù~_tƋ^ƣ,. }APP+]_^VWUJP0 tF3MP tF>,P tF ++F>,FP uFPT uF~0|z~7tFƱ0~0|b~9\F.~0|~9FƱ-0+FP/F=A|~FFƱ-7F-=w,7~5,.~tOPP]_^VWUW>,='u2,1~,.`P u bP+P\+]_^VWU>,=\t,>,P[c z up k f>,P tK+,>,P t,Ʊ-0,CC;ug >,,]_^VWU`6,~=t FPȋ~F;t+ ƣ,.]_^VWU>,=t>,=;t+]_^VWU>,=t>,= ,]_^VWU~A|~Z~ ~a| ~z+]_^VWU~0| ~9+]_^VWU~a|~zF- F]_^VWU+>F;6T }Wvo u]_^VWU>T |nP3T .vVc+DDDD D D T T ]_^VWUsPڃ tePFT H;~CVP@G;>T }ދ.P.P ~WVϸP]]_^VWUF.F .FFN tFFGF]_^VWUsPك uuPك uP+PP6B .L F;6T |.>Et+Py.PP6B .>E$ P6B `H=w.>u .>u P6B $.>EuP6B P6B L P P6B L F;6T |.>Eu+P}.P P6B .>Et[.>E$ #P6B RH=wV'P'P6B ,,P6B 6P6B L h/]_^VWUF;tFP P]_^VWUP P]_^VWUPP]_^VWUFF~FF tI~:u~|~FFҀ~0|р~9˃~u F-0F빊FF.F]_^VWUFF~FP׃F t,~:u~tFFπ~a|΀~pȊF-aF뼋F]_^VWUFF~FF t~:uF~FF t~.t ~FFދ~]_^VWU~=t ~F=.uF]_^VWUF~|.~ ~~FF>0~FF>0~ |~FF a~v ~F:~Fv F  u~=t~E.~FvF u츜]_^VWUv1PvPvcPP1]_^VWUFN t6B v B W]_^VWU>L t>L ~6B PB WL ]_^VWUL ;F>L ud]_^VWU>L tOcPԃ t)6B PB W=PPU6B 6B PB WL ]_^VWUN L <FF~}6B PB W㸊P6N 8P6B k .L ]_^VWUv; 6D KPS]_^VWUNV 6VWUNV *$VWUNV VWUNV ‹]_^VWU쾰!s<tV4vσ]_^VWUvt(tVPT=t+@t VF=t@tDPPQ=uD t uW+]_^VWUv%H=Hu_|tY|D1F;|sEWPDP"P t 'ǀPVKD1;D vD1D 붋FD1+]_^VWU쾰!s<uVv v4+]_^VWU v <tV=u+FFFFF^ F  t4FFFF~uFлCC;ug뽃~t ~tF Fu~u~t ~t DD+DDfPv  u~t D FD aGD\kPv  uD FD6 pPv  uDuPv  u~u DD HD:5D HDo5 @~u Vv u~t(DPPDPP=t~D c~tCDPP=uDPP=tKVIP+PPV`=u,.DPP=tVD0D1D2D3+]_^VWUv DDDDFF|^FF t-~.t'~:t!D;vy~a| ~zn GFÃ~:u*D;uR|uLDF=A|@~P:F-@D됍D;vG |~.u5^FF t%D;w+,~a| ~zn GFˍD;vG ]_^VWUvDP#P;D1D ]_^VWUv v^ W]_^VWUv~ uu W PVEP*]_^VWUv~  u} uuW P=tb}uPE u Eu}uW t.EEE M}WU uWP u]Eƈ*]_^VWUv ]_^VWU v@u3V t%~u VJ~tD +ҹFVus| tm|uPD uD D1tPDP!P u+FF~} ~|=u뿀+~Ǚ)FVFVF V F V %؋ʋÉF^ N +ɋÉF|tF;D1uD+DD;F0|uPD tFD1V+P u#D+DD+F*DFDD$D+]_^VWUv@u/D1+ҹFV|t|+|ǙFVFV]_^VWUv |DFFtV u+D1F;D rFt w;~trGǀ;~taWPDP!PF t2~t~t ;|u0 *FF~} ^PV@ uFD1DD+DD]_^VWUvD+D>PV]_^VWUv~ O|D1uD2u +]_^VWUvPF=t~ t GF~u;u+Ƌ]_^VWU~uF%F>zuE%)>tFn~;ws6z6|^FFFF(^7v1FCC;tHgFF+ƉF }F~uFN tvv^W;vvv^FP^W~uFN uvv^W]_^VWUv FFN^+v t+v ڊFN^FN^^?t^FF^FFF]_^VWUv~nN^ FVF V ǙRPv v -FV t0ǙRPv v RFVF؊FN^F멋F ؊FN^F^?t^FFFƋ]_^VWUv ~G?uOFFGF uF]_^VWUv~ G:u F?u+Oߊ:}]_^VWUv ~FFGF uF]_^VWUvF?u+H]_^܋_܍_VWUV F++ ;wr w;?r+?w@]_^܋_܍_VWUv ~++ ;Wr w;r+W]_^VWUFFFFFFFF u t tu<>uFFvF2~|P P(+P+P^FݍDG t# t ta| zFFDh^G~t&Nv=A|Z  PPP' uP P+P+PtPPv uvP PPPvv uvP PVPa+PFPv7PJ]_^VWU0~}FFPFPFPvvvv v vw~guC=tG;t }0uO+ƉFЃ~| F;F}Fe F;F|F~~tG-~etFFЋGFЈPvvv v tNG.~~ F t FGFG0NڋGe~|G+G-F؉FGF>0GF>0j~G0 F t FGFG0Nu~t6G.~~*FF |F t FGFG0NЋNj]_^VWU@Pvvv v |C^Pvvv v uf^vFN tF0^FFF F t6FFF F FPvvv v ? Pv H FvMF PE (Pvvv v  |F0PF PPF^vvv v vFF~ft~gu~|F;F|FFF@F~}F~~FFFF;F}aF08PWvvv v $ FFF F vvv v ,|%;vtN=9~01^^F]_^VWUv+ }G؋ޱ㋇    FFFF t2FP6N6L6J6H6 FFFFFFFF]_^VWUv^W ]_^VWUvD |DLuAPP@u0 uPP% t| u ]_^VWUvD | D0uaL}~|uPD u ?\}t P PP\G*F~u\u '^CC\ F@DD@@D}\D*]_^VWUvD |D0t|u)P D u VP uzt V ui$L}VPa uO\D*uB u/L}VP4 u"\D* t| u ]_^VWUv ]_^VWUF*^ȣF F F]_^VWUF VWUF Pvttt4 DDD]_^VWUF VWUF Pvttt4\ DDD]_^[6666VWU^VWU^+VWU^VWU^FGV؈FF%uVv ~ FF~FV؈FF%u wFv~Vv~FN+N}^^^^هVv~F9~Vv~FNl N^:ttF~vV:utA$ u u u t7yErIs A؉6>]_^VWU+*F y=ط7VWU+*F)VWU*V F y؃ VWU*V F+ɋ tr ψ+]_^VWU^VWU^GV؈F%uF~FV؈F%uFv~Vv~F8:Vwr;vwr;~wr;Fr Fr:Vwr ;vwr;~wr;Fr +F~vVVVVV⿊Vv~F^+^À| ^+ҋ‰6>]_^VWU^VWU^FV؈FF%t$Fv~GV؈F%u}F~+й8n^^^s F~vV܋^^|5rs ^+ҋ‰6>]_^óVWU~VWU~+~ x Et @"EuHvt @s y]_^VWUVWUFu6V^ Ҋ΁t!|;}Ft+]_^ó @`>CZw 7 ',16 @`H!!+0b!!" s&'&'''''&BFNRT'''''+ +++,, ,%,abrw(2-22272 DOUXcdefgorsux<<<<=U< = = =<=Z=~<< KxTA@ B B@Usage: TLINK genfil {cmdfil} {-8bchlmrsux} Serial number violationTurboDOS 8086 Linker Copyright 1984, Software 2000, Inc. cmdgenparr* %s * oNo input files specifiedNot enough memory for name tableNot enough memory for externals tableAbsolutecon:lst:wCan't open list filePass 1 <<< INTERMODULE REFERENCE LISTING >>> rb%s: Can't open object file%-8s Module %sOriginUnit Duplicate def: %s Bad public def: %s Defines: %s %sToo many externals/moduleTransferDuplicate xfer address References: %s %s Bad token = %02x Code Transfer is not in Code (ignored) No code group (transfer ignored) ExtraStackEndCodeEndDataNot enough memory for output bufferPass 2 <<< MODULE MAP >>> UndCodeUndDatarb%s: Can't open object file%-8s Module %s Undefined name: %s %-8s CS:DS:ES:SS:%04x (%04x) Bad token = %02x Unexpected EOFUnexpected EOFUnexpected EOFUnexpected EOFwbCan't create output fileWriting output file "%s" Can't write output fileCan't write output fileCan't write output file Linker abortedNrProcessing parameter file "%s" %s "Missing '"'(Ignored),=AbsoluteOut of range(Ignored),+-()Missing ")"[]Missing "]"-UndefinedInvalid syntax^ ^ %s Too long0X0Invalid digit(s)'Missing "'"Name table overflow Sorting name table %d Printing name table <<< SYMBOL TABLE >>> %-8s = CS:DS:ES:SS: %04x (%04x) uninitialized %-8s = CS:DS:ES:SS: %04xundefined Page %d of TurboDOS Linker Listing for "%s" con:rdr:lst:pun:{NULL}0123456789ABCDEFcon:waToo many arguments $con:wCannot open stderr $r%s: cannot open %s: cannot create +@ BCzE@GPH$tJL M(knOQ@CRhT*V W1_cY[.\@v:k ^^# `bxaz&Xcn2xeW ?hfSh@aQYjok 'Nm x9?o 6pOgIr#E@|osp+ŝuL67EwV߄xl: z{Η@|H½} Pv狅8COPYRIGHT 1984, SOFTWARE 2000, INC. (VERSION 01/24/84) `&b؎м`\u]< u e< u\udȈRZupߠ\y± ߄uUduJd!u? to retry m not found^, bad memoryM loading at da@"="!u tOtQtStUtWtYt[t]t_i<D_D]D[DYDWDUDSDQDOtËdaDODetP!D_t]l[|YtWTULS\QDOt^u"V!Ɖ\QLSTUDW|Yl[D]D_DOk!rKDSuT4<+%T3uTs(4t)r(WSZڄuWO QR[ZYY4(u4x54D&u[  !44ՊD( ȈD0D( D(tuvuD0u/D/@u)\(S40)Ӊ\(r{[\(t {y5449t T1A2L4\1Uy\1W49Ӊutw-@ttkt!lmtDt\1G_t0D&t\+D-T+l-D&tڕ D&t@KD0:rD( D0D(CD(CD)CD*C4D/tD0C':DU$4DV<s44&4DQÊDUtÊDUolVt  Ӊ44t S[u49trӉ\1t:Ouŀu uPxGu@t2Q%tuY@ Y@tQgY utw\1ttAŀt<t$`<`u/Q4ˋtSQY[Du4Y449t Ӏ'߉tuË4OQYŀt QY0û4409tS [t\1Ãd'D'VD':uFC0^d'uD0:r uD/tDmÀ'XtJD$4:Dsu tu%_VCDF^\1GD"GD 0/\1(4+\14 Juú   \1ÊD'"449)5QS*5ˉ4*54ڊ:uBCB['KYyË\UD]t6TDDDOt.<u(\UD]T&ӋT l <s<sDOÈDDD,r uu;ËL$IDxAL\$\TDdx\ǀuڹA)syIAx )sڋ\ˋL D"D L \TڋLˇڋ\)s,Sˉ\Q ZuH\ LډӉ\7\C뻊D\T0)s؎otDttDx\ÊD$¶4Ӌu%S*uDt5t5À>5t55J$tH5(L$/Nt@tʀH<^r 15x6tx6ux6m6t 66r6g,6"6)6 >n6uo60Z΀PrO:t6r:u6vu6m6t uƀPr)0>n6u m6@tO:u6v m6tt6m6t uv6>v6rv6R5ZÈ0j6j6(70N7@7A7tA7V7^7uGX7t0ӊŠtt:7'<78s (<7=76?7]7b.`7 (jG7$t%G7uI7t ^7x]7zŠG7V7@tMY7X7W7tTV7$t ËD P XY7uDH:_7 ÊD<sPt e t 0ÊT:7$8t0;7R7ӊR7;7:7B7&:7&B7ù:|0;7ÊD:;7t ;7aù?G7ñ KG7$Pu:7$< uB7Pt@u R/CuÜG7Pt@tRCú5247\ Ë\ QLY ((tr 52Z47PucG7$82r8{ZY[X[OSMASTERSYS$ %*%b%i%z5o%z5z5%%%$ 4 z5z5z5 z5C z5 z5z5z5z5z5z5z5z5z5z5)$l$z5$%%z5$z5&z5z5z5z5 z5z5$\z5z5z5Yu"Lfz5qz5z5z5z5z5z5z5z5z5z5z5z5z5$DIRDSK4444..1$ )p5p5@55(-*+-./0123456789   -=@`:;;'1!2@3#4$5%67&8*9(0)-_=+`~[{]}\|,<.>/?;:'"^{6{6 ++O,,+++>-++=*TYCjk^_qlm.,>---,,,,,,,,,B@N@R@@@@@E@oBFB@GBP@JB@@KB@!@@IB@@ B@@0B@B pB@@@@@@@@LB@@@!.070767675//.41@/}7hM57 P?57 (574M 57P;57(574M7M88@'84MR8 M88         #&),/2!$'*-03"%(+.1??bC9COPYRIGHT 1984, SOFTWARE 2000, INC. (VERSION 03/26/84) &؎м( ( +*+܋G&VWUSFFF~} PJP7FF͋F;Frvv <=-u+vv <PFݘ tŀ~MuFՀ~u P~~ 5FP8PFPFPPPFP2F u P P~~ 5FP PFPmFPP[PFPF tPB;Pv@~uGJPv(vFًFٱ%F=ufFًFMP FN tTP.Pb~uv1P^Pv vPmyP FN ufTP.Pb~uvPPvb vP帥P9 uG=t~u P FP vLFv@FӋFFuP 뜸 P vFv FӃ~u",Pv ~ r 5PF^F͋F&vȊFݘ t#vFݘP^WTPFݘPbv P^WFF&FՉ~uKmP ~u|Pv vPȊF t vFݘP^WTPFݘPbv P^W|vFPPy v uX,&-=w9~tpFF͋F;Fs^F&-SPPv/ ~u$F&+FPPv 뱋F&+FPvmvdP +P%]_^VWUvFvF]_^VWUv^W F=u PbF]_^VWU~a| ~zn F]_^VWUPP[ tPPI=u۸2P ]_^VWUvEP PT]_^VWUNV 6VWUNV *$VWUNV VWUNV ‹]_^VWU (s<tV4v]_^VWUvt(tVPT=t+@t VF=t@tDPPQ=uD t uW+]_^VWUv%H=Hu_|tY|D1F;|sEWPDP"P t 'ǀPVKD1;D vD1D 붋FD1+]_^VWU (s<uVv v4+]_^VWU v <tV=u+FFFFF^ F  t4FFFF~uFл CC;ug뽃~t ~tF Fu~u~t ~t DD+DDLPv  u~t D aD D\QPv  uD aD VPve  uD[PvN  u~u DD XD D D @~u Vv u~t(DPPDPP=t~D c~tCDPP=uDPP=tKVIP+PPV`=u,.DPP=tVD0D1D2D3+]_^VWUv DDDDFF|^FF t-~.t'~:t!D;vy~a| ~zn GFÃ~:u*D;uR|uLDF=A|@~P:F-@D됍D;vG |~.u5^FF t%D;w+,~a| ~zn GFˍD;vG ]_^VWUvDP#P;D1D ]_^VWUv v^ W]_^VWUv~ uu W PVEP*]_^VWUv~  u} uuW P=tb}uPbE u Eu}uW t.EEE M}WU uWP u]Eƈ*]_^VWUv ]_^VWU v@u3V t%~u VJ~tD +ҹFVus| tm|uPzD uD D1tPDP!P u+FF~} ~|=u뿀+~Ǚ)FVFVF V F V %؋ʋÉF^ N +ɋÉF|tF;D1uD+DD;F0|uPD tFD1V+P u#D+DD+FDFDD$D+]_^VWUv@u/D1+ҹFV|t|+|ǙFVFV]_^VWUv |DFFtV u+D1F;D rFt w;~trGǀ;~taWPDP!PF t2~t~t ;|u0 *FF~} ^PV@ uFD1DD+DD]_^VWUvD+D>PV]_^VWUv~ O|D1uD2u +]_^VWU~uF%F>`uE%+ >tFn~;ws6`6b^FFFF(^7v1FCC;tHgFF+ƉF }F~uFN tvv^W;vvv^FP^W~uFN uvv^W]_^VWUv FFN^+v t+v ڊlFN^FN^l^?t^FF^FFF]_^VWUv~nN^ FVF V ǙRPv v 1FV t0ǙRPv v VFVF؊lFN^F멋F ؊lFN^F^?t^FFFƋ]_^VWUv ~G?uOFFGF uF]_^VWUv~ G:u F?u+Oߊ:}]_^VWUv ~ FF tOFF^FF uO t ^FF]_^܋_܍_VWUV F++ ;wr w;?r+?w@]_^܋_܍_VWUv ~++ ;Wr w;r+W]_^VWUFFFFFFFF u t tu<>uFFvF2~|P Pn+P+Pb^FݍDG t# t ta| zFFDh^G~t&Nv=A|Z 师PPPm uP P+P+P PPv> uvPPPTPvv uvPPRP+PFPvP]_^VWU0~}FFPFPFPvvvv v vw~guC=tG;t }0uO+ƉFЃ~| F;F}Fe F;F|F~~tG-~etFFЋGFЈXPvvv v tNG.~~ F t FGFG0NڋGe~|G+G-F؉FGF>`0GF>`0j~G0 F t FGFG0Nu~t6G.~~*FF |F t FGFG0NЋNj]_^VWUPvvv v |C^bPvvv v uf^vFN tF0^FFF ~F |t6FF~F |F FPvvv v ? jPv H FvMF PE rPvvv v  |FzPF PPF^vvv v vFF~ft~gu~|F;F|FFF@F~}F~~FFFF;F}aF0PWvvv v $ FF~F |F vvv v ,|%;vtN=9~01^^F]_^VWUv+ }G؋ޱ㋇~|FF~F|F t2FP66666 FF~F|FFFF~F|]_^VWUv^W ]_^VWUvD |DLuAPPu0 uPPk t| u ]_^VWUvD | D0uaL}~|uPD u ?\}t P PP\G*F~u\u '^CC\ F@DD@@D}\D*]_^VWUvD |D0t|u)P D u VP uzt V ui$L}VP uO\D*uB u/L}VPz u"\D* t| u ]_^VWUv ]_^VWUF*^ȣF F ~F|]_^VWUF VWUF Pvttt4 DD~D|]_^VWUF VWUF Pvttt4\ DD~D|]_^[666~6|VWU^VWU^+VWU^VWU^FGV؈FF%uVv ~ FF~FV؈FF%u wFv~Vv~FN+N}^^^^هVv~F9~Vv~FNl N^:ttF~vV:utA$ u u u t7yErIs A؉6>~|]_^VWU+*F y=ط7VWU+*F)VWU*V F y؃ VWU*V F+ɋ tr ψ+~|]_^VWU^VWU^GV؈F%uF~FV؈F%uFv~Vv~F8:Vwr;vwr;~wr;Fr Fr:Vwr ;vwr;~wr;Fr +F~vVVVVV⿊Vv~F^+^À| ^+ҋ‰6>~|]_^VWU^VWU^FV؈FF%t$Fv~GV؈F%u}F~+й8n^^^s F~vV܋^^|5rs ^+ҋ‰6>~|]_^VWU~VWU~+~ x Et @"EuHvt @s y]_^vVWUVWUFu6V^ Ҋ΁t!|;}Ft+]_^ u u I vabrw DOUXcdefgorsuxNISooo KxTA@ B B@Usage: OTOASM {-m} filename Copyright 1984, Software 2000, Inc. .o Opening %srbInput file not found.asm Creating %swUnable to create output file; START = . $ Absolute byte: .BYTE 0%02xH DB 0%02xH Absolute word: .WORD 0%04xH DW 0%04xH Unrecognizable token End of file encountered End of module encountered, transfer address ignored Public symbol defined: .INTERN PUBLIC Symbol table overflowRelocatable symbols not permitted Module name: .IDENT NAME Set location counter: %04xRelocatable code not permittedUnrecognizable token %s = START + 0%04xH EQU START + 0%04xH End of conversion Unexpected end of fileConversion aborted %s gcon:rdr:lst:pun:{NULL}0123456789ABCDEFcon:waToo many arguments $con:wCannot open stderr $r%s: cannot open %s: cannot create @ BCzE@GPH$tJL M(knOQ@CRhT*V W1_cY[.\@v:k ^^# `bxaz&Xcn2xeW ?hfSh@aQYjok 'Nm x9?o 6pOgIr#E@|osp+ŝuL67EwV߄xl: z{Η@|H½} Pv fputc_~free_ddlmullfrexp_rmain_X_fgeof_ckabort_errno_bdos_ddrmul_dtefg_ _ffill__fgcon_freopen__fincr_Znextbyte_H!dldivR#ilcmp ( end_malloc_|_fpac_fprintf_>!drdiv _parse_Lexit_Xdlsub dicvt#idcvt0nextword_H#ircmpxfclose_ dlcvt _fperr_b"dlmulerrorxit_ _file_ _fsize_Ndrsubs_fnext__main_X"drmul$dpushvldivsprintf_#udcvt ducvtq_dtoa_vlrem`a_arena_ dvcvtfflush_Lfgetc_bdosb_ba_block_vrdivvrrem fseek_<startstrcat_a_fgbbb_printf_Dstrncpy_N ftell__fgfcb_ddldiv4bdosp_upercase_hfopen_strcmp_a_exit_Bdladd _fpbbb_ddrdiv"bdosw_8dradd _fpfcb_/))8COPYRIGHT 1984, SOFTWARE 2000, INC. (VERSION 01/24/84) `&b؎м`-gjil;r~~o8t4e8t.[8t5Q8t;G8t*=8t.90grvh0h 0hgrSifftBg.iߠgu/ht(Ȉdzmim߄tj.lRgt<t0iA:ht! ht h@ 1`&b˺߉gi)r< tr< tr<=u r,Ar<àtȢdCdr G$'C8uhrl jChljupurKpnx Ӈڋ)rWnh)tSnfBKYމ׌؎n<ߋ6r ؎h8nBn IdSYf&r\؎kti&vt tCuÉv H *  ໄCvt# 1`&b}|tˀZ߄tiqtft<t#<u<utKtt hC%Hà PXÈRZ8tR Z8t e Àxy/, s:P<0u X\yAz?:h}C ,.ÊCU No queue number available Invalid queue number requested Ambiguous filename: confirm individual files (y/n)? Ok to queue (y/n)? y notn queueda File not foundK Invalid filename3 Insufficient memory Non-privileged userS^U]^[ÜP.CtXSQR ZY[SQRZY[PSQR$±ZY[XHYNDSQ0!!8COPYRIGHT 1984, SOFTWARE 2000, INC. (VERSION 01/24/84) `&b؎м` |}~]< ue< um< u u< uyt؎ytkti~sz{`~}Rf{zOyult:\u#{t y8}um< uu< u^làtHC<;tIt4CpĠh8u z&zR8u z&zà\y¶߄u t ynf)AS?S;XXÇӉdp\r G$'C8uhrl jChljupurKpnx Ӈڋ)rWnh)tSnfBKYމ׌؎n<ߋ6r ؎h8nBntdSYf@r \t}.`)rl6NW؎_EtE ávt tCuÉv v *  ໃCvtQ `&br G$'C8uhrl jChljupurKpnx Ӈڋ)rWnh)tSnfBKYމ׌؎n<ߋ6r ؎h8nBndSYf&r\؎ktit tCuÉ 8 *  ໘Ct `&b8t48t4ǀz&z z&zh [zuzuLvtEMww xtyĠ8t8u  hCS{ t t'GC^W\G ؎Zu?V\ tt uCt iCt ]<t@<t#<u5<utKtt hCsà PXÈRZ8tR Z8t u Àvi/, s:P<0u X(:hC y.ÊCAà\yN Destination drive read only+ Drive not already set to read/writeread only Ambiguous filename: confirm individual files (y/n)? Ok to set attributes (y/n)? ~set1v File not found` Invalid filenameH Non-privileged user- Insufficient memory Network errorS^U]^[ÜP.CtXSQR ZY[SQRZY[PSQR$±ZY[XHYNFRGAuu8COPYRIGHT 1984, SOFTWARE 2000, INC. (VERSION 01/24/84) `&b؎м` {|}\u]< u e< uxt؎xtkti}Wyz`}|Hzy6xu&x]< ue< u \tx+xustlC<;tItX&xC^ĠV8u y&y3@8u y&y*8ut&yyxxtnf)AS?S;XXÇӉdp\r G$'C8uhrl jChljupurKpnx Ӈڋ)rWnh)tSnfBKYމ׌؎n<ߋ6r ؎h8nBn:dSYf&r\؎kti|nvt tCuÉv o *  ໂCvtJ 1`&b to continue File not found Insufficient memoryp Non-privileged userHYNL"*? \ COPYRIGHT (C) 1982, DIGITAL RESEARCH SID86 1. 07/12/82 ABCDSBSDCDSEIODITSZAPC CDESXXXX CANNOT CLOS INSUFFICIENT MEMOR NO SPAC MEMORY REQUEST DENIE NO FIL START EN VERIFY ERROR AT DISK WRITE ERROPASS SYMBOL BAD FILE NAM SYMBOL TABLE FUL SYMBOL LENGTH ERRO BAD HEX DIGIԠ*+عþ t<@v@ȿ &..&X%&[.м[t_uI;Tt &@Ps`<0r06am>bt\#y< t<;t<-u,Ar<w\].?G>uXo;UH añññ ñ ñ tbþUtbþA uþ(tþ#-z1u3pR5dZt*R6UZt ñ7Gtñ8=tþ9*;%@tþUFt]U]ú æ þ6G-O>.td=c< t< t<:u,@Oÿ <*uWQY_t 㰪I? Ë>G ?ù\ +щEù v +щEùQKYA rþȸ.!. þv#ø .#0t1þv4Xu-ùCC +s QYQ YA:Crþmþ\ Du wCC C s QYQYA:Cr2..6't"5EWDtkWt &&`= .t ..t.t.t..t S.[0ulÀ uP.R:XIÊȳcجд t0SRPQ^[X Î_á.....JN&t&.J& t.+.õ  <&Dõ   >.J*aW[n<t .J.......6.>...&...F.F.F.Ȏ؎м[t.5&.u}.[t!.;u.;u  yQt uV^6( t6(|tL.&:t :.t"t79t.<t 6k:" u6(t/6P[PW&[Yuπ\+;tuýY >uW3_<:u>u]W_<:t݉û>u<:t<+u<-uS Y u>u>\uP+u -u+ËX<+t<-tâU^)vDD],0*.V>XrD\Z u"V.X.;s0... u.0\ÌN4\ <t;=V4ء?A+rPX\atu u8\422\.Xr2u4d\ P'tR5\>t?b"8\8X< uġP+)V^[b uG"<t4mtr*غRSrJuSBu[ðþ^6SXPXt> s/pu[ &þI@"&u#t+t6u":duW̵_uÀ>uMúL+HËbrb \bbË;s 6&þ6k< t< t < t< t< t/l&$? tȵ&VQ_Y^VN^U^Ft ]"t:&$? t't t:u&;\t ȵ΃ԉ6t U.]á6&$?ȵ&QVm^Y`? tE> &$? t3Wȵ:u 6`t__&E^> t%&H< u6J6H";HvH&LP< tW+LrQNTPRR< u;6L&6R&:tL%RLL9PrRt%=&PX#\N`t]u$<,Nu V< t;sF>>?6Dr+:t ;v6&1t;u;wCMDSYMH< tm<*uC\StP2d\J\4^ESZ\|c.ع0X< tZVÿe= uL(P]u u%P+Lr>L L.r L;Pvm ..\< t'  P X< tv< u .. e< u _< tsSW< uXPSPe+!oX-B[XPS+ñ*7[XPSPX/%[X tR6(X)Q#XSXPs #XP2XPr u'XP'[<t.6\G< ulD+s< tA&>^Eu\.&'tТ%\J!< !Jt *< u %& #>;>#wLW[S<t >: _!RLtRt L;Pv..Dt ;u;TtIþQVDt^YþDË>RT|t;uX.}= sOXV6u6uV,0*,NJ*^R*< u ТDL< u|,>L46L|*< tG<.u < tA<"u]u?< t's< u']u u s s>LL"&Ի9'7\t< u t7R&ʠ^*]>.@RTPXP]X>ht<rá,=*;0A.?< tC\t7< u >^Ru, J=;< t=A?< u \*`u`u xPLxXumE\;< uDPDXDâG < tu&G g< u`*E02E(<.u < tr< u) tEÀuJ uN;E>E r LABELS@ VARIABLESNUMBERSUL.F8L.wL.ƊN^:uL.uڰ]U,P]U^?$t 7F]U~ v F, AF0P]UFPF$P]UvM.sFPPHM.]UFPFP]UvM.s v6K.M.]U)PD,&7r,]U,&P"A.&GP>.XP$?.X$@.XP$E.F.X$B.C.D.]UE.s))P]UFF,7r,@,7d]U^.Pv]UN.Pv]UE.svv]UvP)PsL.v.|,&Gv]Uv+Pv]UE.sPz]ðPa]Un.Pv)]U,&7>,]U,&7g,]UE.s]]U,&s & ,&P%,]U,&,>.u 6@.i]|,&OI.s>@.u >>.u]À>>.u,>@.u ,&?t,&|,&GP,>>.u,&|,&GP ,6)&@..$P PP$P####$ $$$6)]UB.s6?.,P],P6?.h]Uz.z.˷G.:8.rz.z.S^G.*8.&z.p,,{.>{.w${.:z.w,7H, P<{.u,]U]U,& u s,]J.]U`6A.]U,&"|.A6|.]U2]U']U]U]U ]U3P]U,&,,:Py6,K]U]UB.s _v]qN]UB.s nS]Ncs]Uu=R]UdB.sP7],P]U;I.D.sPg]ð1P]UA.?.,&$E.6?.Y ]UP46A.*]UI.]UE.>?.vJ.]B.s6?.{vx]sk6?.f]Uy^Vf]U>>.uJ.]Z6?.35]U>>.uJ.]7I.F]U!A. ?.P8]UI.>C.u >E.u]3]UI.]UJ.I.~>H.u(G.㋇)z,?.Ƌz,G.@H.>H.w H..p(J.D?:50++1&7!=CIR tz{vql g2bE]VXSNID?:''''''(( (((( (%(*(/(4(9(>(C(H(M(R(W(\(a((f(k(J.sO]UF|,~,&,,~,&O|,&O|,&O}.M.K.,&Êp*G.q*H.}.s%QP)Ps L. |,&G&}.봀>H.uH.=6G. P)Ps |,&O@6G.P)Ps |,&O >E.t |,&OM.si,]Qj$klmnqrvwxy[]??= $WORD $BYTE $K 68Wj)** *0*@*P*`* HOPHOHODE@AIJGDE@AIJGf=;:SR##Qj)Wa    a?  a    a?H H H H HHa?     O O O O OOP P P P PPK     ########aaaaaaaa????????0+ 3& 21/(f f h h 9 9 9 9 979?<hhhhhhhj gs`e]9 9 9 9 qrklffxymnvw9999999999999999C C8699d d$ $TU i!!!!!!!!zo_V>>Q)W X>>^tB"LNM,,s--'.INJAJBJCJEJGJLJOJPJSJZORAAAAADAAMAASADCADDANDCBWCLCCLDCLICMCCMPCS:CWDDAADASDECDIVDS:ES:ESCHLTINCINTJAEJBEJGEJLEJMPJNAJNBJNCJNEJNGJNLJNOJNPJNSJNZJPEJPOLDSLEALESMOVMULNEGNOPNOTOUTPOPRCLRCRREPRETROLRORSALSARSBBSHLSHRSS:STCSTDSTISUBXORCALLIDIVIMULINTOIRETJCXZJMPFJMPSJNAEJNBEJNGEJNLELAHFLOCKLOOPPOPFPUSHREPEREPZRETFSAHFTESTWAITXCHGXLATCALLFCMPSBCMPSWLODSBLODSWLOOPELOOPZMOVSBMOVSWPUSHFREPNEREPNZSCASBSCASWSTOSBSTOSWLOOPNELOOPNZ E QjzAXCXDXBXSPBPSIDIALCLDLBLAHCHDHBHESCSSSDS>BuBP]Á7t7 U P P]U^B]U?P]UAP]U~B"kBBwBA:FuBu]UF,0< v@NAPv@Y ]UF,0< vF,A ]UBBB>^Bu^BBƊ^BBBB<@r6^BQs,>Bu ]B^B]BBs]B]]B]àBs6^BAsBR6^BRY BBq]UO>B t>B t]]U>Bu0BF8Bw B^;u B^ FBuհ]UAPPAGP]UAPPAGP]Un.PPAP~s AG]ð]U^.PPAGPUs1AGAG AuGAGAG ]ð]UN.PPAGPs1AGAG AuGAGAG ]ð]U>]Bu0>BBYu AG >BWOuAG A t]ð]UP>^B:t@Y"]UFBBB]U젉BsA &PBzAG]U>]Bu>B uAG ]s8sA tZËAG G ]]UAG s? B:AuAG *FAG?>B+u *FAG *FAGs B:At]U6BAPAsA^BAAG]UAGAGAGAGAGAG AG AG AG AG AG s]Ps]os]s]àB:AuAN.PPAGPs\5^B:AtAGAG ]>^B:uAAGAG ]à^B:AuPa]ËAG]UA_Bf>B,t]UArBAG s]>>B t\]UBBr-B=w%Ê?:Bu劏?B?B?B]]UB,<vB㋇p,BBB3.8Bw<BPBP6B sBB8.B]àBBBu]UBBBB >B t>B.u]}sPs>>BuBsNB>BuBs6B6BK랰]!]U6AvA]UBBȢBBtBP]>Bv BPM]UFAÊO s$ u\FA G BFBv-]UxB"}BsFBFBrBPV]U>mBw `BBrB~BBsBB_BP!]U ]U>mBw jBsB]U졃BPkBs BPr]U졃BPfB$<u BPT]U>kBu >BvZ>kBu>BrkB]R]UT]U|_BPnr]U>Bw F ~BF kBB]UyB"gB]UyB"jB]U}B"jBP>mBw@P>Bw@Y"Y"]U.{Bs]]U{Bs Pl]]UA~B+ȁwyBsA@B+Q5]M]UjBs=>sBuxBsB>Bt@"yBs6B6B_BP]]Uq6B6BrBP~]U?W>Bv}B"dBs]]U5wBsBÊB sBP]ðPBBrBP]UvBsBrB BRwBsBÊ B sBPr]àB B B]U]U>rBu vBs]]U^vs BTs>B~ u.c&>kBu>Br>BrB_BPvs]U P]U Pz]UyBs"BBAB+Q]ðPBB]U>Bw%yBs>BuPC]ðP;BP]]UZr>pB@s&}B"fBspBPBX$BrBP]]UArB{Bs B P]àyBs 6B]]UgBsz>sBuwBsB>BwyBsBIB B kBPU>`BudBsB>pBwfBsBzBsB B ~BP>BupBP]UL|Bs BB6B6B]ðPBBk]Us B;]s B;]s PAZ]R]UgB"kB"wBs sBP_]Js P ]]Us}B"cBxB"sB_BBrB >mBtvB"jBsBrBB_BP]À>Bu}B"gBskB B6B!>mBuzB"jBs~B B6pB]s'>mBwkB `BP]B!]js Bz]9]UFAA 6A:P6A PA_Bfr>BvB.?%7 Ozup$k*f0ao\WR MVHC>19f4X/M?R?W?\?a?f?k?p?u?z?????????????>A] 7   ?   Q j 8kl'/! "RS#$ TUw%sr&vrVt'}|(~) WX*vYr+sZw,s-u.~[|/}\0q1{2y3upz4z5{ x t]678^mn_oz{p9qr:;<= >?`as@ABbtucCdDEeFGH vwIJLMNxyO (fghiP 0BXBPSIDI,:+ [] ambiguous operand$H@XP4 #TITLE "Hard disk driver tester" #PAGE 132,66 ; MODULE "HDCTST" ; TLINK "X" ; #INCLUDE "EQUATE" ; LOC Data# DRVRBLK: DB 0 ; read operation DB 0 ; driver number TRK: DW 0 ; track number DW 0 ; sector number DW 1 ; sector count DW 128 ; byte count DW DATABUF ; data buffer DSVAL: DW 0 ; data segment DATABUF:RES 8192 LOC Code# ; START: CALL DSKINX# MOV DSVAL,DS __1: LEA SI,DRVRBLK CALL DSKDRX# INC TRK JMP __1 ; WAIT:: SIGNAL:: RET ; END START  ; Segment containing track buf DIRTYBUF: BYTE 0 ; Flag set 1 if track buf dirty CLKCHK: BYTE 0 ; Number of ticks since check ; ; Command blocks and related declarations ; SEEKOP == 0X68 ; Seek operation command SEEKCMD == . ; Seek command block BYTE 2 ; Number of parameters to seek SEEKCYL: WORD 0 ; Hi byte, Lo byte of cylinder SEEKCDRV: BYTE SEEKOP ; Seek command with drive ; RECALOP == 0X50 ; Recalibrate operation command RECALCMD == . ; Recalibrate command block BYTE 0 ; Number of parameters to recal RCDRV: BYTE RECALOP ; Recal command with drive ; READCMD == 0XB0 ; Read operation command DMAREAD == 0X15 ; DMA read mode command XFERCMD == . AIT:IN AL,HDCSTAT ; Wait until status is posted TEST AL,=0X10 JZ __SWAIT MOV AL,0X11 ; Set formatter HSRQ and CLCE CALL DELAY OUT FMTREG,AL CALL DELAY __CE: IN AL,FMTREG ; Wait until CE is down again TEST AL,=0X04 JNZ __CE CALL DELAY MOV AL,=0X10 ; Issue interrupt status command OUT HDCCMD,AL CALL DELAY __SW: IN AL,INTREG ; Wait until status is ready TEST AL,=0X02 JZ __SW MOV CX,=01 ; Setup status byte count READST: MOV BX,DS ; Setup pointer to status buf PUSH ES MOV ES,BX PUSH DI ; Save destination register LEA DI,STATBUF CALL DELAY IN AL,HDCSTAT ; Get status byte CLD  STOS BYTE ; Save status byte in buffer MOV AL,=0X20 ; Setup formatter for status read CALL DELAY OUT FMTREG,AL CALL DELAY __FWT: IN AL,FMTREG ; Is formatter ready with stat? TEST AL,=0X20 JZ __FWT __SLP: IN AL,HDCDATA ; Get status byte STOS BYTE LOOP __SLP MOV AL,=0X10 ; Set CLCE in formatter CALL DELAY OUT FMTREG,AL CALL DELAY __CE: IN AL,FMTREG ; Wait until CE goes down TEST AL,=0X04 JNZ __CE MOV AX,STATBUF ; Get controller status AND AL,=0X60 ; Mask irrelevant bits CMP AL,=0X40 ; Was operation successful ? POP ES POP DI ; Recover destination register RET DISKFLS: XOR AL,AL  RET ; ; ; Function=3, return drive ready status ; RETRDY: MOV AL,PDRDRV[SI] ; Return ready code DEC AL RET END `䢨uWP䖨tW>jb: 1,䢨 t䠪䢨ujb$`<@_0ÊDTurboDOS 1.40, Copyright 1984, Software 2000, Inc. $($/$)$ <-- $Invalid command$Command not found$Program load unsuccessful$Non-privileged user$\U\UU\}COLDSTRTAUTWARMSTRTAUTVVVV2*3J33373v[v[333?2L&R&`~ubv[[&b&v[v[v[i& Qv[Qv[v[&& &&=?H?S?\??@/I22v[233622;<+>>;<&&(;;;2$'&;5L !=,*.*v[9*779v[::::: ;;3DIRDSKWWWWHDCAPCkData'CodeSCREENWAITSIGNALDSKIN_6DSKDR_ a a   hP  < "@djqZ!gInto drvr Out of drvr  PQRt S[C ZYX0械0橰0昍` û` P`XÊr00`G`<D 0 ```Q DD 41)э`,GWD9ȉGGDGD G D G V 5u&[D+GtL DD ؉DDS [ލ`] ` TDƀ:` u;`tCPSR `&``&```` t`t ` Z[X6`6` ``#` t |u| t/`#` e` t`t` ` y W`|L\ `\ u ،Žڎs_``0``  "0     Q  Y0 0/@ 䢨 tCI       䢨uC撈 䖨t t  H  䢨u z䖨t q䒨t  e `䢨u W P䖨t W>`$ : 1 , 䢨 t䠪  䢨u`$$`<@_0ÊD5DS\UD]&&_S[tUTDU&< uCڻuUSQ[rEtu)r:t"<.tG<:tK}Ur#t6uru+< u r uJZStU،{:[[\Oð(tuUC<0r<:s<,0ĠUtUQUrrrrr< s UYt$YT3uTs(Wt)r(WSZڄuWO QR[ZYFYW(uWx5WD&u_!XXՊD( ȈD0D( D(tuvuD0u/D/@u)\(SX0)Ӊ\(r{[\(t {y5WW9t T1A2LW\1Uy\1WW9Ӊutw-@ttkt!lmtDt\1G_t0D&t\+D-T+l-D&tڕVD&t@KD0:rD( D0D(CD(CD)CD*CXD/tD0C':DU$WDV<sWW&WDQÊDUtÊDUolVt  ӉXWt S[uW9trӉ\1t:Ouŀu uPxGu@t2Q%tuY@ Y@tQgY utw\1ttAŀt<t$`<`u/QXˋtSQY[DuWYWW9t Ӏ'߉tuËXQYŀt QY0ûWW09tS [t\1Ãd'D'VD':uFC0^d'uD0:r uD/tDmÀ'XtJD$W:Dsu tu%_VCDF^\1GD"GD 0/\1xW{\1dWo #uú   \1ÊD'"WW95XQS6XˉX6XXڊ:uBCB['KYyË\UD]"t6TDDDOt.<u(\UD]T&ӋT l <s<sDOÈDDD,r uu;ËL$IDxAL\$ \TDdx\ǀuڹA)syIAx )sڋ\ˋL D"D L \TڋLˇڋ\)s,Sˉ\Q ZuH\ LډӉ\7\C뻊D\T0)s؎otDtt<Dx\ÊD$¶XӋu%S*uDtX^Yu؋XQ\XEY[ ÌػY.Y0<Y?HYGt'QZW@u¹ZZS[Y͸DO=ta>Z1rZYtSXXX!ބu?u: Xt.SPWXG[GS_&[X:ޏDlDj|OuQrTtjtlPDjllQXUHP$X@Q1Ƅ@DlY]XDlDjU XX]YúX݄$YúZ9ݠWZDO\_Ë\UD]&R&G&G[* eP$X$t DO&Gñ 6݁*؋\UD]&&G&G, s ËDU=tZáZDOÀDS0t DTDUDQË\QLjTUDl1TULS\QDO< s< t < t< t<uPXDOÊDU< s(< t < u$ZZ$*ZQ YZDOÊLUDUtttl gteDOË\UD]&C:Zt S[Ë\UD]i6DOË\UtZàZDOË\UD]&O&&CIQS@[Yò :Zt&ut`t:Zt"Zt::Zt!:Zt:Zt:Zuڀu;tQY DgtȴZÊ/g*ZuFCtjtl\j\lTnR,ZDnƄ(ZZTnDlDj*ZtG*Ê< t<ut*Z$Z (Zհ ËDUuDn,ZuW(Zt W*ZPPu:*Z%Au+(Zڌ݋\UD] (ZG G ڱ&ڄtDOÃ$Z z#`t$ZS1[ (Zt *Zt4/SDnP,ZDnڱXDn[Ë(ZË$Z$Z)(Z*Z&/C&SC0P<t<< s<t4< t5<t<<t8XP8s&CXP< s@Q^VYNX[&uZXtPK&< sXPRSQR  ZY[SQ;Y[SQY[Ë\UD]&O&IQ&CS[YË\UDT tLQS[Yt <sDhZtZTUt \Q&DOñ8*P [@؎м [Z[ SR[uZYu5QS[C[ [GN [YODYYGF_HW3RZ[0ËTQ\US[\U\Qq_ûZPV [@uD7@u DLZb%^Xπd7D7@tL7L7@D7ud7À [ [uÀ& [Zx0\Ut\8Z\L [@D:\T@lB|DdFTHDJ؎м [& [tZZt 7G[ [ u#ƻZ\LxZ [ ZtƎDJTHdF|DlBT@L>\[t 9[s[r)+\uH[û\)G)ȱË\U\QDOÉ[)s[[[[[tW[@@)t/r9[r[[ڋ[t[=r GË[BB$'0Ë[[BB)Ӱr;[r [CCW0Ë\U[W[[t5[9tG;[tWRZ[WRZW뺋[[[[tHH;[tG[0ý"uVýuaý3tBý*tODStt[)Gv[ڰDODStDOËG+GG)GAOڋ+G7wG)OS![P![ڻ"[X![[GڻJ[/DSTUT]J[Gt ;r9r DOà![PG![>v[u(J[Gt![:Gs SQLY[GX![orKOGG![7wG)OSڻJ[^[G![P![ڻ"[BX![DOX![ûJ[$"[![\\RQ"[YZù(C[t/![:Gu2G;tG;u)ËGGá[u[⻋[t![GڋOډOU]"[r[ [uډwr0G+Gs/> [t؀> [ [u;[s[[⺠ [[t> [ [u[ûJ[r[![:Gs rtËGtڋ+rPG++GXr9 ڕ\UD]r[ݹ![![00x[ùCty$8u ;uCCQYô'd ĺ)sӄut 0PS[XËGډGË_OWډO[.CtS[ \2r \=ZY[XHHF*\\\\È< tttt ,t t0$ uu\ t\\Ë\ ۊ\t t B10;\tC\\9u\C/S\t\À>\t\\J$tH\(L$/Nt@tʀH\uԀt{1Ў.\\C\\9u\;\tC\\RGZð t`u$ s_ȹ 7u )`#`r`y``_TÀ>_t_u__``_KI`!`(` >_u_0ty _tu0PrOy _t0:_r:_v__t uƀPr)0>_u _@tO:_v _t__t u_>_r_R ZÈ0__(``RxZR0€rZ/`&```&``r`f_rP0à_P`&`*_`&`1`&`_`&`*`!R'C0t@uWCCZ@t@t@Pt`#aб C&û` P` XÊr00$a^u a atJa t  ax?݈„u a<wRZt.a8tu \ 0uDu4@aDtCD$CDCD$aD P XD D:  Dt@ M a$taz !a!a t!a1t@tʀ"aDaD aDa\a0aaataa auGat0ӊŠtt`'`8s (``6aab."a (j a$t% au at  axazŠ aa@tMaaatTa$t ËD P XauDH:!a ÊD<sPt e t 0ÊT`$8t0`aӊa``a&`&aù:|0`ÊD:`t `aù? añ K a$Pu`$< uaPt@u R/CuÜ aPt@tRCúPL`\ Ë\ QLY ((tr P`tPuc a$lb: 1,䢨 t䠪䢨ulb$`<@_0ÊDTurboDOS 1.40, Copyright 1984, Software 2000, Inc. $($/$)$ <-- $Invalid command$Command not found$Program load unsuccessful$Non-privileged user$^U^UU\}COLDSTRTAUTWARMSTRTAUTVVVV2*3J33373x[x[333?2L&R&`~ubx[[&b&x[x[x[i& Qx[Qx[x[&& &&=?H?S?\??@/I22x[233622;<+>>;<&&(;;;2$'&;5L !=,*.*x[9*779x[::::: ;;3DIRDSKWWWWwMwMvQ..../.. //////#/w/z/~////$ DSK1$ E$Z$Zx[-PRINT-?000ZZZZZZ`[[ C2NEC-APCC3 SINGLE USERC6 (10/05/84)C5$@?@\\(-*+-./0123456789   -=@`:;;'1!2@3#4$5%67&8*9(0)-_=+`~[{]}\|,<.>/?;:'"^OOOPOQOROSOTOUOVOWOXOYOZ__ eHH3IHHHHK^HH=*TYCjk^_qlm.[(JK;L|LEKcKiKoKuK{KKKKdI3K'KfHCABDJKmMh>JJJJJJJJ#J#JJXJhLluJdJdJ|LlLK;L/L'LB@N@R@@@@@E@oBFB@GBP@JB@@KB@!@@IB@@ B@@0B@B pB@@@@@@@@LB@@@!.````5NNMON?ahM5Pa P?5aa (5ra4M 5aP;5a(5a4MaMaa@a4Mb Ma         #&),/2!$'*-03"%(+.1JbJbPbPbhP @QQQaTQInto drvr Out of drvr  ; Set DMA mask OUT DMAMASK,AL CALL DELAY RET DELAY: PUSH CX ; Save counter register PUSHF ; Save flags MOV CX,=0X10 ; Setup count __L: LOOP __L ; Wait for a while POPF ; Restore flags and counter POP CX RET SENDCMD: XOR AL,AL ; Reset completion status OUT INTREG,AL CALL DELAY ; Couldn't hurt XOR CH,CH ; Get number of parameters MOV CL,[BX] JCXZ __CMD ; Are there any parameters ? MOV AL,=0X40 ; Write CLDB to formatter OUT FMTREG,AL CALL DELAY __FWT: IN AL,FMTREG ; Can formatter accept byte ? TEST AL,=0X20 JZ __FWT __PMOR: INC BX 8 ; Get next parameter DEC CX ; Decrement parameter count JCXZ __PLST ; Is this the last parameter ? MOV AL,[BX] ; No, get the parameter CALL DELAY OUT HDCDATA,AL ; Output it to controller CALL DELAY JMP __PMOR ; Process next parameter __PLST: MOV AL,=0X04 ; Tell controller this is last CALL DELAY OUT FMTREG,AL CALL DELAY MOV AL,[BX] ; Get last parameter OUT HDCDATA,AL CALL DELAY __CMD: MOV AL,=0X11 ; Send HSRQ and CLCE to fmtr OUT FMTREG,AL CALL DELAY __CE: IN AL,FMTREG ; Wait until formatter ready TEST AL,=0X04 JNZ __CE INC BX ; Load command byte MOV AL,[BX] OUT HDCCMD,AL ; Send command byte to cntrlr MOV AH,AL ; Save command byte for later CALL DELAY __CWT: IN AL,INTREG ; Is the command done yet? TEST AL,=0X02 JZ __CWT CALL DELAY ; Yes, finally AND AH,=0X80 ; Yes, was it a seek command ? JZ IOSTAT MOV CX,=07 ; Yes, setup for normal status JMP READST IOSTAT: IN AL,HDCSTAT ; Clear status register CALL DELAY MOV AL,=0X10 ; Set formatter CLCE OUT FMTREG,AL CALL DELAY __CEWT: IN AL,FMTREG ; Wait until CE goes down TEST AL,=0X04 JNZ __CEWT CALL DELAY __HDIN: IN AL,INTREG ; Wait until HDIN goes down TEST AL,=0X02 JZ __HDIN CALL DELAY __SWAIT:IN AL,HDCSTXWWWQRS ZYubG G G G G_G&Xİ>Wt)r(WSZڄuWO QR[ZYFYW(uWx5WD&u_!XXՊD( ȈD0D( D(tuvuD0u/D/@u)\(SX0)Ӊ\(r{[\(t {y5WW9t T1A2LW\1Uy\1WW9Ӊutw-@ttkt!lmtDt\1G_t0D&t\+D-T+l-D&tڕVD&t@KD0:rD( D0D(CD(CD)CD*CXD/tD0C':DU$WDV<sWW&WDQÊDUtÊDUolVt  ӉXWt S[uW9trӉ\1t:Ouŀu uPxGu@t2Q%tuY@ Y@tQgY utw\1ttAŀt<t$`<`u/QXˋtSQY[DuWYWW9t Ӏ'߉tuËXQYŀt QY0ûWW09tS [t\1Ãd'D'VD':uFC0^d'uD0:r uD/tDmÀ'XtJD$W:Dsu tu%_VCDF^\1GD"GD 0/\1xW{\1dWo #uú   \1ÊD'"WW95XQS6XˉX6XXڊ:uBCB['KYyË\UD]"t6TDDDOt.<u(\UD]T&ӋT l <s<sDOÈDDD,r uu;ËL$IDxAL\$ \TDdx\ǀuڹA)syIAx )sڋ\ˋL D"D L \TڋLˇڋ\)s,Sˉ\Q ZuH\ LډӉ\7\C뻊D\T0)s؎otDtt<Dx\ÊD$¶XӋu%S*uDtX^Yu؋XQ\XEY[ ÌػY.Y0<Y?HYGt'QZW@u¹ZZS[Y͸DO=ta>Z1rZYtSXXX!ބu?u: Xt.SPWXG[GS_&[X:ޏDlDj|OuQrTtjtlPDjllQXUHP$X@Q1Ƅ@DlY]XDlDjU XX]YúX݄$YúZ9ݠWZDO\_Ë\UD]&R&G&G[* eP$X$t DO&Gñ 6݁*؋\UD]&&G&G, s ËDU=tZáZDOÀDS0t DTDUDQË\QLjTUDl1TULS\QDO< s< t < t< t<uPXDOÊDU< s(< t < u$ZZ$*ZQ YZDOÊLUDUtttl gteDOË\UD]&C:Zt S[Ë\UD]i6DOË\UtZàZDOË\UD]&O&&CIQS@[Yò :Zt&ut`t:Zt"Zt::Zt!:Zt:Zt:Zuڀu;tQY DgtȴZÊ/g*ZuFCtjtl\j\lTnR,ZDnƄ(ZZTnDlDj*ZtG*Ê< t<ut*Z$Z (Zհ ËDUuDn,ZuW(Zt W*ZPPu:*Z%Au+(Zڌ݋\UD] (ZG G ڱ&ڄtDOÃ$Z z#`t$ZS1[ (Zt *Zt4/SDnP,ZDnڱXDn[Ë(ZË$Z$Z)(Z*Z&/C&SC0P<t<< s<t4< t5<t<<t8XP8s&CXP< s@Q^VYNX[&uZXtPK&< sXPRSQR  ZY[SQ;Y[SQY[Ë\UD]&O&IQ&CS[YË\UDT tLQS[Yt <sDhZtZTUt \Q&DOñ8*P [@؎м [Z[ SR[uZYu5QS[C[ [GN [YODYYGF_HW3RZ[0ËTQ\US[\U\Qq_ûZPV [@uD7@u DLZb%^Xπd7D7@tL7L7@D7ud7À [ [uÀ& [Zx0\Ut\8Z\L [@D:\T@lB|DdFTHDJ؎м [& [tZZt 7G[ [ u#ƻZ\LxZ [ ZtƎDJTHdF|DlBT@L>\[t 9[s[r)+\uH[û\)G)ȱË\U\QDOÉ[)s[[[[[tW[@@)t/r9[r[[ڋ[t[=r GË[BB$'0Ë[[BB)Ӱr;[r [CCW0Ë\U[W[[t5[9tG;[tWRZ[WRZW뺋[[[[tHH;[tG[0ý"uVýuaý3tBý*tODStt[)Gv[ڰDODStDOËG+GG)GAOڋ+G7wG)OS![P![ڻ"[X![[GڻJ[/DS9AT ; Wait until status is posted TEST AL,=0X10 JZ __SWAIT MOV AL,0X11 ; Set formatter HSRQ and CLCE CALL DELAY OUT FMTREG,AL CALL DELAY __CE: IN AL,FMTREG ; Wait until CE is down again TEST AL,=0X04 JNZ __CE CALL DELAY MOV AL,=0X10 ; Issue interrupt status command OUT HDCCMD,AL CALL DELAY __SW: IN AL,INTREG ; Wait until status is ready TEST AL,=0X02 JZ __SW MOV CX,=01 ; Setup status byte count READST: MOV BX,DS ; Setup pointer to status buf PUSH ES MOV ES,BX PUSH DI ; Save destination register LEA DI,STATBUF CALL DELAY IN AL,HDCSTAT ; Get status byte CLD STOS BYTE  ; Save status byte in buffer MOV AL,=0X20 ; Setup formatter for status read CALL DELAY OUT FMTREG,AL CALL DELAY __FWT: IN AL,FMTREG ; Is formatter ready with stat? TEST AL,=0X20 JZ __FWT __SLP: IN AL,HDCDATA ; Get status byte STOS BYTE LOOP __SLP MOV AL,=0X10 ; Set CLCE in formatter CALL DELAY OUT FMTREG,AL CALL DELAY __CE: IN AL,FMTREG ; Wait until CE goes down TEST AL,=0X04 JNZ __CE MOV AX,STATBUF ; Get controller status AND AL,=0X60 ; Mask irrelevant bits CMP AL,=0X40 ; Was operation successful ? POP ES POP DI ; Recover destination register RET DISKFLS: XOR AL,AL RET ; ; .MOV AX,DS MOV DX,ES MOV DS,DX MOV ES,AX MVWRDS: SHR CX,=1 ; Convert byte count to words REP MOVS WORD ; Transfer from/to buffer JNC __R ; Odd number of bytes ? MOVS BYTE ; Yes, catch last byte __R: MOV SI,BX ; Recover critical registers POP DI ; Pop destination register POP DS MOV AL,WRFLAG ; Set dirty bit if write OR DIRTYBUF,AL XOR AL,AL ; Reset clock timeout MOV CLKCHK,AL MOV DRVRBUSY,AL RET SETDMA: OUT DMAMODE,AL ; Setup read/write mode CALL DELAY ; Couldn't hurt XOR AL,AL ; Transfer at start of buffer OUT DMAADDR,AL ; Setup low part of address s ; APAGE: MOV SI,&APGEXEC ; Get jump table for page code APLXEC: XOR BX,BX ; Set minimum and default to 0 PUSH SI ; Save jump table address CALL GET1PRM ; Get operation parameter POP SI ; Restore jump table address CMP CL,=02 ; Is operation greater than 2? JBE __C XOR CX,CX ; Yes, use default __C: MOV BX,CX ; Transfer to appropriate code ADD BX,BX ; Convert to table index JMPI [BX+SI] ; Transfer to appropriate code ; ; ; +------------------------------------+ ; | TERMINAL ESCAPE SEQUENCE FUNCTIONS | ; +------------------------------------+ ; ; Set cursor X-Y address. ; SETXY: MOV NXTSEQ,&SETROW ; next char should be the row RET ; done ; SETROW: MOV CH,=NMBROWS ; get number of valid rows CALL CKBIASA ; remove ASCII bias JC _X2 ; if invalid, exit MOV TMPROW,CL ; store in temp variable MOV NXTSEQ,&SETCOL ; next char should be the column _X2: RET ; done ; SETCOL: MOV CH,=NMBCOLS ; get number of valid columns CALL CKBIASA ; remove ASCII bias JC _X2 ; if invalid, exit MOV DH,CL ; move to reg MOV DL,TMPROW ; get temp stored row JMP FCKWP ; check forward movement and exit ; ; Set attribute directly ; ATTDIR: MOV NXTSEQ,&ATTSET ; Set attribute directly RET ATTSET: MOV CURATTR,CL ; Yes, ... we mean DIRECTLY RET ; ; Set alternate font ; SETFONT: MOV NXTSEQ,&FONTCHK ; Set font from RAM RET FONTCHK: CMP CL,=A1 ; Is this an ASCII "1"? JNE __X MOV FONT,=ALTFONT ; Yes, set alternate font __X: RET ; ; Set display colors. ; BEGCOLOR: ; set colors attribute MOV NXTSEQ,&SETCOLOR RET ; SETCOLOR: MOV CH,=8 ; set upper limit CALL CKBIAS0 JC __X ; if invalid, continue MOV AL,CL ; move to reg MOV CL,=5 ; get shift factor SHL AL,CL ; move bits AND CURATTR,=~0XE0 ; strip old attributes OR CURATTR,AL ; add new ones __X: RET ; done ; ; Begin reverse video fields. ; BEGRV: OR CURATTR,=0X10 ; set attribute bit RET ; done ; ; End reverse video fields. ; ENDRV: AND CURATTR,=~0X10 ; clear attribute bit RET ; done ; ; Begin blinking fields. ; BEGBLINK: OR CURATTR,=0X08 ; set attribute bit RET ; done ; ; Begin blank fields. ; BEGBLANK: AND CURATTR,=~0XE0 ; set secret color code RET ; done ; ; End blink/blank fields. ; ENDBB: AND CURATTR,=~0X08 ; clear attribute bit OR CURATTR,=0X80 ; set display GR attribute RET ; done ; ; Begin underline fields. ; BEGUND: OR CURATTR,=0X01 ; set attribute bit RET ; ; End underline fields. ; ENDUND: AND CURATTR,=~0X01 ; clear attribute bit RET ; ; Set cursor attribute. ; SETCSRA: MOV NXTSEQ,&SETCSR1 ; set code expected next RET ; and exit ; SETCSR1: MOV CH,=5 ; get upper limit on code CALL CKBIAS0 ; check ASCII bias JC __X ; if invalid, continue AND FLAGS,=~CSRFL ; clear cursor display flag DEC CL ; code = 0? JC __X ; if so, continue OR FLAGS,=CSRFL ; set cursor display flag MOV BL,CL ; move to reg ADD BL,BL ; times 2 ADD BL,CL ; times 3 XOR BH,BH ; make double length ADD BX,&CCHRTBL ; add table base MOV AX,&CCHRCMD ; point at command table too MOV CX,=3 ; get loop count __LP: MOV AL,[BX] ; get first parm XCHG AX,BX MOV [BX],AL ; substitute XCHG AX,BX INC BX ; bump table pointer ADD AX,=2 ; and command table pointer LOOP __LP ; continue for the count __X: RET ; all done ; ; ; Check ASCII BIAS. Limit in CH reg, Base is ASCII SPACE. ; CKBIASA: SUB CL,=ASP ; remove bias, check lower limit JC _BX ; if invalid, exit CKBCOM: CMP CL,CH ; check upper limit CMC ; invert logic _BX: RET :SCRAPC3DataCodeWAITSIGNALTABSIZCURSORSLFLAGSCREENCSRCHKCSRENA! a!:  i n%Q]=*TYCjk^_qlm.[(ox]  fHCABDJKmMh>k'93-a[hLlhWB@N@R@@@@@E@oBFB@GBP@JB@@KB@!@@IB@@ B@@0B@B pB@@@@@@@@LB@@@!.VWQ`Y ` _^؎`uQ` r  ,`Y`&`` V``` u1>` u. s)Q~ #Y `:ȹ u )`D #` t`  {` ` ` VÀ>`t`u``t `` ``` !`  (`   >`u` 0ty `tu0PrOy `t0:` r:` v` `t  uƀPr)0>`u `@t O:` v `t` `t  u` >` r`  R Save current position XOR DX,DX ; Set minimum parameter __C: CMP SI,ASCBP ; Are there any parameters left? JE __X MOV BX,DX ; Make default parameter 0 CALL ASCTOBIN ; Get parameter value CALLI ASCADR ; Call handler routine JMP __C ; Go get next parameter __X: POP DX ; Recover cursor position RET ; ; ANSII Set attribute ; AATTR: MOV CURATTR,=DEFATTR ; Set attribute to green MOV AX,&AATRHAN ; Get address of attr handler JMP ADISP ; Go handle attributes AATRHAN: TEST CX,=0XFFE8 ; Is this a valid parameter ? JNZ __C TEST CL,=0X10 ; Yes, is the color bit set ? JNZ __CLR MOV BX,CX ; No, assemble special attrib. MOV  ; all done, exit ; ; Check ASCII BIAS. Limit in CH reg, Base is ASCII 0. ; CKBIAS0: SUB CL,='0' ; remove bias, check lower limit JC _BX ; if under, exit JMPS CKBCOM ; join common code ; ; Clear screen and leave cursor in original location ; CUPSCR1: PUSH DX ; Save original coordinates CALL CUPSCR ; Go clear screen POP DX ; Restore original coordinates RET ; ; ; Clear unprotected screen. ; CUPSCR: MOV TOPROW,=0 ; reset top row CALL PRAMOUT ; send PRAM values XOR DX,DX ; reset row/column register MOV ROWCOL,DX ; and storage location CALL PNTCHAR ; point cursor at screen memory MOV AL,=NMBROWS ; get number of rows MOV CL,=NMBCOLS ; get column size MUL CL ; calc screen positions DEC AX ; adjust for DC variable MOV FIGSP2,AL MOV FIGSP3,AH ; set DC variable MOV BX,&FIGSCMD ; get figs command addr CALL GDCOUT ; and send it MOV CHAR,=ASP MOV BX,&WDATCMD CALL GDCOUT CALL PNTATTR ; point to attribute memory MOV BX,&FIGSCMD CALL GDCOUT AND CURATTR,=0XE0 ; reset non-color attributes MOV BX,&WATTCMD JMP GDCOUT ; send write data command ; ; Clear entire line and leave cursor in original location ; CUPEOL2: PUSH DX ; Save original cursor location XOR DH,DH ; Go to beginning of line CALL CUPEOL ; Clear line POP DX ; Restore original cursor RET ; ; Clear from beginning of line to cursor position, inclusive ; CUPEOL1: PUSH DX ; Save current cursor position MOV AL,DH ; Get # of chars - 1 XOR AH,AH XOR DH,DH ; Start at left margin CALL CLRCHR ; Clear the characters POP DX ; Restore cursor position RET ; ; Clear unprotected to end of line. ; CUPEOL: MOV AX,=NMBCOLS ; get number of columns SUB AL,DH ; calc remaining columns DEC AL ; adjust for DC write CLRCHR: MOV FIGSP2,AL MOV FIGSP3,AH ; set figs parameters CALL PNTCHAR ; point to char memory MOV BX,&FIGSCMD CALL GDCOUT ; send figs command MOV CHAR,=ASP MOV BX,&WDATCMD CALL GDCOUT ; write data and exit CALL PNTATTR ; point to attribute memory MOV BX,&FIGSCMD CALL GDCOUT ; send figs command MOV BX,&WATTCMD JMP GDCOUT ; ; Clear from beginning of screen to current cursor position ; CUPEOP1: CALL CUPEOL1 ; Clear begin line to cursor PUSH DX ; Save current cursor position __C: DEC DL ; Move to prior line JS __X ; Are we off the display ? CALL CUPEOL2 ; No, clear entire line JMP __C ; Loop until done  __X: POP DX ; Restore cursor position RET ; ; ; Clear unprotected to end of page. ; CUPEOP: PUSH DX ; save current row/col __1: CALL CUPEOL ; clear current row to end of line XOR DH,DH ; force first column INC DL ; select next row CMP DL,=NMBROWS ; test against max rows JB __1 ; if still on screen POP DX ; restore row/col RET ; and done ; ; DELCHAR: RET ; ; INSCHAR: RET ; ; ; +----------------------+ ; | STATUS LINE ROUTINES | ; +----------------------+ ; ; Initialize the status line. ; SLINIT: RET ; all done ; ; ; +----------------------------------+ ; | SCREEN DRIVER COMMON SUBROUTINES | ; +----------------------------------+ ; ; Point cursor at current DX specified row/column. ; PNTCHAR: CALL SCRADDR ; calc screen address MOV CSRLOW,AL MOV CSRHI,AH ; load command variables MOV BX,&CSRCMD JMP GDCOUT ; send command and exit ; ; Point cursor at current DX specified attribute field. ; PNTATTR: CALL SCRADDR ; calc screen address ADD AX,=ATTROFF MOV CSRLOW,AL MOV CSRHI,AH MOV BX,&CSRCMD JMP GDCOUT ; ; Return the current attribute byte. ; RETATTR: CALL PNTATTR ; point to attribute memory CALL GDCFE ; wait for fifo to empty MOV BX,&RDATCMD ; load read command addr CALL GDCOUT ; and issue it JMP GDCIN ; read returned value and exit ; ; Calc physical screen address from row/column. ; On entry: DL=row, DH=column. ; On exit: AX=screen address. ; SCRADDR: MOV CL,DL ; mov current row to reg ADD CL,TOPROW ; add in the top row base CMP CL,=NMBROWS ; check for max row wrap JB __C1 ; if no wrap, continue SUB CL,=NMBROWS ; wrap screen memory __C1: MOV AL,=NMBCOLS ; get constant MUL CL ; calc beginning row addr MOV CL,DH ; get current column XOR CH,CH ; make double length ADD AX,CX ; calc distance into row RET ; all done ; ; ; PRAM output subroutine. This routine calculates the PRAM values ; based on the current top row (TOPROW) and number of user rows (NMBROW). ; PRAMOUT: MOV AL,TOPROW ; get current top row MOV CL,=NMBCOLS ; get number of columns MUL CL ; calc starting address MOV PRAM1,AL MOV PRAM2,AH ; set start addr, ptn 1 MOV AL,=NMBROWS ; get max row number SUB AL,TOPROW ; calc rows to ent of ptn MOV CL,=19 MUL CL ; times line size MOV CL,=4 SHL AX,CL ; adjust field MOV PRAM3,AL MOV PRAM4,AH ; set length, ptn 1 XOR AX,AX MOV PRAM5,AL MOV PRAM6,AH ; set start addr, ptn 2 MOV AL,TOPROW ; get rows to end of ptn MOV CL,=19 MUL CL ; times line size MOV CL,=4 SHL AX,CL ; adjust field MOV PRAM7,AL MOV PRAM8,AH ; set l;ength, ptn 2 CALL GDCFE ; wait for fifo empty MOV BX,&PRAMCMD ; get parameter ram command CALL GDCOUT ; send to device JMP GDCFE ; wait fifo empty and exit ; ; ; GDC command output subroutine. ; On entry: [BX]=length of command, [BX]+1=Commands/Parameters word list. ; GDCOUT: PUSHF ; save flags CLI ; and disable interrupts PUSH DX ; save regs MOV AH,[BX] ; load command length INC BX ; bump pointer XOR DH,DH ; clear reg __LOOP: TEST AH,AH ; any bytes left? JZ __X ; if not, exit loop ; __C1: IN AL,CRT_STAT ; read GDC status TEST AL,=FF ; fifo full? JNZ __C1 ; if so, wait MOV DL,1[BX] ; load port (command or parm) MOV AL,0[BX] ; load value OUT DX,AL ; and send it INC BX INC BX DEC AH ; count words down JMPS __LOOP ; and continue loop ; __X: POP DX POPF ; restore interrupt status RET ; else, exit ; ; ; Wait for GDC fifo empty out. ; GDCFE: IN AL,CRT_STAT ; read GDC status TEST AL,=FE ; fifo empty? JZ GDCFE ; if so, continue loop RET ; else, exit ; ; ; Read a GDC returned parameter. ; GDCIN: IN AL,CRT_STAT ; read status TEST AL,=DR ; data ready? JZ GDCIN ; if not, loop IN AL,CRT_PARM ; read the dICopyright 1984, Software 2000, Inc. (Version 24-May-84) U^.;]R&T؎м): )+*+3@܋GR&T˱VWUv vEP9P9 h()+P/]_^VWU~} VP@/+bNtSF v <=-u~ @PPY>ڀ>bu~ 5bP>>u ~ 5VP.먀>bu VP.G+D bPn+F }D F bP+J }3+J P@+H }F H P+F }J FP+~=ubP+~=u VP6.P ,~=ubP+~=uFvvv6H +PP=bPg+FPv6J 6F +PbPr=Pv6J 6F +PvPR=]_^VWU R 6F )PbP,P.< >< t36< PP! u 6< -PPs7Pg7P5<uP tFP tR R .b FP u P uFFGFvT)F }F Fv)F }J Fv)FvI*F^?tvPvvvE*Pv;P: u]_^VWUf~,t ~t ~ +]_^VWUf~t~;u+]_^VWUv+F<tFP;Fu+]_^VWU~A|~ZF F]_^VWU>R u Pj+PP4 u PP+6Pl4 u *P2+6T P V<$>.>MrP' u*mP usP  uuP t:cP tFYF^cPv6,B ueP*B N L ]_^VWU#zP4+FFrP t)+Ps)P6B 4.L F~}~F>V FFF;R |wF.b P&PD&PF.b Pt(PV+: uF.b PP3P)]jFF%=tF%@FfF~tF.>MFN u ~tF.>MFN u(FPwFP8P8=|aFPP98=F~>F7FF~>FFPcP trP uFPP2rP uP'FPP6B 2FIFCFFPPFP7 uQF~u+P$;Ft P(FP F=uF.>Eu8PFPD7 uPFFP F=uF.>Etx~uv;FuPt'UFPH7HF ~C~}_u8~EAFP3 F=tF.>Et ~EэFP F=t(F.>Et%FPP01FFPF=~uF.>MF.>FE ~>F=tAF.>FE F.>Et)F.>vE FPP0rPd u~u.P6B |0L +P<%P6B a0F FP5@F~UFPP6B 60:P6B %0L +P$FP!P6B 0FP5@FFFFPFPiF=uFPF=uF.>F@%E~tF.>M~}#~>FF;V pFV g%P$ZFF~u ~uF?~݀ v=t HP.vX =tnX .>MX .6~>FD X .>FE F.>EtX .>vE ~t~u P!$+FFFFFF;V ~~>F=tދF.6F.>ED rP tF.>Eu~u._P6B -L +P"aP6B -F F.Fv=3@F~UvݸnP6B -4rP6B -L +PN"vݸtP6B p-v2@FrP# txP6B D-.L F~}~F>V v{P,CC;ug~t6: &#zP,]_^VWU+FFFF~}HFF^v~+Љ<>8:46~쉅02미PF~tF.>EuF~tFFhP ubP u+FFhP uA8P u3FFF;T } F;FtF.>EtF~t ~t+>Z ǙFV~uF.>EF.>Z E F.>E +FV>X u6X + FX .>E FF.>Euv FF̋F;Fu!~t1F.>E FV >X tP*X ~uXFFF;T }kF.>E%=uۋF.>}uȋF.>FE F.>EF.>E +FVvvǙFV@BFFF;T }kF.>E%=uۋF.>}uȋF.>FE F.>EF.>E +FVvv}ǙFVDFdPB uHJvv?ǙDF@BPF~tF.>EuF~tuF.>EF.>E F.>E +҉FVvvǙdfF.>Etdf`bP$F~tF.>EuF~tuF.>EF.>E F.>E +҉FVvv ǙtvF.>Ettvpr~t+ǙFVFFF;T }xF.>E%=uۋF.>}uȃ~uFFF.>FE F.>EF.>E +FV|vv3ǙFVPRFFF;T }kF.>E%=uۋF.>}uȋF.>FE F.>EF.>E +FVvvǙFVTVdP\ t XZ\ ^ FFF~}/~\ ^ <>~狅02\ ^ FFF;T }zF.>EtF.>E FF.>EuF.>vE F.>E FF.>FE FFF;T |F.>Et$F.6F.>+ED 뺋F.>EtF.>E FF.6F.>E D qPF=t\F.>EuIF.>DE F.>E F.>FE F.>MP(F=toF.>Eu\F.6~t狅4D F.>E F.>FE F.>M]_^VWUFV ؋ʁ]_^VWU\ W"` u PsO tF]_^VWUP#mPn t+P^$P6B #.L >X t7>` >Z >Z G>` 6Z 6X >+Ɖ>Z >` F~}~F>V 9PFAP<FFFF;R |pF.b P2PIPF.b PP: uF.b PLP"QP5FF%=tF%@FfF~tF F FFF =@t=tFN uFFv F@)FvF =@t=tv~F>` F뢃~tF F FFF =`t=tFN uOFFvF@@)FvwF =`t=tv~>` FFF~>FF.>EtFFF~>FFFrFPcP tmP uFPhP mP u-PFPoP6B L <F6FFP#FFFPkFPF=uF.>F@%E~>FF;V ~FV xP uF.>EtkFPzGFFFFF;V ~~>F=tދF.>EumPl u+P\F.PP6B uF.>E P6B FH=w>vPP6B F.>uP6B L F.6F.>ED F~}~F>V vPDCC;ug~t6: FFF;T }BF.>EuF.6F.>E &>ED벸P]_^VWU~t F;T |+F.D D ]_^VWU~t F;T |+8F.|狅<>FV| | +FV؋ʋË]_^VWU6: : W F=u P F]_^VWU6: : W F=u P6: : W F=u PF F]_^VWU6: : W F=u P~FF uЋ]_^VWUlP te6H PPP@ u P"P!PZhP4 tF|ޱ㋇6 4tVޱ㋇02FVFV؋ʋÉFv+Pޱ㋇46FVFV؋ʋÉFvޱ㋇8:FVFV؋ʋÉFvx 2O t +P9` F\ O t^FP6@ ]_^VWU6@ v@ W=u ;P]_^VWU6@ F%P@ W=u SP6@ F%P@ W=u kPm]_^VWU>B t 6B 6D ]_^VWUPPe tPPS=u P]_^VWU 6F W PvPPp> uvPP6> PP u.,PP tɸP u>,=t6>,="t->uvF+FV؋ʋ>` ,.>,=t ,. P+P>uPPPaFPP t_~uPPm,~F;2wr ;0r΋~狅<>FVFF>uPP tFbvF+FV؋ʋ>` FNF+FV؋ʋ>` FF+FV؋ʋ>` vFFF+ƉF =w6> ]_^VWUvvFP uFP teFPFPt~F;E~ F~E~F;E~ F~E~F~됋F~)=+t=-ty~}u~t~E]_^VWU P t2v#~E=}~EP t3 P t2v~EP tP+P;P tvd~؋~FP tJFPGF~u PNv~F.>E~E~E-v u v  u(P+P]_^VWU+~E~E~]_^VWU~v ^ W =t5 t0 uN ~G +Nu˃ |N ~Gƈu;~t+]_^VWU.-Fv &;|-v }v +-PV57P["-PV:PDv =P7]_^VWUFN tPv ]_^VWU(6,P> u<_ubO ~ ^FFފFP uۊFP* ù~_tƋ^ƣ,. }APP+]_^VWUJP0 tF3MP tF>,P tF ++F>,FP uFPT uF~0|z~7tFƱ0~0|b~9\F.~0|~9FƱ-0+FP/F=A|~FFƱ-7F-=w,7~5,.~tOPP]_^VWUW>,='u2,1~,.`P u bP+P\+]_^VWU>,=\t,>,P[c z up k f>,P tK+,>,P t,Ʊ-0,CC;ug >,,]_^VWU`6,~=t FPȋ~F;t+ ƣ,.]_^VWU>,=t>,=;t+]_^VWU>,=t>,= ,]_^VWU~A|~Z~ ~a| ~z+]_^VWU~0| ~9+]_^VWU~a|~zF- F]_^VWU+>F;6T }Wvo u]_^VWU>T |nP3T .vVc+DDDD D D T T ]_^VWUsPڃ tePFT H;~CVP@G;>T }ދ.P.P ~WVϸP]]_^VWUF.F .FFN tFFGF]_^VWUsPك uuPك uP+PP6B .L F;6T |.>Et+Py.PP6B .>E$ P6B `H=w.>u .>u P6B $.>EuP6B P6B L P P6B L F;6T |.>Eu+P}.P P6B .>Et[.>E$ #P6B RH=wV'P'P6B ,,P6B 6P6B L h/]_^VWUF;tFP P]_^VWUP P]_^VWUPP]_^VWUFF~FF tI~:u~|~FFҀ~0|р~9˃~u F-0F빊FF.F]_^VWUFF~FP׃F t,~:u~tFFπ~a|΀~pȊF-aF뼋F]_^VWUFF~FF t~:uF~FF t~.t ~FFދ~]_^VWU~=t ~F=.uF]_^VWUF~|.~ ~~FF>0~FF>0~ |~FF a~v ~F:~Fv F  u~=t~E.~FvF u츜]_^VWUv1PvPvcPP1]_^VWUFN t6B v B W]_^VWU>L t>L ~6B PB WL ]_^VWUL ;F>L ud]_^VWU>L tOcPԃ t)6B PB W=PPU6B 6B PB WL ]_^VWUN L <FF~}6B PB W㸊P6N 8P6B k .L ]_^VWUv; 6D KPS]_^VWUNV 6VWUNV *$VWUNV VWUNV ‹]_^VWU쾰!s<tV4vσ]_^VWUvt(tVPT=t+@t VF=t@tDPPQ=uD t uW+]_^VWUv%H=Hu_|tY|D1F;|sEWPDP"P t 'ǀPVKD1;D vD1D 붋FD1+]_^VWU쾰!s<uVv v4+]_^VWU v <tV=u+FFFFF^ F  t4FFFF~uFлCC;ug뽃~t ~tF Fu~u~t ~t DD+DDfPv  u~t D FD aGD\kPv  uD FD6 pPv  uDuPv  u~u DD HD:5D HDo5 @~u Vv u~t(DPPDPP=t~D c~tCDPP=uDPP=tKVIP+PPV`=u,.DPP=tVD0D1D2D3+]_^VWUv DDDDFF|^FF t-~.t'~:t!D;vy~a| ~zn GFÃ~:u*D;uR|uLDF=A|@~P:F-@D됍D;vG |~.u5^FF t%D;w+,~a| ~zn GFˍD;vG ]_^VWUvDP#P;D1D ]_^VWUv v^ W]_^VWUv~ uu W PVEP*]_^VWUv~  u} uuW P=tb}uPE u Eu}uW t.EEE M}WU uWP u]Eƈ*]_^VWUv ]_^VWU v@u3V t%~u VJ~tD +ҹFVus| tm|uPD uD D1tPDP!P u+FF~} ~|=u뿀+~Ǚ)FVFVF V F V %؋ʋÉF^ N +ɋÉF|tF;D1uD+DD;F0|uPD tFD1V+P u#D+DD+F=DFDD$D+]_^VWUv@u/D1+ҹFV|t|+|ǙFVFV]_^VWUv |DFFtV u+D1F;D rFt w;~trGǀ;~taWPDP!PF t2~t~t ;|u0 *FF~} ^PV@ uFD1DD+DD]_^VWUvD+D>PV]_^VWUv~ O|D1uD2u +]_^VWUvPF=t~ t GF~u;u+Ƌ]_^VWU~uF%F>zuE%)>tFn~;ws6z6|^FFFF(^7v1FCC;tHgFF+ƉF }F~uFN tvv^W;vvv^FP^W~uFN uvv^W]_^VWUv FFN^+v t+v ڊFN^FN^^?t^FF^FFF]_^VWUv~nN^ FVF V ǙRPv v -FV t0ǙRPv v RFVF؊FN^F멋F ؊FN^F^?t^FFFƋ]_^VWUv ~G?uOFFGF uF]_^VWUv~ G:u F?u+Oߊ:}]_^VWUv ~FFGF uF]_^VWUvF?u+H]_^܋_܍_VWUV F++ ;wr w;?r+?w@]_^܋_܍_VWUv ~++ ;Wr w;r+W]_^VWUFFFFFFFF u t tu<>uFFvF2~|P P(+P+P^FݍDG t# t ta| zFFDh^G~t&Nv=A|Z  PPP' uP P+P+PtPPv uvP PPPvv uvP PVPa+PFPv7PJ]_^VWU0~}FFPFPFPvvvv v vw~guC=tG;t }0uO+ƉFЃ~| F;F}Fe F;F|F~~tG-~etFFЋGFЈPvvv v tNG.~~ F t FGFG0NڋGe~|G+G-F؉FGF>0GF>0j~G0 F t FGFG0Nu~t6G.~~*FF |F t FGFG0NЋNj]_^VWU@Pvvv v |C^Pvvv v uf^vFN tF0^FFF F t6FFF F FPvvv v ? Pv H FvMF PE (Pvvv v  |F0PF PPF^vvv v vFF~ft~gu~|F;F|FFF@F~}F~~FFFF;F}aF08PWvvv v $ FFF F vvv v ,|%;vtN=9~01^^F]_^VWUv+ }G؋ޱ㋇    FFFF t2FP6N6L6J6H6 FFFFFFFF]_^VWUv^W ]_^VWUvD |DLuAPP@u0 uPP% t| u ]_^VWUvD | D0uaL}~|uPD u ?\}t P PP\G*F~u\u '^CC\ F@DD@@D}\D*]_^VWUvD |D0t|u)P D u VP uzt V ui$L}VPa uO\D*uB u/L}VP4 u"\D* t| u ]_^VWUv ]_^VWUF*^ȣF F F]_^VWUF VWUF Pvttt4 DDD]_^VWUF VWUF Pvttt4\ DDD]_^[6666VWU^VWU^+VWU^VWU^FGV؈FF%uVv ~ FF~FV؈FF%u wFv~Vv~FN+N}^^^^هVv~F9~Vv~FNl N^:ttF~vV:utA$ u u u t7yErIs A؉6>]_^VWU+*F y=ط7VWU+*F)VWU*V F y؃ VWU*V F+ɋ tr ψ+]_^VWU^VWU^GV؈F%uF~FV؈F%uFv~Vv~F8:Vwr;vwr;~wr;Fr Fr:Vwr ;vwr;~wr;Fr +F~vVVVVV⿊Vv~F^+^À| ^+ҋ‰6>]_^VWU^VWU^FV؈FF%t$Fv~GV؈F%u}F~+й8n^^^s F~vV܋^^|5rs ^+ҋ‰6>]_^óVWU~VWU~+~ x Et @"EuHvt @s y]_^VWUVWUFu6V^ Ҋ΁t!|;}Ft+]_^ó @`>CZw 7 ',16 @`H!!+0b!!" s&'&'''''&BFNRT'''''+ +++,, ,%,abrw(2-22272 DOUXcdefgorsux<<<<=U< = = =<=Z=~<< KxTA@ B B@Usage: TLINK genfil {cmdfil} {-8bchlmrsux} Serial number violationTurboDOS 8086 Linker Copyright 1984, Software 2000, Inc. cmdgenparr* %s * oNo input files specifiedNot enough memory for name tableNot enough memory for externals tableAbsolutecon:lst:wCan't open list filePass 1 <<< INTERMODULE REFERENCE LISTING >>> rb%s: Can't open object file%-8s Module %sOriginUnit Duplicate def: %s Bad public def: %s Defines: %s %sToo many externals/moduleTransferDuplicate xfer address References: %s %s Bad token = %02x Code Transfer is not in Code (ignored) No code group (transfer ignored) ExtraStackEndCodeEndDataNot enough memory for output bufferPass 2 <<< MODULE MAP >>> UndCodeUndDatarb%s: Can't open object file%-8s Module %s Undefined name: %s %-8s CS:DS:ES:SS:%04x (%04x) Bad token = %02x Unexpected EOFUnexpected EOFUnexpected EOFUnexpected EOFwbCan't create output fileWriting output file "%s" Can't write output fileCan't write output fileCan't write output file Linker abortedNrProcessing parameter file "%s" %s "Missing '"'(Ignored),=AbsoluteOut of range(Ignored),+-()Missing ")"[]Missing "]"-UndefinedInvalid syntax^ ^ %s Too long0X0Invalid digit(s)'Missing "'"Name table overflow Sorting name table %d Printing name table <<< SYMBOL TABLE >>> %-8s = CS:DS:ES:SS: %04x (%04x) uninitialized %-8s = CS:DS:ES:SS: %04xundefined Page %d of TurboDOS Linker Listing for "%s" con:rdr:lst:pun:{NULL}0123456789ABCDEFcon:waToo many arguments $con:wCannot open stderr $r%s: cannot open %s: cannot create >@ BCzE@GPH$tJL M(knOQ@CRhT*V W1_cY[.\@v:k ^^# `bxaz&Xcn2xeW ?hfSh@aQYjok 'Nm x9?o 6pOgIr#E@|osp+ŝuL67EwV߄xl: z{Η@|H½} Pv狅STDLOADR ; STANDARD LOADER SYSTEM NITAPC ; HARDWARE INITIALIZATION MODULE KBDAPC,SCRAPC ; KEYBOARD/SCREEN DRIVER DSKAPC,DSKFMT ; FLOPPY DISK DRIVER RTCAPC ; REAL-TIME-CLOCK DRIVER 2Và2yIA:2q.C$ to retry m not found^, bad memoryM loading at da@"="!u tOtQtStUtWtYt[t]t_i<D_D]D[DYDWDUDSDQDOtËdaDODetP!D_t]l[|YtWTULS\QDOt^u"V!Ɖ\QLSTUDW|Yl[D]D_DOk!rKDSu^4<+%T3uTs(Rt)r(WSZڄuWO QR[ZYFYR(uRx5RD&u_!RRՊD( ȈD0D( D(tuvuD0u/D/@u)\(SR0)Ӊ\(r{[\(t {y5RR9t T1A2LR\1Uy\1WR9Ӊutw-@ttkt!lmtDt\1G_t0D&t\+D-T+l-D&tڕVD&t@KD0:rD( D0D(CD(CD)CD*CRD/tD0C':DU$RDV<sRR&RDQÊDUtÊDUolVt  ӉRRt S[uR9trӉ\1t:Ouŀu uPxGu@t2Q%tuY@ Y@tQgY utw\1ttAŀt<t$`<`u/QRˋtSQY[DuXRYRR9t Ӏ'߉tuËRQYŀt QY0ûRR09tS [t\1Ãd'D'VD':uFC0^d'uD0:r uD/tDmÀ'XtJD$R:Dsu tu%_VCDF^\1GD"GD 0/\1xR{\1dRo #uú   \1ÊD'"RR9RQSRˉRRRڊ:uBCB['KYyË\UD]"t6TDDDOt.<u(\UD]T&ӋT l <s<sDOÈDDD,r uu;ËL$IDxAL\$ \TDdx\ǀuڹA)syIAx )sڋ\ˋL D"D L \TڋLˇڋ\)s,Sˉ\Q ZuH\ LډӉ\7\C뻊D\T0)s؎otDtt<Dx\ÊD$¶RӋu%S*uDt ߎ>&&E&T@szxࠉt #T7Hm6@y.8&RZ8t RZ8uTtuvCrS< s @P^2X.[þz؎úrCrËrKt<;ÊtC8 .<؎м`'TtT@t&TK1`&b˲ ñ'd )sӈut0j Vn(=]~6KWhy#4EbB#.:EI??8COPYRIGHT 1984, SOFTWARE 2000, INC. (VERSION 01/24/84) `&b؎м` ŀu3j5tjo%s);lrlqál)=ru\ywRZtA^< t<u أuBH&d0)ӉAH B.duoq9ssu9s dKd͋)ud9ruu)ӉڋtJ$(tڠ÷K)rQSKtK)[tȄuACt7CC)sdӉCt G<uvCKtlS{[ug hti8u8u'wuwtMt?wt.wt u!tC÷ۺ$S [w:uCBڊSCZCڈCt ڊCڈCIډKt͋K"tjC< rCCtwu.± ߄u!.X$ns &f) ftJ1`&b˻t C<;tItC8ufWú˱ߺ˱ߺPߺXà$0$t۠xtñ'd )sӈut0p to begin verifying  Verifying blocks on drive:  Verify aborted Verify completed - k bad blocks encounteredO Mark bad blocks in directory (y/n) ? " Marking bad blocks in directory Non-privileged user No verify drive specified Unable to lockout verify drive Verify drive not ready z Insufficient memory for verifyT Excessive bad blocks8 Error marking bad blocks Bad directory blockS^U]^[ÜP.Ct2XSQR ZY[SQRZY[SQRtZY[PSQR$±ZY[X BLOCKSBAD$ DIRYNRTT5t[tTWuW9sSTGTH=uʉW[ {TuT~TTTTTTDj~SXSSSt7O-S~o>XSSu؋XSQ\XSEY[ Ìػ~T.T0<T?H~TGt'QTW@u¹TTS[Y͸DO=ta>T1rZ{TtS{S}SZS!ބu?u: ~St.SPWXG[GS_&[ZS:ޏDlDj|OuQrTtjtlPDjllQXUHP$X@Q1Ƅ@DlY]XDlDjU XS~S]YúZS݄$~TúT9ݠRTDO\_Ë\UD]&R&G&G[* eP$X$t DO&Gñ 6݁*؋\UD]&&G&G, s ËDU=tTáTDOÀDS0t DTDUDQË\QLjTUDl1TULS\QDO< s< t < t< t<uPXDOÊDU< s(< t < u$TT$*TQ YTDOÊLUDUtttl gteDOË\UD]&C:Tt S[Ë\UD]i6DOË\UtTàTDOË\UD]&O&&CIQS@[Yò :Tt&ut`t:TtTt::Tt!:Tt:Tt:Tuڀu;tQY DgtȴTÊ/gTuFCtjtl\j\lTnRTDnƄTZTnDlDjTtG*Ê< t<utTT Tհ ËDUuDnTuWTt WTPPu:T%Au+Tڌ݋\UD] TG G ڱ&ڄtDOÃT z#`tTS1[ Tt Tt4/SDnPTDnڱXDn[ËTËTT)TT&/C&SC0P<t<< s<t4< t5<t<<t8XP8s&CXP< s@Q^VYNX[&uZXtPK&< sXPRSQR  ZY[SQ;Y[SQY[Ë\UD]&O&IQ&CS[YË\UDT tLQS[Yt <sDhPUtPUTUt \Q&DOñ8*PU@؎мUZU[ SR[uZYu5QS[C[UGNUYODYYGF_HW3RZU[0ËTQ\US[\U\Qq_ûfUPVU@uD7@u DLZUb%^Xπd7D7@tL7L7@D7ud7ÀUUuÀ&UZUx0\Ut\8`U\LU@D:\T@lB|DdFTHDJ؎мU&UtfUfUt 7G[U u#ƻZU\LxZUU ZUtƎDJTHdF|DlBT@L>\Ut 9UsUr)+VuHUûV)G)ȱË\U\QDOÉU)sUUUUUtWU@@)t/r9UrUUڋUtU=r GËUBB$'0ËUUBB)Ӱr;Ur UCCW0Ë\UUWUUt5U9tG;UtWRZUWRZW뺋UUUUtHH;UtGU0ý"uVýuaý3tBý*tODSttU)GVڰDODStDOËG+GG)GAOڋ+G7wG)OSUPUڻUXU[GڻU/DSTUT]UGt ;r9r DOàUPGU>Vu(UGtU:Gs SQLY[GXUorKOGGU7wG)OSڻU^[GUPUڻUBXUDOXUûU$UUVVRQUYZù(CUt/U:Gu2G;tG;u)ËGGáUuU⻋UtUGڋOډOU]UVUuډwr0G+Gs/>Ut؀>UUu;UsUU⺠UUt>UUuUûUVU:Gs rtËGtڋ+rPG++GXr9 ڕ\UD]VݹUU00VùCty$8u ;uCCQYô'd ĺ)sӄut 0PS[XËGډGË_OWډO[.CtS[V2rVZY[XHHF*VVVVÈ< tttt ,t t0$ u8V tVËV0;VtCVV9uV PSQR#;ZY[XV9VuLt >VtVÀ>VtVVJ$tHV(L$/Nt@tʀH<^r aVWYW&XXDWWWu sWȹ u )W,Xs'Xz.XWZ >WtWuWWt XXWH,X$'X+.X >WuW0Z΀PrO:Wr:WvWWt uƀPr)0>Wu W@tO:Wv WtWWt uW>WrWR7ZÈ0WW(Iõrȱ&1X1XÀ1XÀ&1XÀ1XÀ&1XÀ&1X1XÀ1XÀ&1XWIõ8r,&Wr#W0RXXCÀ r8À0rW1҉WvPHNX&PXIX,X 'XdIX&1X.X@P(ȢNX&PXIX,X 'X.IX.XR0€rZ/#X&%X X#X&%X Xr3XfWrP0àWP9X&;X*W=X&?X1AX&CXWEX&GX*6X!R'C0t@uWCCZ@t@t@PtjXXб C&û^XI P^XDXÊr00X^uX }XtJ}X t Xx?݈„uzX<wRZtX8tu \ 0uDu4@rXDtCD$CDCD$XD P XD D:  Dt@ MwX$tXz XX tX1t@tʀXDXD XDX\nX0~XpXqXtqXXXuGXt0ӊŠttjX'lX8s (lXmX6oXXb.X (jwX$t%wXuyXt Xx+XzŠwXX@tMXXXtTX$t ËD P XXuDH:X ÊD<sPt e t 0ÊTjX$8t0kXXӊXkXjXrX&jX&rXù:|0kXÊD:kXt kXaù?wXñ KwX$PujX$< urXPt@u R/CuÜwXPt@tRCúNdX\ Ë\ QLY ((tr NdXPucwX$>;<&&(;;;2$'&;5L !=,*.*V9*779V::::: ;;3DIRDSKRRRR?K?K..../.. //////#/w/z/~////$ DSK1$ ETTV-PRINT-?000\U\UbUbUfUfU`UU C2NEC-APCC3 SINGLE USERC6 (10/05/84)C5$@?@VV(-*+-./0123456789   -=@`:;;'1!2@3#4$5%67&8*9(0)-_=+`~[{]}\|,<.>/?;:'"^WW *HXHHHaHHHHI#HDH=*TYCjk^_qlm.IIJDJ7IUI[IaIgImIxI~IIB@N@R@@D@@@E@oBFB@GBP@JB@@KB@!@@IB@@ B@@0B@B pB@@@@@@@@LB@@@!.`X`XfXfX5_LhLcKMKXhM5X P?5X (5X4M 5XP;5Y(5Y4M$YM5YFY@WY4MY MhY         #&),/2!$'*-03"%(+.11$ ETTV-PRINT-?000ZUZU`U`UdUdU`UU C2NEC-APCC3 SINGLE USERC6 (10/05/84)C5$@?@VV(-*+-./0123456789   -=@`:;;'1!2@3#4$5%67&8*9(0)-_=+`~[{]}\|,<.>/?;:'"^WW )HWHHH`HHGHI"HCH=*TYCjk^_qlm. IIJAJ6ITIZI`IfIlIwI}IIB@N@R@@@; Function=3, return drive ready status ; RETRDY: MOV AL,PDRDRV[SI] ; Return ready code DEC AL RET END ke sure transfer is forward MOV ES,HDBUFSEG ; Load destination for write MOV DI,PDRSEC[SI] MOV CL,=7 SHL DI,CL MOV CX,PDRTC[SI] ; Get byte count MOV BX,PDRDMA[SI] ; Load source for write TEST WRFLAG,=01 ; Set flags for type of call MOV DS,PDRBAS[SI] XCHG BX,SI JNZ MVWRDS ; Is this a read call ? XCHG SI,DI ; Yes, swap source and dest MOV AX,DS MOV DX,ES MOV DS,DX MOV ES,AX MVWRDS: SHR CX,=1 ; Convert byte count to words REP MOVS WORD ; Transfer from/to buffer JNC __R ; Odd number of bytes ? MOVS BYTE ; Yes, catch last byte __R: MOV SI,BX ; Recover critical registers POP DI ata RET ; and return it ; END MOV NXTSEQ,&SETCSR1 ; set code expected next RET ; and exit ; SETCSR1: MOV CH,=5 ; get upper limit on code CALL CKBIAS0 ; check ASCII bias JC __X ; if invalid, continue AND FLAGS,=~CSRFL ; clear cursor display flag DEC CL ; code = 0? JC __X ; if so, continue OR FLAGS,=CSRFL ; set cursor display flag MOV BL,CL ; move to reg ADD BL,BL ; times 2 ADD BL,CL ; times 3 XOR BH,BH ; make double length ADD BX,&CCHRTBL ; add table base MOV AX,&CCHRCMD ; point at command table too MOV CX,=3 ; get loop count __LP: MOV AL,[BX] ; get first parm XCHG AX,BX MOV [BX],AL ; substitute XCHG AX,BX INC BX ; bump table pointer ADD AX,=2 ; and command table pointer LOOP __LP ; continue for the count __X: RET ; all done ; ; ; Check ASCII BIAS. Limit in CH reg, Base is ASCII SPACE. ; CKBIASA: SUB CL,=ASP ; remove bias, check lower limit JC _BX ; if invalid, exit CKBCOM: CMP CL,CH ; check upper limit CMC ; invert logic _BX: RET  HDCTST: Hard disk driver tester Copyright 1984, Software 2000, Inc Page 1 ; 0000 MODULE "HDCTST" ; 0000 TLINK "X" ; ; #INCLUDE "EQUATE" ;SYMBOLIC EQUIVALENCES ; 01:0000 LOC Code# ; 01:0000 START: 01:0000 8A0E 002E MOV CL,46 01:0004 8A16 0002 MOV DL,2 01:0008 CD E0 INT 224 01:000A E9 FFF3 JMP START ; 01:0000 END START ]]] ]]&]໗]R0ZR00 ZøP(Ȣ]&]B]] ]>]]RxZR0€rZ/]&]]]&]]r]f\rP0à\Pᢢ]&]*\ࢦ]&]1]&]\ࢮ]&]*]!R'C0t@uWCCZ@t@t@Pt]]б C&û] P] XÊr00]^u] ]tJ] t ]x?݈„u]<wRZt^8tu \ 0uDu4@]DtCD$CDCD$]D P XD D:  Dt@ M]$t]z ]] t]1t@tʀ]D]D ]D]\]0]]]t]]]uG]t0ӊŠtt]']8s (]]6]]b.] (j]$t%]u]t ]x]zŠ]]@tM]]]tT]$t ËD P X]uDH:] ÊD<ETUT]J[Gt ;r9r DOà![PG![>v[u(J[Gt![:Gs SQLY[GX![orKOGG![7wG)OSڻJ[^[G![P![ڻ"[BX![DOX![ûJ[$"[![\\RQ"[YZù(C[t/![:Gu2G;tG;u)ËGGá[u[⻋[t![GڋOډOU]"[r[ [uډwr0G+Gs/> [t؀> [ [u;[s[[⺠ [[t> [ [u[ûJ[r[![:Gs rtËGtڋ+rPG++GXr9 ڕ\UD]r[ݹ![![00x[ùCty$8u ;uCCQYô'd ĺ)sӄut 0PS[XËGډGË_OWډO[.CtS[ \2r \=ZY[XHHF*\\\\È< tttt ,t t0$ uu\ t\\Ë\ ۊ\t t B10;\tC\\9u\C/S\t\À>\t\\J$tH\(L$/Nt@tʀH\uԀt{1Ў.\\C\\9u\;\tC\\RGZð t`u$ s_ȹ 8C;0..&.8C.& ..&τt2u.t4u.t.u7*V.A;^0.u.&.8C.&Dg0\m$nT  sAtRST[T[T[OAt.[ZUYu.YYu؎ڱ3຀.o. .u , k@   : @T utVtXtNtP<t,tBt0ttt>Read>Write >Not ready> error, Drive: DA,0<t?>, Track: \>t>, Sector: \S>[TJtSS> - [=H> (Retry, <t 5>Ignore, )>Abort) I/te/`/P/X >(t"(qUqUtbdUR /[Cu\CfUxfU`UujUU< uU< u CCMCDUUUtUUtU;@uhUU"6t!tU &t tUUjU"rڈCځEVrsKUUػU.hU\S< UxUt UKjUs?UNUu#oUt;CufUð  >qUu±>qUu  0MSTDSPOOL ; STANDARD SINGLE USER SYSTEM WITH SPOOLING PATCH ; PATCH AREA ;SUBMIT,CPMSUP ; CP/M SUPPORT MODULES SOMAPC ; USER SIGN-ON MESSAGE AREA MSTAPC ; MEMORY SPECIFICATION TABLE AREA NITAPC ; INITIALIZATION MODULE RTCAPC ; REAL-TIME-CLOCK DRIVER KBDAPC,SCRAPC ; KEYBOARD/SCREEN DRIVER DSKAPC,DSKFMT ; FLOPPY DISK DRIVER AND SPECIFICATIONS HDCAPC ; HARD DISK DRIVER OUOVOWOXOYOZ\\ eHH3IHHHHK^HH=*TYCjk^_qlm.[(JK;L|LEKcKiKoKuK{KKKKdI3K'KfHCABDJKmMh>JJJJJJJJ#J#JJXJhLluJdJdJ|LlLK;L/L'LB@N@R@@@@@E@oBFB@GBP@JB@@KB@!@@IB@@ B@@0B@B pB@@@@@@@@LB@@@!.]]]]5NNMON^hM5(^ P?59^ (5J^4M 5[^P;5l^(5}^4M^M^^@^4M^ M^         #&),/2!$'*-03"%(+.1u )`#`r`y``_TÀ>_t_u__``_KI`!`(` >_u_0ty _tu0PrOy _t0:_r:_v__t uƀPr)0>_u _@tO:_v _t__t u_>_r_R ZÈ0__(``RxZR0€rZ/`&```&``r`f_rP0à_P`&`*_`&`1`&`_`&`*`!R'C0t@uWCCZ@t@t@Pt`#aб C&û` P` XÊr00$a^u a atJa t  ax?݈„u a<wRZt.a8tu \ 0uDu4@aDtCD$CDCD$aD P XD D:  Dt@ M a$taz !a!a t!a1t@tʀ"aDaD aDa\a0aaataa auGat0ӊŠtt`'`8s (``6aab."a (j a$t% au at  axazŠ aa@tMaaatTa$t ËD P XauDH:!a ÊD<FUSRSOM = 0X0D,0X0A, 0X1B,"C2","NEC-APC", ;SET RED COLOR 0X1B,"C3"," SINGLE USER", ;SET BLUE 0X1B,"C6"," (10/05/84)", ;SET CYAN 0X1B,"C5" ;RESTORE GREEN ; MEMRES = 0X400 ;RESERVED MEMORY COMPAT = 0XB8 ;COMPATABILITY FLAGS ATNCHR = 00 ;ATTENTION CHARACTER AUTUSR = 0X80 ;AUTO LOGON USER NUMBER ; PRTMOD = 1 ;INITIAL PRINT MODE FOR LOCAL USER QUEPTR = 0 ;INITIAL QUEUE OR PRINTER ASSIGNMENT ; OSMLEN = 0X600 ;O/S MEMORY LENGTH IN PARAGRAPHS NMBUFS = 20 ;NUMBER OF DISK BUFFERS ; SRHDRV = 0XFF ;O/S PROGRAM SEARCH DRIVE (0=OFF,1-16="A"-"P",FF=BOOT DRIVE) DSKAST = 00,DSKDRA,01,DSKDRA,00,DSKDRB ;LDCOLD = 0 ;COLD START AUTOLOAD ENABLE FLAG (0=DISABLE) ;LDWARM = 0 ;WARM START AUTOLOAD ENABLE FLAG (0=DISABLE) ; FLSRTA = 0X03 ;SET FLOPPY DISK STEP RATE ; ; ***** PATCHES (6/26/84) ***** ; ;RVNFCN = 0XE8,[PATCH] ;PATCH 1.40-2 ;PATCH = 0XA1,CKTAST,0X89,0X44,0X55,0XA0,CPMVER,0XC3 ; PFNFCN+0X150 = 0XE8,[PATCH+0X0A],0X90 ;PATCH 1.40-4 PATCH+0X0A = 0X3C,0X3B,0X74,0X01,0XC3,0X44,  0X44,0XF9,0XE9,[PFNFCN+0X168] ; CHNFCN+0X4A = [PATCH+0X15] ;PATCH 1.40-8 PATCH+0X15 = 0XE8,[ENADSP],0XE9,[WARMST] ; ALVNIT+0X33 = 0XE9,[PATCH+0X1B] ;PATCH 1.40-9 ALVNIT+0X38 = 0XE9,[PATCH+0X29] PATCH+0X1B = 0XE8,[GETNAB+0X2C],0X74,0X03,0XE9,[ALVNIT+0X0C],0X8B, 0X5C,0X11,0XE9,[ALVNIT+0X3B],0XE8,[WRITDE],0XEB,0XF5 ; CMDINT+0X1FD = [CMDINT+0X10E] ;PATCH 1.40-12 ; ;SVCMGR+0X1F8 = [SNDREP] ;PATCH 1.40-13 (NETSVC) ; ;DAFCBP+0X3A = 0X5D ;PATCH 1.40-14 (FILLOK) ;DAFCBP+0X3D = 0X5D ;DAFCBP+0X43 = 0X5D ; ;SVCOSC+0X15 = 0XE8,[PATCH+0X2E] ;PATCH 1.40-15 (NETSVC) ;PATCH+0X2E = 0X8A,0X45,0X0D,0XFE,0XC0,0X88,0X84, ; 0X92,0X00,0XC3 ; ; ***** END OF PATCHES (6/26/84) ***** `ZZ AL,AL ; Reset completion status OUT INTREG,AL CALL DELAY ; Couldn't hurt XOR CH,CH ; Get number of parameters MOV CL,[BX] JCXZ __CMD ; Are there any parameters ? MOV AL,=0X40 ; Write CLDB to formatter OUT FMTREG,AL CALL DELAY __FWT: IN AL,FMTREG ; Can formatter accept byte ? TEST AL,=0X20 JZ __FWT __PMOR: INC BX ; Get next parameter DEC CX ; Decrement parameter count JCXZ __PLST ; Is this the last parameter ? MOV AL,[BX] ; No, get the parameter CALL DELAY OUT HDCDATA,AL ; Output it to controller CALL DELAY JMP __PMOR ; Process next parameter __PLST: MOV AL,=0X04 ;DS\UD]&&_S[rUTDU&< uCڻsUSQ[rEtu)r:t"<.tG<:tK{Ur#t6uru+< u r uJZSrU،{:[[\Oð(tsUC<0r<:s<,0ĠUtUQUrrrrr< s UYt$Ylb: 1,䢨 t䠪䢨ulb$`<@_0ÊDTurboDOS 1.40, Copyright 1984, Software 2000, Inc. $($/$)$ <-- $Invalid command$Command not found$Program load unsuccessful$Non-privileged user$^U^UU\}COLDSTRTAUTWARMSTRTAUTVVVV2*3J33373x[x[333?2L&R&`~ubx[[&b&x[x[x[i& Qx[Qx[x[&& &&=?H?S?\??@/I22x[233622;<+>>;<&&(;;;2$'&;5L !=,*.*x[9*779x[::::: ;;3DIRDSKWWWWG OR AL,=0XFF ; set status reg  below control range? JB __C4 ; if so, continue CMP AL,=0X5F ; is key above control range? JA __C4 ; if so, continue AND AL,=0X1F ; mask to control values MOV CL,AL ; place back in reg __C4: CALL STOCIB ; store in char buffer TEST DL,=1<<0 ; was function key depressed? JZ __X ; if not, continue MOV CL,=ACR ; get terminator char CALL STOCIB ; and store input buffer __X: RET ; all done with keyboard service  #TITLE "NEC-APC Keyboard Interface Module" #PAGE 132,66 ; ; KBDAPC.A ; ; NOTE: This version handles APC keyboard input and calls ; the screen driver at entry point "SCREEN#" for output. ; ; Version: 07/12/84 ; MODULE "KBDAPC" ; module ID ; #INCLUDE "DREQUATE" ; common driver equivalences #INCLUDE "APCEQU" ; common NEC-APC equivalences ; KBDIREQ == 4 ; keyboard IREQ level DLYCNT == 40 ; delay in ticks before key repeat RATECNT == 3 ; rate count in ticks for key repeat ; ; LOC Data# ; locate in data segment ; CIBSIZ::WORD 64 ; console input buffer size CIBADR: WORD 0 ; console input buffer address CIIPTR: WORD 0 ; console input buffer input pointer CIOPTR: WORD 0 ; console input buffer output pointer ; CISPH: ; console input semaphore WORD 0 ; semaphore count WORD . ; semaphore list head WORD .-2 ; KBDFL: BYTE 0 ; keyboard locked flag DELAY: BYTE DLYCNT ; key repeat delay counter RATE: BYTE 0 ; key repeat rate counter ; ; Key translation table for keyboard data 5E-FF hex. ; A byte of FF in the table means key is ignored. ; KEYTBL: BYTE 0X18 ; 5E - Control-X BYTE "-" ; 5F ; #REPEAT 0X6A-0X60 ; 60 to 69 - undefined codes BYTE 0XFF #ENDREP ; BYTE "*" ; 6A BYTE "+" ; 6B BYTE 0XFF ; 6C - undefined code BYTE "-" ; 6D BYTE "." ; 6E BYTE "/" ; 6F BYTE "0" ; 70 BYTE "1" ; 71 BYTE "2" ; 72 BYTE "3" ; 73 BYTE "4" ; 74 BYTE "5" ; 75 BYTE "6" ; 76 BYTE "7" ; 77 BYTE "8" ; 78 BYTE "9" ; 79 ; #REPEAT 0X80-0X7A ; 7A to 7F - undefined codes BYTE 0XFF #ENDREP ; #REPEAT 0X96-0X80 ; 80 to 95 - function keys BYTE 0XFF #ENDREP ; BYTE 0X00 ; 96 - break stop BYTE 0X0D ; 97 - return BYTE 0X09 ; 98 - tab/back tab BYTE 0XFF ; 99 - undefined code BYTE 0X1E ; 9A - home/clear BYTE 0XFF ; 9B - undefined code BYTE 0X08 ; 9C - back space ; #REPEAT 0XF7-0X9D ; 9D to F6 - undefined codes BYTE 0XFF #ENDREP ; BYTE 0X0B ; F7 - up arrow BYTE 0X0A ; F8 - down arrow BYTE 0X0C ; F9 - right arrow BYTE 0X08 ; FA - left arrow ; BYTE 0XFF ; FB - ins BYTE 0X7F ; FC - del BYTE 0X0D ; FD - enter BYTE 0XFF ; FE - undefined code BYTE 0XFF ; FF - print ; ; Special table for screwed-up keys. Scan codes are converted. ; SPECTBL: BYTE 0X2D,0X3D BYTE 0X40,0X60 BYTE 0X3A,0X3B BYTE 0X3B,0X27 SPECTLN == (.-SPECTBL)/2 ; length of table ; ; Shift case table ; CASETBL: BYTE "1!" BYTE "2@" BYTE "3#" BYTE "4$" BYTE "5%" BYTE "6",0XD0 BYTE "7&" BYTE "8*" BYTE "9(" BYTE "0)" BYTE "-_" BYTE "=+" BYTE "`~" BYTE "[{" BYTE "]}" BYTE "\\|" BYTE ",<" BYTE ".>" BYTE "/?" BYTE ";:" BYTE 0X27,0X22 BYTE 0X18,"^" CASETLN == (.-CASETBL)/2 ; ; BOOTOF: WORD 0X1FED WORD 0XFE00 FKEYPTR: WORD 0 FUNCS: #REPEAT 0X10 ; Allocate empty func key BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 #ENDREP BYTE 0X1B,"OO",0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE 0X1B,"OP",0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE 0X1B,"OQ",0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE 0X1B,"OR",0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE 0X1B,"OS",0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE 0X1B,"OT",0,0,0,0,0,0,0,0,0,0,0,0,0 #REPEAT 0X10 BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 #ENDREP BYTE 0X1B,"OU",0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE 0X1B,"OV",0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE 0X1B,"OW",0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE 0X1B,"OX",0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE 0X1B,"OY",0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE 0X1B,"OZ",0,0,0,0,0,0,0,0,0,0,0,0,0 BYTE 0 ; ; ; Local console initialization routine. ; LOC Code# ; locate in code segment ; CONNIT:: IN AL,KBD_DATA ; clear intrps once IN AL,KBD_DATA ; and again ; MOV DX,&KBDISR ; get ISR entry point MOV AL,=KBDIREQ ; get keyboard IREQ level CALL INTENA# ; enable interrupts from device ; MOV BX,CIBSIZ ; get console input buffer size CALL ALLOC# ; allocate console input buffer MOV CIBADR,BX ; save console input buffer addr MOV CIIPTR,BX ; set console input pointer MOV CIOPTR,BX ; set console output pointer ; RET ; and exit ; ; ; Local driver entry point. ; CONDR_:: MOV AL,DL ; get function number CMP AL,=10 ; function number = 10? JZ __CO ; if so, do char output OR AL,AL ; function = 0? JZ CONST ; if so, do char status DEC AL ; function = 1? JZ CONIN ; if so, do char input DEC AL ; function = 2? JZ __CO ; if so, do char output SUB AL,=8-2 ; function = 8? JZ CONSI ; if so, do error shift in DEC AL ; function = 9? JZ CONSO ; if so, do error shift out XOR AL,AL ; clear return status RET ; and exit ; __CO: JMP SCREEN# ; CONSO: CONSI: CALL DMS# ; position to next line BYTE ACR,ALF,0 RET ; done ; CONST: CALL CHKCIB ; check input buffer RET ; exit ; CONIN: CALL CHKCIB ; check console input buffer JNZ __CI2 ; if char waiting, continue CALL CSRENA# ; enable cursor for console input __CI1: MOV BX,&CISPH ; get console input semaphore CALL WAIT# ; wait for console input CALL CHKCIB ; check input buffer JZ __CI1 ; if false alarm, continue __CI2: MOV CIOPTR,BX ; update buffer out pointer MOV FKEYPTR,DX ; Update function key pointer MOV AL,CL ; get char in reg RET ; and exit ; ; Check the contents of the input buffer. ; CHKCIB: MOV BX,FKEYPTR ; Get ^current func key buffer MOV DX,BX ; Initialize pointer return val OR BX,BX ; Is there an active key ? MOV CL,[BX] ; Get the char just in case MOV BX,CIOPTR ; Get the normal buffer pointer JZ __0 ; Is there a key active ? OR CL,CL ; Yes, is there valid data ? JZ __F2 ORH AL,0XFF ; Yes, return with it INC DX ; Update key buffer pointer __X: RET __F2: XOR DX,DX ; No, cancel function key __0: XOR AL,AL ; clear reg CMP BX,CIIPTR ; compare to input pointer JZ __X ; if equal, continue INC BX ; bump pointer MOV AX,CIBADR ; get buffer base ADD AX,CIBSIZ ; calc end of buffer CMP AX,BX ; buffer wrap? JNZ __1 ; if not, continue MOV BX,CIBADR ; reset buffer out pointer __1: MOV AL,[BX] ; load the char INC BX ; Index to shift status MOV CH,[BX] ; Load shift status PUSH BX ; Save buffer pointer CMP AL,=0X80 ; function key ? JB __C6 CMP AL,=0X95 JA __C6 XOR AH,AH ; Yes, calculate address of key SHR CH,=1 ; Is the FUNC shift down ?  JNC __F1 ADD AL,=0X16 ; Yes, shift up to upper set __F1: SHL AL,=1 ; Multiply key number by 16 SHL AX,=1 SHL AX,=1 SHL AX,=1 ADD AX,&FUNCS ; Offset into key table MOV BX,AX ; Setup function key pointer MOV CL,[BX] ; Get first character OR CL,CL ; Is there really a character ? JZ __F3 MOV DX,BX ; Yes, increment to next char INC DX JMP __C4 __F3: POP BX ; No, get next character JMP __0 __C6: CMP AL,=0X5E ; special soft keys? JB __XL1 ; if not, continue MOV BX,&KEYTBL-0X5E ; get key translate table addr XLAT ; load the real key value CMP AL,=0XFF ; undefined code? JNZ __C2 ; if not, continue POP BX ; Recover buffer pointer JMP __0 ; Yes, try reading next char ; __XL1: MOV BX,&SPECTBL ; get special sub table addr MOV CL,=SPECTLN ; and length __XL2: CMP AL,0[BX] ; match? JZ __XL3 ; if so, continue ADD BX,=2 ; select next entry DEC CL ; any left? JNZ __XL2 ; if so, continue loop JMPS __C2 ; else, continue __XL3: MOV AL,1[BX] ; get substitute scan code ; __C2: MOV CL,AL ; move key data to reg CALL CASES ; do caps and shift cases TEST CH,=1<<1 ; Is the control key down ? JZ __C4 ; if not, continue MOV AL,CL ; get char value CALL UPCASE ; fold to upper case CMP AL,=0X40 ; is key below control range? JB __C4 ; if so, continue CMP AL,=0X5F ; is key above control range? JA __C4 ; if so, continue AND AL,=0X1F ; mask to control values MOV CL,AL ; Return character in CL __C4: POP BX ; Recover buffer pointer OR AL,=0XFF ; Return status FF and Z = 0 RET ; ; KBDISR: PUSH AX PUSH BX PUSH CX PUSH DX PUSH DS ; save regs CALL GETSDS# ; get system data seg CALL KBDIN ; do keyboard request stuff MOV AL,=KBDIREQ ; get keyboard IREQ level CALL SIGEOI# ; signal EOI condition POP DS POP DX POP CX POP BX POP AX ; restore regs JMP ISRXIT# ; and exit interrupt ; ; ; Keyboard repeat routines. NOTE: Public entry called from "RTCAPC" module. ; KBDREP:: MOV AX,CIIPTR ; get char buffer in pointer CMP CIOPTR,AX ; compare out pointer, chars present? JNZ __X ; if so, skip repeat stuff IN AL,KBD_SIG ; read signal switches TEST AL,=1<<4 ; test repeat bit, reqeat on? JZ __X ; if so, skip repeat stuff CMP DELAY,=0 ; initial delay completed? JZ __C1 ; if so, continue DEC DELAY ; else, decrement delay count __X: RET ; and exit ; __C1: CMP RATE,=0 ; keyboard rate completed? JZ __C2 ; if so, continue DEC RATE ; else, decrement repeat rate count RET ; and exit ; __I]COPYRIGHT 1984, SOFTWARE 2000, INC. (VERSION 05/22/84) `&b.>м`.@.B.D.F= TurboDOS PC-DOS Emulator Copyright 1984, Software 2000, Inc. 5t> @r  .x S ˱iCy4T>.AA. R ,[CtѴCh d uCj y < u T@ < u&TCCOCMx #tT@t  ECXCE뼋 & u tt9 r~   t x pt  V 3Dx <uPڱ3)x !Xt` bO t &=MZt&p &r &.H&.J&H&+&n & 9 s& r9 r &+ )p .JŃ&.Q&&&?&W&[9tݎs11N j Wp .J.H+  u‰n  0 KKr p &-  l $\  C  CCttYtDt .It 4t  j >rڈCځ r,s K  t $8p &r t 1l n ‰ƉljŀT t . t..Hx x   t # Tv@.8&0RZ8t RZ8uTt6n fh DrS< s @P^ X[jþx ؎úd ACd Ëd Kt<;ÊtCò .>؎м` t SQv  Y[îTtT t&Tu1`&b#˴2X.>r~z|̰.>r|z~dfhj6l>n.ptv&x؎м`e.tn.ptv&x6~6z6|6r AX=d  BX=fp  CX=ha  DX=jR  SI=lC  DI=n4  BP=p%  CS=z | DS=r m ES=t ^ SS=v O SP=x @ PS=~ 1 IP=| Îz& .H& .J"3 &&#$ &&$ dfhj6l>n.ptv&x6~6z6|6r..HO dÊjB .6#> d.6j$, Êj Êju dt&~Á~@ñ ñ dËjr ËjrSڱ [CC ñ dñ t d<u><uq<t<t< tdòr rÊj\ um6v toD D$D%uX)  &=u&&E &Ev &E&E1}G!G#ddUuddú x Ie u&E&E&E&E&Ex u VW^ _^&VFG 1^\W؎Zu&>&=u&U&Eڱ ddux  dlu^d<tdPudud4ux :R ZR Zu  u-âdux D &C$nDt uFGt< ut< uàDuuE,Ar <sDXdtn&G .r+t'<:t%<.t!<*tu5WQDY_&G"+r t0&Muv O%uG%*G%ƊW&SZR![t w&FG!W#n+sW>uI&WQQY_u7G2)ыsO$@&U&E0E&Muv â O%u u=G%*G%Ơ O$0G$u0Àg$o!_#W&SZR"[G!W#tËv R[u$G$@tg$$uG OR[R#[u2G R[u!W!G#%O tـ)8VfN^&u &E.&U 8&M &E &} r &E &E Îr>j&=u8ùj ) )  ;!3"P+#u#$y%& '8S÷1؉W[S÷1؋W[ñ'd )sӈut0ÈPX$0<:r1UVWttKU0UySy9[|yUU)ԅy UUàU$uڻ9| V)CVBWàU$u>U0twU5)UUU#۾0VtFW$mu@d buËǣE!ñ!"UWVQVFU]YQUV]%u^G!W#NuYF^_]<t<tbFPvHWYFPP=u bøUWVNV^_]%ËWVwG *+ұ <0r<9w ,0’`P Yu_Ë܋G;js;s ;hr`+bË+_jË܊G*T3uTs(Wt)r(WSZڄuWO QR[ZYFYW(uWx5WD&u_!WXՊD( ȈD0D( D(tuvuD0u/D/@u)\(SX0)Ӊ\(r{[\(t {y5WW9t T1A2LW\1Uy\1WW9Ӊutw-@ttkt!lmtDt\1G_t0D&t\+D-T+l-D&tڕVD&t@KD0:rD( D0D(CD(CD)CD*CXD/tD0C':DU$WDV<sWW&WDQÊDUtÊDUolVt  ӉWWt S[uW9trӉ\1t:Ouŀu uPxGu@t2Q%tuY@ Y@tQgY utw\1ttAŀt<t$`<`u/QXˋtSQY[DuWYWW9t Ӏ'߉tuËWQYŀt QY0ûWW09tS [t\1Ãd'D'VD':uFC0^d'uD0:r uD/tDmÀ'XtJD$W:Dsu tu%_VCDF^\1GD"GD 0/\1xW{\1dWo #uú   \1ÊD'"WW93XQS4XˉX4XXڊ:uBCB['KYyË\UD]"t6TDDDOt.<u(\UD]T&ӋT l <s<sDOÈDDD,r uu;ËL$IDxAL\$ \TDdx\ǀuڹA)syIAx )sڋ\ˋL D"D L \TڋLˇڋ\)s,Sˉ\Q ZuH\ LډӉ\7\C뻊D\T0)s؎otDtt<Dx\ÊD$¶XӋu%S*uDt