From c787a3deb54d23516ea89639bb7ef51bd3a86fff Mon Sep 17 00:00:00 2001 From: majick <125657+majick@users.noreply.github.com> Date: Sun, 30 Jun 2024 17:26:42 -0700 Subject: [PATCH] Add the (actual) ISIS PL/M compiler and the SysCon PLMX compiler Note that the ISIS environment doesn't start under ntvcm so the compiler fails there; other simulators and emulators can run it. Thanks to https://schorn.ch/altair_6.php for the disk images, from which these were extracted. --- ISIS PLM/ASM.COM | Bin 0 -> 8192 bytes ISIS PLM/ASM80 | Bin 0 -> 23680 bytes ISIS PLM/BDOS.MAC | 2776 ++++++++++++++++++++++++++++++++++++++ ISIS PLM/BOOT.COM | Bin 0 -> 128 bytes ISIS PLM/BOOT.MAC | 13 + ISIS PLM/BOOTGEN.COM | Bin 0 -> 1536 bytes ISIS PLM/CBIOSX.MAC | 1333 ++++++++++++++++++ ISIS PLM/CC.SUB | 13 + ISIS PLM/CCP.MAC | 1206 +++++++++++++++++ ISIS PLM/CFGCCP.LIB | 21 + ISIS PLM/COMMON.LIT | 30 + ISIS PLM/CONV86 | Bin 0 -> 37120 bytes ISIS PLM/COPY.COM | Bin 0 -> 768 bytes ISIS PLM/CPM | Bin 0 -> 128 bytes ISIS PLM/CPU.COM | Bin 0 -> 256 bytes ISIS PLM/CPU.MAC | 67 + ISIS PLM/CREF80.COM | Bin 0 -> 4096 bytes ISIS PLM/DDT.COM | Bin 0 -> 4864 bytes ISIS PLM/DDTZ.COM | Bin 0 -> 10112 bytes ISIS PLM/DIF.COM | Bin 0 -> 2944 bytes ISIS PLM/DO.COM | Bin 0 -> 2176 bytes ISIS PLM/DPGOS.LIT | 25 + ISIS PLM/DSKBOOT.MAC | 208 +++ ISIS PLM/DUMP.COM | Bin 0 -> 384 bytes ISIS PLM/ED.COM | Bin 0 -> 6656 bytes ISIS PLM/FCB.LIT | 20 + ISIS PLM/FIXEOF.COM | Bin 0 -> 256 bytes ISIS PLM/FIXEOF.MAC | 120 ++ ISIS PLM/FLAG.LIT | 9 + ISIS PLM/FORMAT.COM | Bin 0 -> 1792 bytes ISIS PLM/GENHEX.COM | Bin 0 -> 768 bytes ISIS PLM/GENMOD.COM | Bin 0 -> 1280 bytes ISIS PLM/GO.COM | 0 ISIS PLM/HALT.COM | Bin 0 -> 128 bytes ISIS PLM/HDIR.COM | Bin 0 -> 1408 bytes ISIS PLM/HDSKBOOT.MAC | 1 + ISIS PLM/HEXOBJ | Bin 0 -> 6656 bytes ISIS PLM/IS14.COM | Bin 0 -> 12544 bytes ISIS PLM/ISIS.COM | Bin 0 -> 12544 bytes ISIS PLM/ISX.COM | Bin 0 -> 12544 bytes ISIS PLM/IXREF | Bin 0 -> 10880 bytes ISIS PLM/L80.COM | Bin 0 -> 10752 bytes ISIS PLM/LIB | Bin 0 -> 10240 bytes ISIS PLM/LIB80.COM | Bin 0 -> 4736 bytes ISIS PLM/LINK | Bin 0 -> 13184 bytes ISIS PLM/LINK.OVL | Bin 0 -> 4608 bytes ISIS PLM/LOAD.COM | Bin 0 -> 1792 bytes ISIS PLM/LOCATE | Bin 0 -> 15104 bytes ISIS PLM/LS.COM | Bin 0 -> 3072 bytes ISIS PLM/LU.COM | Bin 0 -> 20224 bytes ISIS PLM/M80.COM | Bin 0 -> 20096 bytes ISIS PLM/MAC.COM | Bin 0 -> 11776 bytes ISIS PLM/MAKEPIP.SUB | 14 + ISIS PLM/MC.SUB | 5 + ISIS PLM/MCC.SUB | 6 + ISIS PLM/MCCL.SUB | 8 + ISIS PLM/MEMMGR.LIT | 15 + ISIS PLM/MONX | Bin 0 -> 128 bytes ISIS PLM/MOVER.MAC | 26 + ISIS PLM/OBJCPM.COM | Bin 0 -> 2816 bytes ISIS PLM/OBJHEX | Bin 0 -> 3712 bytes ISIS PLM/OS5TRINT.SRC | 15 + ISIS PLM/PIP | Bin 0 -> 8064 bytes ISIS PLM/PIP.COM | Bin 0 -> 7424 bytes ISIS PLM/PIP.LIN | 4 + ISIS PLM/PIP.LST | 1700 +++++++++++++++++++++++ ISIS PLM/PIP.MOD | Bin 0 -> 12928 bytes ISIS PLM/PIP.OBJ | Bin 0 -> 12672 bytes ISIS PLM/PIP.PLM | 1594 ++++++++++++++++++++++ ISIS PLM/PIP.SYM | 7 + ISIS PLM/PLM80 | Bin 0 -> 21632 bytes ISIS PLM/PLM80.LIB | Bin 0 -> 5632 bytes ISIS PLM/PLM80.OV0 | Bin 0 -> 18816 bytes ISIS PLM/PLM80.OV1 | Bin 0 -> 29184 bytes ISIS PLM/PLM80.OV2 | Bin 0 -> 8192 bytes ISIS PLM/PLM80.OV3 | Bin 0 -> 23808 bytes ISIS PLM/PLM80.OV4 | Bin 0 -> 8960 bytes ISIS PLM/PLM80.OV5 | Bin 0 -> 8960 bytes ISIS PLM/PLM80.OV6 | Bin 0 -> 15360 bytes ISIS PLM/PLMLANG.DOC | 352 +++++ ISIS PLM/PRLCOM.COM | Bin 0 -> 1024 bytes ISIS PLM/PROCES.LIT | 44 + ISIS PLM/QUEUE.LIT | 47 + ISIS PLM/R.COM | Bin 0 -> 4096 bytes ISIS PLM/README.TXT | 89 ++ ISIS PLM/RSETSIMH.COM | Bin 0 -> 128 bytes ISIS PLM/RSETSIMH.MAC | 34 + ISIS PLM/SETEOF.COM | Bin 0 -> 128 bytes ISIS PLM/SHOWSEC.COM | Bin 0 -> 1920 bytes ISIS PLM/SID.COM | Bin 0 -> 7808 bytes ISIS PLM/SPEED.COM | Bin 0 -> 1152 bytes ISIS PLM/STAT.COM | Bin 0 -> 5376 bytes ISIS PLM/SUBMIT | Bin 0 -> 7168 bytes ISIS PLM/SUBMIT.COM | Bin 0 -> 1280 bytes ISIS PLM/SURVEY.COM | Bin 0 -> 1152 bytes ISIS PLM/SURVEY.MAC | Bin 0 -> 14464 bytes ISIS PLM/SYSCOPY.COM | Bin 0 -> 1664 bytes ISIS PLM/SYSCPM2.SUB | 48 + ISIS PLM/SYSDAT.LIT | 111 ++ ISIS PLM/TIMER.COM | Bin 0 -> 256 bytes ISIS PLM/TIMER.MAC | 1 + ISIS PLM/TRINT.LST | 39 + ISIS PLM/TRINT.OBJ | Bin 0 -> 128 bytes ISIS PLM/TRINT.SRC | 15 + ISIS PLM/UNCR.COM | Bin 0 -> 6400 bytes ISIS PLM/UNERA.COM | Bin 0 -> 1664 bytes ISIS PLM/UNERA.MAC | Bin 0 -> 15488 bytes ISIS PLM/USQ.COM | Bin 0 -> 1920 bytes ISIS PLM/W.COM | Bin 0 -> 3840 bytes ISIS PLM/WM.COM | Bin 0 -> 10496 bytes ISIS PLM/WM.HLP | 65 + ISIS PLM/X0100 | Bin 0 -> 384 bytes ISIS PLM/X0100.ASM | 27 + ISIS PLM/X0200 | Bin 0 -> 384 bytes ISIS PLM/X0200.ASM | 27 + ISIS PLM/XDOS.LIT | 45 + ISIS PLM/XFORMAT.COM | Bin 0 -> 1664 bytes ISIS PLM/XSUB.COM | Bin 0 -> 768 bytes ISIS PLM/ZAP.COM | Bin 0 -> 9856 bytes ISIS PLM/ZSID.COM | Bin 0 -> 10240 bytes ISIS PLM/ZTRAN4.COM | Bin 0 -> 4096 bytes SysCon PLMX/CODA.PLM | Bin 0 -> 19712 bytes SysCon PLMX/FNLCG.PLM | Bin 0 -> 20224 bytes SysCon PLMX/GKSL.TXT | 766 +++++++++++ SysCon PLMX/IATABLE.FOR | Bin 0 -> 1664 bytes SysCon PLMX/IETABLE.FOR | Bin 0 -> 10880 bytes SysCon PLMX/IHTABLE.FOR | Bin 0 -> 640 bytes SysCon PLMX/IOCLD.SRC | 197 +++ SysCon PLMX/IOLIB.MAC | 1985 +++++++++++++++++++++++++++ SysCon PLMX/IOLIB.REL | Bin 0 -> 6784 bytes SysCon PLMX/MEAN.COM | Bin 0 -> 1152 bytes SysCon PLMX/MEAN.MAC | 99 ++ SysCon PLMX/MEAN.REL | Bin 0 -> 256 bytes SysCon PLMX/MEAN.SRC | 22 + SysCon PLMX/PARSER.PLM | Bin 0 -> 20224 bytes SysCon PLMX/PLMLEX.PLM | Bin 0 -> 5248 bytes SysCon PLMX/PLMX.COM | Bin 0 -> 6656 bytes SysCon PLMX/PLMX.SUB | 4 + SysCon PLMX/PLMXUG.TXT | 2500 ++++++++++++++++++++++++++++++++++ SysCon PLMX/PLMXadv.pdf | Bin 0 -> 1377481 bytes SysCon PLMX/PLMXadv2.pdf | Bin 0 -> 846244 bytes SysCon PLMX/RLIB.MAC | 1020 ++++++++++++++ SysCon PLMX/RLIB.REL | Bin 0 -> 3712 bytes 143 files changed, 16773 insertions(+) create mode 100644 ISIS PLM/ASM.COM create mode 100644 ISIS PLM/ASM80 create mode 100644 ISIS PLM/BDOS.MAC create mode 100644 ISIS PLM/BOOT.COM create mode 100644 ISIS PLM/BOOT.MAC create mode 100644 ISIS PLM/BOOTGEN.COM create mode 100644 ISIS PLM/CBIOSX.MAC create mode 100644 ISIS PLM/CC.SUB create mode 100644 ISIS PLM/CCP.MAC create mode 100644 ISIS PLM/CFGCCP.LIB create mode 100644 ISIS PLM/COMMON.LIT create mode 100644 ISIS PLM/CONV86 create mode 100644 ISIS PLM/COPY.COM create mode 100644 ISIS PLM/CPM create mode 100644 ISIS PLM/CPU.COM create mode 100644 ISIS PLM/CPU.MAC create mode 100644 ISIS PLM/CREF80.COM create mode 100644 ISIS PLM/DDT.COM create mode 100644 ISIS PLM/DDTZ.COM create mode 100644 ISIS PLM/DIF.COM create mode 100644 ISIS PLM/DO.COM create mode 100644 ISIS PLM/DPGOS.LIT create mode 100644 ISIS PLM/DSKBOOT.MAC create mode 100644 ISIS PLM/DUMP.COM create mode 100644 ISIS PLM/ED.COM create mode 100644 ISIS PLM/FCB.LIT create mode 100644 ISIS PLM/FIXEOF.COM create mode 100644 ISIS PLM/FIXEOF.MAC create mode 100644 ISIS PLM/FLAG.LIT create mode 100644 ISIS PLM/FORMAT.COM create mode 100644 ISIS PLM/GENHEX.COM create mode 100644 ISIS PLM/GENMOD.COM create mode 100644 ISIS PLM/GO.COM create mode 100644 ISIS PLM/HALT.COM create mode 100644 ISIS PLM/HDIR.COM create mode 100644 ISIS PLM/HDSKBOOT.MAC create mode 100644 ISIS PLM/HEXOBJ create mode 100644 ISIS PLM/IS14.COM create mode 100644 ISIS PLM/ISIS.COM create mode 100644 ISIS PLM/ISX.COM create mode 100644 ISIS PLM/IXREF create mode 100644 ISIS PLM/L80.COM create mode 100644 ISIS PLM/LIB create mode 100644 ISIS PLM/LIB80.COM create mode 100644 ISIS PLM/LINK create mode 100644 ISIS PLM/LINK.OVL create mode 100644 ISIS PLM/LOAD.COM create mode 100644 ISIS PLM/LOCATE create mode 100644 ISIS PLM/LS.COM create mode 100644 ISIS PLM/LU.COM create mode 100644 ISIS PLM/M80.COM create mode 100644 ISIS PLM/MAC.COM create mode 100644 ISIS PLM/MAKEPIP.SUB create mode 100644 ISIS PLM/MC.SUB create mode 100644 ISIS PLM/MCC.SUB create mode 100644 ISIS PLM/MCCL.SUB create mode 100644 ISIS PLM/MEMMGR.LIT create mode 100644 ISIS PLM/MONX create mode 100644 ISIS PLM/MOVER.MAC create mode 100644 ISIS PLM/OBJCPM.COM create mode 100644 ISIS PLM/OBJHEX create mode 100644 ISIS PLM/OS5TRINT.SRC create mode 100644 ISIS PLM/PIP create mode 100644 ISIS PLM/PIP.COM create mode 100644 ISIS PLM/PIP.LIN create mode 100644 ISIS PLM/PIP.LST create mode 100644 ISIS PLM/PIP.MOD create mode 100644 ISIS PLM/PIP.OBJ create mode 100644 ISIS PLM/PIP.PLM create mode 100644 ISIS PLM/PIP.SYM create mode 100644 ISIS PLM/PLM80 create mode 100644 ISIS PLM/PLM80.LIB create mode 100644 ISIS PLM/PLM80.OV0 create mode 100644 ISIS PLM/PLM80.OV1 create mode 100644 ISIS PLM/PLM80.OV2 create mode 100644 ISIS PLM/PLM80.OV3 create mode 100644 ISIS PLM/PLM80.OV4 create mode 100644 ISIS PLM/PLM80.OV5 create mode 100644 ISIS PLM/PLM80.OV6 create mode 100644 ISIS PLM/PLMLANG.DOC create mode 100644 ISIS PLM/PRLCOM.COM create mode 100644 ISIS PLM/PROCES.LIT create mode 100644 ISIS PLM/QUEUE.LIT create mode 100644 ISIS PLM/R.COM create mode 100644 ISIS PLM/README.TXT create mode 100644 ISIS PLM/RSETSIMH.COM create mode 100644 ISIS PLM/RSETSIMH.MAC create mode 100644 ISIS PLM/SETEOF.COM create mode 100644 ISIS PLM/SHOWSEC.COM create mode 100644 ISIS PLM/SID.COM create mode 100644 ISIS PLM/SPEED.COM create mode 100644 ISIS PLM/STAT.COM create mode 100644 ISIS PLM/SUBMIT create mode 100644 ISIS PLM/SUBMIT.COM create mode 100644 ISIS PLM/SURVEY.COM create mode 100644 ISIS PLM/SURVEY.MAC create mode 100644 ISIS PLM/SYSCOPY.COM create mode 100644 ISIS PLM/SYSCPM2.SUB create mode 100644 ISIS PLM/SYSDAT.LIT create mode 100644 ISIS PLM/TIMER.COM create mode 100644 ISIS PLM/TIMER.MAC create mode 100644 ISIS PLM/TRINT.LST create mode 100644 ISIS PLM/TRINT.OBJ create mode 100644 ISIS PLM/TRINT.SRC create mode 100644 ISIS PLM/UNCR.COM create mode 100644 ISIS PLM/UNERA.COM create mode 100644 ISIS PLM/UNERA.MAC create mode 100644 ISIS PLM/USQ.COM create mode 100644 ISIS PLM/W.COM create mode 100644 ISIS PLM/WM.COM create mode 100644 ISIS PLM/WM.HLP create mode 100644 ISIS PLM/X0100 create mode 100644 ISIS PLM/X0100.ASM create mode 100644 ISIS PLM/X0200 create mode 100644 ISIS PLM/X0200.ASM create mode 100644 ISIS PLM/XDOS.LIT create mode 100644 ISIS PLM/XFORMAT.COM create mode 100644 ISIS PLM/XSUB.COM create mode 100644 ISIS PLM/ZAP.COM create mode 100644 ISIS PLM/ZSID.COM create mode 100644 ISIS PLM/ZTRAN4.COM create mode 100644 SysCon PLMX/CODA.PLM create mode 100644 SysCon PLMX/FNLCG.PLM create mode 100644 SysCon PLMX/GKSL.TXT create mode 100644 SysCon PLMX/IATABLE.FOR create mode 100644 SysCon PLMX/IETABLE.FOR create mode 100644 SysCon PLMX/IHTABLE.FOR create mode 100644 SysCon PLMX/IOCLD.SRC create mode 100644 SysCon PLMX/IOLIB.MAC create mode 100644 SysCon PLMX/IOLIB.REL create mode 100644 SysCon PLMX/MEAN.COM create mode 100644 SysCon PLMX/MEAN.MAC create mode 100644 SysCon PLMX/MEAN.REL create mode 100644 SysCon PLMX/MEAN.SRC create mode 100644 SysCon PLMX/PARSER.PLM create mode 100644 SysCon PLMX/PLMLEX.PLM create mode 100644 SysCon PLMX/PLMX.COM create mode 100644 SysCon PLMX/PLMX.SUB create mode 100644 SysCon PLMX/PLMXUG.TXT create mode 100644 SysCon PLMX/PLMXadv.pdf create mode 100644 SysCon PLMX/PLMXadv2.pdf create mode 100644 SysCon PLMX/RLIB.MAC create mode 100644 SysCon PLMX/RLIB.REL diff --git a/ISIS PLM/ASM.COM b/ISIS PLM/ASM.COM new file mode 100644 index 0000000000000000000000000000000000000000..a63e5aec663546b7aac7b330a9ebe8be3a46ba33 GIT binary patch literal 8192 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 literal 0 HcmV?d00001 diff --git a/ISIS PLM/BDOS.MAC b/ISIS PLM/BDOS.MAC new file mode 100644 index 0000000..352d8de --- /dev/null +++ b/ISIS PLM/BDOS.MAC @@ -0,0 +1,2776 @@ + title 'Bdos Interface, Bdos, Version 2.2 Feb, 1980' + + .Z80 + aseg + org 100h + maclib MEMCFG.LIB ; define configuration parameters + .phase bdosph +bios equ biosph + +;***************************************************************** +;***************************************************************** +;** ** +;** B a s i c D i s k O p e r a t i n g S y s t e m ** +;** I n t e r f a c e M o d u l e ** +;** ** +;***************************************************************** +;***************************************************************** + +; Copyright (c) 1978, 1979, 1980 +; Digital Research +; Box 579, Pacific Grove +; California + + +; 20 january 1980 + +ssize equ 24 ;24 level stack + +; low memory locations +reboot equ 0000h ;reboot system +ioloc equ 0003h ;i/o byte location +bdosa equ 0006h ;address field of jp BDOS + +; bios access constants +bootf defl bios+3*0 ;cold boot function +wbootf defl bios+3*1 ;warm boot function +constf defl bios+3*2 ;console status function +coninf defl bios+3*3 ;console input function +conoutf defl bios+3*4 ;console output function +listf defl bios+3*5 ;list output function +punchf defl bios+3*6 ;punch output function +readerf defl bios+3*7 ;reader input function +homef defl bios+3*8 ;disk home function +seldskf defl bios+3*9 ;select disk function +settrkf defl bios+3*10 ;set track function +setsecf defl bios+3*11 ;set sector function +setdmaf defl bios+3*12 ;set dma function +readf defl bios+3*13 ;read disk function +writef defl bios+3*14 ;write disk function +liststf defl bios+3*15 ;list status function +sectran defl bios+3*16 ;sector translate + +; equates for non graphic characters +ctlc equ 03h ;control c +ctle equ 05h ;physical eol +ctlh equ 08h ;backspace +ctlp equ 10h ;prnt toggle +ctlr equ 12h ;repeat line +ctls equ 13h ;stop/start screen +ctlu equ 15h ;line delete +ctlx equ 18h ;=ctl-u +ctlz equ 1ah ;end of file +rubout equ 7fh ;char delete +tab equ 09h ;tab char +cr equ 0dh ;carriage return +lf equ 0ah ;line feed +ctl equ 5eh ;up arrow + + db 0,0,0,0,0,0 + +; enter here from the user's program with function number in c, +; and information address in d,e + jp bdose ;past parameter block + +; ************************************************ +; *** relative locations 0009 - 000e *** +; ************************************************ +pererr: dw persub ;permanent error subroutine +selerr: dw selsub ;select error subroutine +roderr: dw rodsub ;ro disk error subroutine +roferr: dw rofsub ;ro file error subroutine + + +bdose: ex de,hl ;arrive here from user programs + ld (info),hl + ex de,hl ;info=DE, DE=info + ld a,e + ld (linfo),a ;linfo = low(info) - don't equ + ld hl,0 + ld (aret),hl ;return value defaults to 0000 + ;save user's stack pointer, set to local stack + add hl,sp + ld (entsp),hl ;entsp = stackptr + ld sp,lstack ;local stack setup + xor a + ld (fcbdsk),a + ld (resel),a ;fcbdsk,resel=false + ld hl,goback ;return here after all functions + push hl ;jmp goback equivalent to ret + ld a,c + cp nfuncs + ret nc ;skip if invalid # + ld c,e ;possible output character to C + ld hl,functab + ld e,a + ld d,0 ;DE=func, HL=.ciotab + add hl,de + add hl,de + ld e,(hl) + inc hl + ld d,(hl) ;DE=functab(func) + ld hl,(info) ;info in DE for later xchg + ex de,hl + jp (hl) ;dispatched + +; dispatch table for functions +functab: + dw wbootf, func1, func2, func3 + dw punchf, listf, func6, func7 + dw func8, func9, func10,func11 +diskf equ ($-functab)/2 ;disk funcs + dw func12,func13,func14,func15 + dw func16,func17,func18,func19 + dw func20,func21,func22,func23 + dw func24,func25,func26,func27 + dw func28,func29,func30,func31 + dw func32,func33,func34,func35 + dw func36,func37,func38,func39 + dw func40 +nfuncs equ ($-functab)/2 + + +; error subroutines +persub: ld hl,permsg ;report permanent error + call errflg ;to report the error + cp ctlc + jp z,reboot ;reboot if response is ctlc + ret ;and ignore the error + +selsub: ld hl,selmsg ;report select error + jp wait$err ;wait console before boot + +rodsub: ld hl,rodmsg ;report write to read/only disk + jp wait$err ;wait console + +rofsub: ;report read/only file + ld hl,rofmsg ;drop through to wait for console + +wait$err: ;wait for response before boot + call errflg + jp reboot + +; error messages +dskmsg: db 'Bdos Err On ' +dskerr: db ' : $' ;filled in by errflg +permsg: db 'Bad Sector$' +selmsg: db 'Select$' +rofmsg: db 'File ' +rodmsg: db 'R/O$' + + +errflg: push hl ;report error to console, message address in HL + call crlf ;stack mssg address, new line + ld a,(curdsk) + add a,'A' + ld (dskerr),a ;current disk name + ld bc,dskmsg + call print ;the error message + pop bc + call print ;error mssage tail +; jp conin ;to get the input character + ;(drop through to conin) +; ret + + +; console handlers +conin: ld hl,kbchar ;read console character to A + ld a,(hl) + ld (hl),0 + or a + ret nz + ;no previous keyboard character ready + jp coninf ;get character externally +; ret +conech: call conin ;read character with echo + call echoc + ret c ;echo character? + ;character must be echoed before return + push af + ld c,a + call tabout + pop af + ret ;with character in A + +echoc: ;echo character if graphic + cp cr ;cr, lf, tab, or backspace + ret z ;carriage return? + cp lf + ret z ;line feed? + cp tab + ret z ;tab? + cp ctlh + ret z ;backspace? + cp ' ' + ret ;carry set if not graphic + +conbrk: ;check for character ready + ld a,(kbchar) + or a + jp nz,conb1 ;skip if active kbchar + ;no active kbchar, check external break + call constf + and 1 + ret z ;return if no char ready + ;character ready, read it + call coninf ;to A + cp ctls + jp nz,conb0 ;check stop screen function + ;found ctls, read next character + call coninf ;to A + cp ctlc + jp z,reboot ;ctlc implies re-boot + ;not a reboot, act as if nothing has happened + xor a + ret ;with zero in accumulator +conb0: + ;character in accum, save it + ld (kbchar),a +conb1: + ;return with true set in accumulator + ld a,1 + ret + +conout: ;compute character position/write console char from C + ;compcol = true if computing column position + ld a,(compcol) + or a + jp nz,compout + ;write the character, then compute the column + ;write console character from C + push bc + call conbrk ;check for screen stop function + pop bc + push bc ;recall/save character + call conoutf ;externally, to console + pop bc + push bc ;recall/save character + ;may be copying to the list device + ld a,(listcp) + or a + call nz,listf ;to printer, if so + pop bc ;recall the character +compout: + ld a,c ;recall the character + ;and compute column position + ld hl,column ;A = char, HL = .column + cp rubout + ret z ;no column change if nulls + inc (hl) ;column = column + 1 + cp ' ' + ret nc ;return if graphic + ;not graphic, reset column position + dec (hl) ;column = column - 1 + ld a,(hl) + or a + ret z ;return if at zero + ;not at zero, may be backspace or end line + ld a,c ;character back to A + cp ctlh + jp nz,notbacksp + ;backspace character + dec (hl) ;column = column - 1 + ret + +notbacksp: ;not a backspace character, eol? + cp lf + ret nz ;return if not + ;end of line, column = 0 + ld (hl),0 ;column = 0 + ret + +ctlout: ;send C character with possible preceding up-arrow + ld a,c + call echoc ;cy if not graphic (or special case) + jp nc,tabout ;skip if graphic, tab, cr, lf, or ctlh + ;send preceding up arrow + push af + ld c,ctl + call conout ;up arrow + pop af + or 40h ;becomes graphic letter + ld c,a ;ready to print + ;(drop through to tabout) + +tabout: ;expand tabs to console + ld a,c + cp tab + jp nz,conout ;direct to conout if not + ;tab encountered, move to next tab position +tab0: ld c,' ' + call conout ;another blank + ld a,(column) + and 111b ;column mod 8 = 0 ? + jp nz,tab0 ;back for another if not + ret + +backup: ;back-up one screen position + call pctlh + ld c,' ' + call conoutf +; (drop through to pctlh) +pctlh: ;send ctlh to console without affecting column count + ld c,ctlh + jp conoutf +; ret +crlfp: ;print #, cr, lf for ctlx, ctlu, ctlr functions + ;then move to strtcol (starting column) + ld c,'#' + call conout + call crlf ;column = 0, move to position strtcol +crlfp0: ld a,(column) + ld hl,strtcol + cp (hl) + ret nc ;stop when column reaches strtcol + ld c,' ' + call conout ;print blank + jp crlfp0 + +crlf: ld c,cr ;carriage return line feed sequence + call conout + ld c,lf + jp conout +; ret +print: ld a,(bc) ;print message until M(BC) = '$' + cp '$' + ret z ;stop on $ + ;more to print + inc bc + push bc + ld c,a ;char to C + call tabout ;another character printed + pop bc + jp print + +read: ;read to info address (max length, current length, buffer) + ld a,(column) + ld (strtcol),a ;save start for ctl-x, ctl-h + ld hl,(info) + ld c,(hl) + inc hl + push hl + ld b,0 + ;B = current buffer length, + ;C = maximum buffer length, + ;HL= next to fill - 1 +readnx: ;read next character, BC, HL active + push bc + push hl ;blen, cmax, HL saved +readn0: call conin ;next char in A + and 7fh ;mask parity bit + pop hl + pop bc ;reactivate counters + cp cr + jp z,readen ;end of line? + cp lf + jp z,readen ;also end of line + cp ctlh + jp nz,noth ;backspace? + ;do we have any characters to back over? + ld a,b + or a + jp z,readnx + ;characters remain in buffer, backup one + dec b ;remove one character + ld a,(column) + ld (compcol),a ;col > 0 + ;compcol > 0 marks repeat as length compute + jp linelen ;uses same code as repeat + +noth: ;not a backspace + cp rubout + jp nz,notrub ;rubout char? + ;rubout encountered, rubout if possible + ld a,b + or a + jp z,readnx ;skip if len=0 + ;buffer has characters, resend last char + ld a,(hl) + dec b + dec hl ;A = last char + ;blen=blen-1, next to fill - 1 decremented + jp rdech1 ;act like this is an echo + +notrub: ;not a rubout character, check end line + cp ctle + jp nz,note ;physical end line? + ;yes, save active counters and force eol + push bc + push hl + call crlf + xor a + ld (strtcol),a ;start position = 00 + jp readn0 ;for another character + +note: ;not end of line, list toggle? + cp ctlp + jp nz,notp ;skip if not ctlp + ;list toggle - change parity + push hl ;save next to fill - 1 + ld hl,listcp ;HL=.listcp flag + ld a,1 + sub (hl) ;True-listcp + ld (hl),a ;listcp = not listcp + pop hl + jp readnx ;for another char + +notp: ;not a ctlp, line delete? + cp ctlx + jp nz,notx + pop hl ;discard start position + ;loop while column > strtcol +backx: ld a,(strtcol) + ld hl,column + cp (hl) + jp nc,read ;start again + dec (hl) ;column = column - 1 + call backup ;one position + jp backx + +notx: ;not a control x, control u? + ;not control-X, control-U? + cp ctlu + jp nz,notu ;skip if not + ;delete line (ctlu) + call crlfp ;physical eol + pop hl ;discard starting position + jp read ;to start all over + +notu: ;not line delete, repeat line? + cp ctlr + jp nz,notr +linelen: ;repeat line, or compute line len (ctlh) + ;if compcol > 0 + push bc + call crlfp ;save line length + pop bc + pop hl + push hl + push bc + ;bcur, cmax active, beginning buff at HL +rep0: ld a,b + or a + jp z,rep1 ;count len to 00 + inc hl + ld c,(hl) ;next to print + dec b + push bc + push hl ;count length down + call ctlout ;character echoed + pop hl + pop bc ;recall remaining count + jp rep0 ;for the next character + +rep1: ;end of repeat, recall lengths + ;original BC still remains pushed + push hl ;save next to fill + ld a,(compcol) + or a ;>0 if computing length + jp z,readn0 ;for another char if so + ;column position computed for ctlh + ld hl,column + sub (hl) ;diff > 0 + ld (compcol),a ;count down below + ;move back compcol-column spaces +backsp: ;move back one more space + call backup ;one space + ld hl,compcol + dec (hl) + jp nz,backsp + jp readn0 ;for next character + +notr: ;not a ctlr, place into buffer +rdecho: inc hl + ld (hl),a ;character filled to mem + inc b ;blen = blen + 1 +rdech1: ;look for a random control character + push bc + push hl ;active values saved + ld c,a ;ready to print + call ctlout ;may be up-arrow C + pop hl + pop bc + ld a,(hl) ;recall char + cp ctlc ;set flags for reboot test + ld a,b ;move length to A + jp nz,notc ;skip if not a control c + cp 1 ;control C, must be length 1 + jp z,reboot ;reboot if blen = 1 + ;length not one, so skip reboot +notc: ;not reboot, are we at end of buffer? + cp c + jp c,readnx ;go for another if not +readen: ;end of read operation, store blen + pop hl + ld (hl),b ;M(current len) = B + ld c,cr + jp conout ;return carriage +; ret +func1: ;return console character with echo + call conech + jp sta$ret + +func2 equ tabout + ;write console character with tab expansion + +func3: ;return reader character + call readerf + jp sta$ret + +;func4: equated to punchf + ;write punch character + +;func5: equated to listf + ;write list character + ;write to list device + +func6: ;direct console i/o - read if 0ffh + ld a,c + inc a + jp z,dirinp ;0ffh => 00h, means input mode + inc a + jp z,constf ;0feH in C for status + ;direct output function + jp conoutf + +dirinp: call constf ;status check + or a + jp z,retmon ;skip, return 00 if not ready + ;character is ready, get it + call coninf ;to A + jp sta$ret + +func7: ;return io byte + ld a,(ioloc) + jp sta$ret + +func8: ;set i/o byte + ld hl,ioloc + ld (hl),c + ret ;jmp goback + +func9: ;write line until $ encountered + ex de,hl ;was lhld info + ld c,l + ld b,h ;BC=string address + jp print ;out to console + +func10 equ read + ;read a buffered console line + +func11: ;check console status + call conbrk + ;(drop through to sta$ret) +sta$ret: ;store the A register to aret + ld (aret),a +func$ret: + ret ;jmp goback (pop stack for non cp/m functions) + +setlret1: ;set lret = 1 + ld a,1 + jp sta$ret + + + +; data areas + +compcol: + db 0 ;true if computing column position +strtcol: + db 0 ;starting column position after read +column: db 0 ;column position +listcp: db 0 ;listing toggle +kbchar: db 0 ;initial key char = 00 +entsp: ds 2 ;entry stack pointer + ds ssize*2 ;stack size +lstack: +; end of Basic I/O System + +;***************************************************************** +;***************************************************************** + +; common values shared between bdosi and bdos +usrcode: + db 0 ;current user number +curdsk: db 0 ;current disk number +info: ds 2 ;information address +aret: ds 2 ;address value to return +lret equ aret ;low(aret) + +;***************************************************************** +;***************************************************************** +;** ** +;** B a s i c D i s k O p e r a t i n g S y s t e m ** +;** ** +;***************************************************************** +;***************************************************************** + +dvers equ 22h ;version 2.2 +; module addresses + +; literal constants +true equ 0ffh ;constant true +false equ 000h ;constant false +enddir equ 0ffffh ;end of directory +byte equ 1 ;number of bytes for "byte" type +word equ 2 ;number of bytes for "word" type + +; fixed addresses in low memory +tfcb equ 005ch ;default fcb location +tbuff equ 0080h ;default buffer location + +; fixed addresses referenced in bios module are +; pererr (0009), selerr (000c), roderr (000f) + +; error message handlers + +;per$error: ;report permanent error to user +; ld hl,pererr +; jp goerr + +;rod$error: ;report read/only disk error +; ld hl,roderr +; jp goerr + +;rof$error: ;report read/only file error +; ld hl,roferr +; jp goerr + +sel$error: ;report select error + ld hl,selerr + + +goerr: ;HL = .errorhandler, call subroutine + ld e,(hl) + inc hl + ld d,(hl) ;address of routine in DE + ex de,hl + jp (hl) ;to subroutine + + + +; local subroutines for bios interface + +move: ;move data length of length C from source DE to + ;destination given by HL + inc c ;in case it is zero +move0: dec c + ret z ;more to move + ld a,(de) + ld (hl),a ;one byte moved + inc de + inc hl ;to next byte + jp move0 + +selectdisk: ;select the disk drive given by curdsk, and fill + ;the base addresses curtrka - alloca, then fill + ;the values of the disk parameter block + ld a,(curdsk) + ld c,a ;current disk# to c + ;lsb of e = 0 if not yet logged - in + call seldskf ;HL filled by call + ;HL = 0000 if error, otherwise disk headers + ld a,h + or l + ret z ;return with 0000 in HL and z flag + ;disk header block address in hl + ld e,(hl) + inc hl + ld d,(hl) + inc hl ;DE=.tran + ld (cdrmaxa),hl + inc hl + inc hl ;.cdrmax + ld (curtrka),hl + inc hl + inc hl ;HL=.currec + ld (curreca),hl + inc hl + inc hl ;HL=.buffa + ;DE still contains .tran + ex de,hl + ld (tranv),hl ;.tran vector + ld hl,buffa ;DE= source for move, HL=dest + ld c,addlist + call move ;addlist filled + ;now fill the disk parameter block + ld hl,(dpbaddr) + ex de,hl ;DE is source + ld hl,sectpt ;HL is destination + ld c,dpblist + call move ;data filled + ;now set single/double map mode + ld hl,(maxall) ;largest allocation number + ld a,h ;00 indicates < 255 + ld hl,single + ld (hl),true ;assume a=00 + or a + jp z,retselect + ;high order of maxall not zero, use double dm + ld (hl),false +retselect: + ld a,true + or a + ret ;select disk function ok + +home: ;move to home position, then offset to start of dir + call homef ;move to track 00, sector 00 reference + ;lxi h,offset ;mov c,m ;inx h ;mov b,m ;call settrkf + ;first directory position selected + xor a ;constant zero to accumulator + ld hl,(curtrka) + ld (hl),a + inc hl + ld (hl),a ;curtrk=0000 + ld hl,(curreca) + ld (hl),a + inc hl + ld (hl),a ;currec=0000 + ;curtrk, currec both set to 0000 + ret + +rdbuff: ;read buffer and check condition + call readf ;current drive, track, sector, dma + jp diocomp ;check for i/o errors + +wrbuff: ;write buffer and check condition + ;write type (wrtype) is in register C + ;wrtype = 0 => normal write operation + ;wrtype = 1 => directory write operation + ;wrtype = 2 => start of new block + call writef ;current drive, track, sector, dma +diocomp: ;check for disk errors + or a + ret z + ld hl,pererr + jp goerr + +seek$dir: ;seek the record containing the current dir entry + ld hl,(dcnt) ;directory counter to HL + ld c,dskshf + call hlrotr ;value to HL + ld (arecord),hl + ld (drec),hl ;ready for seek +; jp seek +; ret + + +seek: ;seek the track given by arecord (actual record) + ;local equates for registers + ;load the registers from memory + ld hl,arecord + ld c,(hl) + inc hl + ld b,(hl) + ld hl,(curreca) + ld e,(hl) + inc hl + ld d,(hl) + ld hl,(curtrka) + ld a,(hl) + inc hl + ld h,(hl) + ld l,a + ;loop while arecord < currec +seek0: ld a,c + sub e + ld a,b + sbc a,d + jp nc,seek1 ;skip if arecord >= currec + ;currec = currec - sectpt + push hl + ld hl,(sectpt) + ld a,e + sub l + ld e,a + ld a,d + sbc a,h + ld d,a + pop hl + ;curtrk = curtrk - 1 + dec hl + jp seek0 ;for another try + +seek1: ;look while arecord >= (t:=currec + sectpt) + push hl + ld hl,(sectpt) + add hl,de ;HL = currec+sectpt + jp c,seek2 ;can be > FFFFH + ld a,c + sub l + ld a,b + sbc a,h + jp c,seek2 ;skip if t > arecord + ;currec = t + ex de,hl + ;curtrk = curtrk + 1 + pop hl + inc hl + jp seek1 ;for another try + +seek2: pop hl + ;arrive here with updated values in each register + push bc + push de + push hl ;to stack for later + ;stack contains (lowest) BC=arecord, DE=currec, HL=curtrk + ex de,hl + ld hl,(offset) + add hl,de ;HL = curtrk+offset + ld b,h + ld c,l + call settrkf ;track set up + ;note that BC - curtrk is difference to move in bios + pop de ;recall curtrk + ld hl,(curtrka) + ld (hl),e + inc hl + ld (hl),d ;curtrk updated + ;now compute sector as arecord-currec + pop de ;recall currec + ld hl,(curreca) + ld (hl),e + inc hl + ld (hl),d + pop bc ;BC=arecord, DE=currec + ld a,c + sub e + ld c,a + ld a,b + sbc a,d + ld b,a + ld hl,(tranv) + ex de,hl ;BC=sector#, DE=.tran + call sectran ;HL = tran(sector) + ld c,l + ld b,h ;BC = tran(sector) + jp setsecf ;sector selected +; ret + +; file control block (fcb) constants +empty equ 0e5h ;empty directory entry +lstrec equ 127 ;last record# in extent +recsiz equ 128 ;record size +fcblen equ 32 ;file control block size +dirrec equ recsiz/fcblen ;directory elts / record +dskshf equ 2 ;log2(dirrec) +dskmsk equ dirrec-1 +fcbshf equ 5 ;log2(fcblen) + +extnum equ 12 ;extent number field +maxext equ 31 ;largest extent number +ubytes equ 13 ;unfilled bytes field +modnum equ 14 ;data module number +maxmod equ 15 ;largest module number +fwfmsk equ 80h ;file write flag is high order modnum +namlen equ 15 ;name length +reccnt equ 15 ;record count field +dskmap equ 16 ;disk map field +lstfcb equ fcblen-1 +nxtrec equ fcblen +ranrec equ nxtrec+1 ;random record field (2 bytes) + +; reserved file indicators +rofile equ 9 ;high order of first type char +invis equ 10 ;invisible file in dir command +; equ 11 ;reserved + +; utility functions for file access + +dm$position: ;compute disk map position for vrecord to HL + ld hl,blkshf + ld c,(hl) ;shift count to C + ld a,(vrecord) ;current virtual record to A +dmpos0: or a + rra + dec c + jp nz,dmpos0 + ;A = shr(vrecord,blkshf) = vrecord/2**(sect/block) + ld b,a ;save it for later addition + ld a,8 + sub (hl) ;8-blkshf to accumulator + ld c,a ;extent shift count in register c + ld a,(extval) ;extent value ani extmsk +dmpos1: + ;blkshf = 3,4,5,6,7, C=5,4,3,2,1 + ;shift is 4,3,2,1,0 + dec c + jp z,dmpos2 + or a + rla + jp dmpos1 + +dmpos2: ;arrive here with A = shl(ext and extmsk,7-blkshf) + add a,b ;add the previous shr(vrecord,blkshf) value + ;A is one of the following values, depending upon alloc + ;bks blkshf + ;1k 3 v/8 + extval * 16 + ;2k 4 v/16+ extval * 8 + ;4k 5 v/32+ extval * 4 + ;8k 6 v/64+ extval * 2 + ;16k 7 v/128+extval * 1 + ret ;with dm$position in A + +getdm: ;return disk map value from position given by BC + ld hl,(info) ;base address of file control block + ld de,dskmap + add hl,de ;HL =.diskmap + add hl,bc ;index by a single byte value + ld a,(single) ;single byte/map entry? + or a + jp z,getdmd ;get disk map single byte + ld l,(hl) + ld h,0 + ret ;with HL=00bb +getdmd: + add hl,bc ;HL=.fcb(dm+i*2) + ;double precision value returned + ld e,(hl) + inc hl + ld d,(hl) + ex de,hl + ret + +index: ;compute disk block number from current fcb + call dm$position ;0...15 in register A + ld c,a + ld b,0 + call getdm ;value to HL + ld (arecord),hl + ret + +allocated: ;called following index to see if block allocated + ld hl,(arecord) + ld a,l + or h + ret + +atran: ;compute actual record address, assuming index called + ld a,(blkshf) ;shift count to reg A + ld hl,(arecord) +atran0: add hl,hl + dec a + jp nz,atran0 ;shl(arecord,blkshf) + ld (arecord1),hl ;save shifted block # + ld a,(blkmsk) + ld c,a ;mask value to C + ld a,(vrecord) + and c ;masked value in A + or l + ld l,a ;to HL + ld (arecord),hl ;arecord=HL or (vrecord and blkmsk) + ret + +getexta: ;get current extent field address to A + ld hl,(info) + ld de,extnum + add hl,de ;HL=.fcb(extnum) + ret + +getfcba: ;compute reccnt and nxtrec addresses for get/setfcb + ld hl,(info) + ld de,reccnt + add hl,de + ex de,hl ;DE=.fcb(reccnt) + ld hl,nxtrec-reccnt + add hl,de ;HL=.fcb(nxtrec) + ret + +getfcb: ;set variables from currently addressed fcb + call getfcba ;addresses in DE, HL + ld a,(hl) + ld (vrecord),a ;vrecord=fcb(nxtrec) + ex de,hl + ld a,(hl) + ld (rcount),a ;rcount=fcb(reccnt) + call getexta ;HL=.fcb(extnum) + ld a,(extmsk) ;extent mask to a + and (hl) ;fcb(extnum) and extmsk + ld (extval),a + ret + +setfcb: ;place values back into current fcb + call getfcba ;addresses to DE, HL + ld a,(seqio) + cp 02 + jp nz,setfcb1 + xor a ;check ranfill +setfcb1: + ld c,a ;=1 if sequential i/o + ld a,(vrecord) + add a,c + ld (hl),a ;fcb(nxtrec)=vrecord+seqio + ex de,hl + ld a,(rcount) + ld (hl),a ;fcb(reccnt)=rcount + ret + +hlrotr: ;hl rotate right by amount C + inc c ;in case zero +hlrotr0: + dec c + ret z ;return when zero + ld a,h + or a + rra + ld h,a ;high byte + ld a,l + rra + ld l,a ;low byte + jp hlrotr0 + +compute$cs: ;compute checksum for current directory buffer + ld c,recsiz ;size of directory buffer + ld hl,(buffa) ;current directory buffer + xor a ;clear checksum value +computecs0: + add a,(hl) + inc hl + dec c ;cs=cs+buff(recsiz-C) + jp nz,computecs0 + ret ;with checksum in A + +hlrotl: ;rotate the mask in HL by amount in C + inc c ;may be zero +hlrotl0: + dec c + ret z ;return if zero + add hl,hl + jp hlrotl0 + +set$cdisk: ;set a "1" value in curdsk position of BC + push bc ;save input parameter + ld a,(curdsk) + ld c,a ;ready parameter for shift + ld hl,1 ;number to shift + call hlrotl ;HL = mask to integrate + pop bc ;original mask + ld a,c + or l + ld l,a + ld a,b + or h + ld h,a ;HL = mask or rol(1,curdsk) + ret + +nowrite: ;return true if dir checksum difference occurred + ld hl,(rodsk) + ld a,(curdsk) + ld c,a + call hlrotr + ld a,l + and 1b + ret ;non zero if nowrite + +set$ro: ;set current disk to read only + ld hl,rodsk + ld c,(hl) + inc hl + ld b,(hl) + call set$cdisk ;sets bit to 1 + ld (rodsk),hl + ;high water mark in directory goes to max + ld hl,(dirmax) + inc hl + ex de,hl ;DE = directory max + ld hl,(cdrmaxa) ;HL = .cdrmax + ld (hl),e + inc hl + ld (hl),d ;cdrmax = dirmax + ret + +check$rodir: ;check current directory element for read/only status + call getdptra ;address of element + +check$rofile: ;check current buff(dptr) or fcb(0) for r/o status + ld de,rofile + add hl,de ;offset to ro bit + ld a,(hl) + rla + ret nc ;return if not set + ld hl,roferr + jp goerr +; jp rof$error ;exit to read only disk message + + +check$write: ;check for write protected disk + call nowrite + ret z ;ok to write if not rodsk + ld hl,roderr + jp goerr +; jp rod$error ;read only disk error + +getdptra: ;compute the address of a directory element at + ;positon dptr in the buffer + ld hl,(buffa) + ld a,(dptr) +addh: ;HL = HL + A + add a,l + ld l,a + ret nc + ;overflow to H + inc h + ret + + +getmodnum: ;compute the address of the module number + ;bring module number to accumulator + ;(high order bit is fwf (file write flag) + ld hl,(info) + ld de,modnum + add hl,de ;HL=.fcb(modnum) + ld a,(hl) + ret ;A=fcb(modnum) + +clrmodnum: ;clear the module number field for user open/make + call getmodnum + ld (hl),0 ;fcb(modnum)=0 + ret + +setfwf: call getmodnum ;HL=.fcb(modnum), A=fcb(modnum) + ;set fwf (file write flag) to "1" + or fwfmsk + ld (hl),a ;fcb(modnum)=fcb(modnum) or 80h + ;also returns non zero in accumulator + ret + + +compcdr: ;return cy if cdrmax > dcnt + ld hl,(dcnt) + ex de,hl ;DE = directory counter + ld hl,(cdrmaxa) ;HL=.cdrmax + ld a,e + sub (hl) ;low(dcnt) - low(cdrmax) + inc hl ;HL = .cdrmax+1 + ld a,d + sbc a,(hl) ;hig(dcnt) - hig(cdrmax) + ;condition dcnt - cdrmax produces cy if cdrmax>dcnt + ret + +setcdr: ;if not (cdrmax > dcnt) then cdrmax = dcnt+1 + call compcdr + ret c ;return if cdrmax > dcnt + ;otherwise, HL = .cdrmax+1, DE = dcnt + inc de + ld (hl),d + dec hl + ld (hl),e + ret + +subdh: ;compute HL = DE - HL + ld a,e + sub l + ld l,a + ld a,d + sbc a,h + ld h,a + ret + +newchecksum: + ld c,true ;drop through to compute new checksum +checksum: ;compute current checksum record and update the + ;directory element if C=true, or check for = if not + ;drec < chksiz? + ld hl,(drec) + ex de,hl + ld hl,(chksiz) + call subdh ;DE-HL + ret nc ;skip checksum if past checksum vector size + ;drec < chksiz, so continue + push bc ;save init flag + call compute$cs ;check sum value to A + ld hl,(checka) ;address of check sum vector + ex de,hl + ld hl,(drec) ;value of drec + add hl,de ;HL = .check(drec) + pop bc ;recall true=0ffh or false=00 to C + inc c ;0ffh produces zero flag + jp z,initial$cs + ;not initializing, compare + cp (hl) ;compute$cs=check(drec)? + ret z ;no message if ok + ;checksum error, are we beyond + ;the end of the disk? + call compcdr + ret nc ;no message if so + call set$ro ;read/only disk set + ret + +initial$cs: ;initializing the checksum + ld (hl),a + ret + + +wrdir: ;write the current directory entry, set checksum + call newchecksum ;initialize entry + call setdir ;directory dma + ld c,1 ;indicates a write directory operation + call wrbuff ;write the buffer + jp setdata ;to data dma address +; ret +rd$dir: ;read a directory entry into the directory buffer + call setdir ;directory dma + call rdbuff ;directory record loaded + ;jmp setdata to data dma address +; ret +setdata: ;set data dma address + ld hl,dmaad + jp setdma ;to complete the call + +setdir: ;set directory dma address + ld hl,buffa ;jmp setdma to complete call + +setdma: ;HL=.dma address to set (i.e., buffa or dmaad) + ld c,(hl) + inc hl + ld b,(hl) ;parameter ready + jp setdmaf + +dir$to$user: ;copy the directory entry to the user buffer + ;after call to search or searchn by user code + ld hl,(buffa) + ex de,hl ;source is directory buffer + ld hl,(dmaad) ;destination is user dma address + ld c,recsiz ;copy entire record + jp move +; ret + +end$of$dir: ;return zero flag if at end of directory, non zero + ;if not at end (end of dir if dcnt = 0ffffh) + ld hl,dcnt + ld a,(hl) ;may be 0ffh + inc hl + cp (hl) ;low(dcnt) = high(dcnt)? + ret nz ;non zero returned if different + ;high and low the same, = 0ffh? + inc a ;0ffh becomes 00 if so + ret + +set$end$dir: ;set dcnt to the end of the directory + ld hl,enddir + ld (dcnt),hl + ret + +read$dir: ;read next directory entry, with C=true if initializing + ld hl,(dirmax) + ex de,hl ;in preparation for subtract + ld hl,(dcnt) + inc hl + ld (dcnt),hl ;dcnt=dcnt+1 + ;continue while dirmax >= dcnt (dirmax-dcnt no cy) + call subdh ;DE-HL + jp nc,read$dir0 + ;yes, set dcnt to end of directory + jp set$end$dir +; ret + +read$dir0: ;not at end of directory, seek next element + ;initialization flag is in C + ld a,(dcnt) + and dskmsk ;low(dcnt) and dskmsk + ld b,fcbshf ;to multiply by fcb size +read$dir1: + add a,a + dec b + jp nz,read$dir1 + ;A = (low(dcnt) and dskmsk) shl fcbshf + ld (dptr),a ;ready for next dir operation + or a + ret nz ;return if not a new record + push bc ;save initialization flag C + call seek$dir ;seek proper record + call rd$dir ;read the directory record + pop bc ;recall initialization flag + jp checksum ;checksum the directory elt +; ret + + +getallocbit: ;given allocation vector position BC, return with byte + ;containing BC shifted so that the least significant + ;bit is in the low order accumulator position. HL is + ;the address of the byte for possible replacement in + ;memory upon return, and D contains the number of shifts + ;required to place the returned value back into position + ld a,c + and 111b + inc a + ld e,a + ld d,a + ;d and e both contain the number of bit positions to shift + ld a,c + rrca + rrca + rrca + and 11111b + ld c,a ;C shr 3 to C + ld a,b + add a,a + add a,a + add a,a + add a,a + add a,a ;B shl 5 + or c + ld c,a ;bbbccccc to C + ld a,b + rrca + rrca + rrca + and 11111b + ld b,a ;BC shr 3 to BC + ld hl,(alloca) ;base address of allocation vector + add hl,bc + ld a,(hl) ;byte to A, hl = .alloc(BC shr 3) + ;now move the bit to the low order position of A +rotl: rlca + dec e + jp nz,rotl + ret + + +set$alloc$bit: ;BC is the bit position of ALLOC to set or reset. The + ;value of the bit is in register E. + push de + call getallocbit ;shifted val A, count in D + and 11111110b ;mask low bit to zero (may be set) + pop bc + or c ;low bit of C is masked into A +; jp rotr ;to rotate back into proper position +; ret +rotr: + ;byte value from ALLOC is in register A, with shift count + ;in register C (to place bit back into position), and + ;target ALLOC position in registers HL, rotate and replace + rrca + dec d + jp nz,rotr ;back into position + ld (hl),a ;back to ALLOC + ret + +scandm: ;scan the disk map addressed by dptr for non-zero + ;entries, the allocation vector entry corresponding + ;to a non-zero entry is set to the value of C (0,1) + call getdptra ;HL = buffa + dptr + ;HL addresses the beginning of the directory entry + ld de,dskmap + add hl,de ;hl now addresses the disk map + push bc ;save the 0/1 bit to set + ld c,fcblen-dskmap+1;size of single byte disk map + 1 +scandm0: ;loop once for each disk map entry + pop de ;recall bit parity + dec c + ret z ;all done scanning? + ;no, get next entry for scan + push de ;replace bit parity + ld a,(single) + or a + jp z,scandm1 + ;single byte scan operation + push bc ;save counter + push hl ;save map address + ld c,(hl) + ld b,0 ;BC=block# + jp scandm2 + +scandm1: ;double byte scan operation + dec c ;count for double byte + push bc ;save counter + ld c,(hl) + inc hl + ld b,(hl) ;BC=block# + push hl ;save map address +scandm2: ;arrive here with BC=block#, E=0/1 + ld a,c + or b ;skip if = 0000 + jp z,scanm3 + ld hl,(maxall) ;check invalid index + ld a,l + sub c + ld a,h + sbc a,b ;maxall - block# + call nc,set$alloc$bit + ;bit set to 0/1 +scanm3: pop hl + inc hl ;to next bit position + pop bc ;recall counter + jp scandm0 ;for another item + +initialize: ;initialize the current disk + ;lret = false ;set to true if $ file exists + ;compute the length of the allocation vector - 2 + ld hl,(maxall) + ld c,3 ;perform maxall/8 + ;number of bytes in alloc vector is (maxall/8)+1 + call hlrotr + inc hl ;HL = maxall/8+1 + ld b,h + ld c,l ;count down BC til zero + ld hl,(alloca) ;base of allocation vector + ;fill the allocation vector with zeros +initial0: + ld (hl),0 + inc hl ;alloc(i)=0 + dec bc ;count length down + ld a,b + or c + jp nz,initial0 + ;set the reserved space for the directory + ld hl,(dirblk) + ex de,hl + ld hl,(alloca) ;HL=.alloc() + ld (hl),e + inc hl + ld (hl),d ;sets reserved directory blks + ;allocation vector initialized, home disk + call home + ;cdrmax = 3 (scans at least one directory record) + ld hl,(cdrmaxa) + ld (hl),3 + inc hl + ld (hl),0 + ;cdrmax = 0000 + call set$end$dir ;dcnt = enddir + ;read directory entries and check for allocated storage +initial2: + ld c,true + call read$dir + call end$of$dir + ret z ;return if end of directory + ;not end of directory, valid entry? + call getdptra ;HL = buffa + dptr + ld a,empty + cp (hl) + jp z,initial2 ;go get another item + ;not empty, user code the same? + ld a,(usrcode) + cp (hl) + jp nz,pdollar + ;same user code, check for '$' submit + inc hl + ld a,(hl) ;first character + sub '$' ;dollar file? + jp nz,pdollar + ;dollar file found, mark in lret + dec a + ld (lret),a ;lret = 255 +pdollar: ;now scan the disk map for allocated blocks + ld c,1 ;set to allocated + call scandm + call setcdr ;set cdrmax to dcnt + jp initial2 ;for another entry + +copy$dirloc: ;copy directory location to lret following + ;delete, rename, ... ops + ld a,(dirloc) + jp sta$ret +; ret + +compext: ;compare extent# in A with that in C, return nonzero + ;if they do not match + push bc ;save C's original value + push af + ld a,(extmsk) + cpl + ld b,a + ;B has negated form of extent mask + ld a,c + and b + ld c,a ;low bits removed from C + pop af + and b ;low bits removed from A + sub c + and maxext ;set flags + pop bc ;restore original values + ret + +search: ;search for directory element of length C at info + ld a,0ffh + ld (dirloc),a ;changed if actually found + ld hl,searchl + ld (hl),c ;searchl = C + ld hl,(info) + ld (searcha),hl ;searcha = info + call set$end$dir ;dcnt = enddir + call home ;to start at the beginning + ;(drop through to searchn) + +searchn: ;search for the next directory element, assuming + ;a previous call on search which sets searcha and + ;searchl + ld c,false + call read$dir ;read next dir element + call end$of$dir + jp z,search$fin ;skip to end if so + ;not end of directory, scan for match + ld hl,(searcha) + ex de,hl ;DE=beginning of user fcb + ld a,(de) ;first character + cp empty ;keep scanning if empty + jp z,searchnext + ;not empty, may be end of logical directory + push de ;save search address + call compcdr ;past logical end? + pop de ;recall address + jp nc,search$fin ;artificial stop +searchnext: + call getdptra ;HL = buffa+dptr + ld a,(searchl) + ld c,a ;length of search to c + ld b,0 ;b counts up, c counts down +searchloop: + ld a,c + or a + jp z,endsearch + ld a,(de) + cp '?' + jp z,searchok ;? matches all + ;scan next character if not ubytes + ld a,b + cp ubytes + jp z,searchok + ;not the ubytes field, extent field? + cp extnum ;may be extent field + ld a,(de) ;fcb character + jp z,searchext ;skip to search extent + sub (hl) + and 7fh ;mask-out flags/extent modulus + jp nz,searchn ;skip if not matched + jp searchok ;matched character + +searchext: ;A has fcb character + ;attempt an extent # match + push bc ;save counters + ld c,(hl) ;directory character to c + call compext ;compare user/dir char + pop bc ;recall counters + jp nz,searchn ;skip if no match +searchok: ;current character matches + inc de + inc hl + inc b + dec c + jp searchloop + +endsearch: ;entire name matches, return dir position + ld a,(dcnt) + and dskmsk + ld (lret),a + ;lret = low(dcnt) and 11b + ld hl,dirloc + ld a,(hl) + rla + ret nc ;dirloc=0ffh? + ;yes, change it to 0 to mark as found + xor a + ld (hl),a ;dirloc=0 + ret + +search$fin: ;end of directory, or empty name + call set$end$dir ;may be artifical end + ld a,255 + jp sta$ret + +delete: ;delete the currently addressed file + call check$write ;write protected? + ld c,extnum + call search ;search through file type +delete0: + ;loop while directory matches + call end$of$dir + ret z ;stop if end + ;set each non zero disk map entry to 0 + ;in the allocation vector + ;may be r/o file + call check$rodir ;ro disk error if found + call getdptra ;HL=.buff(dptr) + ld (hl),empty + ld c,0 + call scandm ;alloc elts set to 0 + call wrdir ;write the directory + call searchn ;to next element + jp delete0 ;for another record + +get$block: ;given allocation vector position BC, find the zero bit + ;closest to this position by searching left and right. + ;if found, set the bit to one and return the bit position + ;in hl. if not found (i.e., we pass 0 on the left, or + ;maxall on the right), return 0000 in hl + ld d,b + ld e,c ;copy of starting position to de +lefttst: + ld a,c + or b + jp z,righttst ;skip if left=0000 + ;left not at position zero, bit zero? + dec bc + push de + push bc ;left,right pushed + call getallocbit + rra + jp nc,retblock ;return block number if zero + ;bit is one, so try the right + pop bc + pop de ;left, right restored +righttst: + ld hl,(maxall) ;value of maximum allocation# + ld a,e + sub l + ld a,d + sbc a,h ;right=maxall? + jp nc,retblock0 ;return block 0000 if so + inc de + push bc + push de ;left, right pushed + ld b,d + ld c,e ;ready right for call + call getallocbit + rra + jp nc,retblock ;return block number if zero + pop de + pop bc ;restore left and right pointers + jp lefttst ;for another attempt +retblock: + rla + inc a ;bit back into position and set to 1 + ;d contains the number of shifts required to reposition + call rotr ;move bit back to position and store + pop hl + pop de ;HL returned value, DE discarded + ret + +retblock0: ;cannot find an available bit, return 0000 + ld a,c + or b + jp nz,lefttst ;also at beginning + ld hl,0000h + ret + +copy$fcb: ;copy the entire file control block + ld c,0 + ld e,fcblen ;start at 0, to fcblen-1 +; jp copy$dir + +copy$dir: ;copy fcb information starting at C for E bytes + ;into the currently addressed directory entry + push de ;save length for later + ld b,0 ;double index to BC + ld hl,(info) ;HL = source for data + add hl,bc + ex de,hl ;DE=.fcb(C), source for copy + call getdptra ;HL=.buff(dptr), destination + pop bc ;DE=source, HL=dest, C=length + call move ;data moved +seek$copy: ;enter from close to seek and copy current element + call seek$dir ;to the directory element + jp wrdir ;write the directory element +; ret +rename: ;rename the file described by the first half of + ;the currently addressed file control block. the + ;new name is contained in the last half of the + ;currently addressed file conrol block. the file + ;name and type are changed, but the reel number + ;is ignored. the user number is identical + call check$write ;may be write protected + ;search up to the extent field + ld c,extnum + call search + ;copy position 0 + ld hl,(info) + ld a,(hl) ;HL=.fcb(0), A=fcb(0) + ld de,dskmap + add hl,de ;HL=.fcb(dskmap) + ld (hl),a ;fcb(dskmap)=fcb(0) + ;assume the same disk drive for new named file +rename0: + call end$of$dir + ret z ;stop at end of dir + ;not end of directory, rename next element + call check$rodir ;may be read-only file + ld c,dskmap + ld e,extnum + call copy$dir + ;element renamed, move to next + call searchn + jp rename0 + +indicators: ;set file indicators for current fcb + ld c,extnum + call search ;through file type +indic0: call end$of$dir + ret z ;stop at end of dir + ;not end of directory, continue to change + ld c,0 + ld e,extnum ;copy name + call copy$dir + call searchn + jp indic0 + +open: ;search for the directory entry, copy to fcb + ld c,namlen + call search + call end$of$dir + ret z ;return with lret=255 if end + ;not end of directory, copy fcb information +open$copy: ;(referenced below to copy fcb info) + call getexta + ld a,(hl) + push af + push hl ;save extent# + call getdptra + ex de,hl ;DE = .buff(dptr) + ld hl,(info) ;HL=.fcb(0) + ld c,nxtrec ;length of move operation + push de ;save .buff(dptr) + call move ;from .buff(dptr) to .fcb(0) + ;note that entire fcb is copied, including indicators + call setfwf ;sets file write flag + pop de + ld hl,extnum + add hl,de ;HL=.buff(dptr+extnum) + ld c,(hl) ;C = directory extent number + ld hl,reccnt + add hl,de ;HL=.buff(dptr+reccnt) + ld b,(hl) ;B holds directory record count + pop hl + pop af + ld (hl),a ;restore extent number + ;HL = .user extent#, B = dir rec cnt, C = dir extent# + ;if user ext < dir ext then user := 128 records + ;if user ext = dir ext then user := dir records + ;if user ext > dir ext then user := 0 records + ld a,c + cp (hl) + ld a,b ;ready dir reccnt + jp z,open$rcnt ;if same, user gets dir reccnt + ld a,0 + jp c,open$rcnt ;user is larger + ld a,128 ;directory is larger +open$rcnt: ;A has record count to fill + ld hl,(info) + ld de,reccnt + add hl,de + ld (hl),a + ret + +mergezero: ;HL = .fcb1(i), DE = .fcb2(i), + ;if fcb1(i) = 0 then fcb1(i) := fcb2(i) + ld a,(hl) + inc hl + or (hl) + dec hl + ret nz ;return if = 0000 + ld a,(de) + ld (hl),a + inc de + inc hl ;low byte copied + ld a,(de) + ld (hl),a + dec de + dec hl ;back to input form + ret + +close: ;locate the directory element and re-write it + xor a + ld (lret),a + ld (dcnt),a + ld (dcnt+1),a + call nowrite + ret nz ;skip close if r/o disk + ;check file write flag - 0 indicates written + call getmodnum ;fcb(modnum) in A + and fwfmsk + ret nz ;return if bit remains set + ld c,namlen + call search ;locate file + call end$of$dir + ret z ;return if not found + ;merge the disk map at info with that at buff(dptr) + ld bc,dskmap + call getdptra + add hl,bc + ex de,hl ;DE is .buff(dptr+16) + ld hl,(info) + add hl,bc ;DE=.buff(dptr+16), HL=.fcb(16) + ld c,fcblen-dskmap;length of single byte dm +merge0: ld a,(single) + or a + jp z,merged ;skip to double + ;this is a single byte map + ;if fcb(i) = 0 then fcb(i) = buff(i) + ;if buff(i) = 0 then buff(i) = fcb(i) + ;if fcb(i) <> buff(i) then error + ld a,(hl) + or a + ld a,(de) + jp nz,fcbnzero + ;fcb(i) = 0 + ld (hl),a ;fcb(i) = buff(i) +fcbnzero: + or a + jp nz,buffnzero + ;buff(i) = 0 + ld a,(hl) + ld (de),a ;buff(i)=fcb(i) +buffnzero: + cp (hl) + jp nz,mergerr ;fcb(i) = buff(i)? + jp dmset ;if merge ok + +merged: ;this is a double byte merge operation + call mergezero ;buff = fcb if buff 0000 + ex de,hl + call mergezero + ex de,hl ;fcb = buff if fcb 0000 + ;they should be identical at this point + ld a,(de) + cp (hl) + jp nz,mergerr ;low same? + inc de + inc hl ;to high byte + ld a,(de) + cp (hl) + jp nz,mergerr ;high same? + ;merge operation ok for this pair + dec c ;extra count for double byte +dmset: inc de + inc hl ;to next byte position + dec c + jp nz,merge0 ;for more + ;end of disk map merge, check record count + ;DE = .buff(dptr)+32, HL = .fcb(32) + ld bc,-(fcblen-extnum) + add hl,bc + ex de,hl + add hl,bc + ;DE = .fcb(extnum), HL = .buff(dptr+extnum) + ld a,(de) ;current user extent number + ;if fcb(ext) >= buff(fcb) then + ;buff(ext) := fcb(ext), buff(rec) := fcb(rec) + cp (hl) + jp c,endmerge + ;fcb extent number >= dir extent number + ld (hl),a ;buff(ext) = fcb(ext) + ;update directory record count field + ld bc,reccnt-extnum + add hl,bc + ex de,hl + add hl,bc + ;DE=.buff(reccnt), HL=.fcb(reccnt) + ld a,(hl) + ld (de),a ;buff(reccnt)=fcb(reccnt) +endmerge: + ld a,true + ld (fcb$copied),a ;mark as copied + jp seek$copy ;ok to "wrdir" here - 1.4 compat + ; ret + +mergerr: ;elements did not merge correctly + ld hl,lret + dec (hl) ;=255 non zero flag set + ret + +make: ;create a new file by creating a directory entry + ;then opening the file + call check$write ;may be write protected + ld hl,(info) + push hl ;save fcb address, look for e5 + ld hl,efcb + ld (info),hl ;info = .empty + ld c,1 + call search ;length 1 match on empty entry + call end$of$dir ;zero flag set if no space + pop hl ;recall info address + ld (info),hl ;in case we return here + ret z ;return with error condition 255 if not found + ex de,hl ;DE = info address + ;clear the remainder of the fcb + ld hl,namlen + add hl,de ;HL=.fcb(namlen) + ld c,fcblen-namlen ;number of bytes to fill + xor a ;clear accumulator to 00 for fill +make0: ld (hl),a + inc hl + dec c + jp nz,make0 + ld hl,ubytes + add hl,de ;HL = .fcb(ubytes) + ld (hl),a ;fcb(ubytes) = 0 + call setcdr ;may have extended the directory + ;now copy entry to the directory + call copy$fcb + ;and set the file write flag to "1" + jp setfwf +; ret + +open$reel: ;close the current extent, and open the next one + ;if possible. RMF is true if in read mode + xor a + ld (fcb$copied),a ;set true if actually copied + call close ;close current extent + ;lret remains at enddir if we cannot open the next ext + call end$of$dir + ret z ;return if end + ;increment extent number + ld hl,(info) + ld bc,extnum + add hl,bc ;HL=.fcb(extnum) + ld a,(hl) + inc a + and maxext + ld (hl),a ;fcb(extnum)=++1 + jp z,open$mod ;move to next module if zero + ;may be in the same extent group + ld b,a + ld a,(extmsk) + and b + ;if result is zero, then not in the same group + ld hl,fcb$copied ;true if the fcb was copied to directory + and (hl) ;produces a 00 in accumulator if not written + jp z,open$reel0 ;go to next physical extent + ;result is non zero, so we must be in same logical ext + jp open$reel1 ;to copy fcb information +open$mod: ;extent number overflow, go to next module + ld bc,modnum-extnum + add hl,bc ;HL=.fcb(modnum) + inc (hl) ;fcb(modnum)=++1 + ;module number incremented, check for overflow + ld a,(hl) + and maxmod ;mask high order bits + jp z,open$r$err ;cannot overflow to zero + ;otherwise, ok to continue with new module +open$reel0: + ld c,namlen + call search ;next extent found? + call end$of$dir + jp nz,open$reel1 + ;end of file encountered + ld a,(rmf) + inc a ;0ffh becomes 00 if read + jp z,open$r$err ;sets lret = 1 + ;try to extend the current file + call make + ;cannot be end of directory + call end$of$dir + jp z,open$r$err ;with lret = 1 + jp open$reel2 + +open$reel1: ;not end of file, open + call open$copy +open$reel2: + call getfcb ;set parameters + xor a + jp sta$ret ;lret = 0 +; ret ;with lret = 0 + +open$r$err: ;cannot move to next extent of this file + call setlret1 ;lret = 1 + jp setfwf ;ensure that it will not be closed +; ret + +seqdiskread: ;sequential disk read operation + ld a,1 + ld (seqio),a + ;drop through to diskread + +diskread: ;(may enter from seqdiskread) + ld a,true + ld (rmf),a ;read mode flag = true (open$reel) + ;read the next record from the current fcb + call getfcb ;sets parameters for the read + ld a,(vrecord) + ld hl,rcount + cp (hl) ;vrecord-rcount + ;skip if rcount > vrecord + jp c,recordok + ;not enough records in the extent + ;record count must be 128 to continue + cp 128 ;vrecord = 128? + jp nz,diskeof ;skip if vrecord<>128 + call open$reel ;go to next extent if so + xor a + ld (vrecord),a ;vrecord=00 + ;now check for open ok + ld a,(lret) + or a + jp nz,diskeof ;stop at eof +recordok: ;arrive with fcb addressing a record to read + call index + ;error 2 if reading unwritten data + ;(returns 1 to be compatible with 1.4) + call allocated ;arecord=0000? + jp z,diskeof + ;record has been allocated, read it + call atran ;arecord now a disk address + call seek ;to proper track,sector + call rdbuff ;to dma address + jp setfcb ;replace parameter +; ret + +diskeof: + jp setlret1 ;lret = 1 +; ret + +seqdiskwrite: ;sequential disk write + ld a,1 + ld (seqio),a + ;drop through to diskwrite + +diskwrite: ;(may enter here from seqdiskwrite above) + ld a,false + ld (rmf),a ;read mode flag + ;write record to currently selected file + call check$write ;in case write protected + ld hl,(info) ;HL = .fcb(0) + call check$rofile ;may be a read-only file + call getfcb ;to set local parameters + ld a,(vrecord) + cp lstrec+1 ;vrecord-128 + ;skip if vrecord > lstrec + ;vrecord = 128, cannot open next extent + jp nc,setlret1 ;lret=1 +diskwr0: ;can write the next record, so continue + call index + call allocated + ld c,0 ;marked as normal write operation for wrbuff + jp nz,diskwr1 + ;not allocated + ;the argument to getblock is the starting + ;position for the disk search, and should be + ;the last allocated block for this file, or + ;the value 0 if no space has been allocated + call dm$position + ld (dminx),a ;save for later + ld bc,0000h ;may use block zero + or a + jp z,nopblock ;skip if no previous block + ;previous block exists at A + ld c,a + dec bc ;previous block # in BC + call getdm ;previous block # to HL + ld b,h + ld c,l ;BC=prev block# +nopblock: ;BC = 0000, or previous block # + call get$block ;block # to HL + ;arrive here with block# or zero + ld a,l + or h + jp nz,blockok + ;cannot find a block to allocate + ld a,2 + jp sta$ret ;lret=2 + +blockok: ;allocated block number is in HL + ld (arecord),hl + ex de,hl ;block number to DE + ld hl,(info) + ld bc,dskmap + add hl,bc ;HL=.fcb(dskmap) + ld a,(single) + or a ;set flags for single byte dm + ld a,(dminx) ;recall dm index + jp z,allocwd ;skip if allocating word + ;allocating a byte value + call addh + ld (hl),e ;single byte alloc + jp diskwru ;to continue + +allocwd: ;allocate a word value + ld c,a + ld b,0 ;double(dminx) + add hl,bc + add hl,bc ;HL=.fcb(dminx*2) + ld (hl),e + inc hl + ld (hl),d ;double wd +diskwru: ;disk write to previously unallocated block + ld c,2 ;marked as unallocated write +diskwr1: ;continue the write operation of no allocation error + ;C = 0 if normal write, 2 if to prev unalloc block + ld a,(lret) + or a + ret nz ;stop if non zero returned value + push bc ;save write flag + call atran ;arecord set + ld a,(seqio) + dec a + dec a + jp nz,diskwr11 + pop bc + push bc + ld a,c + dec a + dec a + jp nz,diskwr11 ;old allocation + push hl ;arecord in hl ret from atran + ld hl,(buffa) + ld d,a ;zero buffa & fill +fill0: ld (hl),a + inc hl + inc d + jp p,fill0 + call setdir + ld hl,(arecord1) + ld c,2 +fill1: ld (arecord),hl + push bc + call seek + pop bc + call wrbuff ;write fill record + ld hl,(arecord) ;restore last record + ld c,0 ;change allocate flag + ld a,(blkmsk) + ld b,a + and l + cp b + inc hl + jp nz,fill1 ;cont until cluster is zeroed + pop hl + ld (arecord),hl + call setdata +diskwr11: + call seek ;to proper file position + pop bc + push bc ;restore/save write flag (C=2 if new block) + call wrbuff ;written to disk + pop bc ;C = 2 if a new block was allocated, 0 if not + ;increment record count if rcount<=vrecord + ld a,(vrecord) + ld hl,rcount + cp (hl) ;vrecord-rcount + jp c,diskwr2 + ;rcount <= vrecord + ld (hl),a + inc (hl) ;rcount = vrecord+1 + ld c,2 ;mark as record count incremented +diskwr2: ;A has vrecord, C=2 if new block or new record# + dec c + dec c + jp nz,noupdate + push af ;save vrecord value + call getmodnum ;HL=.fcb(modnum), A=fcb(modnum) + ;reset the file write flag to mark as written fcb + and (not fwfmsk) and 0ffh;bit reset + ld (hl),a ;fcb(modnum) = fcb(modnum) and 7fh + pop af ;restore vrecord +noupdate: ;check for end of extent, if found attempt to open + ;next extent in preparation for next write + cp lstrec ;vrecord=lstrec? + jp nz,diskwr3 ;skip if not + ;may be random access write, if so we are done + ;change next + ld a,(seqio) + cp 1 + jp nz,diskwr3 ;skip next extent open op + ;update current fcb before going to next extent + call setfcb + call open$reel ;rmf=false + ;vrecord remains at lstrec causing eof if + ;no more directory space is available + ld hl,lret + ld a,(hl) + or a + jp nz,nospace + ;space available, set vrecord=255 + dec a + ld (vrecord),a ;goes to 00 next time +nospace: + ld (hl),0 ;lret = 00 for returned value +diskwr3: + jp setfcb ;replace parameters +; ret + +rseek: ;random access seek operation, C=0ffh if read mode + ;fcb is assumed to address an active file control block + ;(modnum has been set to 1100$0000b if previous bad seek) + xor a + ld (seqio),a ;marked as random access operation +rseek1: push bc ;save r/w flag + ld hl,(info) + ex de,hl ;DE will hold base of fcb + ld hl,ranrec + add hl,de ;HL=.fcb(ranrec) + ld a,(hl) + and 7fh + push af ;record number + ld a,(hl) + rla ;cy=lsb of extent# + inc hl + ld a,(hl) + rla + and 11111b ;A=ext# + ld c,a ;C holds extent number, record stacked + ld a,(hl) + rra + rra + rra + rra + and 1111b ;mod# + ld b,a ;B holds module#, C holds ext# + pop af ;recall sought record # + ;check to insure that high byte of ran rec = 00 + inc hl + ld l,(hl) ;l=high byte (must be 00) + inc l + dec l + ld l,6 ;zero flag, l=6 + ;produce error 6, seek past physical eod + jp nz,seekerr + ;otherwise, high byte = 0, A = sought record + ld hl,nxtrec + add hl,de ;HL = .fcb(nxtrec) + ld (hl),a ;sought rec# stored away + ;arrive here with B=mod#, C=ext#, DE=.fcb, rec stored + ;the r/w flag is still stacked. compare fcb values + ld hl,extnum + add hl,de + ld a,c ;A=seek ext# + sub (hl) + jp nz,ranclose ;tests for = extents + ;extents match, check mod# + ld hl,modnum + add hl,de + ld a,b ;B=seek mod# + ;could be overflow at eof, producing module# + ;of 90H or 10H, so compare all but fwf + sub (hl) + and 7fh + jp z,seekok ;same? +ranclose: + push bc + push de ;save seek mod#,ext#, .fcb + call close ;current extent closed + pop de + pop bc ;recall parameters and fill + ld l,3 ;cannot close error #3 + ld a,(lret) + inc a + jp z,badseek + ld hl,extnum + add hl,de + ld (hl),c ;fcb(extnum)=ext# + ld hl,modnum + add hl,de + ld (hl),b ;fcb(modnum)=mod# + call open ;is the file present? + ld a,(lret) + inc a + jp nz,seekok ;open successful? + ;cannot open the file, read mode? + pop bc ;r/w flag to c (=0ffh if read) + push bc ;everyone expects this item stacked + ld l,4 ;seek to unwritten extent #4 + inc c ;becomes 00 if read operation + jp z,badseek ;skip to error if read operation + ;write operation, make new extent + call make + ld l,5 ;cannot create new extent #5 + ld a,(lret) + inc a + jp z,badseek ;no dir space + ;file make operation successful +seekok: + pop bc ;discard r/w flag + xor a + jp sta$ret ;with zero set +badseek: ;fcb no longer contains a valid fcb, mark + ;with 1100$000b in modnum field so that it + ;appears as overflow with file write flag set + push hl ;save error flag + call getmodnum ;HL = .modnum + ld (hl),11000000b + pop hl ;and drop through +seekerr: + pop bc ;discard r/w flag + ld a,l + ld (lret),a ;lret=#, nonzero + ;setfwf returns non-zero accumulator for err + jp setfwf ;flag set, so subsequent close ok +; ret + +randiskread: ;random disk read operation + ld c,true ;marked as read operation + call rseek + call z,diskread ;if seek successful + ret + +randiskwrite: ;random disk write operation + ld c,false ;marked as write operation + call rseek + call z,diskwrite ;if seek successful + ret + +compute$rr: ;compute random record position for getfilesize/setrandom + ex de,hl + add hl,de + ;DE=.buf(dptr) or .fcb(0), HL = .f(nxtrec/reccnt) + ld c,(hl) + ld b,0 ;BC = 0000 0000 ?rrr rrrr + ld hl,extnum + add hl,de + ld a,(hl) + rrca + and 80h ;A=e000 0000 + add a,c + ld c,a + ld a,0 + adc a,b + ld b,a + ;BC = 0000 000? errrr rrrr + ld a,(hl) + rrca + and 0fh + add a,b + ld b,a + ;BC = 000? eeee errrr rrrr + ld hl,modnum + add hl,de + ld a,(hl) ;A=XXX? mmmm + add a,a + add a,a + add a,a + add a,a ;cy=? A=mmmm 0000 + push af + add a,b + ld b,a + ;cy=?, BC = mmmm eeee errr rrrr + push af ;possible second carry + pop hl ;cy = lsb of L + ld a,l ;cy = lsb of A + pop hl ;cy = lsb of L + or l ;cy/cy = lsb of A + and 1 ;A = 0000 000? possible carry-out + ret + +getfilesize: ;compute logical file size for current fcb + ld c,extnum + call search + ;zero the receiving ranrec field + ld hl,(info) + ld de,ranrec + add hl,de + push hl ;save position + ld (hl),d + inc hl + ld (hl),d + inc hl + ld (hl),d ;=00 00 00 +getsize: + call end$of$dir + jp z,setsize + ;current fcb addressed by dptr + call getdptra + ld de,reccnt ;ready for compute size + call compute$rr + ;A=0000 000? BC = mmmm eeee errr rrrr + ;compare with memory, larger? + pop hl + push hl ;recall, replace .fcb(ranrec) + ld e,a ;save cy + ld a,c + sub (hl) + inc hl ;ls byte + ld a,b + sbc a,(hl) + inc hl ;middle byte + ld a,e + sbc a,(hl) ;carry if .fcb(ranrec) > directory + jp c,getnextsize ;for another try + ;fcb is less or equal, fill from directory + ld (hl),e + dec hl + ld (hl),b + dec hl + ld (hl),c +getnextsize: + call searchn + jp getsize + +setsize: + pop hl ;discard .fcb(ranrec) + ret + +setrandom: ;set random record from the current file control block + ld hl,(info) + ld de,nxtrec ;ready params for computesize + call compute$rr ;DE=info, A=cy, BC=mmmm eeee errr rrrr + ld hl,ranrec + add hl,de ;HL = .fcb(ranrec) + ld (hl),c + inc hl + ld (hl),b + inc hl + ld (hl),a ;to ranrec + ret + +select: ;select disk info for subsequent input or output ops + ld hl,(dlog) + ld a,(curdsk) + ld c,a + call hlrotr + push hl + ex de,hl ;save it for test below, send to seldsk + call selectdisk + pop hl ;recall dlog vector + call z,sel$error ;returns true if select ok + ;is the disk logged in? + ld a,l + rra + ret c ;return if bit is set + ;disk not logged in, set bit and initialize + ld hl,(dlog) + ld c,l + ld b,h ;call ready + call set$cdisk + ld (dlog),hl ;dlog=set$cdisk(dlog) + jp initialize +; ret + +curselect: + ld a,(linfo) + ld hl,curdsk + cp (hl) + ret z ;skip if linfo=curdsk + ld (hl),a ;curdsk=info + jp select +; ret + +reselect: ;check current fcb to see if reselection necessary + ld a,true + ld (resel),a ;mark possible reselect + ld hl,(info) + ld a,(hl) ;drive select code + and 11111b ;non zero is auto drive select + dec a ;drive code normalized to 0..30, or 255 + ld (linfo),a ;save drive code + cp 30 + jp nc,noselect + ;auto select function, save curdsk + ld a,(curdsk) + ld (olddsk),a ;olddsk=curdsk + ld a,(hl) + ld (fcbdsk),a ;save drive code + and 11100000b + ld (hl),a ;preserve hi bits + call curselect +noselect: ;set user code + ld a,(usrcode) ;0...31 + ld hl,(info) + or (hl) + ld (hl),a + ret + +; individual function handlers +func12: ;return version number + ld a,dvers + jp sta$ret ;lret = dvers (high = 00) +; ret +; jp goback + +func13: ;reset disk system - initialize to disk 0 + ld hl,0 + ld (rodsk),hl + ld (dlog),hl + xor a + ld (curdsk),a ;note that usrcode remains unchanged + ld hl,tbuff + ld (dmaad),hl ;dmaad = tbuff + call setdata ;to data dma address + jp select +; ret +; jp goback + +func14 equ curselect ;select disk info +; ret +; jp goback + +func15: ;open file + call clrmodnum ;clear the module number + call reselect + jp open +; ret +; jp goback + +func16: ;close file + call reselect + jp close +; ret +; jp goback + +func17: ;search for first occurrence of a file + ld c,0 ;length assuming '?' true + ex de,hl ;was lhld info + ld a,(hl) + cp '?' ;no reselect if ? + jp z,qselect ;skip reselect if so + ;normal search + call getexta + ld a,(hl) + cp '?' ; + call nz,clrmodnum ;module number zeroed + call reselect + ld c,namlen +qselect: + call search + jp dir$to$user ;copy directory entry to user +; ret +; jp goback + +func18: ;search for next occurrence of a file name + ld hl,(searcha) + ld (info),hl + call reselect + call searchn + jp dir$to$user ;copy directory entry to user +; ret +; jp goback + +func19: ;delete a file + call reselect + call delete + jp copy$dirloc +; ret +; jp goback + +func20: ;read a file + call reselect + jp seqdiskread +; jp goback + +func21: ;write a file + call reselect + jp seqdiskwrite +; jp goback + +func22: ;make a file + call clrmodnum + call reselect + jp make +; ret +; jp goback + +func23: ;rename a file + call reselect + call rename + jp copy$dirloc +; ret +; jp goback + +func24: ;return the login vector + ld hl,(dlog) + jp sthl$ret +; ret +; jp goback + +func25: ;return selected disk number + ld a,(curdsk) + jp sta$ret +; ret +; jp goback + +func26: ;set the subsequent dma address to info + ex de,hl ;was lhld info + ld (dmaad),hl ;dmaad = info + jp setdata ;to data dma address +; ret +; jp goback + +func27: ;return the login vector address + ld hl,(alloca) + jp sthl$ret +; ret +; jp goback + +func28 equ set$ro + ;write protect current disk +; ret +; jp goback + +func29: ;return r/o bit vector + ld hl,(rodsk) + jp sthl$ret +; ret +; jp goback + +func30: ;set file indicators + call reselect + call indicators + jp copy$dirloc ;lret=dirloc +; ret +; jp goback + +func31: ;return address of disk parameter block + ld hl,(dpbaddr) +sthl$ret: + ld (aret),hl + ret +; jp goback + +func32: ;set user code + ld a,(linfo) + cp 0ffh + jp nz,setusrcode + ;interrogate user code instead + ld a,(usrcode) + jp sta$ret ;lret=usrcode +; ret +; jp goback + +setusrcode: + and 1fh + ld (usrcode),a + ret +; jp goback + +func33: ;random disk read operation + call reselect + jp randiskread ;to perform the disk read +; ret +; jp goback + +func34: ;random disk write operation + call reselect + jp randiskwrite ;to perform the disk write +; ret +; jp goback + +func35: ;return file size (0-65536) + call reselect + jp getfilesize +; ret +; jp goback + +func36 equ setrandom ;set random record +; ret +; jp goback + +func37: ld hl,(info) + ld a,l + cpl + ld e,a + ld a,h + cpl + ld hl,(dlog) + and h + ld d,a + ld a,l + and e + ld e,a + ld hl,(rodsk) + ex de,hl + ld (dlog),hl + ld a,l + and e + ld l,a + ld a,h + and d + ld h,a + ld (rodsk),hl + ret + +goback: ;arrive here at end of processing to return to user + ld a,(resel) + or a + jp z,retmon + ;reselection may have taken place + ld hl,(info) + ld (hl),0 ;fcb(0)=0 + ld a,(fcbdsk) + or a + jp z,retmon + ;restore disk number + ld (hl),a ;fcb(0)=fcbdsk + ld a,(olddsk) + ld (linfo),a + call curselect + +; return from the disk monitor +retmon: ld hl,(entsp) + ld sp,hl ;user stack restored + ld hl,(aret) + ld a,l + ld b,h ;BA = HL = aret + ret + +func38 equ func$ret +func39 equ func$ret +func40: ;random disk write with zero fill of unallocated block + call reselect + ld a,2 + ld (seqio),a + ld c,false + call rseek1 + call z,diskwrite ;if seek successful + ret + +; data areas + +; initialized data +efcb: db empty ;0e5=available dir entry +rodsk: dw 0 ;read only disk vector +dlog: dw 0 ;logged-in disks +dmaad: dw tbuff ;initial dma address + +; curtrka - alloca are set upon disk select +; (data must be adjacent, do not insert variables) +; (address of translate vector, not used) +cdrmaxa: + ds word ;pointer to cur dir max value +curtrka: + ds word ;current track address +curreca: + ds word ;current record address +buffa: ds word ;pointer to directory dma address +dpbaddr: + ds word ;current disk parameter block address +checka: ds word ;current checksum vector address +alloca: ds word ;current allocation vector address +addlist equ $-buffa ;address list size + +; sectpt - offset obtained from disk parm block at dpbaddr +; (data must be adjacent, do not insert variables) +sectpt: ds word ;sectors per track +blkshf: ds byte ;block shift factor +blkmsk: ds byte ;block mask +extmsk: ds byte ;extent mask +maxall: ds word ;maximum allocation number +dirmax: ds word ;largest directory number +dirblk: ds word ;reserved allocation bits for directory +chksiz: ds word ;size of checksum vector +offset: ds word ;offset tracks at beginning +dpblist equ $-sectpt ;size of area + +; local variables +tranv: ds word ;address of translate vector +fcb$copied: + ds byte ;set true if copy$fcb called +rmf: ds byte ;read mode flag for open$reel +dirloc: ds byte ;directory flag in rename, etc. +seqio: ds byte ;1 if sequential i/o +linfo: ds byte ;low(info) +dminx: ds byte ;local for diskwrite +searchl: + ds byte ;search length +searcha: + ds word ;search address +tinfo: ds word ;temp for info in "make" +single: ds byte ;set true if single byte allocation map +resel: ds byte ;reselection flag +olddsk: ds byte ;disk on entry to bdos +fcbdsk: ds byte ;disk named in fcb +rcount: ds byte ;record count in current fcb +extval: ds byte ;extent number and extmsk +vrecord: + ds word ;current virtual record +arecord: + ds word ;current actual record +arecord1: + ds word ;current actual block# * blkmsk + +; local variables for directory access +dptr: ds byte ;directory pointer 0,1,2,3 +dcnt: ds word ;directory counter 0,1,...,dirmax +drec: ds word ;directory record 0,1,...,dirmax/4 + +;bios equ ($ and 0ff00h)+100h;next module + + end + \ No newline at end of file diff --git a/ISIS PLM/BOOT.COM b/ISIS PLM/BOOT.COM new file mode 100644 index 0000000000000000000000000000000000000000..d8df1e11f7ca621b8f7380a01db39548f457672f GIT binary patch literal 128 NcmX@i@SkBI0RZ2E0mA?Q literal 0 HcmV?d00001 diff --git a/ISIS PLM/BOOT.MAC b/ISIS PLM/BOOT.MAC new file mode 100644 index 0000000..c8c6221 --- /dev/null +++ b/ISIS PLM/BOOT.MAC @@ -0,0 +1,13 @@ + .Z80 + aseg + +boot equ 0ff00h + + org 100h + + jp boot + +ds 17fh-$ + + end + \ No newline at end of file diff --git a/ISIS PLM/BOOTGEN.COM b/ISIS PLM/BOOTGEN.COM new file mode 100644 index 0000000000000000000000000000000000000000..26892e6db994c0cb50ed9f1ab3ded01c5a724c2d GIT binary patch literal 1536 zcmbtUT}&KR7`=CP??e{2&4kA6)}-DG`v6P9WrXD?Ky_R7p{7hj>>CC??!_CI@(%5+RAf~kOp zg2zNS8i_{EYSXiNPMs)HIh9J&tFyEpxH=ukPH1}mG@a&EbHT5kAI-kitm!IWcd{b$ zzy9n$2&+P_lMg%N#I^IpJT7uf_$MYsP(ZU+N$GQerI7PR*ttUDu011|cZH+=XQ1@{ zU+P67rBFcg)uk6uauusS!ltlmj|yxMahc>AR{2^+{gMp?=z0Z>`lVdL$t|qfpO8{h zh&_#5h5>(}q#6TMG2)z4(@D75S&){OWLTte|bLiq`P#%o`G_YF2 zY0S4t5!r=+uz*ziSMu|6NLoPgyef4e`v+boq0!h_0VxMd_d_h?FEXcy->!7O+mFx7 ztJq*q2A1-C&+Ia>KO*z;7B+ZdNk%|g0+JaxIS$!hhwMP!NA?|3>JGE~fx0}0>_?<_ zM5rAW_CA)^Fk8pzDu7&jMM#!{bNMz5@pz+}xo)k4YaighF&=P6as#XLFv&>z zE=Pv^dG|!H6{VE&9{xVx9iOYN3t zZ$ah3vBK}%;_o}e?^s^!k&*d{0&(ukC8OP9ABfh-P)vAgzwEg8oU+sD>}`87>6GBb zs!xTznCP8TJNG73Fx0u{{b-qJA14wC%AbMDnSZ?!Alb0UlO3y)z7ip&)F>XSF$rQf zMB{qT&NZ<$R@Gax^4RFvxhyUxMbx is lower byte of address for jp instruction + inc hl ; point to upper byte + ld d,(hl) ; points to address for jp instruction + inc hl ; points to lower byte of source jp address + ld a,jpopcod ; jp op code + ld (de),a ; store jp op-code to appropriate location + inc de ; points to lower byte of destination jp address + ld a,(hl) ; get lower byte of address + ld (de),a ; store it + inc hl ; point to upper byte source jp address + inc de ; point to upper byte destination jp address + ld a,(hl) ; get upper byte of address + ld (de),a ; store it + inc hl ; point to next table pair + dec b ; entry done + jp nz,patch1 ; if more to do + +; patch bdos to perform a ROM reboot in case of Bad Sector error +; is detected and user has typed ^C. This is to make sure that one +; can recover from errors due to non-existing drives. + ld hl,rom + ld (bdos+009ch),hl ; at bdos+9bh we now have jp z,rom instead of jp z,0 + +; patch ccp to look on ipl drive if file not found + ld a,jpzopcd ; replace jp opcode with jp z opcode + ld (ccp+06dbh),a ; plug into ccp at intercept point + + ld hl,lctabs + ld c,low ((lctabe-lctabs) / 3) ; number of table entries +;precondition: points to table with structure (byte length, word address)* +;at 'address' starts a character string of length 'length' which is to be translated to +;lower case +tolc: ld b,(hl) ; points to length byte + inc hl ; points to lower byte of address + ld e,(hl) ; E := lower byte of address + inc hl ; points to upper byte of address + ld d,(hl) ; D := upper byte of address + inc hl ; points to next length byte + ex de,hl +tolc1: ld a,(hl) ; get character to be transformed + cp 'A' + jp c,tolc2 ; next character if less than 'A' + cp 'Z'+1 + jp nc,tolc2 ; next character if greater than 'Z' + add a,'a'-'A' ; to lower case + ld (hl),a ; store back +tolc2: inc hl ; point to next character + dec b ; count down length + jp nz,tolc1 ; repeat if necessary + ex de,hl ; points to next length byte + dec c ; update number of table entries processed + jp nz,tolc ; if not equal to zero, continue +;end patch CCP and BDOS + endif + + + if initCmd + ld de,ccp+7 ; destination in CCP + ld hl,cmdBeg ; command length, command, 0 +movCmd: ld a,(hl) ; get byte + ld (de),a ; store at destination + or a ; check byte + jp z,doneMv ; zero byte is the last, done + inc hl ; next source + inc de ; next destination + jp movCmd ; repeat +doneMv: ld (cmdBeg),a ; execute only once + endif + + ld a,creset ; reset command + out (constat),a ; reset console device + out (punstat),a ; and list/punch device + ld bc,0080h + call setdma + ld a,(cdisk) ; get current disk + cp ndisks+nhdisks ; does it exist? + jp c,ent1 ; yes, proceed + ld a,(bootdr1) ; get boot drive + ld (cdisk),a ; and make it current disk +ent1: ld c,a ; inform CCP + ei + jp ccp + + if initCmd +cmdBeg: db cmdEnd-cmdBeg-2,'DO INITMAKE',0 +cmdEnd equ $ + endif + + + if patchOS +; DD40 3A E3EF ld a,(cdisk) +; DD43 B7 or a +; DD44 3E 00 ld a,0 +; DD46 C4 DCBD call nz,select +; DD49 11 E3AC ld de,subfcb +;DD43: jp ccpp1 +ccpp1: ld e,a ; := current disk + ld a,(bootdr1) ; := boot drive + cp e ; compare boot drive with current disk + jp ccp+0146h ; a select of boot drive occurs iff current disk <> boot drive + +; DD7D 3A E3EF ld a,(cdisk) +; DD80 B7 or a +; DD81 C4 DCBD call nz,select +; DD84 21 DC08 ld hl,combuf +;DD7D: jp ccpp2 +ccpp2: ld a,(bootdr1) ; := boot drive + ld e,a ; := boot drive + ld a,(ccp+07efh) ; := current disk + cp e ; compare boot drive with current disk + jp ccp+0181h ; a select of current disk occurs iff current disk <> boot drive + +; DDE3 36 00 ld (hl),0 ;submit flag is set to false +; DDE5 AF xor a +; DDE6 CD DCBD call select ;on drive a to erase file +; DDE9 11 E3AC ld de,subfcb +;DDE3: jp ccpp3 +ccpp3: ld (hl),0 ; patched over + ld a,(bootdr1) ; := boot drive + jp ccp+01e6h ; go select boot drive + +; patch bdos to change the drive selected by +; BDOS Function 13 (Reset Disk System). +f13pat: ld a,(bootdr1) ; get boot drive + ld (bdos+033ch),a ; store into curdsk (BDOS) + jp bdos+0c8ah + +; patch ccp to look on ipl drive if file not found +ccpat: ld hl,ccp+07f0h ; look at drive spec in command + or (hl) ; zero means default was taken + jp nz,ccp+076bh ; if nonzero don't change it + ld a,(bootdr1) ; take boot drive and increment it since + inc a ; for a FCB A=1, B=2, ... + ld (hl),a ; modify command line + ld de,ccp+07d6h ; setup for retry + jp ccp+06cdh ; go retry command + +; patch ccp to show current user number in prompt +propat: call ccp+0113h ; get current user no + or a + jp z,prono ; do not show it if it's 0 + cp 10 ; see if 1 or 2 digits + jp nc,pro2 + add a,'0' +pro1: call ccp+008ch ; output a character +prono: ld a,'>' ; prompt character + call ccp+008ch ; output it + jp ccp+0395h ; resume ! +pro2: add a,'0' - 10 + push af + ld a,'1' + call ccp+008ch + pop af + jp pro1 + +; patch bdos to look at user 0 if file not found in current user # +pubpat: ld a,b ; get char count + or a ; looking at first byte? + jp nz,pubno ; no, skipit + ld a,(de) ; get user # from directory + cp 0e5h ; active dir entry? + jp z,pubno ; no + ld a,(hl) ; get user# from dir entry + or a ; is it user # 0? + jp z,bdos+0776h ; yes, force char match regardless +pubno: ld a,b + cp 13 + jp bdos+075bh + endif + +; print the message pointed to by and terminated by '$' to the console +; leaves unchanged +msg: ld a,(de) ; get character + cp '$' ; is is the terminating character? + ret z ; yes, we are done + ld c,a ; 'conout' expects the character in + call conout ; disply it on console + inc de ; point to next character + jp msg ; and repeat + +; The WBOOT entry point gets control when a warm start occurs. A warm +; start is performed whenever a user program branches to location 0000H, or +; when the CPU is reset from the front panel. The CP/M system must be +; loaded from the first two tracks of drive A up to, but not including, the +; BIOS, or CBIOS, if the user has completed the patch. System parameters +; must be initialized as follows: +; location 0,1,2 Set to JMP WBOOT for warm starts +; (000H: JMP 4A03H + b) +; location 3 Set initial value of IOBYTE, if implemented in the +; CBIOS +; location 4 High nibble = current user no; low nibble current +; drive +; location 5,6,7 Set to JMP BDOS, which is the primary entry point +; to CP/M for transient programs. (0005H: JMP 3C06H + b) +; Upon completion of the initialization, the WBOOT program must branch to the +; CCP at 3400H + b to restart the system. Upon entry to the CCP, register C +; is set to the drive to select after system initialization. The WBOOT +; routine should read location 4 in memory, verify that is a legal drive, and +; pass it to the CCP in register C. +wboot: ld sp,chk02 + ld a,(bootdr1) ; make sure that ccp and bdos are loaded from correct disk + + if nhdisks gt 0 + cp ndisks + jp c,altdsk + ld b,32 ; reset hard disk controller + ld a,hdskReset ; by issuing the reset command 32 times +rhdsk: out (hdskPort),a + dec b + jp nz,rhdsk ; post condition is := 0 + ld de,firstDiskAddr ; := 0 (Track), := 8 (Sector) + ld hl,ccp ; DMA address + ld c,sectors ; is loop counter +again: ld a,hdskRead + out (hdskport),a ; send read command to hard disk port + ld a,(bootdr1) ; in real life take disk number from boot ROM + sub ndisks ; correct for Altair disks + out (hdskport),a ; send drive to boot from to hard disk port + ld a,e + out (hdskport),a ; send sector + ld a,d + out (hdskport),a ; send lower byte of track + xor a + out (hdskport),a ; send higher byte of track which is always 0 + ld a,l + out (hdskport),a ; send lower byte of DMA address + ld a,h + out (hdskport),a ; send upper byte of DMA address + in a,(hdskport) ; perform operation and get result + or a + jp z,cont ; continue if no error + halt ; halt otherwise +cont: ld a,c ; save in + ld c,csecsiz ; is now 128 since always zero + add hl,bc ; get next DMA address + ld c,a ; restore from + dec c ; decrement loop counter + jp z,entcpm + inc e ; Sector := Sector + 2 + inc e + ld a,e + cp spt ; is new Sector equal to 32 + jp z,switch ; yes, need to go to odd sectors + cp spt+1 ; is new Sector equal to 33 + jp nz,again ; no, proceed with read + ld e,0 ; Sector := 0 + inc d ; Track := Track + 1 + jp again ; proceed with read +switch: ld e,1 ; Sector := 1 + jp again ; proceed with read +altdsk equ $ + endif + + out (selout),a ; select it + ld a,cload ; load head command + out (dskcon),a ; load head to drive surface + call dhome ; position disk head on track zero + ld de,ccp ; destination load address + ld b,17 ; first sector to read on track zero +nextsc: push bc ; save current sector to read, is undefined + push de ; save current destination load address + call seclp2 ; position to sector in + call blread ; read the sector + pop de ; restore current destination load address, is destination + ld hl,altbuf+3 ; ignore first three byte of buffer, is source + call ldir ; has been set by 'blread' + pop bc ; is current sector, is undefined + ld hl,bios ; when reaches this address we are done + ld a,d + cp h + jp nz,decide + ld a,e + cp l +decide: jp nc,gotoit ; jump if everything loaded + inc b ; compute next sector number + inc b + ld a,b + cp spt ; compare new sector number with sectors per track + jp c,nextsc ; continue if less + ld b,1 ; otherwise prepare for odd numbered sectors + jp z,nextsc ; if old sector number was equal to sectors per track + call whmove ; loop until head movement is allowed + ld a,cstepin ; step in one track command + out (dskcon),a ; step in one track + ld b,0 ; start with even sectors + jp nextsc +gotoit: ld a,(bootdr2) ; clear disk controller of correct disk + out (selout),a ; do it + ld hl,ontrk0 ; start address of table for current track positions + ld b,ndisks ; number of disks +resett: ld (hl),track1 ; reset entry for disk + inc hl ; point to next entry + dec b ; decrement counter for disks to go + jp nz,resett ; jump if not yet done + jp entcpm + +; You should sample the status of the currently assigned console device and +; return 0FFH in register A if a character is ready to read and 00H in register +; A if no console characters are ready. +; +; console in/out routines - use sio port 1 +; +const: in a,(constat) ; get console status + rra ; I bit into carry + ld a,0 ; prepare no character available + ret nc ; I bit clear means no character, done + dec a ; character available, result is 0ffh + ret ; done + +; The next console character is read into register A, and the parity bit is set, +; high-order bit, to zero. If no console character is ready, wait until a +; character is typed before returning. + if sleepol + +conin: in a,(constat) ; get console status + rra ; I bit into carry + jp c,getchr ; get character + ld a,27 ; otherwise sleep for SIMHSleep microseconds + out (0feh),a ; execute command + jp conin ; try again +getchr: in a,(condata) ; read character + and 7fh ; clear bit 8 + ret + + else + +conin: in a,(constat) ; get console status + rra ; I bit into carry + jp nc,conin ; jump back if no character available + in a,(condata) ; read character + and 7fh ; clear bit 8 + ret + + endif + +; The character is sent from register C to the console output device. The +; character is in ASCII, with high-order parity bit set to zero. You might +; want to include a time-out on a line-feed or carriage return, if the console +; device requires some time interval at the end of the line (such as a TI Silent +; 700 terminal). You can filter out control characters that cause the console +; device to react in a strange way (CTRL-Z causes the Lear-Siegler terminal +; to clear the screen, for example). +conout: in a,(constat) ; get console status + and mout ; mask output bit + jp z,conout ; jump back if not ready for output + ld a,c ; prepare character for output + out (condata),a ; do it + ret + +; +; reader/punch routines use sio port 2 +; +; The character is sent from register C to the currently assigned listing +; device. The character is in ASCII with zero parity bit. +list: ; list aliased to punch +; The character is sent from register C to the currently assigned punch +; device. The character is in ASCII with zero parity. +punch: in a,(punstat) ; get punch status + and mout ; mask output bit + jp z,punch ; jump back if not ready for output + ld a,c ; prepare character for output + out (pundata),a ; do it + ret + +; The next character is read from the currently assigned reader device into +; register A with zero parity (high-order bit must be zero); an end-of-file +; condition is reported by returning an ASCII CTRL-Z(1AH). +reader: in a,(punstat) ; get reader status + rra ; I bit into carry + jp nc,reader ; jump back if no character available + in a,(pundata) ; read character + ret + +; The disk drive given by register C is selected for further operations, where +; register C contains 0 for drive A, 1 for drive B, and so on up to 15 for +; drive P (the standard CP/M distribution version supports four drives). On +; each disk select, SELDSK must return in HL the base address of a 16-byte +; area, called the Disk Parameter Header, described in Section 6.10. For +; standard floppy disk drives, the contents of the header and associated +; tables do not change; thus, the program segment included in the sample +; CBIOS performs this operation automatically. +; If there is an attempt to select a nonexistent drive, SELDSK returns HL = +; 0000H as an error indicator. Although SELDSK must return the header +; address on each call, it is advisable to postpone the physical disk select +; operation until an I/O function (seek, read, or write) is actually performed, +; because disk selects often occur without ultimately performing any disk +; I/O, , and many controllers unload the head of the current disk before +; selecting the new drive. This causes an excessive amount of noise and disk +; wear. The least significant bit of register E is zero if this is the first +; occurrence of the drive select since the last cold or warm start. +seldsk: ld hl,0 ; select disk number + ld a,c + ld (diskno),a + cp ndisks+nhdisks ; number of disk drives + ret nc ; error - disk number too high + ld l,a ; := disk number + ld h,0 + add hl,hl ; disk number * 2 + add hl,hl ; disk number * 4 + add hl,hl ; disk number * 8 + add hl,hl ; disk number * 16 + ld de,dpbase ; dpbase entries have size of 16 bytes + add hl,de ; = 16 * disknumber + dpbase + ret + +; The disk head of the currently selected disk (initially disk A) is moved to +; the track 00 position. If the controller allows access to the track 0 flag +; from the drive, the head is stepped until the track 0 flag is detected. If the +; controller does not support this feature, the HOME call is translated into a +; call to SETTRK with a parameter of 0. +home: ld bc,0 ; move to track 00 + ; fall into settrk + +; Register BC contains the track number for subsequent disk accesses on the +; currently selected drive. The sector number in BC is the same as the +; number returned from the SECTRAN entry point. You can choose to seek +; the selected track at this time or delay the seek until the next read or write +; actually occurs. Register BC can take on values in the range 0-76 +; corresponding to valid track numbers for standard floppy disk drives and +; 0-65535 for nonstandard disk subsystems. +settrk: ld l,c ; save track + ld h,b + ld (track),hl + ret + +; Register BC contains the sector number, 1 through 26, for subsequent disk +; accesses on the currently selected drive. The sector number in BC is the +; same as the number returned from the SECTRAN entry point. You can +; choose to send this information to the controller at this point or delay +; sector selection until a read or write operation occurs. +setsec: ld a,c ; set sector + ld (sector),a + ret + +; Logical-to-physical sector translation is performed to improve the overall +; response of CP/M. Standard CP/M systems are shipped with a skew factor +; of 6, where six physical sectors are skipped between each logical read +; operation. This skew factor allows enough time between sectors for most +; programs to load their buffers without missing the next sector. In particular +; computer systems that use fast processors, memory, and disk subsystems, +; the skew factor might be changed to improve overall response. However, +; the user should maintain a single-density IBM-compatible version of CP/M +; for information transfer into and out of the computer system, using a skew +; factor of 6. +; In general, SECTRAN receives a logical sector number relative to zero in +; BC and a translate table address in DE. The sector number is used as an +; index into the translate table, with the resulting physical sector number in +; HL. For standard systems, the table and indexing code is provided in the +; CBIOS and need not be changed. +sectrn: + if nhdisks gt 0 + ld l,c ; := BC, prepration for = 0 + ld h,b ; load upper byte + inc hl ; rebase to one + ld a,e ; get lower byte of translate table address + or d ; or with upper byte + ret z ; if equal to zero, no translation necessary + endif + ex de,hl ; := translate table address + add hl,bc ; add sector number + ld l,(hl) ; get pointed to byte + ld h,0 ; set upper byte to zero + ret ; done + +; Register BC contains the DMA (Disk Memory Access) address for +; subsequent read or write operations. For example, if B = 00H and C = 80H +; when SETDMA is called, all subsequent read operations read their data +; into 80H through 0FFH and all subsequent write operations get their data +; from 80H through 0FFH, until the next call to SETDMA occurs. The initial +; DMA address is assumed to be 80H. The controller need not actually +; support Direct Memory Access. If, for example, all data transfers are +; through I/O ports, the CBIOS that is constructed uses the 128byte area +; starting at the selected DMA address for the memory buffer during the +; subsequent read or write operations. +setdma: ld l,c ; set dma address + ld h,b + ld (dmaad),hl + ret + +; +; altair disk read/write drivers +; +; Assuming the drive has been selected, the track has been set, and +; the DMA address has been specified, the READ subroutine attempts to +; read eone sector based upon these parameters and returns the following +; error codes in register A: +; +; 0 no errors occurred +; +; 1 nonrecoverable error condition occurred +; +; Currently, CP/M responds only to a zero or nonzero value as the return +; code. That is, if the value in register A is 0, CP/M assumes that the disk +; operation was completed properly. IF an error occurs the CBIOS should +; attempt at least 10 retries to see if the error is recoverable. When an error +; is reported the BDOS prints the message BDOS ERR ON x: BAD +; SECTOR. The operator then has the option of pressing a carriage return to +; ignore the error, or CTRL-C to abort. + if nhdisks gt 0 +read: ld a,(diskno) ; get disk number + cp ndisks ; compare with number of Altair disks + jp c,aread ; carry means we got an Altair disk + ld a,hdskRead ; otherwise perform hard disk read + jp shdpar ; send hard disk parameters +aread equ $ + else +read equ $ + endif + call poshed ; select disk 'diskno' and position disk head to 'track' + call secget ; position head to desired sector + di + call blread + ld a,cuload ; unload head command + out (dskcon),a ; do it + ei + ld de,altbuf+3 ; address of sector just read + ld hl,(dmaad) ; destination address + ex de,hl ; prepare for ldir + call ldir ; move + +; You return the ready status of the list device used by the DESPOOL +; program to improve console response during its operation. The value 00 is +; returned in A if the list device is not ready to accept a character and 0FFH +; if a character can be sent to the printer. A 00 value should be returned if +; LIST status is not implemented. +listst: xor a ; := 0 means no error + ret + +; Data is written from the currently selected DMA address to the currently +; selected drive, track, and sector. For floppy disks, the data should be +; marked as nondeleted data to maintain compatibility with other CP/M +; systems. The error codes given in the READ command are returned in +; register A, with error recovery attempts as described above. + if nhdisks gt 0 +write: ld a,(diskno) ; get disk number + cp ndisks ; compare with number of Altair disks + jp c,awrite ; carry means we got an Altair disk + ld a,hdskWrite ; otherwise perform hard disk write +shdpar: out (hdskPort),a ; send command + ld a,(diskno) ; get disk number + sub ndisks ; rebase + out (hdskPort),a ; send rebased disk number + ld a,(sector) ; get sector + dec a ; rebase to 0 + out (hdskPort),a ; send rebased sector number + ld a,(track) ; get lower byte of track + out (hdskPort),a ; send lower byte of track + ld a,(track+1) ; get upper byte of track + out (hdskPort),a ; send upper byte of track + ld a,(dmaad) ; get lower byte DMA address + out (hdskPort),a ; send lower byte of DMA address + ld a,(dmaad+1) ; get upper byte of DMA address + out (hdskPort),a ; send upper byte of DMA address + in a,(hdskPort) ; perform command and get result + ret +awrite equ $ + else +write equ $ + endif + call poshed ; select desired disk and position to desired track + call secget ; position head to desired sector + ld hl,(dmaad) ; source of sector is in 'dmaad' + ld de,altbuf+3 ; destination inside local buffer + ld bc,csecsiz ; sector size is 128 + call ldir ; block move + ld a,cwrseq ; command for 'start write enable sequence' + out (dskcon),a ; do it + di + ld hl,altbuf ; point to first byte in local buffer + ld b,asecsiz+1 ; number of bytes to write (additional byte triggers 'real' write) +wready: in a,(statin) ; get status + rra ; get bit for ready for write + jp c,wready ; loop until ready for write + ld a,(hl) ; byte to write + out (dskwrit),a ; write byte + inc hl ; point to next byte + dec b ; decrement counter of bytes + jp nz,wready ; jp if not done + ld a,cuload ; unload head command + out (dskcon),a ; do it + ei + xor a ; := 0 means no error + ret + +; Postcondition: 'altbuf' contains 'asecsiz' many bytes, is set to 'csecsiz' +blread: ld hl,altbuf ; address of sector buffer + ld e,asecsiz ; number of bytes to read +blrd1: in a,(statin) ; get disk status + or a ; set sign of byte + jp m,blrd1 ; loop until disk has new byte to read + in a,(dskread) ; read byte of sector + ld (hl),a ; store into buffer + inc hl ; point to next position in buffer + dec e ; decrement size counter + jp nz,blrd1 ; if not zero, we need to continue + ld bc,csecsiz ; sector size in preparation for call to 'ldir' + ret + +; position disk on track zero, == 0 at the end +dhome: in a,(statin) ; position disk to track 0 + and mtzero ; mask for 'head is on track zero' + ret z ; track zero reached, done + call whmove ; loop until head movement is allowed + ld a,cstepot ; command for 'step head out one track' + out (dskcon),a ; do it + jp dhome ; try again + +; Select disk 'diskno' and position disk head to 'track' +poshed: call calcd ; position altair disk head + ld a,d ; select disk , cur track in + out (selout),a ; select disk + in a,(statin) ; get status of selected drive + cp mall ; ok? + jp z,selerr ; no! + ld a,b ; := track of selected disk + cp track1 ; compare with non-existing track + jp nz,alseek ; if a regular track, proceed to seek + call dhome ; position disk to track 0 + ld b,a ; := 0 (current track) +;Input: location 'track' contains desired track +; contains current track +;Output: desired track is reached and stored in track array +alseek: ld a,(track) ; seek to 'track' (cur track in b) + ld e,a ; := desired track + ld a,b ; := current track + sub e ; := current track - desired track + ret z ; we are already at desired track + ld e,a ; e is the number of "step in" or "step out" + jp c,stpin ; current track < desired track + ld c,cstepot ; command for step head out one track + jp aseek ; perform steps +stpin: ld c,cstepin ; command for step head in one track + cpl ; := ~(current track - desired track) + inc a ; := desired track - current track (positive) + ld e,a ; is positive number of tracks to move +aseek: call whmove ; loop until head movement is allowed + ld a,c ; get command (step in or step out) + out (dskcon),a ; perform it + dec e ; next iteration + jp nz,aseek ; loop if not done + call calcd ; get pointer to 'track' of 'diskno' + ld a,(track) ; this is the current track + ld (hl),a ; update 'track' of 'diskno' + ret +selerr: pop hl ; discard return address + ld a,bioserr ; := 1 means error + ret + +; loop until head movement is allowed +whmove: in a,(statin) ; get status + and mhm ; mask for 'head movement allowed' + jp nz,whmove ; loop until movement allowed + ret + +; Input: - implicit input is location 'diskno' +; Output: contains the current track of 'diskno' +; , and contain 'diskno' +; points to 'track' of 'diskno' +calcd: ld a,(diskno) ; get 'diskno' + ld e,a ; := 'diskno' + ld hl,ontrk0 + ld d,0 + add hl,de ; points to 'track' of 'diskno' + ld b,(hl) ; := 'track' of 'diskno' + ld d,e ; := 'diskno' + ret + +; Input: 'sector' contains desired sector number +; Output: head is positioned at desired sector +secget: ld a,cload ; command to load head to drive surface + out (dskcon),a ; do it + ld a,(sector) ; := desired sector + dec a ; adjust to range 0..(spt-1) + ld b,a ; := adjusted, desired sector + cp spt ; compare with sectors per track + jp c,seclp2 ; desired sector is less than total sectors per track, ok + ld de,secmsg ; prepare error message + call msg ; print it + halt ; not much we can do +seclp2: in a,(secpos) ; get sector position + rra ; rotate T bit into carry + jp c,seclp2 ; loop until sector is positioned to read or write + and sptmask ; now contains the sector under the head + cp b ; compare with desired sector + jp nz,seclp2 ; repeat if not equal + ret + +; Move bytes from start address to destination . +; This is equivalent to the Z80 instruction 'LDIR'. +; This subroutine dynamically determines the processor. +ldir: xor a ; := 0 + dec a ; := 1111'1111b + jp pe,ldir1 ; on an 8080 this means parity is even + ldir ; otherwise we have a Z80 + ret +ldir1: ld a,(hl) ; get byte from source + ld (de),a ; put byte to destination + inc hl ; point to next source address + inc de ; point to next destination address + dec bc ; decrement number of bytes to move + ld a,c ; := ( or ) + or b + jp nz,ldir1 ; not zero, move again + ret + + if patchOS +lctabs: db 9 ; (R)EAD ERROR + dw ccp+03e0h ; DFE0 + db 6 ; (N)O FILE + dw ccp+03f1h ; DFF1 + db 2 ; (A)LL + dw ccp+0553h ; E153 + db 7 ; (N)O SPACE + dw ccp+0608h ; E208 + db 10 ; (F)ILE EXISTS + dw ccp+0683h ; E283 + db 7 ; (B)AD LOAD + dw ccp+077bh ; E37B +lctabe equ $ + +patchs: dw ccp+0143h, ccpp1 ; DD43: jp ccpp1 + dw ccp+017dh, ccpp2 ; DD7D: jp ccpp2 + dw ccp+01e3h, ccpp3 ; DDE3: jp ccpp3 + dw ccp+0392h, propat + dw ccp+06dbh, ccpat + dw bdos+0c86h, f13pat + dw bdos+0758h, pubpat +patche equ $ + endif + +; In general, each disk drive has an associated (16-byte) disk parameter +; header that contains information about the disk drive and provides a +; scratch pad area for certain BDOS operations. The format of the disk +; parameter header for each drive is shown below, where each element is a +; word (16-bit) value. +; +; DISK PARAMETER HEADER +; +-------+------+------+------+----------+-------+-------+-------+ +; | XLT | 0000 | 0000 | 0000 |DIRBUF| DPB | CSV | ALV | +; +------+------+------+-------+----------+-------+-------+-------+ +; 16B 16B 16B 16B 16B 16B 16B 16B +; +; XLT Address of the logical-to-physical translation vector, if used +; for this particular drive, or the value 0000H if no sector translation +; takes place (that is, the physical and logical sector numbers are the +; same). Disk drives with identical sector skew factors share the same +; translate tables. +; +; 0000 Scratch pad values for use within the BDOS, initial value is +; unimportant. DIRBUF Address of a 128-byte scratch pad area for directory +; operations within BDOS. All DPHs address the same scratch pad area. +; +; DPB Address of a disk parameter block for this drive. Drives +; withidentical disk characteristics address the same disk parameter block. +; +; CSV Address of a scratch pad area used for software check for +; changed disks. This address is different for each DPH. +; +; ALV Address of a scratch pad area used by the BDOS to keep disk +; storage allocation information. This address is different for each DPH. +; +; Given n disk drives, the DPHs are arranged in a table whose first row of 16 +; bytes corresponds to drive 0, with the last row corresponding to drive n-1. +; In the following figure the label DPBASE defines the base address of the +; DPH table. +; +; DPBASE: +; 00 XLT00 0000 0000 0000 DIRBUF DBP00 CSV00 ALV00 +; 01 XLT01 0000 0000 0000 DIRBUF DBP01 CSV01 ALV01 +; (and so on through) +; n-1 XLTn-1 0000 0000 0000 DIRBUF DBPn-1 CSVn-1 ALVn-1 + +; +; The translation vectors, XLT00 through XLTn-1, are located elsewhere in the +; BIOS, and simply correspond one-for-one with the logical sector numbers +; zero through the sector count 1. The Disk Parameter Block (DPB) for each +; drive is more complex. As shown below, particular DPB, that is addressed by +; one or more DPHS, takes the general form: +; +; +---+---+---+---+---+---+---+---+---+---+ +; |SPT|BSH|BLM|EXM|DSM|DRM|AL0|AL1|CKS|OFF| +; +---+---+---+---+---+---+---+---+---+---+ +; 16B 8B 8B 8B 16B 16B 8B 8B 16B 16B +; +; where each is a byte or word value, as shown by the 8b or 16b indicator +; below the field. +; +; The following field abbreviations are used in the figure above: +; SPT is the total number of sectors per track. +; BSH is the data allocation block shift factor, determined by +; the data block allocation size. +; BLM is the data allocation block mask (2[BSH-1]). +; EXM is the extent mask, determined by the data block +; allocation size and the number of disk blocks. +; DSM determines the total storage capacity of the disk drive. +; DRM determines the total number of directory entries that +; can be stored on this drive. +; AL0, AL1 determine reserved directory blocks. +; CKS is the size of the directory check vector. +; +; OFF is the number of reserved tracks at the beginning of the +; (logical) disk. +; +; The values of BSH and BLM determine the data allocation size BLS, which is +; not an entry in the DPB. Given that the designer has selected a value for +; BLS, the values of BSH and BLM are shown in the following table. +; +; BLS BSH BLM +; 1,024 3 7 +; 2,048 4 15 +; 4,096 5 31 +; 8,192 6 63 +; 16,384 7 127 +; +; where all values are in decimal. The value of EXM depends upon both the BLS +; and whether the DSM value is less than 256 or greater than 255, as shown in +; the table below. +; +; EXM values +; BLS DSM<256 DSM>255 +; 1,024 0 N/A +; 2,048 1 0 +; 4,096 3 1 +; 8,192 7 3 +; 16,384 15 7 +; +; The value of DSM is the maximum data block number supported by this +; particular drive, measured in BLS units. The product (DSM + 1) is the total +; number of bytes held by the drive and must be within the capacity of the +; physical disk, not counting the reserved operating system tracks. +; +; The DRM entry is the one less than the total number of directory entries +; that can take on a 16-bit value. The values of AL0 and AL1, however, are +; determined by DRM. The values AL0 and AL1 can together be considered a +; string of 16-bits, as shown below. +; +; |--------- AL0 ---------|-------- AL1 ----------| +; 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 +; +; Position 00 corresponds to the high-order bit of the byte labeled AL0 and +; 15 corresponds to the low-order bit of the byte labeled AL1. Each bit +; position reserves a data block for number of directory entries, thus +; allowing a total of 16 data blocks to be assigned for directory entries +; (bits are assigned starting at 00 and filled to the right until position +; 15). Each directory entry occupies 32 bytes, resulting in the following +; tabulation: +; +; BLS Directory Entries +; 1,024 32 times # bits +; 2,048 64 times # bits +; 4,096 128 times # bits +; 8,192 256 times # bits +; 16,384 512 times # bits +; +; Thus, if DRM = 127 (128 directory entries) and BLS = 1024, there are 32 +; directory entries per block, requiring 4 reserved blocks. In this case, the +; 4 high-order bits of AL0 are set, resulting in the values AL0 = 0F0H and +; AL1 = 00H. +; +; The CKS value is determined as follows: if the disk drive media is +; removable, then CKS = (DRM + 1)/4, where DRM is the last directory entry +; number. If the media are fixed, then set CKS = 0 (no directory records are +; checked in this case). +; +; Finally, the OFF field determines the number of tracks that are skipped at +; the beginning of the physical disk. This value is automatically added +; whenever SETTRK is called and can be used as a mechanism for skipping +; reserved operating system tracks or for partitioning a large disk into +; smaller segmented sections. +; +; To complete the discussion of the DPB, several DPHs can address the same +; DPB if their drive characteristics are identical. Further, the DPB can be +; dynamically changed when a new drive is addressed by simply changing the +; pointer in the DPH; because the BDOS copies the DPB values to a local area +; whenever the SELDSK function is invoked. +; +; Returning back to DPH for a particular drive, the two address values CSV +; and ALV remain. Both addresses reference an area of uninitialized memory +; following the BIOS. The areas must be unique for each drive, and the size +; of each area is determined by the values in the DPB. +; +; The size of the area addressed by CSV is CKS bytes, which is sufficient to +; hold the directory check information for this particular drive. If CKS = +; (DRM + 1)/4, you must reserve (DRM + 1)/4 bytes for directory check use. If +; CKS = 0, no storage is reserved. +; +; The size of the area addressed by ALV is determined by the maximum number +; of data blocks allowed for this particular disk and is computed as (DSM/8) +; + 1. + +; +; diskette drives +; +dpbase equ $ + dw atrans,0,0,0,dirbf,mits2,chk00,all00 + dw atrans,0,0,0,dirbf,mits,chk01,all01 + dw atrans,0,0,0,dirbf,mits,chk02,all02 + dw atrans,0,0,0,dirbf,mits,chk03,all03 + dw atrans,0,0,0,dirbf,mits2,chk04,all04 + dw atrans,0,0,0,dirbf,mits2,chk05,all05 + dw atrans,0,0,0,dirbf,mits2,chk06,all06 + dw atrans,0,0,0,dirbf,mits,chk07,all07 + + if nhdisks gt 0 +defdw macro ?value + dw all0&?value + endm + +defdp macro ?number + local ?hdi +?hdi defl 8 + rept ?number + dw 0,0,0,0,dirbf,simhd,0 + defdw %?hdi +?hdi defl ?hdi+1 + endm + endm + + defdp nhdisks + +simhd: dw spt ; SPT, sectors per track + db 5 ; BSH, data allocation block shift factor, for BLS=4,096 + db 31 ; BLM, data allocation block mask, for BLS=4,096 + db 1 ; extent mask for BLS=4,096 and DSM>255 + dw 2047-restrk ; DSM, maximum data block number + dw 1023 ; DRM, number of directory entries - 1 + db 0ffh,0 ; AL0, AL1, 8 blocks reserved to hold all entries + ; (number of directory entries)*32 = (number of reserved blocks)*(block size BLS) + ; 1024 * 32 = 8 * 4096 + dw 0 ; CKS, set 0 since hard disk is fixed + dw restrk ; OFF, number of tracks skipped at beginning of disk + endif + +; copylib (default) format +mits: dw spt ; spt, sectors per track + db 3 ; allocation block shift factor, bsh + db 7 ; data allocation block mask, blm, allocation size (bls) = 1024 + db 0 ; extent mask + dw dsm07 ; dsm, maximum data block number + dw dirent ; drm, number of directory entries - 1 + db 0ffh,0 ; al0, al1, 8 blocks reserved to hold all entries + ; 256 * 32 = 8 * 1024 + ; (drm+1) * 32 = (number of bits in al0 and al1) * bls + dw cks ; cks = (drm + 1)/4 + dw restrk ; off, number of tracks skipped at beginning of disk + +mits2: dw spt ; spt, sectors per track + db 4 ; allocation block shift factor, bsh + db 15 ; data allocation block mask, blm, allocation size (bls) = 2048 + db 0 ; extent mask + dw dsm06 ; dsm, maximum data block number + dw dirent ; drm, number of directory entries - 1 + db 0f0h,0 ; al0, al1, 4 blocks reserved to hold all entries + ; 256 * 32 = 4 * 2048 + ; (drm+1) * 32 = (number of bits in al0 and al1) * bls + dw cks ; cks = (drm + 1)/4 + dw restrk ; off, number of tracks skipped at beginning of disk + +; speedball (copylib) skewtable +atrans: db 01,18,03,20,05,22,07,24 + db 09,26,11,28,13,30,15,32 + db 17,02,19,04,21,06,23,08 + db 25,10,27,12,29,14,31,16 +msg1: db cr, lf + db '0' + (msize/10) + db '0' + (msize MOD 10) + db 'K CP/M Version 2.2 (SIMH ALTAIR 8800, BIOS V1.26 for PLM, ' + + if nhdisks gt 0 + db '0' + nhdisks + db ' HD, ' + endif + + db '07-Jan-07)' + db cr, lf, '$' + + if needZ80 +msg2: db cr, lf, '8080 CPU detected. Need Z80.', cr, lf, '$' + endif + +secmsg: db cr, lf, 'Cannot find sector in register ', cr, lf, '$' + +; position disk drive head +ontrk0: db track1 ; current track# drive 0 (logical 1) + db track1 ; current track# drive 1 (logical 2) + db track1 ; current track# drive 2 (logical 3) + db track1 ; current track# drive 3 (logical 4) + db track1 ; current track# drive 4 (logical 5) + db track1 ; current track# drive 5 (logical 6) + db track1 ; current track# drive 6 (logical 7) + db track1 ; current track# drive 7 (logical 8) + +diskno: db 0 +sector: db 0 +track: dw 0 +dmaad: dw 0 + +; begin scratch area for bdos +dirbf: ds 128 ; directory work space +all00: ds ((dsm06+1)/8)+1 +all01: ds ((dsm06+1)/8)+1 +all02: ds ((dsm06+1)/8)+1 +all03: ds ((dsm06+1)/8)+1 +all04: ds ((dsm06+1)/8)+1 +all05: ds ((dsm06+1)/8)+1 +all06: ds ((dsm06+1)/8)+1 +all07: ds ((dsm07+1)/8)+1 + + if nhdisks gt 0 + +deflab macro ?value +all0&?value equ $ + endm + +defall macro ?number + local ?hdi +?hdi defl 8 + rept ?number + deflab %?hdi + ds 256 +?hdi defl ?hdi+1 + endm + endm + + defall nhdisks + endif + +chk00: ds cks +chk01: ds cks +chk02: ds cks +chk03: ds cks +chk04: ds cks +chk05: ds cks +chk06: ds cks +chk07: ds cks +altbuf: ds asecsiz+1 + +biosend equ $ +biossiz equ biosend-bios + +; fill remainder with 0 + +fillmod equ biossiz AND 00ffh + if fillmod gt 0 +fillsiz equ 100h-fillmod + ds fillsiz + endif + + if2 +padjust macro ?newsiz + .printx /Adjust bioslen in MEMCFG.LIB to ?newsiz/ + endm + +psize macro ?val1,?val2,?val3,?val4 + .printx /BIOS extends from ?val1 to ?val2 (Size ?val3, bioslen = ?val4)/ + endm + +psave macro ?value + .printx /SAVE ?value CPMBOOT.COM/ + endm + + .radix 16 + psize %bios,%biosend,%biossiz,%bioslen + if biossiz gt bioslen + padjust %(100h*((biossiz + 0ffh) / 100h)) + endif + .radix 10 + if biosend gt 0ff00h + .printx /Warning: BIOS extends into Altair ROM/ + endif + + psave %(9+(ccplen + bdoslen + bioslen) / 100h) + + endif + + .dephase + + end + \ No newline at end of file diff --git a/ISIS PLM/CC.SUB b/ISIS PLM/CC.SUB new file mode 100644 index 0000000..0edaa15 --- /dev/null +++ b/ISIS PLM/CC.SUB @@ -0,0 +1,13 @@ +attach b 4 +b:seteof $1.plm +b:is14 +ERA $1.MOD +era $1 +era $1.obj +:f1:PLM80 $1.PLM debug PAGEWIDTH(80) $2 +:f1:link $1.obj,:f1:x0100,:f1:plm80.lib to $1.mod +:f1:locate $1.mod code(0100H) stacksize(100) map print($1.tra) +:f1:cpm +attach b 1 +e:objcpm $1 + \ No newline at end of file diff --git a/ISIS PLM/CCP.MAC b/ISIS PLM/CCP.MAC new file mode 100644 index 0000000..3c1bed1 --- /dev/null +++ b/ISIS PLM/CCP.MAC @@ -0,0 +1,1206 @@ + title 'console command processor (CCP), ver 2.0' + + .Z80 + aseg + org 100h + maclib MEMCFG.LIB ; define configuration parameters + .phase ccpph ; CCPLOC not needed, we use ccpph instead + +; assembly language version of the CP/M console command processor +; +; version 2.2 February, 1980 + +; Copyright (c) 1976, 1977, 1978, 1979, 1980 +; Digital Research +; Box 579, Pacific Grove, +; California, 93950 + +bdosl equ bdosph ;bdos location +tran equ 100h +tranm equ $ +ccploc equ $ + +; ******************************************************** +; * Base of CCP contains the following code/data * +; * ccp: jmp ccpstart (start with command) * +; * jmp ccpclear (start, clear command) * +; * ccp+6 127 (max command length) * +; * ccp+7 comlen (command length = 00) * +; * ccp+8 ' ... ' (16 blanks) * +; ******************************************************** +; * Normal entry is at ccp, where the command line given * +; * at ccp+8 is executed automatically (normally a null * +; * command with comlen = 00). An initializing program * +; * can be automatically loaded by storing the command * +; * at ccp+8, with the command length at ccp+7. In this * +; * case, the ccp executes the command before prompting * +; * the console for input. Note that the command is exe-* +; * cuted on both warm and cold starts. When the command* +; * line is initialized, a jump to "jmp ccpclear" dis- * +; * ables the automatic command execution. * +; ******************************************************** + + jp ccpstart ;start ccp with possible initial command + jp ccpclear ;clear the command buffer +maxlen: db 127 ;max buffer length +comlen: db 0 ;command length (filled in by dos) + +; (command executed initially if comlen non zero) +combuf: db ' ' ;8 character fill + db ' ' ;8 character fill + db 'COPYRIGHT (C) 1979, DIGITAL RESEARCH '; 38 + ds 128-($-combuf) +; total buffer length is 128 characters + +comaddr: + dw combuf ;address of next to char to scan +staddr: ds 2 ;starting address of current fillfcb request + +diska equ 0004h ;disk address for current disk +bdos equ 0005h ;primary bdos entry point +buff equ 0080h ;default buffer +fcb equ 005ch ;default file control block + +rcharf equ 1 ;read character function +pcharf equ 2 ;print character function +pbuff equ 9 ;print buffer function +rbuff equ 10 ;read buffer function +breakf equ 11 ;break key function +liftf equ 12 ;lift head function (no operation) +initf equ 13 ;initialize bdos function +self equ 14 ;select disk function +openf equ 15 ;open file function +closef equ 16 ;close file function +searf equ 17 ;search for file function +searnf equ 18 ;search for next file function +delf equ 19 ;delete file function +dreadf equ 20 ;disk read function +dwritf equ 21 ;disk write function +makef equ 22 ;file make function +renf equ 23 ;rename file function +logf equ 24 ;return login vector +cself equ 25 ;return currently selected drive number +dmaf equ 26 ;set dma address +userf equ 32 ;set user number + +; special fcb flags +rofile equ 9 ;read only file +sysfile equ 10 ;system file flag + +; special characters +cr equ 13 ;carriage return +lf equ 10 ;line feed +la equ 5fh ;left arrow +eofile equ 1ah ;end of file + +; utility procedures +printchar: + ld e,a + ld c,pcharf + jp bdos + +printbc: ;print character, but save b,c registers + push bc + call printchar + pop bc + ret + +crlf: ld a,cr + call printbc + ld a,lf + jp printbc + +blank: ld a,' ' + jp printbc + +print: ;print string starting at b,c until next 00 entry + push bc + call crlf + pop hl ;now print the string +prin0: ld a,(hl) + or a + ret z ;stop on 00 + inc hl + push hl ;ready for next + call printchar + pop hl ;character printed + jp prin0 ;for another character + +initialize: + ld c,initf + jp bdos + +select: ld e,a + ld c,self + jp bdos + +bdos$inr: + call bdos + ld (dcnt),a + inc a + ret + +open: ;open the file given by d,e + ld c,openf + jp bdos$inr + +openc: ;open comfcb + xor a + ld (comrec),a ;clear next record to read + ld de,comfcb + jp open + +close: ;close the file given by d,e + ld c,closef + jp bdos$inr + +search: ;search for the file given by d,e + ld c,searf + jp bdos$inr + +searchn: ;search for the next occurrence of the file given by d,e + ld c,searnf + jp bdos$inr + +searchcom: ;search for comfcb file + ld de,comfcb + jp search + +delete: ;delete the file given by d,e + ld c,delf + jp bdos + +bdos$cond: + call bdos + or a + ret + +diskread: ;read the next record from the file given by d,e + ld c,dreadf + jp bdos$cond + +diskreadc: ;read the comfcb file + ld de,comfcb + jp diskread + +diskwrite: ;write the next record to the file given by d,e + ld c,dwritf + jp bdos$cond + +make: ;create the file given by d,e + ld c,makef + jp bdos$inr + +renam: ;rename the file given by d,e + ld c,renf + jp bdos + +getuser: ;return current user code in a + ld e,0ffh ;drop through to setuser + +setuser: + ld c,userf + jp bdos ;sets user number + +saveuser: ;save user#/disk# before possible ^c or transient + call getuser ;code to a + add a,a + add a,a + add a,a + add a,a ;rot left + ld hl,cdisk + or (hl) ;4b=user, 4b=disk + ld (diska),a ;stored away in memory for later + ret + +setdiska: + ld a,(cdisk) + ld (diska),a ;user/disk + ret + +translate: ;translate character in register A to upper case + cp 61h + ret c ;return if below lower case a + cp 7bh + ret nc ;return if above lower case z + and 5fh + ret ;translated to upper case + +readcom: ;read the next command into the command buffer + ;check for submit file + ld a,(submit) + or a + jp z,nosub + ;scanning a submit file + ;change drives to open and read the file + ld a,(cdisk) + or a + ld a,0 + call nz,select + ;have to open again in case xsub present + ld de,subfcb + call open + jp z,nosub ;skip if no sub + ld a,(subrc) + dec a ;read last record(s) first + ld (subcr),a ;current record to read + ld de,subfcb + call diskread ;end of file if last record + jp nz,nosub + ;disk read is ok, transfer to combuf + ld de,comlen + ld hl,buff + ld b,128 + call move0 + ;line is transferred, close the file with a + ;deleted record + ld hl,submod + ld (hl),0 ;clear fwflag + inc hl + dec (hl) ;one less record + ld de,subfcb + call close + jp z,nosub + ;close went ok, return to original drive + ld a,(cdisk) + or a + call nz,select + ;print to the 00 + ld hl,combuf + call prin0 + call break$key + jp z,noread + call del$sub + jp ccp ;break key depressed + +nosub: ;no submit file + call del$sub + ;translate to upper case, store zero at end + call saveuser ;user # save in case control c + ld c,rbuff + ld de,maxlen + call bdos + call setdiska ;no control c, so restore diska +noread: ;enter here from submit file + ;set the last character to zero for later scans + ld hl,comlen + ld b,(hl) ;length is in b +readcom0: + inc hl + ld a,b + or a ;end of scan? + jp z,readcom1 + ld a,(hl) ;get character and translate + call translate + ld (hl),a + dec b + jp readcom0 + +readcom1: ;end of scan, h,l address end of command + ld (hl),a ;store a zero + ld hl,combuf + ld (comaddr),hl ;ready to scan to zero + ret + +break$key: ;check for a character ready at the console + ld c,breakf + call bdos + or a + ret z + ld c,rcharf + call bdos ;character cleared + or a + ret + +cselect: ;get the currently selected drive number to reg-A + ld c,cself + jp bdos + +setdmabuff: ;set default buffer dma address + ld de,buff ;(drop through) + +setdma: ;set dma address to d,e + ld c,dmaf + jp bdos + +del$sub: ;delete the submit file, and set submit flag to false + ld hl,submit + ld a,(hl) + or a + ret z ;return if no sub file + ld (hl),0 ;submit flag is set to false + xor a + call select ;on drive a to erase file + ld de,subfcb + call delete + ld a,(cdisk) + jp select ;back to original drive + +serialize: ;check serialization + ld de,serial + ld hl,bdosl + ld b,6 ;check six bytes +ser0: ld a,(de) + cp (hl) + jp nz,badserial + inc de + inc hl + dec b + jp nz,ser0 + ret ;serial number is ok + +comerr: ;error in command string starting at position + ;'staddr' and ending with first delimiter + call crlf ;space to next line + ld hl,(staddr) ;h,l address first to print +comerr0: ;print characters until blank or zero + ld a,(hl) + cp ' ' + jp z,comerr1 ; not blank + or a + jp z,comerr1 ; not zero, so print it + push hl + call printchar + pop hl + inc hl + jp comerr0 ; for another character +comerr1: ;print question mark,and delete sub file + ld a,'?' + call printchar + call crlf + call del$sub + jp ccp ;restart with next command + + ; fcb scan and fill subroutine (entry is at fillfcb below) + ;fill the comfcb, indexed by A (0 or 16) + ;subroutines +delim: ;look for a delimiter + ld a,(de) + or a + ret z ;not the last element + cp ' ' + jp c,comerr ;non graphic + ret z ;treat blank as delimiter + cp '=' + ret z + cp la + ret z ;left arrow + cp '.' + ret z + cp ':' + ret z + cp ';' + ret z + cp '<' + ret z + cp '>' + ret z + ret ;delimiter not found + +deblank: ;deblank the input line + ld a,(de) + or a + ret z ;treat end of line as blank + cp ' ' + ret nz + inc de + jp deblank + +addh: ;add a to h,l + add a,l + ld l,a + ret nc + inc h + ret + +fillfcb0: ;equivalent to fillfcb(0) + ld a,0 + +fillfcb: + ld hl,comfcb + call addh + push hl + push hl ;fcb rescanned at end + xor a + ld (sdisk),a ;clear selected disk (in case A:...) + ld hl,(comaddr) + ex de,hl ;command address in d,e + call deblank ;to first non-blank character + ex de,hl + ld (staddr),hl ;in case of errors + ex de,hl + pop hl ;d,e has command, h,l has fcb address + ;look for preceding file name A: B: ... + ld a,(de) + or a + jp z,setcur0 ;use current disk if empty command + sbc a,'A'-1 + ld b,a ;disk name held in b if : follows + inc de + ld a,(de) + cp ':' + jp z,setdsk ;set disk name if : + +setcur: ;set current disk + dec de ;back to first character of command +setcur0: + ld a,(cdisk) + ld (hl),a + jp setname + +setdsk: ;set disk to name in register b + ld a,b + ld (sdisk),a ;mark as disk selected + ld (hl),b + inc de ;past the : + +setname: ;set the file name field + ld b,8 ;file name length (max) +setnam0: call delim + jp z,padname ;not a delimiter + inc hl + cp '*' + jp nz,setnam1 ;must be ?'s + ld (hl),'?' + jp setnam2 ;to dec count + +setnam1: + ld (hl),a ;store character to fcb + inc de +setnam2: + dec b ;count down length + jp nz,setnam0 + + ;end of name, truncate remainder +trname: call delim + jp z,setty ;set type field if delimiter + inc de + jp trname + +padname: + inc hl + ld (hl),' ' + dec b + jp nz,padname + +setty: ;set the type field + ld b,3 + cp '.' + jp nz,padty ;skip the type field if no . + inc de ;past the ., to the file type field +setty0: ;set the field from the command buffer + call delim + jp z,padty + inc hl + cp '*' + jp nz,setty1 + ld (hl),'?' ;since * specified + jp setty2 + +setty1: ;not a *, so copy to type field + ld (hl),a + inc de +setty2: ;decrement count and go again + dec b + jp nz,setty0 + + ;end of type field, truncate +trtyp: ;truncate type field + call delim + jp z,efill + inc de + jp trtyp + +padty: ;pad the type field with blanks + inc hl + ld (hl),' ' + dec b + jp nz,padty + +efill: ;end of the filename/filetype fill, save command address + ;fill the remaining fields for the fcb + ld b,3 +efill0: inc hl + ld (hl),0 + dec b + jp nz,efill0 + ex de,hl + ld (comaddr),hl ;set new starting point + + ;recover the start address of the fcb and count ?'s + pop hl + ld bc,11 ;b=0, c=8+3 +scnq: inc hl + ld a,(hl) + cp '?' + jp nz,scnq0 + ;? found, count it in b + inc b +scnq0: dec c + jp nz,scnq + ;number of ?'s in c, move to a and return with flags set + ld a,b + or a + ret + +intvec: ;intrinsic function names (all are four characters) + db 'DIR ' + db 'ERA ' + db 'TYPE' + db 'SAVE' + db 'REN ' + db 'USER' +intlen equ ($-intvec)/4 ;intrinsic function length +serial: db 0,0,0,0,0,0 + + +intrinsic: ;look for intrinsic functions (comfcb has been filled) + ld hl,intvec + ld c,0 ;c counts intrinsics as scanned +intrin0: + ld a,c + cp intlen ;done with scan? + ret nc + ;no, more to scan + ld de,comfcb+1 ;beginning of name + ld b,4 ;length of match is in b +intrin1: + ld a,(de) + cp (hl) ;match? + jp nz,intrin2 ;skip if no match + inc de + inc hl + dec b + jp nz,intrin1 ;loop while matching + ;complete match on name, check for blank in fcb + ld a,(de) + cp ' ' + jp nz,intrin3 ;otherwise matched + ld a,c + ret ;with intrinsic number in a + +intrin2: ;mismatch, move to end of intrinsic + inc hl + dec b + jp nz,intrin2 + +intrin3: ;try next intrinsic + inc c ;to next intrinsic number + jp intrin0 ;for another round + +ccpclear: ;clear the command buffer + xor a + ld (comlen),a + ;drop through to start ccp +ccpstart: ;enter here from boot loader + ld sp,stack + push bc ;save initial disk number + ;(high order 4bits=user code, low 4bits=disk#) + ld a,c + rra + rra + rra + rra + and 0fh ;user code + ld e,a + call setuser ;user code selected + ;initialize for this user, get $ flag + call initialize ;0ffh in accum if $ file present + ld (submit),a ;submit flag set if $ file present + pop bc ;recall user code and disk number + ld a,c + and 0fh ;disk number in accumulator + ld (cdisk),a ;clears user code nibble + call select ;proper disk is selected, now check sub files + ;check for initial command + ld a,(comlen) + or a + jp nz,ccp0 ;assume typed already + +ccp: ;enter here on each command or error condition + ld sp,stack + call crlf ;print d> prompt, where d is disk name + call cselect ;get current disk number + add a,'A' + call printchar + ld a,'>' + call printchar + call readcom ;command buffer filled +ccp0: ;(enter here from initialization with command full) + ld de,buff + call setdma ;default dma address at buff + call cselect + ld (cdisk),a ;current disk number saved + call fillfcb0 ;command fcb filled + call nz,comerr ;the name cannot be an ambiguous reference + ld a,(sdisk) + or a + jp nz,userfunc + ;check for an intrinsic function + call intrinsic + ld hl,jmptab ;index is in the accumulator + ld e,a + ld d,0 + add hl,de + add hl,de ;index in d,e + ld a,(hl) + inc hl + ld h,(hl) + ld l,a + jp (hl) + ;pc changes to the proper intrinsic or user function +jmptab: dw direct ;directory search + dw erase ;file erase + dw type ;type file + dw save ;save memory image + dw rename ;file rename + dw user ;user number + dw userfunc ;user-defined function +badserial: + ld hl,76f3h ;'di hlt' instructions. [di or (hlt shl 8)] + ld (ccploc),hl + ld hl,ccploc + jp (hl) + + + ;utility subroutines for intrinsic handlers +readerr: ;print the read error message + ld bc,rdmsg + jp print +rdmsg: db 'READ ERROR',0 + +nofile: ;print no file message + ld bc,nofmsg + jp print +nofmsg: db 'NO FILE',0 + +getnumber: ;read a number from the command line + call fillfcb0 ;should be number + ld a,(sdisk) + or a + jp nz,comerr ;cannot be prefixed + ;convert the byte value in comfcb to binary + ld hl,comfcb+1 + ld bc,11 ;(b=0, c=11) + ;value accumulated in b, c counts name length to zero +conv0: ld a,(hl) + cp ' ' + jp z,conv1 + ;more to scan, convert char to binary and add + inc hl + sub '0' + cp 10 + jp nc,comerr ;valid? + ld d,a ;save value + ld a,b ;mult by 10 + and 11100000b + jp nz,comerr + ld a,b ;recover value + rlca + rlca + rlca ;*8 + add a,b + jp c,comerr + add a,b + jp c,comerr ;*8+*2 = *10 + add a,d + jp c,comerr ;+digit + ld b,a + dec c + jp nz,conv0 ;for another digit + ret +conv1: ;end of digits, check for all blanks + ld a,(hl) + cp ' ' + jp nz,comerr ;blanks? + inc hl + dec c + jp nz,conv1 + ld a,b ;recover value + ret + +movename: ;move 3 characters from h,l to d,e addresses + ld b,3 +move0: ld a,(hl) + ld (de),a + inc hl + inc de + dec b + jp nz,move0 + ret + +addhcf: ;buff + a + c to h,l followed by fetch + ld hl,buff + add a,c + call addh + ld a,(hl) + ret + +setdisk: ;change disks for this command, if requested + xor a + ld (comfcb),a ;clear disk name from fcb + ld a,(sdisk) + or a + ret z ;no action if not specified + dec a + ld hl,cdisk + cp (hl) + ret z ;already selected + jp select + +resetdisk: ;return to original disk after command + ld a,(sdisk) + or a + ret z ;no action if not selected + dec a + ld hl,cdisk + cp (hl) + ret z ;same disk + ld a,(cdisk) + jp select + + ;individual intrinsics follow +direct: ;directory search + call fillfcb0 ;comfcb gets file name + call setdisk ;change disk drives if requested + ld hl,comfcb+1 + ld a,(hl) ;may be empty request + cp ' ' + jp nz,dir1 ;skip fill of ??? if not blank + ;set comfcb to all ??? for current disk + ld b,11 ;length of fill ????????.??? +dir0: ld (hl),'?' + inc hl + dec b + jp nz,dir0 + ;not a blank request, must be in comfcb +dir1: ld e,0 + push de ;E counts directory entries + call searchcom ;first one has been found + call z,nofile ;not found message +dir2: jp z,endir + ;found, but may be system file + ld a,(dcnt) ;get the location of the element + rrca + rrca + rrca + and 1100000b + ld c,a + ;c contains base index into buff for dir entry + ld a,sysfile + call addhcf ;value to A + rla + jp c,dir6 ;skip if system file + ;c holds index into buffer + ;another fcb found, new line? + pop de + ld a,e + inc e + push de + ;e=0,1,2,3,...new line if mod 4 = 0 + and 11b + push af ;and save the test + jp nz,dirhdr0 ;header on current line + call crlf + push bc + call cselect + pop bc + ;current disk in A + add a,'A' + call printbc + ld a,':' + call printbc + jp dirhdr1 ;skip current line hdr +dirhdr0: + call blank ;after last one + ld a,':' + call printbc +dirhdr1: + call blank + ;compute position of name in buffer + ld b,1 ;start with first character of name +dir3: ld a,b + call addhcf ;buff+a+c fetched + and 7fh ;mask flags + ;may delete trailing blanks + cp ' ' + jp nz,dir4 ;check for blank type + pop af + push af ;may be 3rd item + cp 3 + jp nz,dirb ;place blank at end if not + ld a,9 + call addhcf ;first char of type + and 7fh + cp ' ' + jp z,dir5 + ;not a blank in the file type field +dirb: ld a,' ' ;restore trailing filename chr +dir4: + call printbc ;char printed + inc b + ld a,b + cp 12 + jp nc,dir5 + ;check for break between names + cp 9 + jp nz,dir3 ;for another char + ;print a blank between names + call blank + jp dir3 + +dir5: ;end of current entry + pop af ;discard the directory counter (mod 4) +dir6: call break$key ;check for interrupt at keyboard + jp nz,endir ;abort directory search + call searchn + jp dir2 ;for another entry +endir: ;end of directory scan + pop de ;discard directory counter + jp retcom + + +erase: call fillfcb0 ;cannot be all ???'s + cp 11 + jp nz,erasefile + ;erasing all of the disk + ld bc,ermsg + call print + call readcom + ld hl,comlen + dec (hl) + jp nz,ccp ;bad input + inc hl + ld a,(hl) + cp 'Y' + jp nz,ccp + ;ok, erase the entire diskette + inc hl + ld (comaddr),hl ;otherwise error at retcom +erasefile: + call setdisk + ld de,comfcb + call delete + inc a ;255 returned if not found + call z,nofile ;no file message if so + jp retcom + +ermsg: db 'ALL (Y/N)?',0 + +type: call fillfcb0 + jp nz,comerr ;don't allow ?'s in file name + call setdisk + call openc ;open the file + jp z,typerr ;zero flag indicates not found + ;file opened, read 'til eof + call crlf + ld hl,bptr + ld (hl),255 ;read first buffer +type0: ;loop on bptr + ld hl,bptr + ld a,(hl) + cp 128 ;end buffer + jp c,type1 + push hl ;carry if 0,1,...,127 + ;read another buffer full + call diskreadc + pop hl ;recover address of bptr + jp nz,typeof ;hard end of file + xor a + ld (hl),a ;bptr = 0 +type1: ;read character at bptr and print + inc (hl) ;bptr = bptr + 1 + ld hl,buff + call addh ;h,l addresses char + ld a,(hl) + cp eofile + jp z,retcom + call printchar + call break$key + jp nz,retcom ;abort if break + jp type0 ;for another character + +typeof: ;end of file, check for errors + dec a + jp z,retcom + call readerr +typerr: call resetdisk + jp comerr + +save: call getnumber ; value to register a + push af ;save it for later + ;should be followed by a file to save the memory image + call fillfcb0 + jp nz,comerr ;cannot be ambiguous + call setdisk ;may be a disk change + ld de,comfcb + push de + call delete ;existing file removed + pop de + call make ;create a new file on disk + jp z,saverr ;no directory space + xor a + ld (comrec),a ; clear next record field + pop af ;#pages to write is in a, change to #sectors + ld l,a + ld h,0 + add hl,hl + ld de,tran ;h,l is sector count, d,e is load address +save0: ;check for sector count zero + ld a,h + or l + jp z,save1 ;may be completed + dec hl ;sector count = sector count - 1 + push hl ;save it for next time around + ld hl,128 + add hl,de + push hl ;next dma address saved + call setdma ;current dma address set + ld de,comfcb + call diskwrite + pop de + pop hl ;dma address, sector count + jp nz,saverr ;may be disk full case + jp save0 ;for another sector + +save1: ;end of dump, close the file + ld de,comfcb + call close + inc a ; 255 becomes 00 if error + jp nz,retsave ;for another command +saverr: ;must be full or read only disk + ld bc,fullmsg + call print +retsave: ;reset dma buffer + call setdmabuff + jp retcom + +fullmsg: + db 'NO SPACE',0 + +rename: ;rename a file on a specific disk + call fillfcb0 + jp nz,comerr ;must be unambiguous + ld a,(sdisk) + push af ;save for later compare + call setdisk ;disk selected + call searchcom ;is new name already there? + jp nz,renerr3 + ;file doesn't exist, move to second half of fcb + ld hl,comfcb + ld de,comfcb+16 + ld b,16 + call move0 + ;check for = or left arrow + ld hl,(comaddr) + ex de,hl + call deblank + cp '=' + jp z,ren1 ;ok if = + cp la + jp nz,renerr2 +ren1: ex de,hl + inc hl + ld (comaddr),hl ;past delimiter + ;proper delimiter found + call fillfcb0 + jp nz,renerr2 + ;check for drive conflict + pop af + ld b,a ;previous drive number + ld hl,sdisk + ld a,(hl) + or a + jp z,ren2 + ;drive name was specified. same one? + cp b + ld (hl),b + jp nz,renerr2 +ren2: ld (hl),b ;store the name in case drives switched + xor a + ld (comfcb),a + call searchcom ;is old file there? + jp z,renerr1 + + ;everything is ok, rename the file + ld de,comfcb + call renam + jp retcom + +renerr1: ; no file on disk + call nofile + jp retcom +renerr2: ; ambigous reference/name conflict + call resetdisk + jp comerr +renerr3: ; file already exists + ld bc,renmsg + call print + jp retcom +renmsg: db 'FILE EXISTS',0 + +user: ;set user number + call getnumber ; leaves the value in the accumulator + cp 16 + jp nc,comerr ; must be between 0 and 15 + ld e,a ;save for setuser call + ld a,(comfcb+1) + cp ' ' + jp z,comerr + call setuser ;new user number set + jp endcom + +userfunc: + call serialize ;check serialization + ;load user function and set up for execution + ld a,(comfcb+1) + cp ' ' + jp nz,user0 + ;no file name, but may be disk switch + ld a,(sdisk) + or a + jp z,endcom ;no disk name if 0 + dec a + ld (cdisk),a + call setdiska ;set user/disk + call select + jp endcom +user0: ;file name is present + ld de,comfcb+9 + ld a,(de) + cp ' ' + jp nz,comerr ;type ' ' + push de + call setdisk + pop de + ld hl,comtype ;.com + call movename ;file type is set to .com + call openc + jp z,userer + ;file opened properly, read it into memory + ld hl,tran ;transient program base +load0: push hl ;save dma address + ex de,hl + call setdma + ld de,comfcb + call diskread + jp nz,load1 + ;sector loaded, set new dma address and compare + pop hl + ld de,128 + add hl,de + ld de,tranm ;has the load overflowed? + ld a,l + sub e + ld a,h + sbc a,d + jp nc,loaderr + jp load0 ;for another sector + +load1: pop hl + dec a + jp nz,loaderr ;end file is 1 + call resetdisk ;back to original disk + call fillfcb0 + ld hl,sdisk + push hl + ld a,(hl) + ld (comfcb),a ;drive number set + ld a,16 + call fillfcb ;move entire fcb to memory + pop hl + ld a,(hl) + ld (comfcb+16),a + xor a + ld (comrec),a ;record number set to zero + ld de,fcb + ld hl,comfcb + ld b,33 + call move0 + ;move command line to buff + ld hl,combuf +bmove0: ld a,(hl) + or a + jp z,bmove1 + cp ' ' + jp z,bmove1 + inc hl + jp bmove0 ;for another scan + ;first blank position found +bmove1: ld b,0 + ld de,buff+1 + ;ready for the move +bmove2: ld a,(hl) + ld (de),a + or a + jp z,bmove3 + ;more to move + inc b + inc hl + inc de + jp bmove2 +bmove3: ;b has character count + ld a,b + ld (buff),a + call crlf + ;now go to the loaded program + call setdmabuff ;default dma + call saveuser ;user code saved + ;low memory diska contains user code + call tran ;gone to the loaded program + ld sp,stack ;may come back here + call setdiska + call select + jp ccp + +userer: ;arrive here on command error + call resetdisk + jp comerr + +loaderr: ;cannot load the program + ld bc,loadmsg + call print + jp retcom +loadmsg: + db 'BAD LOAD',0 +comtype: + db 'COM' ;for com files + + +retcom: ;reset disk before end of command check + call resetdisk + +endcom: ;end of intrinsic command + call fillfcb0 ;to check for garbage at end of line + ld a,(comfcb+1) + sub ' ' + ld hl,sdisk + or (hl) + ;0 in accumulator if no disk selected, and blank fcb + jp nz,comerr + jp ccp + +; data areas + ds 16 ;8 level stack +stack: + +; 'submit' file control block +submit: db 0 ;00 if no submit file, ff if submitting +subfcb: db 0,'$$$ ' ;file name is $$$ + db 'SUB',0,0 ;file type is sub +submod: db 0 ;module number +subrc: ds 1 ;record count filed + ds 16 ;disk map +subcr: ds 1 ;current record to read + +; command file control block +comfcb: ds 32 ;fields filled in later +comrec: ds 1 ;current record to read/write +dcnt: ds 1 ;disk directory count (used for error codes) +cdisk: ds 1 ;current disk +sdisk: ds 1 ;selected disk for current operation + ;none=0, a=1, b=2 ... +bptr: ds 1 ;buffer pointer + + end ccploc + \ No newline at end of file diff --git a/ISIS PLM/CFGCCP.LIB b/ISIS PLM/CFGCCP.LIB new file mode 100644 index 0000000..3a3875b --- /dev/null +++ b/ISIS PLM/CFGCCP.LIB @@ -0,0 +1,21 @@ +msize equ 64 ; adjust per installed system memory + +; configuration parameters for BIOS +bioslen equ 0d00h ; adjust as bios changes are made (if necessary) +nhdisks equ 2 ; total number of hard disks (set to 0 + ; if no hard disks desired) +needZ80 equ 0 ; 0 = 8080 is ok, 1 = Z80 is needed +patchOS equ 1 ; 0 = do not patch CCP and BODS + ; 1 = patch orignal CCP and original BDOS + +; common definitions and derived values - no change should be necessary below +ccplen equ 0800h ; cp/m constant +bdoslen equ 0e00h ; cp/m constant + +; cp/m image size (rounded up to next 1k boundary) +cpmlen equ (ccplen + bdoslen + bioslen + 03ffh) / 0400h + +ccpph equ (msize - cpmlen) * 1024 ; ccp start address +bdosph equ ccpph + ccplen ; bdos start address +biosph equ ccpph + ccplen + bdoslen ; bios start address + \ No newline at end of file diff --git a/ISIS PLM/COMMON.LIT b/ISIS PLM/COMMON.LIT new file mode 100644 index 0000000..9060ef7 --- /dev/null +++ b/ISIS PLM/COMMON.LIT @@ -0,0 +1,30 @@ +$nolist +/* + Common Literals +*/ + + declare true literally '0FFFFH'; + declare false literally '0'; + declare forever literally 'while true'; + declare boolean literally 'byte'; + + declare enter$region literally + 'disable'; + + exitr: + procedure external; + end exitr; + + declare exit$region literally + 'call exitr'; + + declare restarts literally + '0C7C7H,0C7C7H,0C7C7H,0C7C7H, + 0C7C7H,0C7C7H,0C7C7H,0C7C7H, + 0C7C7H,0C7C7H,0C7C7H,0C7C7H, + 0C7C7H,0C7C7H,0C7C7H,0C7C7H, + 0C7C7H,0C7C7H,0C7C7H,0C7C7H, + 0C7C7H,0C7C7H,0C7C7H'; + +$list + \ No newline at end of file diff --git a/ISIS PLM/CONV86 b/ISIS PLM/CONV86 new file mode 100644 index 0000000000000000000000000000000000000000..5e29fa12d0f1ac3e1a4d66f4c8f7f5a457ab9dba GIT binary patch literal 37120 zcmch=33yXg`agbeH%Ng(0NKUgE+Ro&wI|jX$)0F!Kr7+i?XPP+WiplwSOfk7Cs-0yfd!@T-+<t2pxow`QqO#g#D{(uWrdn5ZsmbA-<*INIAFHYN=sXmMy|TQj z%vtT!BhB^XnOq)Ejngq8o&G1_6=#LRR5|PCnJE*`oeDg3Mc}5Iz$=pj=T-)qrUbUV z{^M(R$Y@bQt=M_^{_f@@&(~v zCf|1sX9f374y<^_+gS75G-&D<(Hy+#U$32j1@7%NXyQOd^Xuxs!x_^9ot? zK^9^>cd|b)XmX%xa!>I-oT9NGK84sP`$%#hNe-qLL@;~`MUd)4E*J_a=aLg&6q%gr zV^L?MGof8mtecV4SyM9lA&FvNmfK?Ird8Q1#q&0|{zp@|`UG zV>`=71`L1)0G8&!6s<^FnK+H3cI_R{pmu^7$?v9Q2$azvO<{5Bq{q&@J0)W<_d>k9 z3=T~8ivv#wo;qMnZ_EmQIYs>22XKgCLeX>U0jmKX_ggc>K*yhY=I1F>)-75n(8{tpui zSp9cZ%(a!d9Hv>WGN-A+R_@dh=pL%wXy&sj-Q~9G-myB3r`qkRC_yJtX)3F%DCwQJ zCl>M6P;8ZUu;;x(xecw|QR(!sj)j^&>sF@O-9^*NW)=11z(uR6xU!4k)6uzzUXy4@mT8W`e&hd?G9JLuSo$G zc{+=+uN0<9wpR+%rH%C1`|HBt(ks6%9O;+flS)1Y@-dLlF!CAUm-2mU#>69Tkf(!n zxQn$e07X2yp)}E#QVOK^*VDCR69sd0rAiZ6NetH|aFKx6j|E?uF3Y|`3}?tZ*$31l z_5SI8Yrd~T@E)3;Ib3Wfc?b`7tspy@zFs3%OQ-v#@!eAJ7mBO@R9-}gt1AWO2|h5O zGR+DOEz*QmJEzMNkh^fU1wPo_Dv$M@q*Ayb4UVEX-?6^>R;hDS;Fx-Vs>~gbU>8-H zXjbs1qRfj#b64zo(TFEb`((+N-D#4SSL4+mw7uML=y^`Uh1-EfUzPE^1FY=A(m zd!s0Gtat@uhM)-&fp|09x~QDdWK(Ye90#c@cA

-PGo^Gwog)-_VU7Zopn1_d@IQ>O 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 JU`gAHmbw`gx*gN*d=S$u` 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 literal 0 HcmV?d00001 diff --git a/ISIS PLM/COPY.COM b/ISIS PLM/COPY.COM new file mode 100644 index 0000000000000000000000000000000000000000..99239f04f0716a6e604e1a5c56805f704ef3f06e GIT binary patch literal 768 zcmbtRL1+^}6y2GLu)DA+D;Ox0_LuaM6eR{vi$o{cH4JHX!)8;=Dd5$cARdI!LoWfr zquzwxy;dZOu!{#%0^))Ma}crSB1pj|Ee3*rHySMB$+^s*_x^wH%}j7gG*wfx*(~ra zj|&$}QLk8@XF-vdDvcV{T&L{vDqssXZfI)VX}Bc|Ojm4M*8l<2s(Zrbo^b3x(7MN6 zgv;Q$CHwQ zj29i8@*F5RwPu{)HQbEOaYSfd0@vbZ6TK4>x`HH0Rh^Nf(myBZmw)ZwNK(bKaYRN- zv!!>tG=EI=;y=kT(eIok*N;g55xbv1A;vLjO>+4GF~+3Z+of24CVKa5I~vWJzDI+H zRDUq1f>To131u7)<)J*f-g`=Mqy7_GprH~xrZGGI%^u9zmveTXuD@cdQVJFlg+!?I z6D-*o%Flir(xG}Ut@Wl|XWxg)+J^)it#$nbd$TGnY$63zO?FTQ zK_!Lx_RHy^yystGJE7W6-$2O<(?S)22(GYDoo;Tf6rk&GL^HB+LL6g4p7&m`tNBUv zHu2@Cf0q?Vs4TqVn|5L>IG}A^l4i!+_qjnU-JazJasB1i?M!AllagA?Uq1zVEWnTa G-}Munpy1B{ literal 0 HcmV?d00001 diff --git a/ISIS PLM/CPM b/ISIS PLM/CPM new file mode 100644 index 0000000000000000000000000000000000000000..97d93d69111a21fca70ec3346624f15e1c9f9e51 GIT binary patch literal 128 zcmZQ#XJB>?@MSc7#3snV&|qdb(@e43?5P$b!^_`g&skU*7=eNge2feqrDy^G1I!b> literal 0 HcmV?d00001 diff --git a/ISIS PLM/CPU.COM b/ISIS PLM/CPU.COM new file mode 100644 index 0000000000000000000000000000000000000000..a2dcd3cfc42ba17351096db44107878779982cc0 GIT binary patch literal 256 zcmX@Sjxn@2F+J5v!8ssQK_e>K!XQ?mM!_Q50Lai(h%Sre}a;Zo~Sr`Cy zmZT<^q^5ubEP&>t2!N~yTB8880jL(F1W5#>8YE=Zz~H|9)Kf-VAhv2^_!o8RJmWu$ zLr)p)Lc=?}VBSYQ4uv6a{m03?5zR9@WR + or a ; no parameters? + jp z,showus ; yes, show usage + dec a ; or just one character? + jp z,showus ; yes, show usage + ld a,(cmdline+2) ; get first character (cmdline+1) is ' ' + cp 'Z' ; check for Z80 + jp z,sz80 ; Z80 is desired + cp '8' ; check for 8080 + jp nz,showus ; neither, show usage + ld a,set8080cpu ; 8080 is desired, prepare command + ld de,m8080 ; and optional confirmation message for 8080 + jp doset ; perform CPU set operation + +sz80: ld a,setz80cpu ; Z80 is desired, prepare command + ld de,mz80 ; and optional confirmation message for Z80 +doset: out (simhport),a ; set CPU + ld hl,cmdline+1 ; start of command line +find: ld a,(hl) ; get character + cp 'V' ; is it 'V' (for verbose)? + jp z,print ; yes, print message + inc hl ; point to next character + dec b ; decrement counter of characters in command line + ret z ; done + jp find + +showus: xor a ; determine which CPU currently in use + dec a + ld de,md8080 ; prepare for 8080 + jp pe,detmsg ; all eight bits set means parity even for 8080 + ld de,mdz80 ; not so on Z80 +detmsg: call print ; print CPU type + ld de,usage ; show usage +print: ld c,printstringcmd ; print command for CP/M + jp bdos ; execute it and return to CP/M + +last equ $ + ds 200h - last ; make sure to fill with zeros via M80 /M option + + end + \ No newline at end of file diff --git a/ISIS PLM/CREF80.COM b/ISIS PLM/CREF80.COM new file mode 100644 index 0000000000000000000000000000000000000000..e136ec14cff826f180a745aae8fbad9fc9bab2b5 GIT binary patch literal 4096 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 literal 0 HcmV?d00001 diff --git a/ISIS PLM/DDTZ.COM b/ISIS PLM/DDTZ.COM new file mode 100644 index 0000000000000000000000000000000000000000..2eafb5d650039b0235fe78343c9b725989a8f941 GIT binary patch literal 10112 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 O=;ipIp5O65d;K41a{$Z$ literal 0 HcmV?d00001 diff --git a/ISIS PLM/DIF.COM b/ISIS PLM/DIF.COM new file mode 100644 index 0000000000000000000000000000000000000000..71cb48f07f0fbf05e867278069e0962b3f73595e GIT binary patch literal 2944 zcmcImYiJZ#6rOcvcC$04c2I0$i@i6ES|?519b*!MSuu&CXi=k0YEvKU?(AeW+0os# zK1iw-e4|E0B?v7D{n7rJw$!#zsI`mMMF#4l4;F?RbPBp`LqS?nL3{4q+1)7VuhRXo zbME=RbMATEbGfM$-@a@KS`dl$s{TO!s{~MYTfc98xqwhuO{(#}XiQC@WRHr%(MUv% ztFaKQH>=5=sv0ZW24mrZJ+bVLYB443C4pVNGO4VakZI5xuC5hfSOS-{7w*(LV65s){{Mmlp{g#MF@T+d`B!9?L~_r z)0Gjl1W1JAf0_e6oN^LS86Q*v1Z>NLNnO)=RYXgq(sB{dHy-FC$kIHL*cnZRdQehF zJ?buKO=4Sba5ur*pT)y!DB2h79m}b6I7xjQ3h8~@g7IiVkCh8hvQm>lhW(MSdEJhE=FiDA-HtU+7FUfwslfNOTv{Bl+^Ig9=nHMb+)7n)zRU_#j&^ zpJHFBI>n~(A&^gle40(0ciD;&bGwMWjBUj@E5h66??UQ;NOTjZPIEL2s3d{0Vs0zq zF;|G0Eu1owvo>&6Coj+BG;@iVS;yg-Ts=mNZBF4T?qVNfZE#zio=UP#o#jgQNObnA zvCUay^fN@s$K>fpMW0`pTR*R%v1$II*0%P=OGpIILj!cRX1?R4J5Pv3CACePzleAjbt~^#AmQpWt3by5xwH z7#p8wNqeOyjM*Y)rn&KTSA!p4EgBNarLmM2N>NG_N>FA1Qf@c=MQBJ_OlA2)Er*8zUd2i<=jU>QCMH zB-`M^XK7?`L<*EEMapeA9wZclQZVC!vkpfbPJY9FIPwkq%|5Z}3`@ePI!8X#1@wD{ z2Tx;c`3y}HPbn6KG^5Ic4}(((pBRuB!Jsp5aIR#KFA*_VIkGwit7Bw!lx=Ius2o3}a#;Ht+t03aZS z@GFZ3BObDLh$96e2tYhaiN}hb2lJj`4?y6!klnzT9Gt0T<|8(>Rgj0^iWp*P5TN## zIb)q_D#LB`q|3w$Kr4#Snlc!9GBA>hk&gok9lcnF--Ajq9Na&)IfutBd1Khv#w^IQ zI1+?y<~V$Z_KrkSgosQa$Lciok$O^w_m-Tle#$A#`FIYAdK_n~dHF;>jatFn$vacn z^w89KshpupXhyvkt}fCQ5a^N3w0KFGWI^&5NSRe$xK4>mDXKzVbA+nu3aXoXz0!-+ z6$mUHyTe{M7sPI9ft0!6CDSv+)<6dc(q2Tq@#5ofz{X&Uir7zHd;%~hFqk89r9cZt zy}9m_Y!_TOMy_K3X4G&fFh>sMB_Y>6SfUITDA>-o#0h09sgYFLu}y%XPpN`b%5S6K z#m}M{0jn(BV0+jGC3TN36teK+O?m2{;_!{TuUodsGuE(?9=?3n*1FcuhADC} zm6pBRtQ4)`%PWnqzKv?>`vadhUNh3>3^AK-U7j^`Eg!LEtM&Xx!F#QF+vVDhcUM$3b1;tko&)Qo10`^~P2Um`9r<<{fx znKi3cbgW&`ntzKbbv{2lN9WeItD#z71M)XE&ueO~pEsL%tH}p17#$wI2|bSD>h>Mc NI6RBs4fCJ&{|93T)~f&j literal 0 HcmV?d00001 diff --git a/ISIS PLM/DO.COM b/ISIS PLM/DO.COM new file mode 100644 index 0000000000000000000000000000000000000000..8d2b6f0ebd4b71498f71bcf583826fc35a91197c GIT binary patch literal 2176 zcmc&!U1$_n6rR70cc$HK*R&P`)w?@O(bXopEe&pxjWI?ICYmOjU?nlk?oKvScXrm9 z*>0k;jZ#dZ(5F5W`jDqWTLddb7C}nft);VcKm$t1i_JrduzeEjk1dm)J8M#_v~Q*R zaQEJG&OPTl-}&wYC~8j-@w@Ny_RI88J}2u#!~5{a?&jTIA#}^fN5?1!S3mLC9?CxD zu_tMJFKz!s+xHk7u@#C6$W##mhG~Bz-@w{!T=^yFVJEzfr^n7a`3!ZnWBqg={v~s5$*8cguq4nGQC*&h&Wn_XAV5D>?m0);W(;= zM^Ld;zRMY+E(S-?^6kb33PP(t&=3m?56i|zu2Q9I!8lsZ)gVi!6`-i#F%*@N(^73< z{G*ibIcTfBdX)awF$V6x1%5`SxbEYFQi|$`!VqPoOWQBnbQ2Z@&)G?_($FT&O|r!kuYx&(xeRGnk(m$;<`4ve3YNP7cU zNwanju{BVYYp(ly*8uAS_Rg-OQ?s)(v*!+0zGSC59xiY;Cb0)OPc_XJ#T7`f?5Qle z2wx;bmp|aFz$hwqwEkKMj}b!05J+Q&dL5=29!CWckXzAF!e6n|a)gDuoc0Q}-9Ldg zL-VJXt?O3I3!9h#8X5O7fCe;RInttY=H`#%mi?M%zha!k6ZuRgPx|YGoNw}UQIpM1S(EY=8-GM~xKF-d%3Tp%hd=#*(>zaWbkM|6aGgA$*ax?C=J0uu-xaA0*c_#O(}=ix2IX5fW@>@ELik18Pk zH_Iy=(h2|<=M5PT4G;7T!gng_6}-aQp}l)B#`Dpfu4GMYPAUdI)YCVBRoO74wER~b zZg~`$)-Z&+i%eQm-jT7YrT!k8R8wvfMvRZvOZWG84ZihcVEcjIzMdFvALttFAA(TH zfZW(HrEE&lQvi5he{a0G`)EHw+kchUp~(GE!;qMrKwd;b(QL)G8j|JOf7(V 0 + jp z,move1 ; no banked memory support detected + ld a,setbankselect ; next command is select bank + out (simhport),a ; send it + xor a ; bank for boot is 0 + out (simhport),a ; reset bank to 0 +move1: ld hl,cold + ld de,dest + ld c,altbuf - cold +move2: ld a,(de) + ld (hl),a + inc de + inc hl + dec c + jp nz,move2 + jp cold +dest equ $ + .dephase + + .phase cold + ld sp,stack +selds0: ld a,0 ; the address of <0> is "unitNoOffset1" + out (selout),a ; select it + ld a,4 ; load head command + out (dskcon),a ; load head to drive surface + jp cktk0 +back1: in a,(statin) + and 2 ; head movement mask + jp nz,back1 ; loop until head movement is allowed + ld a,2 ; step out command + out (dskcon),a ; step head out one track +cktk0: in a,(statin) + and 40h ; head on track zero mask + jp nz,back1 ; loop until head is on track zero + ld de,bootorg ; destination load address + ld b,8 ; first sector to read on track zero +nextsc: push bc ; save current sector to read, is undefined + push de ; save current destination load address + ld de,8086h ; := 80h, := 86h + ld hl,altbuf ; address of sector buffer +findsc: in a,(secpos) + rra + jp c,findsc ; loop until sector is positioned to read or write + and (spt-1) ; now contains the sector under the head + cp b ; compare with desired sector + jp nz,findsc ; loop until done +readsc: in a,(statin) ; get disk status + or a ; set sign of byte + jp m,readsc ; loop until disk has new byte to read + in a,(dskread) ; read byte of sector + ld (hl),a ; store into buffer + inc hl ; point to next position in buffer + dec e ; decrement byte counter + jp nz,readsc ; repeat if byte counter not yet zero +donesc: pop de ; restore current destination load address, is destination + ld hl,altbuf+3 ; ignore first three byte of buffer, is source + ld b,secsiz ; 128 bytes in a sector +ldir: ld a,(hl) ; get byte from source + ld (de),a ; put byte to destination + inc hl ; point to next source address + inc de ; point to next destination address + dec b ; decrement number of bytes to move + jp nz,ldir ; not zero, move again + pop bc ; is current sector, is undefined + ld hl,cold ; when reaches this address we are done + ld a,d + cp h + jp nz,decide + ld a,e + cp l +decide: jp nc,gotoit ; jump if everything loaded + inc b ; compute next sector number + inc b + ld a,b + cp spt ; compare new sector number with sectors per track + jp c,nextsc ; continue if less + ld b,1 ; otherwise prepare for odd numbered sectors + jp z,nextsc ; if old sector number was equal to sectors per track +stepin: in a,(statin) + and 2 ; head movement mask + jp nz,stepin ; loop until head movement is allowed + ld a,1 ; step in one track command + out (dskcon),a ; step in one track + ld b,0 ; start with even sectors + jp nextsc +gotoit: ld a,80h ; the address of <80H> is "unitNoOffset2" + out (selout),a + ei + jp bootorg + +altbuf: ds 137 + ds 16 + +stack: + .dephase + + end + \ No newline at end of file diff --git a/ISIS PLM/DUMP.COM b/ISIS PLM/DUMP.COM new file mode 100644 index 0000000000000000000000000000000000000000..c02b6bb774d900a891365b13df501b2a40d1b3ac GIT binary patch literal 384 zcmY#nV6aq5WHQ{&be5Ot-~U6>jDq$|XJ0TLPGq!eFp6hVOl49^W>REeczX673lz5F0um>m@&Dtxbd~X#!QtzS$IL+@U-^OH>`BItKzx#q z6KLH@t9Yh=4Tt_So|R(Se(FD?`N?=O1{;ts8yF<(wx3*YRKp+`!@$Q6QVVo2h%Ewj zrkkgatAb0YZ-7FWYf!MKzn_Ako{0)Cm!H3ar(Zy5hyqwaK#*&&t6zu$P};>a*jokU Me+CQ?=?51A0H-d7hyVZp literal 0 HcmV?d00001 diff --git a/ISIS PLM/ED.COM b/ISIS PLM/ED.COM new file mode 100644 index 0000000000000000000000000000000000000000..a0f0f5410f0542e3e6d05bfcd0fb361d84c73f26 GIT binary patch literal 6656 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 literal 0 HcmV?d00001 diff --git a/ISIS PLM/FCB.LIT b/ISIS PLM/FCB.LIT new file mode 100644 index 0000000..d028294 --- /dev/null +++ b/ISIS PLM/FCB.LIT @@ -0,0 +1,20 @@ +$nolist +/* + FCB Literals +*/ + + declare fcb$descriptor literally + 'structure ( + et byte, + fn (8) byte, + ft (3) byte, + ex byte, + nu address, + rc byte, + dm (16) byte, + nr byte, + r0r1 address, + r2 byte )'; + +$list + \ No newline at end of file diff --git a/ISIS PLM/FIXEOF.COM b/ISIS PLM/FIXEOF.COM new file mode 100644 index 0000000000000000000000000000000000000000..3526d5133832eb76f3bc04abb4a1a5237b504008 GIT binary patch literal 256 zcmXq<&dA3v7{hRumEqt2L(+_VoPzm`K+a(X20mqoxK%BKtx+vV+Kkbv4#=)!;FA(; z0BPY5m-;Xv1Wc5eProryQ2!06C51~i|S;00~K`2}Ao!zamAH@!NllSgD z_uO;OnP*BArfC z)AkEi5Lnc9?ZDO@`?TdzNJxnRDS=69diI<}pVxqzK0rPyE5g-8jHwc)LYf?R+fu|bpqq@65Ezd)udCRlf zl|yuam8cIo9JHjkkdSbeob6aX&3SD0{y352U?HlSg?@Gbw9-J)V}|AXC^u4|pu}Mx)uBYsL5Q5 z4pW!S(>cqta|;OXA`@tr%esTN-HI;h09^!1NL`zY@Hs`Zz}NEM=#;~ZLKKa5K1C?D z(kMl&XZe;l2NOr-eka;KJb(rCfW$#r_u&pa?rLk`dN{!=J6W>+lyda(m1=EP%dliL-E$uT*OrWDQ?C z%Ov$8Syxq}tgE9$={?N#t*a;SG)CmjLqL)~L7M&QNm3rUdQD z(F0So%*HZlhLccWQTtXAhOQ?b+7np{OFCAu-B}7dF`%{)wa*&cc%@#gJJ?P+oAR=i$OuZo|mSH$? z;XC3_+7+?7zbIz83*{`gv7}uUtGA-;eEt2c+Nuc5!Ruq47Ee~yO>s5JR+9O(WVw=D z+FLtcu3TE0ys;tvGCHblikaFuvALQouOyeMb+}D%9(>F&flI5T31s0b{2H2m;Lq|A Gw*LV0Vg3jJ literal 0 HcmV?d00001 diff --git a/ISIS PLM/GENHEX.COM b/ISIS PLM/GENHEX.COM new file mode 100644 index 0000000000000000000000000000000000000000..8314d35f07c260e8ac353e293bb39e84e6aafb60 GIT binary patch literal 768 zcmYjP&ubGw6rP=FLk(t=r9U7km07a~8$HxTEEHTwH``=s%!bX@T9k^2RS*7Z4@KLC zQ1BoKqIeL*gMUE|B02PA7K0lYaVrrCcnFvtvL00Ep&(mlvu*IfyqS6P=KJ1!Z%!{U zCJ(W!j@m2n<-`qfF@C{`JIg0m5?8zH_Cd@h z^P_)W9p!I{+@vU#0zA1Er4gx4PxJsLtr44+HNE&%kg{f5Te)S9D?)M;b8f|2L&hR<&-Y3f$f~=h{iyg$3 zfUomsM1FY?4R+9zn;q#PZT*jwQgzC&=?l1!Ps)lw-%=LWffWjNTdXVe11Y+$>4N`$ NT9*XGo4^9T{R0^&2MhoJ literal 0 HcmV?d00001 diff --git a/ISIS PLM/GENMOD.COM b/ISIS PLM/GENMOD.COM new file mode 100644 index 0000000000000000000000000000000000000000..017afd6bc96bcf1d8b1c264f1e511ce5a390476d GIT binary patch literal 1280 zcmcgr&uiOO9DjP!b8sMv)odv?+xl#)uy})|p)`vRW{Rvjf<($>Wtq)}DLdq{ksSuj z;%4neNNY+dB`b`v``F1l&6L0((wa_YI@sXiWl-=zzIcb^5VkN-_mv&9u|HrBeI`MmG5rx+^h%LPNtEtvFGd5T_|dvp4AnpJbEDJ@b%$t#i}FVIUz#68bdXLd*& zp~P+CR+!XnlJwj*-s;}0YfRG4GOr~nq}M4w-2CS78gm6DZIg-bkjoJ3&a%QMj9Vu5 z=VWYjNzbkD@sTD{3!EZ3|yE!%!0H~I z43z!vbB!-nH#+-{R3`6QITsv?7f`7Q~2wz_#?wS1v8W_59J zXwjftiN}x-k~rOQf3z8452o#N?7^)22X;=zVYwW84C35yC)q6!Co=}V%xDlGFsG0x znqWen@Er@BbbyXjg?K?-Pk1ym2~O~r;z9vi0ty9eAMUbVi;qEZ{zc(F>7$w@0J#zE zb?kMPj|sN|tbAnP1?Fdo)2Erj;7~=&QY!wV=hdPz)U&|Qz;iOjXxJ=pZ&xtG~_pq7~y{;zKCr{)qjeHOIjm z9+8Q_ZE|3PLv5OzJ_Rdm&jqo7GlZ(=CWuw!5?m-F&iutf!an5m`^cyDmq_}f!8d-N z2p^(QBz8Rs@pm|Y+~OwyeS@EbcOQForb_tn!2p0^kAtDOf*j!|Ziq|OmRC%ARfRjH z=_XwcZmnjDLib-0??{Vk7Vb05Y9Aw=m-31zgvl^TK+YhMp~$+C6@`muz9luESGC+( z0ci=gy>;f2B`v5Z8;WEqR9`WNjflbrXCVRM{nq*iW9m9xl#HAr@?ikz*a-cf_|bpX E-;%et#sB~S literal 0 HcmV?d00001 diff --git a/ISIS PLM/GO.COM b/ISIS PLM/GO.COM new file mode 100644 index 0000000..e69de29 diff --git a/ISIS PLM/HALT.COM b/ISIS PLM/HALT.COM new file mode 100644 index 0000000000000000000000000000000000000000..5139f32dda214c1561b1cc2dcac1d9387c9ec6b7 GIT binary patch literal 128 LcmXS87+3%RJAeRp literal 0 HcmV?d00001 diff --git a/ISIS PLM/HDIR.COM b/ISIS PLM/HDIR.COM new file mode 100644 index 0000000000000000000000000000000000000000..b63022455c93205cd2816ddd3b223044838b95f1 GIT binary patch literal 1408 zcmc&!%WoS+93GEnjgrcRRa$VW68)CAY2ql6^L{{L5k(>qPFuya30M_!ob{s^kJ;Tc ztteo@l_PLMNJt0;E}IGgQV&&;8_^Z)!K!jG^1;9!+SN)t4v-=RX2v*5`3Km;?#}P| zecx|pDsSQQdMc|_XI5uh5R*63vwH1)L&hHHJ0#V)1N`JzGf9Gp$S6cnie`bMclHKXYl9S$cT@nDD` zdrVT=kW(*`dPZ{W3aKng%06=J8^q#YtUQKg1^WoHPfE2D{=?3j zKGE}*&y+_{ge=X=PMS z`&mPtZoeZ{wu$nA@YqQ#VnYH-3?${ElH%!akC9XC1ylc|ztn6L# z=Ayo~nCo3~XW& 0 jp z,reset2 ; no banked memory support detected ld a,setbankselect ; next command is select bank out (simhport),a ; send it xor a ; bank for boot is 0 out (simhport),a ; reset bank to 0 reset2: ld b,32 ; reset hard disk controller ld a,hdskReset ; by issuing the reset command 32 times reset3: out (hdskPort),a dec b jp nz,reset3 ; post condition is := 0 ld de,firstDiskAddr ; := 0 (Track), := 8 (Sector) ld hl,bootorg ; DMA address ld c,sectors ; is loop counter again: ld a,hdskRead out (hdskport),a ; send read command to hard disk port if includeTestCode ; for testing purposes ld a,0 ; always use disk 0 else ld a,(bootdr1) ; in real life take disk number from boot ROM sub ndisks ; correct for Altair disks endif out (hdskport),a ; send drive to boot from to hard disk port ld a,e out (hdskport),a ; send sector ld a,d out (hdskport),a ; send lower byte of track xor a out (hdskport),a ; send higher byte of track which is always 0 ld a,l out (hdskport),a ; send lower byte of DMA address ld a,h out (hdskport),a ; send upper byte of DMA address in a,(hdskport) ; perform operation and get result or a jp z,cont1 ; continue if no error halt ; halt otherwise cont1: ld a,c ; save in ld c,sectorLength ; is now 128 since always zero add hl,bc ; get next DMA address ld c,a ; restore from dec c ; decrement loop counter jp nz,cont2 ei jp bootorg ; done, jump to loaded code cont2: inc e ; Sector := Sector + 2 inc e ld a,e cp sectorsPerTrack ; is new Sector equal to 32 jp z,switch ; yes, need to go to odd sectors cp sectorsPerTrack+1 ; is new Sector equal to 33 jp nz,again ; no, proceed with read ld e,0 ; Sector := 0 inc d ; Track := Track + 1 jp again ; proceed with read switch: ld e,1 ; Sector := 1 jp again ; proceed with read bootend equ $ .dephase end  \ No newline at end of file diff --git a/ISIS PLM/HEXOBJ b/ISIS PLM/HEXOBJ new file mode 100644 index 0000000000000000000000000000000000000000..c7ce0090a2ee5c44ff27b5771d2a46a14e70cc26 GIT binary patch literal 6656 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 literal 0 HcmV?d00001 diff --git a/ISIS PLM/ISIS.COM b/ISIS PLM/ISIS.COM new file mode 100644 index 0000000000000000000000000000000000000000..bc78d4aed30b8fde875ab960e2eecba807919b4f GIT binary patch literal 12544 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 literal 0 HcmV?d00001 diff --git a/ISIS PLM/ISX.COM b/ISIS PLM/ISX.COM new file mode 100644 index 0000000000000000000000000000000000000000..bc78d4aed30b8fde875ab960e2eecba807919b4f GIT binary patch literal 12544 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 literal 0 HcmV?d00001 diff --git a/ISIS PLM/IXREF b/ISIS PLM/IXREF new file mode 100644 index 0000000000000000000000000000000000000000..9d8c24910f183934da4104dc1bc24a7d0430d3e5 GIT binary patch literal 10880 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 X$6@~$`6Js1`A_ literal 0 HcmV?d00001 diff --git a/ISIS PLM/LIB b/ISIS PLM/LIB new file mode 100644 index 0000000000000000000000000000000000000000..02c7eb41d15de0883c04073aa07bb78806de258a GIT binary patch literal 10240 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 literal 0 HcmV?d00001 diff --git a/ISIS PLM/LINK b/ISIS PLM/LINK new file mode 100644 index 0000000000000000000000000000000000000000..5d75497ef49d12b805b1e6eaaf1099567623bdc5 GIT binary patch literal 13184 zcmch8dwdhumH&(}2ANptP)cH8ZH<(WFpv-&B5Xm7Woe`l=w&^OExz;e=IX4wkxk|q;xRT@kp{jx7?z7+QnrB(mw8XxEewVP{ zCW|i^ll>M~C=zbJ{npz!j&tuu2k+81@p+Ri>L(aj&1PxBnd{)B#+ z-z;mFTvETBs~bm`_LP%9VLx40$$zY9uea8Z{NB#L!<{blX*YIAy|O!if!bfYv~#XM z-Yc$B?wP-1{PbUQ-S~(@b46xnZ7_>W<sQg3^N!cGsp-P9DjqNz1o-&w-v`ENgP`-!K*+f z_R2)rbxl&Sc?zVsvk1MNpmzZJgT|8XKWHRXe%p@5PbwUplQ{mbs52wpOXB7~@(BOs z(f-Yy7r&@z74pc}o1`x)dFdlht@R^MUOVs3@L6V|1B`6(OIM8A#YX+GiQlCdh~`6p z`71{4W}~Khg=#P6vhGpx;+JV)cDF;?10hZIf|V*S*@4sz!2tlDwK;x|B2?0loUxb| zxD6@7%%5^%TwV$(wFC@O^WuHnIqey@6i{ld0p+aroZA{wq|I_32y4q`-R$7sVod2+ zs=U^zUYc~+WUcmQ_#&Nqm3(uh_H*~h3l2tSZ&CG(&Ia=bl(N+AJMDv2a*e=O#$M(*v9nu@KUKwaYU8-8=?yA2p_co$ZlSWHmrqXOU*xF zOZlq>BNX;2d_V!uCl>Nmq~1}y>pFol3|-{KeT3bhX7)0Sz&HR30C^qYP&FS?g#Ahm zjZgyADng?)goHYkVLicknY}DS7Q$D+$L>>3lUeLnwD1J85IK${R84B-d5#3XPk}*5 z`xV$jhOgqJ8D6YqAt`HF-EYEen(P+78{YeF{P7&a%yHV(t6;XyoPeCB3oy)}tl+&T znCT2JQ|1hBro!j<%U-A7;`GFV7H7m856Hn7Hz^hhSpv>rrzI4YgBFj^FGsmbUl2P^ zM0Umeot9`=cKJL$+08n+$?+gMLf)V+fhM=y?sLhOpfezICbuuT(&F~fxKO0i;)(nH z+%<&J;)`0G{)p^!>(g*G!H^{ycPTnb^Qwq1CR@UhPz*z5Hzx!`F^dzZfRDy=pLfP$ zav+R8OH`IuT0%ifFciF{1Tdon(CT!p)S-wqk2Au3!Q~9z6thI+C|UAXl%?QlL-gDHMbR z84DJ@+b#QL@LCi$XD#6Ohn#L~^g4bULlbsJV-`8&;okHG+ns(NxbF4^SZ(LeXS8EMD<~DQII}hYz9+N z?mr5mh{njwXbxi55Z-Sf1ejAC7O%kAXOj(_A=8@>g^T^yZCs^Y2g8dT**#1`fM}={R2ReVi3lFToEe$4Si(0 zKC*&FX41cFxngv_CH;1xEuEyfu}}QamAUxdX?Nh_v^|G*pSjj~EG;;X{ZmftbB>74 zi>6%OlouayPWsZd*Iw&wp7QMIDZHHgRsG3ObNw^k%4>c*WyLAylqj#?ThcQ zFKKLYwz}N1M?74lWc&PK{6_(x_@rXz9fuV>hep2IDm{W&;xR;z*o^ouw3>2gNAF?8 zh0+s>X}EeU&yx1*uf5`^P% zWfzT2KhT;Hj}<9nG#yj!u-Q4sF-3eDR8_j9ry1TON^Q<~J*w0WR}Y=}7%_GRK#No7 zS`lE1Cz!b&R|du`DT_-w4&ytnq-*FcBRGkxM5nm|A1K(22yw(C1PSFhFw-xKR72%{}zJ@h^N3niK5x%3CP3-f#g<*Q^&h)1% zQFu`?S2393Plx$?#mq67H$NRFrI;r%m~)>F^Oj=jG?+vp;g1?o7Sm z&UDY@_8i)}`&eHFwzucet-Fu(88{yWPJC>g%gs83S3nT#;qKkGaArM^pFYx@tCK%g2w#bon7ZE1A%C)72drW zOvw&NUB3;KJaO8;n;MKT7F2>E;KssQI|E`qlTLK*G8Nxq`TFean!Bkzq<~n zS!tV^M{Di;Qu`3K3ucZ0UTsXTSV8Zn=pDce42R)L{xlnYk2;s*Z&ytN4R5UzsyS-K zVbAdcxqf8Nij43Dj(?|zMh>x4`|C2^h3OoBnKkZZjW}|>+UWR&JjSJ7TOs@z$IoW- zrd9~G9A822!V->eq!+PUwe!uDcnpmUuavrJ@=NkOQ!__r$nUKr?^93b%Q`be< zw3hcdy443Bc!18z(^QI#r*c4Agc>-{!#$M73miX6(K(CA+g1v79Dk9h&>>vvJQIs| zLn=MwFi zX9!HfD4M0D|8XUVxWvxuk24~qOE?Kgm*qV8qN6^W+i_WDf&@|kmn8Uj2`|}huPV7z zYnkw72R>VP98EHnU@ zLD>#|3Ojq{fMtUC-({Vj$WZCJxxhN1R+^wbn+ni+8Yk+ojxm`*P1;Gsv5y(vv=qo7 zGO1&cN$TGN8B*Ot>nK-Jr&#Y*bwM}p6CtQ^_sDQi>Q(vcy@ut^A)}hZjOyi}GzW$> zFxHZKAt+iE>nc^k?@qGqoy@ks6eLmZB$J+_nDWCU_?}=I%@75eX#^gOu$^kUIVi1C z(Z!(OgZM8}N@@-Qqg5))PTi}{2Z4~^Pu;Iz&J6n4*f~miPLNLJy=pD=m8}S7#ILAE zdJsG4_H)d;{A-X-xZ1iVm=H6Dob+XtrL_!=Bh#UOOJ5>4LCe(|RoREZej72@#+X|X zlG?CNg)ggEso5o=G;1LEHhn#|sp;7vDXP+XE^-sXXOwZ1foB;TPrV*;G^+L4T_Lz} zu~D^;3zuYm9kbEFkhD&QdPY3unF`5--d4 zigZWVu^br9VQAT@Qv8{EC&Y7;h;e5@z2k;@O<^RyAUBq6aH_R-u1t;>L*jB3Er1}u zS%9JF{-!YKy|M%3>?&)+vA~pUt|b(5n=sDNhro?%&K{ZpnVNlS zkplQlD2sgCKGpDTh(5Qs6#<~MH_E@Rj;|bMV2n@wUHOo5g5GE|x9w~@Vsz_V?=uX2 zohs}j<6?nCUf8Q5tjSi85OUH!bv`kLm^l?JNi5H^0omCR^UsmuBCF+7_6X&DS<>9V zoc2Wc>MNQ~PE^XK(kCe;{aERH;41c9)@`pS(F0B7kZIKIN!+h)Crxfv9s7x{w+eJI zU2ay>ZBgo|NaYIDP3SmZg#aD^=f|NSeb0`v#ZwhE%zOU?yB|;85hVjRT8jn_U-jio zSqHOvS|-6LVl1G-92v)2tjca`5Z7Xz8`}YVpkp;U?u}AVNKxOI2T|Xc$I*h;6H&1R zE0Ds)hIeH=Yy%A!=;?S@9y;@4RD4%vy*9@Md=Ev%3&uBLD5~gJvhL*y`uVl~O^bWn zaQBl9e=t2p?j8$tf+P5C6sb^Q%tOYqF2+LwV;;nBv{0HWUdt|y(Mkq!Ot|Y*ybd(L zPO3)QV%mmKIu_G9!-z}KUJJU?(_^T4fUWuP0(Zw)Fbv(Dim{09%tJBZMvmXoqg~&W zJ{1#xA=`Pv9n?-m8ZI&!*o4h0Ou+g}nUpp1>zKhr!KwW^M!G0DHH6v-X0z|aAp0`+ z_G&DnT~xqLF?J?Rj64u8(9flAjhhi3V)h*UP)H5SYo3hEH+l54SSaZS;-wVw@;FN& z(;AtS^2g2pVJw)c?54PG!OZoIY=}c(7)gNRsl9R90!DTljQ|V~uidIPs$`gPJRZ+5 zvwS)Z4oa$cZIwYO?3lU3@q#;igK(9(V%;E@ja6hXP!Hp%?phwvq10HPeYM?)?`Tsg zj2bPv`_dL8>VWnN+AtC20alNg0b5)Q6uG`~=B4%mqVhhBqwv#+1rB~DOkvNY5D8Ht z$~K>fP*Ju)Y3*fZD%(gHHY^~~#MQ!wJ=sJvvAAKD9wtygybH;OGQy1Qi2`EeI~>ih z*=*%1^M}wISve?0+b*$Ly@QZrK^3UamP@zDdV#$H=~7&eXMm^JGz;-eoJ9cS0nlTO zt5;G4@1W0qbpg*JE{GuAEWz_dwyvIzv$X`vInP0p;%fEz`s|Na(XMM)6b-@(ESb=7 zhmNQ2GLNW^jA3(!5!T(8>gu39mQWEn2;s=c4l`Hzw`2imp>=U~lr*k4*JoFEke*oA z9K{G_p{E--USWFL)PXp2z7_Fjsv~_$pMIj&=IB~026wvF7@bT5dMue;0tALrVXKpL zugl>ASfPN0u@@k02Fl1!aqgXp9_K=#pex(O6H2U+4* z)$NY2V(*xiFs83D)&tHZIjK_*rRj)5R%Gl#hC%Vyz`(JqBUHy+GriVM7BBXzB2SqE z+P6@G9(Sw(`i~NnMEPz#3zZT^sDy%B`f@^xN9k9M(eL~8OD}pC`z^2N>AfX@@2#Tu zKkF>DlnpEazr`l{mHQW0UX5O!|n(c$MC79;|_R|2rt^*!W=`hzvr7==dGqqpVLAg08fU8~FzN|adIX0#;9cUwUd~59lfsqg(Fyd-Z)n}TY7avoReHpQ=l^!e1D-5#p*~J1%?O9)X zm=RopDf(u8J<(W{QE_$w-Gx4i8yNbHyn^U2)1Bdo5ys@>wnkTCM=m z=5g)&o#ntYkv1sIGI1pH1XzxR-ZC2Iu1#lFlef3o7?f^Sg?S8XA~KJt;xUAIkTagx z4x(Ms5hy@!CbRuy&LZ4pM2;*|@k+|oMf!zr&;x!DG_b6DnBDbgE`a8Ml?9n;R~MTQ zu*~Xbdeft8)7iBJ!zG=;%#NzU5tTnmt8L_+E-2-yl>DfGUH~NanA9*M1-Q#ZR+K@R zq{?RB*F|DG3e_D|v+KKx>+))xcXm(Y{Kjs<#_^BRz6FfrJPWEw`@0zx1r=SXWR8@~ z9B3ISzv)5&L&fzGQcSPfTnM@kbW_kx=>{V}DWx(tb`$IdRYXEBu1XVgPEwDydKoAH zPl(1>t8ioFvBnmp-sv`c5+dw#-P*~u>3`|g7Oqa;(8B;KQuRG0fYEMq9&W5C8A4H! zGWRe`O@G|YhM3RH>0#auILyBRxc17j^zm+O#|rI2Ad^R0K0oVgNYNkAQ}q95>+Wy$ zWh}Q?0&#!L7xv4jGovo$3(D>VmQsn+7eql4RpOZ93|bbU(9asELb-s7mmX9?W4L2h zs9I7P6kkRibOGwbp_Qx}9*S5NVzPJ;^;_H_Fv_BSIp~d{7*LL>rkXCbVWzMpYi%uX_cP@QCCzF z!ILJ3Be*Z@EHqc#kfcJinnV!agJXcT7|nt`#oslHwTd%BvWg9K|&`+GBDe{x5Gu%$G&V^eY{b%5TGsn?eFrVsT> z{Yknd_+vFw_Z~L&O}&}AOXhj(`KEaRJps+`Y)wmQA8x_!hAWK-7=DD2NQ`43`tj^? zF^n1EZkY$B0xF(b=vB@sKvR=7) zJzy8(uep9G8(z=5&{IWW*A@G^&%jmgV29bFY54vBLly@LYH{Hv!bl+aj zuH7M}jfx2lVpit1(r2z{rd&4*!i%|SG#J4?d1n@%>fR0P%~(x0IX3CcO&heI^=ezz8@>|3KH1WO)S3<2^ChUj zl~C#1H)zLu(5p6R-*!Y`M=sDb5jQ;p7N$q#N(v~DroHYjP#3Rm@NMxgwfZI`5 ziMx$0hjFX#v3bIT0GwF@vos>syAi}*eU6#B9E)4-Ct~~magOu_VwL2{j4zKDrq{vb z4)Fl22}gxy&Nh_&(MHFCC>kxIHp`( z6+f(7dgUeo3!%(E;obUZ5=@KJllG9!-fpw|h2sVOkLLHs{0?~oo%7MxwpnZMhF z(d6|`(u?(B@}=a^3iFcJ-Li>)llg{+X(0K~e^klO0+LAuhwW-QY^zC=UBWNcs${rO zot5<85OU_Xn>GnEIsSU`(>TB5-gmiIE_rJr0fz{X^Jtkzq;Lps=8x-vjaJ3fep2H?BqJlp zR^IZv0JV64tr`O;rw|(; z$hRo8C>Bv7kwuY)SXc>%7lj-AVgI7mR+rBe^4L8~JdK_v@o>_pMM{T~c8BzMa^QZ- znrz&R^x2^#Wgd%deMTEK(t0|C_2i%|*C9yxP*Qvnz8L3*CzC@X;uh&ia>1<1_IMH} z>_bUt6jg^=TL`TVzBqMxGu4(KhjpOKL0$G+OZ`As!O(3p&|%Zg1G)@d{{(c)83s#6 z{056bjzpGceiUp-qh;&a806G`(l>S*D_lZ8g(|7sAvnKYZlYAEc3E$?S8 zRs}fjy5u!JT*|z~=d*-bSKwYI4h+GSxCVr{x;?ZKadc}ZVrSznt0m_2`Sn|(mZ0p6 gSZoeX|NmZMfpAmhWRA!G#xmW^bHAPS|MlO01D~TOI{*Lx literal 0 HcmV?d00001 diff --git a/ISIS PLM/LINK.OVL b/ISIS PLM/LINK.OVL new file mode 100644 index 0000000000000000000000000000000000000000..34b6445f896b4abc24ff3272367e7b82a89dddeb GIT binary patch literal 4608 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 literal 0 HcmV?d00001 diff --git a/ISIS PLM/LOCATE b/ISIS PLM/LOCATE new file mode 100644 index 0000000000000000000000000000000000000000..76f3e901a98ff88670b2cc80998edc88818bcb0b GIT binary patch literal 15104 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 F{{!Ih(zyTt literal 0 HcmV?d00001 diff --git a/ISIS PLM/LS.COM b/ISIS PLM/LS.COM new file mode 100644 index 0000000000000000000000000000000000000000..413bceca00ddbf1470c0ccc51a6dc12939020b1b GIT binary patch literal 3072 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 T60TWM$8YFZD{tA+LKXiPXz3&z literal 0 HcmV?d00001 diff --git a/ISIS PLM/M80.COM b/ISIS PLM/M80.COM new file mode 100644 index 0000000000000000000000000000000000000000..d54606572457565559674a8d67d7ded4b80f78ae GIT binary patch literal 20096 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 LleoA4|BnA}sttr@ literal 0 HcmV?d00001 diff --git a/ISIS PLM/MAKEPIP.SUB b/ISIS PLM/MAKEPIP.SUB new file mode 100644 index 0000000..94256f5 --- /dev/null +++ b/ISIS PLM/MAKEPIP.SUB @@ -0,0 +1,14 @@ +; must use "submit makepip" to execute, "do makepip" will fail +pip d:trint.src=a:os5trint.src +pip d:=a:pip.plm +fixeof d:pip.plm +isx +:f1:plm80 :f3:pip.plm +:f2:asm80 :f3:trint.src +:f1:cpm +isx +:f1:link :f3:pip.obj,:f3:trint.obj,:f1:x0100,:f1:plm80.lib to :f3:pip.mod +:f1:locate :f3:pip.mod code(0100H) stacksize(100) +:f1:cpm +objcpm d:pip + \ No newline at end of file diff --git a/ISIS PLM/MC.SUB b/ISIS PLM/MC.SUB new file mode 100644 index 0000000..6c3b12e --- /dev/null +++ b/ISIS PLM/MC.SUB @@ -0,0 +1,5 @@ +; compile an assembler program +A:M80 =$1/M +A:L80 $1,$1/N/E +ERA $1.REL + \ No newline at end of file diff --git a/ISIS PLM/MCC.SUB b/ISIS PLM/MCC.SUB new file mode 100644 index 0000000..8cf9073 --- /dev/null +++ b/ISIS PLM/MCC.SUB @@ -0,0 +1,6 @@ +; read and compile an assembler program +A:R $1.MAC +A:M80 =$1/M +A:L80 $1,$1/N/E +ERA $1.REL + \ No newline at end of file diff --git a/ISIS PLM/MCCL.SUB b/ISIS PLM/MCCL.SUB new file mode 100644 index 0000000..aae2261 --- /dev/null +++ b/ISIS PLM/MCCL.SUB @@ -0,0 +1,8 @@ +; read and compile an assembler program +R $1.MAC +M80 $1,$1=$1/M +L80 $1,$1/N/E +ERA $1.REL +W $1.PRN +ERA $1.PRN + \ No newline at end of file diff --git a/ISIS PLM/MEMMGR.LIT b/ISIS PLM/MEMMGR.LIT new file mode 100644 index 0000000..dba5769 --- /dev/null +++ b/ISIS PLM/MEMMGR.LIT @@ -0,0 +1,15 @@ +$nolist +/* + Memmgr Literals +*/ + + declare allocated literally '80H'; + + declare memory$descriptor literally + 'structure (base byte, + size byte, + attrib byte, + bank byte)'; + +$list + \ No newline at end of file diff --git a/ISIS PLM/MONX b/ISIS PLM/MONX new file mode 100644 index 0000000000000000000000000000000000000000..8a13460aef3a8a18779fd0e06fbc4bf40bc3251d GIT binary patch literal 128 zcmZRQU|{j}_lsa)U}RxnW@2DqW(HywAa0XjWnl6TX0R8NW?*Cht1@JO&_+O-6{yR| lkwKS@10<`(!0_^(0viKRGb6(_7FH0&@Qsg=;iD9O004`64<`Ts literal 0 HcmV?d00001 diff --git a/ISIS PLM/MOVER.MAC b/ISIS PLM/MOVER.MAC new file mode 100644 index 0000000..dc96a5d --- /dev/null +++ b/ISIS PLM/MOVER.MAC @@ -0,0 +1,26 @@ + .Z80 + aseg + maclib MEMCFG.LIB ; define configuration parameters + org 100h + +cpmsiz equ ccplen + bdoslen + bioslen +cpmsrc equ 00A00h + +start: ld hl,cpmsrc + ld de,ccpph + ld bc,cpmsiz +again: ld a,(hl) + ld (de),a + inc hl + inc de + dec bc + ld a,c + or b + jp nz,again + jp biosph + +movend equ $ + ds 0200h-movend ; fill remainder with zeroes + + end start + \ No newline at end of file diff --git a/ISIS PLM/OBJCPM.COM b/ISIS PLM/OBJCPM.COM new file mode 100644 index 0000000000000000000000000000000000000000..6e8fd452d3c1ab637ddf103d0233105be7d50944 GIT binary patch literal 2816 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 literal 0 HcmV?d00001 diff --git a/ISIS PLM/OS5TRINT.SRC b/ISIS PLM/OS5TRINT.SRC new file mode 100644 index 0000000..72de2ac --- /dev/null +++ b/ISIS PLM/OS5TRINT.SRC @@ -0,0 +1,15 @@ +; PIP INTERFACE TO BDOS (CAN BE USED FOR OTHER TRANSIENTS) + PUBLIC BOOT,IOBYTE,BDISK,BDOS,MON1,MON2,MON3 + PUBLIC MAXB,FCB,BUFF +BOOT EQU 0000H ;WARM START +IOBYTE EQU 0003H ;IO BYTE +BDISK EQU 0004H ;BOOT DISK # +BDOS EQU 0005H ;BDOS ENTRY +MON1 EQU 0005H ;BDOS ENTRY +MON2 EQU 0005H ;BDOS ENTRY +MON3 EQU 0005H ;BDOS ENTRY +MAXB EQU 0006H ;MAX MEM BASE +FCB EQU 005CH ;DEFAULT FCB +BUFF EQU 0080H ;DEFAULT BUFFER + END + \ No newline at end of file diff --git a/ISIS PLM/PIP b/ISIS PLM/PIP new file mode 100644 index 0000000000000000000000000000000000000000..8eb676ebec1daad936937c57041118853e25237b GIT binary patch literal 8064 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 literal 0 HcmV?d00001 diff --git a/ISIS PLM/PIP.COM b/ISIS PLM/PIP.COM new file mode 100644 index 0000000000000000000000000000000000000000..b8750478254121730adfabfa1ab491b0f8a36035 GIT binary patch literal 7424 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 TJ7>D|jTQC!s}-jI|Md4iv$6(X literal 0 HcmV?d00001 diff --git a/ISIS PLM/PIP.LIN b/ISIS PLM/PIP.LIN new file mode 100644 index 0000000..87c5d1d --- /dev/null +++ b/ISIS PLM/PIP.LIN @@ -0,0 +1,4 @@ +0000 PIP# +0000 X0100# + + \ No newline at end of file diff --git a/ISIS PLM/PIP.LST b/ISIS PLM/PIP.LST new file mode 100644 index 0000000..fdf1b98 --- /dev/null +++ b/ISIS PLM/PIP.LST @@ -0,0 +1,1700 @@ + PL/M-80 COMPILER PAGE 1 + + +ISIS-II PL/M-80 V3.1 COMPILATION OF MODULE PIPMOD +OBJECT MODULE PLACED IN :F3:PIP.OBJ +COMPILER INVOKED BY: :F1:PLM80 :F3:PIP.PLM + + + + 1 PIPMOD: + DO; + /* P E R I P H E R A L I N T E R C H A N G E P R O G R A M + + COPYRIGHT (C) 1976, 1977, 1978, 1979, 1980 + DIGITAL RESEARCH + BOX 579 + PACIFIC GROVE, CA + 93950 + */ + + 2 1 DECLARE + CPMVERSION LITERALLY '0020H'; /* REQUIRED FOR OPERATION */ + + 3 1 DECLARE + IOBYTE BYTE EXTERNAL, /* IOBYTE AT 0003H */ + MAXB ADDRESS EXTERNAL, /* ADDR FIELD OF JMP BDOS */ + FCB (33) BYTE EXTERNAL, /* DEFAULT FILE CONTROL BLOCK */ + BUFF(128)BYTE EXTERNAL; /* DEFAULT BUFFER */ + + 4 1 DECLARE + ENDFILE LITERALLY '1AH', /* END OF FILE MARK */ + JMP LITERALLY '0C3H', /* 8080 JUMP INSTRUCTION */ + RET LITERALLY '0C9H'; /* 8080 RETURN */ + + /* THE FIRST PORTION OF THE PIP PROGRAM 'FAKES' THE PAGE ONE + (100H - 1FFH) SECTION OF PIP WHICH CONTAINS A JUMP TO PIPENTRY, AND + SPACE FOR CUSTOM I/O DRIVERS (WHICH CAN BE 'PATCHED' USING DDT) IN THE + REMAINING PAGE ONE AREA. THE PIP PROGRAM ACTUALLY STARTS AT 200H */ + + 5 1 DECLARE JUMP BYTE DATA(JMP); /* JMP INSTRUCTION TO */ + /* JMP .PIPENTRY-3 WHERE THE LXI SP,STACK ACTUALLY OCCURS */ + 6 1 DECLARE JADR ADDRESS DATA(.PIPENTRY-3); /* START OF PIP */ + 7 1 DECLARE INPSUB(3) BYTE DATA(RET,0,0); /* INP: RET NOP NOP */ + 8 1 DECLARE OUTSUB(3) BYTE DATA(RET,0,0); /* OUT: RET NOP NOP */ + 9 1 DECLARE INPDATA BYTE DATA(ENDFILE); /* RETURNED DATA */ + /* NOTE: PAGE 1 AT 100H CONTAINS THE FOLLOWING + 100H: JMP PIPENTRY ;TO START THE PIP PROGRAM + 103H: RET ;INP: DEFAULTS TO EMPTY INPUT (DATA 1AH AT 109H) + 104H: NOP + 105H: NOP + 106H: RET ;OUT: DEFAULTS TO EMPTY OUTPUT + 107H: NOP + 108H: NOP + 109H: 1AH=ENDFILE ;DATA FROM INP: FUNCTION IS STORED HERE ON + ;RETURN FROM THE INP: ENTRY POINT + 10AH: - 1FFH ;SPACE RESERVED FOR SPECIAL PURPOSE + ; DRIVERS - IF INCLUDED, THEN REPLACE 103H AND 106H BY JMP'S + ; TO THE PROPER LOCATIONS WITHIN THE RESERVED AREA. + ; ALSO, RETURN DATA FROM INP: ENTRY POINT AT 109H. + ; THESE DRIVERS ARE MOST EASILY INSERTED WITH THE DDT PROGRAM + PL/M-80 COMPILER PAGE 2 + + + ; UNDER CP/M + */ + + 10 1 DECLARE /* 16 BYTE MESSAGE */ + FREEMEMORY LITERALLY '''(INP:/OUT:SPACE)''', + /* 256 BYTE AREA FOR INP: OUT: PATCHING */ + RESERVED(*) BYTE DATA(0,0,0,0,0,0, + FREEMEMORY, FREEMEMORY, FREEMEMORY, + FREEMEMORY, FREEMEMORY, FREEMEMORY, FREEMEMORY, + FREEMEMORY, FREEMEMORY, FREEMEMORY, FREEMEMORY, + FREEMEMORY, FREEMEMORY, FREEMEMORY, FREEMEMORY); + + + + + 11 1 DECLARE COPYRIGHT(*) BYTE DATA ( + ' COPYRIGHT (C) 1979, DIGITAL RESEARCH, PIP VERS 1.5'); + + 12 1 DECLARE INPLOC ADDRESS DATA (.INPSUB); /* ADDRESS OF INP: DEVICE */ + 13 1 DECLARE OUTLOC ADDRESS DATA (.OUTSUB); /* ADDRESS OF OUT: DEVICE */ + + 14 1 OUT: PROCEDURE(B); + 15 2 DECLARE B BYTE; + /* SEND B TO OUT: DEVICE */ + 16 2 CALL OUTLOC; + 17 2 END OUT; + + 18 1 INP: PROCEDURE BYTE; + 19 2 CALL INPLOC; + 20 2 RETURN INPDATA; + 21 2 END INP; + + + 22 1 TIMEOUT: PROCEDURE; + /* WAIT FOR 50 MSEC */ + 23 2 CALL TIME(250); CALL TIME(250); + 25 2 END TIMEOUT; + + /* LITERAL DECLARATIONS */ + 26 1 DECLARE + LIT LITERALLY 'LITERALLY', + LPP LIT '60', /* LINES PER PAGE */ + TAB LIT '09H', /* HORIZONTAL TAB */ + FF LIT '0CH', /* FORM FEED */ + LA LIT '05FH', /* LEFT ARROW */ + LB LIT '05BH', /* LEFT BRACKET */ + RB LIT '05DH', /* RIGHT BRACKET */ + XOFF LIT '13H', /* TRANSMIT BUFFER FUNCTION */ + + RDR LIT '5', + LST LIT '10', + PUNP LIT '15', /* POSITION OF 'PUN' + 1 */ + CONP LIT '19', /* CONSOLE */ + NULP LIT '19', /* NUL: BEFORE INCREMENT */ + EOFP LIT '20', /* EOF: BEFORE INCREMENT */ + HSRDR LIT 'RDR', /* READER DEVICES */ + PRNT LIT '10', /* PRINTER */ + PL/M-80 COMPILER PAGE 3 + + + + + FSIZE LIT '33', + FRSIZE LIT '36', /* SIZE OF RANDOM FCB */ + NSIZE LIT '8', + FNSIZE LIT '11', + MDISK LIT '1', + FNAM LIT '8', + FEXT LIT '9', + FEXTL LIT '3', + ROFILE LITERALLY '9', /* READ ONLY FILE FIELD */ + SYSFILE LITERALLY '10', /* SYSTEM FILE FIELD */ + FREEL LIT '12', /* REEL NUMBER FIELD OF FCB */ + + HBUFS LIT '80', /* "HEX" BUFFER SIZE */ + + ERR LIT '0', + SPECL LIT '1', + FILE LIT '2', + PERIPH LIT '3', + DISKNAME LIT '4'; + + 27 1 DECLARE + COLUMN BYTE, /* COLUMN COUNT FOR PRINTER TABS */ + LINENO BYTE, /* LINE WITHIN PAGE */ + AMBIG BYTE, /* SET FOR AMBIGUOUS FILE REFS */ + PARSET BYTE, /* TRUE IF PARAMETERS PRESENT */ + FEEDBASE BYTE, /* USED TO FEED SEARCH CHARACTERS */ + FEEDLEN BYTE, /* LENGTH OF FEED STRING */ + MATCHLEN BYTE, /* USED IN MATCHING STRINGS */ + QUITLEN BYTE, /* USED TO TERMINATE QUIT COMMAND */ + NBUF BYTE, /* NUM BUFFERS-1 IN SBUFF AND DBUFF */ + CDISK BYTE, /* CURRENT DISK */ + BUFFER LITERALLY 'BUFF', /* DEFAULT BUFFER */ + SEARFCB LITERALLY 'FCB', /* SEARCH FCB IN MULTI COPY */ + MEMSIZE LITERALLY 'MAXB', /* MEMORY SIZE */ + SBLEN ADDRESS, /* SOURCE BUFFER LENGTH */ + DBLEN ADDRESS, /* DEST BUFFER LENGTH */ + SBASE ADDRESS, /* SOURCE BUFFER BASE */ + /* THE VECTORS DBUFF AND SBUFF ARE DECLARED WITH DIMENSION + 1024, BUT ACTUALLY VARY WITH THE FREE MEMORY SIZE */ + DBUFF(1024) BYTE AT (.MEMORY), /* DESTINATION BUFFER */ + SBUFF BASED SBASE (1024) BYTE, /* SOURCE BUFFER */ + SDISK BYTE, /* SOURCE DISK */ + (SCOM, DHEX) BYTE, /* SOURCE IS 'COM' FILE IF TRUE */ + /* DEST IS 'HEX' FILE IF TRUE */ + SOURCE (FSIZE) BYTE, /* SOURCE FCB */ + SFUB BYTE AT(.SOURCE(13)), /* UNFILLED BYTES FIELD */ + DEST (FRSIZE) BYTE, /* DESTINATION FCB */ + DESTR ADDRESS AT(.DEST(33)), /* RANDOM RECORD POSITION */ + DESTO BYTE AT(.DEST(35)), /* RANDOM OVERFLOW BYTE */ + DFUB BYTE AT (.DEST(13)), /* UNFILLED BYTES FIELD */ + DDISK BYTE, /* DESTINATION DISK */ + HBUFF(HBUFS) BYTE, /* HEX FILE BUFFER */ + HSOURCE BYTE, /* NEXT HEX SOURCE CHARACTER */ + + NSOURCE ADDRESS, /* NEXT SOURCE CHARACTER */ + PL/M-80 COMPILER PAGE 4 + + + HARDEOF ADDRESS, /* SET TO NSOURCE ON REAL EOF */ + NDEST ADDRESS; /* NEXT DESTINATION CHARACTER */ + + 28 1 DECLARE + /* SUBMIT FILE CONTROL BLOCK FOR ERROR DELETE */ + SUBFCB (*) BYTE DATA (0,'$$$ SUB',0,0,0); + + 29 1 DECLARE + PDEST BYTE, /* DESTINATION DEVICE */ + PSOURCE BYTE; /* CURRENT SOURCE DEVICE */ + + 30 1 DECLARE + MULTCOM BYTE, /* FALSE IF PROCESSING ONE LINE */ + PUTNUM BYTE, /* SET WHEN READY FOR NEXT LINE NUM */ + CONCNT BYTE, /* COUNTER FOR CONSOLE READY CHECK */ + CHAR BYTE, /* LAST CHARACTER SCANNED */ + TYPE BYTE, /* TYPE OF CHARACTER SCANNED */ + FLEN BYTE; /* FILE NAME LENGTH */ + + 31 1 MON1: PROCEDURE(F,A) EXTERNAL; + 32 2 DECLARE F BYTE, + A ADDRESS; + 33 2 END MON1; + + 34 1 MON2: PROCEDURE(F,A) BYTE EXTERNAL; + 35 2 DECLARE F BYTE, + A ADDRESS; + 36 2 END MON2; + + 37 1 MON3: PROCEDURE(F,A) ADDRESS EXTERNAL; + 38 2 DECLARE F BYTE, + A ADDRESS; + 39 2 END MON3; + + 40 1 BOOT: PROCEDURE EXTERNAL; + /* SYSTEM REBOOT */ + 41 2 END BOOT; + + 42 1 READRDR: PROCEDURE BYTE; + /* READ CURRENT READER DEVICE */ + 43 2 RETURN MON2(3,0); + 44 2 END READRDR; + + 45 1 READCHAR: PROCEDURE BYTE; + /* READ CONSOLE CHARACTER */ + 46 2 RETURN MON2(1,0); + 47 2 END READCHAR; + + 48 1 DECLARE + TRUE LITERALLY '1', + FALSE LITERALLY '0', + FOREVER LITERALLY 'WHILE TRUE', + CR LITERALLY '13', + LF LITERALLY '10', + WHAT LITERALLY '63'; + + 49 1 PRINTCHAR: PROCEDURE(CHAR); + PL/M-80 COMPILER PAGE 5 + + + 50 2 DECLARE CHAR BYTE; + 51 2 CALL MON1(2,CHAR AND 7FH); + 52 2 END PRINTCHAR; + + 53 1 CRLF: PROCEDURE; + 54 2 CALL PRINTCHAR(CR); + 55 2 CALL PRINTCHAR(LF); + 56 2 END CRLF; + + 57 1 PRINT: PROCEDURE(A); + 58 2 DECLARE A ADDRESS; + /* PRINT THE STRING STARTING AT ADDRESS A UNTIL THE + NEXT DOLLAR SIGN IS ENCOUNTERED */ + 59 2 CALL CRLF; + 60 2 CALL MON1(9,A); + 61 2 END PRINT; + + 62 1 DECLARE DCNT BYTE; + + 63 1 VERSION: PROCEDURE ADDRESS; + 64 2 RETURN MON3(12,0); /* VERSION NUMBER */ + 65 2 END VERSION; + + 66 1 INITIALIZE: PROCEDURE; + 67 2 CALL MON1(13,0); + 68 2 END INITIALIZE; + + 69 1 SELECT: PROCEDURE(D); + 70 2 DECLARE D BYTE; + 71 2 CALL MON1(14,D); + 72 2 END SELECT; + + 73 1 OPEN: PROCEDURE(FCB); + 74 2 DECLARE FCB ADDRESS; + 75 2 DCNT = MON2(15,FCB); + 76 2 END OPEN; + + 77 1 CLOSE: PROCEDURE(FCB); + 78 2 DECLARE FCB ADDRESS; + 79 2 DCNT = MON2(16,FCB); + 80 2 END CLOSE; + + 81 1 SEARCH: PROCEDURE(FCB); + 82 2 DECLARE FCB ADDRESS; + 83 2 DCNT = MON2(17,FCB); + 84 2 END SEARCH; + + 85 1 SEARCHN: PROCEDURE; + 86 2 DCNT = MON2(18,0); + 87 2 END SEARCHN; + + 88 1 DELETE: PROCEDURE(FCB); + 89 2 DECLARE FCB ADDRESS; + 90 2 CALL MON1(19,FCB); + 91 2 END DELETE; + + 92 1 DISKREAD: PROCEDURE(FCB) BYTE; + PL/M-80 COMPILER PAGE 6 + + + 93 2 DECLARE FCB ADDRESS; + 94 2 RETURN MON2(20,FCB); + 95 2 END DISKREAD; + + 96 1 DISKWRITE: PROCEDURE(FCB) BYTE; + 97 2 DECLARE FCB ADDRESS; + 98 2 RETURN MON2(21,FCB); + 99 2 END DISKWRITE; + + 100 1 MAKE: PROCEDURE(FCB); + 101 2 DECLARE FCB ADDRESS; + 102 2 DCNT = MON2(22,FCB); + 103 2 END MAKE; + + 104 1 RENAME: PROCEDURE(FCB); + 105 2 DECLARE FCB ADDRESS; + 106 2 CALL MON1(23,FCB); + 107 2 END RENAME; + + 108 1 DECLARE + CUSER BYTE, /* CURRENT USER NUMBER */ + SUSER BYTE; /* SOURCE USER NUMBER ('G' PARAMETER) */ + + 109 1 SETIND: PROCEDURE(FCB); + 110 2 DECLARE FCB ADDRESS; + 111 2 CALL MON1(30,FCB); + 112 2 END SETIND; + + 113 1 GETUSER: PROCEDURE BYTE; + 114 2 RETURN MON2(32,0FFH); + 115 2 END GETUSER; + + 116 1 SETUSER: PROCEDURE(USER); + 117 2 DECLARE USER BYTE; + 118 2 CALL MON1(32,USER); + 119 2 END SETUSER; + + 120 1 SETCUSER: PROCEDURE; + 121 2 CALL SETUSER(CUSER); + 122 2 END SETCUSER; + + 123 1 SETSUSER: PROCEDURE; + 124 2 CALL SETUSER(SUSER); + 125 2 END SETSUSER; + + 126 1 READ$RANDOM: PROCEDURE(FCB) BYTE; + 127 2 DECLARE FCB ADDRESS; + 128 2 RETURN MON2(33,FCB); + 129 2 END READ$RANDOM; + + 130 1 WRITE$RANDOM: PROCEDURE(FCB) BYTE; + 131 2 DECLARE FCB ADDRESS; + 132 2 RETURN MON2(34,FCB); + 133 2 END WRITE$RANDOM; + + 134 1 SET$RANDOM: PROCEDURE(FCB); + 135 2 DECLARE FCB ADDRESS; + PL/M-80 COMPILER PAGE 7 + + + /* SET RANDOM RECORD POSITION */ + 136 2 CALL MON1(36,FCB); + 137 2 END SET$RANDOM; + + 138 1 DECLARE CBUFF(130) BYTE, /* COMMAND BUFFER */ + MAXLEN BYTE AT (.CBUFF(0)), /* MAX BUFFER LENGTH */ + COMLEN BYTE AT (.CBUFF(1)), /* CURRENT LENGTH */ + COMBUFF (128) BYTE AT (.CBUFF(2)); /* COMMAND BUFFER CONTENTS */ + 139 1 DECLARE (TCBP,CBP) BYTE; /* TEMP CBP, COMMAND BUFFER POINTER */ + + 140 1 READCOM: PROCEDURE; + /* READ INTO COMMAND BUFFER */ + 141 2 MAXLEN = 128; + 142 2 CALL MON1(10,.MAXLEN); + 143 2 END READCOM; + + 144 1 DECLARE MCBP BYTE; + + 145 1 CONBRK: PROCEDURE BYTE; + /* CHECK CONSOLE CHARACTER READY */ + 146 2 RETURN MON2(11,0); + 147 2 END CONBRK; + + 148 1 DECLARE /* CONTROL TOGGLE VECTOR */ + CONT(26) BYTE, /* ONE FOR EACH ALPHABETIC */ + /* 00 01 02 03 04 05 06 07 08 09 10 11 12 13 + A B C D E F G H I J K L M N + 14 15 16 17 18 19 20 21 22 23 24 25 + O P Q R S T U V W X Y Z */ + BLOCK BYTE AT(.CONT(1)), /* BLOCK MODE TRANSFER */ + DELET BYTE AT(.CONT(3)), /* DELETE CHARACTERS */ + ECHO BYTE AT(.CONT(4)), /* ECHO CONSOLE CHARACTERS */ + FORMF BYTE AT(.CONT(5)), /* FORM FILTER */ + GETU BYTE AT(.CONT(6)), /* GET FILE, USER # */ + HEXT BYTE AT(.CONT(7)), /* HEX FILE TRANSFER */ + IGNOR BYTE AT(.CONT(8)), /* IGNORE :00 RECORD ON FILE */ + LOWER BYTE AT(.CONT(11)), /* TRANSLATE TO LOWER CASE */ + NUMB BYTE AT(.CONT(13)), /* NUMBER OUTPUT LINES */ + OBJ BYTE AT(.CONT(14)), /* OBJECT FILE TRANSFER */ + PAGCNT BYTE AT(.CONT(15)), /* PAGE LENGTH */ + QUITS BYTE AT(.CONT(16)), /* QUIT COPY */ + RSYS BYTE AT(.CONT(17)), /* READ SYSTEM FILES */ + STARTS BYTE AT(.CONT(18)), /* START COPY */ + TABS BYTE AT(.CONT(19)), /* TAB SET */ + UPPER BYTE AT(.CONT(20)), /* UPPER CASE TRANSLATE */ + VERIF BYTE AT(.CONT(21)), /* VERIFY EQUAL FILES ONLY */ + WRROF BYTE AT(.CONT(22)), /* WRITE TO R/O FILE */ + ZEROP BYTE AT(.CONT(25)); /* ZERO PARITY ON INPUT */ + + 149 1 SETDMA: PROCEDURE(A); + 150 2 DECLARE A ADDRESS; + 151 2 CALL MON1(26,A); + 152 2 END SETDMA; + + /* INTELLEC 8 INTEL/ICOM READER INPUT */ + + 153 1 INTIN: PROCEDURE BYTE; + PL/M-80 COMPILER PAGE 8 + + + /* READ THE INTEL / ICOM READER */ + 154 2 DECLARE PTRI LITERALLY '3', /* DATA */ + PTRS LITERALLY '1', /* STATUS */ + PTRC LITERALLY '1', /* COMMAND */ + PTRG LITERALLY '0CH', /* GO */ + PTRN LITERALLY '08H'; /* STOP */ + + /* STROBE THE READER */ + 155 2 OUTPUT(PTRC) = PTRG; + 156 2 OUTPUT(PTRC) = PTRN; + 157 2 DO WHILE NOT ROL(INPUT(PTRS),3); /* NOT READY */ + 158 3 END; + /* DATA READY */ + 159 2 RETURN INPUT(PTRI) AND 7FH; + 160 2 END INTIN; + + + 161 1 DECLARE ZEROSUP BYTE, /* ZERO SUPPRESSION */ + (C3,C2,C1) BYTE; /* LINE COUNT ON PRINTER */ + + 162 1 ERROR: PROCEDURE(A); + 163 2 DECLARE A ADDRESS, I BYTE; + 164 2 CALL SETCUSER; + 165 2 CALL PRINT(A); CALL PRINTCHAR(':'); CALL PRINTCHAR(' '); + 168 2 DO I = TCBP TO CBP; + 169 3 IF I < COMLEN THEN CALL PRINTCHAR(COMBUFF(I)); + 171 3 END; + /* ZERO THE COMLEN IN CASE THIS IS A SINGLE COMMAND */ + 172 2 COMLEN = 0; + /* DELETE ANY $$$.SUB FILES IN CASE BATCH PROCESSING */ + /* DELETE SUB FILE ONLY IF PRESENT (MAY BE R/O DISK) */ + 173 2 CALL SEARCH(.SUBFCB); + 174 2 IF DCNT <> 255 THEN CALL DELETE(.SUBFCB); + 176 2 CALL CRLF; + 177 2 GO TO RETRY; + 178 2 END ERROR; + + 179 1 MOVE: PROCEDURE(S,D,N); + 180 2 DECLARE (S,D) ADDRESS, N BYTE; + 181 2 DECLARE A BASED S BYTE, B BASED D BYTE; + 182 2 DO WHILE (N:=N-1) <> 255; + 183 3 B = A; S = S+1; D = D+1; + 186 3 END; + 187 2 END MOVE; + + + 188 1 FILLSOURCE: PROCEDURE; + /* FILL THE SOURCE BUFFERS */ + 189 2 DECLARE (I,J) BYTE; + 190 2 NSOURCE = 0; + 191 2 CALL SELECT(SDISK); + 192 2 CALL SETSUSER; /* SOURCE USER NUMBER SET */ + 193 2 DO I = 0 TO NBUF; + /* SET DMA ADDRESS TO NEXT BUFFER POSIITION */ + 194 3 CALL SETDMA(.SBUFF(NSOURCE)); + 195 3 IF (J := DISKREAD(.SOURCE)) <> 0 THEN + 196 3 DO; IF J <> 1 THEN + PL/M-80 COMPILER PAGE 9 + + + 198 4 CALL ERROR(.('DISK READ ERROR$')); + /* END - OF - FILE */ + 199 4 HARDEOF = NSOURCE; /* SET HARD END-OF-FILE */ + 200 4 SBUFF(NSOURCE) = ENDFILE; I = NBUF; + 202 4 END; ELSE + 203 3 NSOURCE = NSOURCE + 128; + 204 3 END; + 205 2 NSOURCE = 0; + 206 2 CALL SETCUSER; /* BACK TO CURRENT USER NUMBER */ + 207 2 END FILLSOURCE; + + + 208 1 WRITEDEST: PROCEDURE; + /* WRITE OUTPUT BUFFERS UP TO BUT NOT INCLUDING POSITION + NDEST - THE LOW ORDER 7 BITS OF NDEST ARE ZERO */ + 209 2 DECLARE (I, J, N) BYTE; + 210 2 DECLARE DMA ADDRESS; + 211 2 DECLARE DATAOK BYTE; + 212 2 IF (N := LOW(SHR(NDEST,7)) - 1) = 255 THEN RETURN ; + 214 2 NDEST = 0; + 215 2 CALL SELECT(DDISK); + 216 2 CALL SETRANDOM(.DEST); /* SET BASE RECORD FOR VERIFY */ + 217 2 DO I = 0 TO N; + /* SET DMA ADDRESS TO NEXT BUFFER */ + 218 3 DMA = .DBUFF(NDEST); + 219 3 CALL SETDMA(DMA); + 220 3 IF DISKWRITE(.DEST) <> 0 THEN + 221 3 CALL ERROR(.('DISK WRITE ERROR$')); + 222 3 NDEST = NDEST + 128; + 223 3 END; + 224 2 IF VERIF THEN /* VERIFY DATA WRITTEN OK */ + 225 2 DO; + 226 3 NDEST = 0; + 227 3 CALL SETDMA(.BUFF); /* FOR COMPARE */ + 228 3 DO I = 0 TO N; + 229 4 DATAOK = READRANDOM(.DEST) = 0; + 230 4 DESTR = DESTR + 1; /* NEXT RANDOM READ */ + 231 4 J = 0; + /* PERFORM COMPARISON */ + 232 4 DO WHILE DATAOK AND J < 80H; + 233 5 DATAOK = BUFFER(J) = DBUFF(NDEST+J); + 234 5 J = J + 1; + 235 5 END; + 236 4 NDEST = NDEST + 128; + 237 4 IF NOT DATAOK THEN + 238 4 CALL ERROR(.('VERIFY ERROR$')); + 239 4 END; + 240 3 DATAOK = DISKWRITE(.DEST); + /* NOW READY TO CONTINUE THE WRITE OPERATION */ + 241 3 END; + 242 2 NDEST = 0; + 243 2 END WRITEDEST; + + 244 1 PUTDCHAR: PROCEDURE(B); + 245 2 DECLARE (B,IOB) BYTE; + /* WRITE BYTE B TO THE DESTINATION DEVICE GIVEN BY PDEST */ + 246 2 IF B >= ' ' THEN + PL/M-80 COMPILER PAGE 10 + + + 247 2 DO; COLUMN = COLUMN + 1; + 249 3 IF DELET > 0 THEN /* MAY BE PAST RIGHT SIDE */ + 250 3 DO; IF COLUMN > DELET THEN RETURN; + 253 4 END; + 254 3 END; + 255 2 IOB = IOBYTE; /* IN CASE IT IS ALTERED */ + 256 2 DO CASE PDEST; + /* CASE 0 IS THE DESTINATION FILE */ + 257 3 DO; + 258 4 IF NDEST >= DBLEN THEN CALL WRITEDEST; + 260 4 DBUFF(NDEST) = B; + 261 4 NDEST = NDEST+1; + 262 4 END; + /* CASE 1 IS ARD (ADDMASTER) */ + 263 3 GO TO NOTDEST; + /* CASE 2 IS IRD (INTEL/ICOM) */ + 264 3 GO TO NOTDEST; + /* CASE 3 IS PTR */ + 265 3 GO TO NOTDEST; + /* CASE 4 IS UR1 */ + 266 3 GO TO NOTDEST; + /* CASE 5 IS UR2 */ + 267 3 GO TO NOTDEST; + /* CASE 6 IS RDR */ + 268 3 NOTDEST: + CALL ERROR(.('NOT A CHARACTER SINK$')); + /* CASE 7 IS OUT */ + 269 3 CALL OUT(B); + /* CASE 8 IS LPT */ + 270 3 DO; IOBYTE = 1000$0000B; GO TO LSTL; + 273 4 END; + /* CASE 9 IS UL1 */ + 274 3 DO; IOBYTE = 1100$0000B; GO TO LSTL; + 277 4 END; + /* CASE 10 IS PRN (TABS EXPANDED, LINES LISTED, CHANGED TO LST) */ + 278 3 DO; IOBYTE = 1000$0000B; GO TO LSTL; + 281 4 END; + /* CASE 11 IS LST */ + 282 3 LSTL: + CALL MON1(5,B); + /* CASE 12 IS PTP */ + 283 3 DO; IOBYTE = 0001$0000B; GO TO PUNL; + 286 4 END; + /* CASE 13 IS UP1 */ + 287 3 DO; IOBYTE = 0010$0000B; GO TO PUNL; + 290 4 END; + /* CASE 14 IS UP2 */ + 291 3 DO; IOBYTE = 0011$0000B; GO TO PUNL; + 294 4 END; + /* CASE 15 IS PUN */ + 295 3 PUNL: + CALL MON1(4,B); + /* CASE 16 IS TTY */ + 296 3 DO; IOBYTE = 0; GO TO CONL; + 299 4 END; + /* CASE 17 IS CRT */ + 300 3 DO; IOBYTE = 1; GO TO CONL; + PL/M-80 COMPILER PAGE 11 + + + 303 4 END; + /* CASE 18 IS UC1 */ + 304 3 DO; IOBYTE = 11B; GO TO CONL; + 307 4 END; + /* CASE 19 IS CON */ + 308 3 CONL: + CALL MON1(2,B); + 309 3 END; + 310 2 IOBYTE = IOB; + 311 2 END PUTDCHAR; + + 312 1 PUTDESTC: PROCEDURE(B); + 313 2 DECLARE (B,I) BYTE; + /* WRITE DESTINATION CHARACTER, TAB EXPANSION */ + 314 2 IF B <> TAB THEN CALL PUTDCHAR(B); ELSE + 316 2 IF TABS = 0 THEN CALL PUTDCHAR(B); ELSE + /* B IS TAB CHAR, TABS > 0 */ + 318 2 DO; I = COLUMN; + 320 3 DO WHILE I >= TABS; + 321 4 I = I - TABS; + 322 4 END; + 323 3 I = TABS - I; + 324 3 DO WHILE I > 0; + 325 4 I = I - 1; + 326 4 CALL PUTDCHAR(' '); + 327 4 END; + 328 3 END; + 329 2 IF B = CR THEN COLUMN = 0; + 331 2 END PUTDESTC; + + 332 1 PRINT1: PROCEDURE(B); + 333 2 DECLARE B BYTE; + 334 2 IF (ZEROSUP := ZEROSUP AND B = 0) THEN CALL PUTDESTC(' '); ELSE + 336 2 CALL PUTDESTC('0'+B); + 337 2 END PRINT1; + + 338 1 PRINTDIG: PROCEDURE(D); + 339 2 DECLARE D BYTE; + 340 2 CALL PRINT1(SHR(D,4)); CALL PRINT1(D AND 1111B); + 342 2 END PRINTDIG; + + 343 1 NEWLINE: PROCEDURE; + 344 2 DECLARE ONE BYTE; + 345 2 ONE = 1; + 346 2 ZEROSUP = NUMB = 1; + 347 2 C1 = DEC(C1+ONE); C2 = DEC(C2 PLUS 0); C3 = DEC(C3 PLUS 0); + 350 2 CALL PRINTDIG(C3); CALL PRINTDIG(C2); CALL PRINTDIG(C1); + 353 2 IF NUMB = 1 THEN /* USUALLY PRINTER OUTPUT */ + 354 2 DO; CALL PUTDESTC(':'); CALL PUTDESTC(' '); + 357 3 END; ELSE + 358 2 CALL PUTDESTC(TAB); + 359 2 END NEWLINE; + + 360 1 CLEARBUFF: PROCEDURE; + /* CLEAR OUTPUT BUFFER IN BLOCK MODE TRANSMISION */ + 361 2 DECLARE NA ADDRESS; + 362 2 DECLARE I BYTE; + PL/M-80 COMPILER PAGE 12 + + + 363 2 I = LOW(NDEST) AND 7FH; /* REMAINING PARTIAL BUFFER LENGTH */ + 364 2 NA = NDEST AND 0FF80H; /* START OF SEGMENT NOT WRITTEN */ + 365 2 CALL WRITEDEST; /* CLEARS BUFFERS */ + 366 2 CALL MOVE(.DBUFF(NA),.DBUFF,I); + /* DATA MOVED TO BEGINNING OF BUFFER */ + 367 2 NDEST = I; + 368 2 END CLEARBUFF; + + 369 1 PUTDEST: PROCEDURE(B); + 370 2 DECLARE (I,B) BYTE; + /* WRITE DESTINATION CHARACTER, CHECK TABS AND LINES */ + 371 2 IF FORMF THEN /* SKIP FORM FEEDS */ + 372 2 DO; IF B = FF THEN RETURN; + 375 3 END; + 376 2 IF PUTNUM THEN /* END OF LINE OR START OF FILE */ + 377 2 DO; + 378 3 IF B <> FF THEN /* NOT FORM FEED */ + 379 3 DO; + 380 4 IF (I:=PAGCNT) <> 0 THEN /* PAGE EJECT */ + 381 4 DO; IF I=1 THEN I=LPP; + 384 5 IF (LINENO := LINENO + 1) >= I THEN + 385 5 DO; LINENO = 0; /* NEW PAGE */ + 387 6 CALL PUTDESTC(FF); + 388 6 END; + 389 5 END; + 390 4 IF NUMB > 0 THEN + 391 4 CALL NEWLINE; + 392 4 PUTNUM = FALSE; + 393 4 END; + 394 3 END; + 395 2 IF BLOCK THEN /* BLOCK MODE TRANSFER */ + 396 2 DO; + 397 3 IF B = XOFF AND PDEST = 0 THEN + 398 3 DO; CALL CLEARBUFF; /* BUFFERS WRITTEN */ + 400 4 RETURN; /* DON'T PASS THE X-OFF */ + 401 4 END; + 402 3 END; + 403 2 IF B = FF THEN LINENO = 0; + 405 2 CALL PUTDESTC(B); + 406 2 IF B = LF THEN PUTNUM = TRUE; + 408 2 END PUTDEST; + + + 409 1 UTRAN: PROCEDURE(B) BYTE; + 410 2 DECLARE B BYTE; + /* TRANSLATE ALPHA TO UPPER CASE */ + 411 2 IF B >= 110$0001B AND B <= 111$1010B THEN /* LOWER CASE */ + 412 2 B = B AND 101$1111B; /* TO UPPER CASE */ + 413 2 RETURN B; + 414 2 END UTRAN; + + 415 1 LTRAN: PROCEDURE(B) BYTE; + 416 2 DECLARE B BYTE; + /* TRANSLATE TO LOWER CASE ALPHA */ + 417 2 IF B >= 'A' AND B <= 'Z' THEN B = B OR 10$0000B; /* TO LOWER */ + 419 2 RETURN B; + 420 2 END LTRAN; + PL/M-80 COMPILER PAGE 13 + + + + 421 1 GETSOURCEC: PROCEDURE BYTE; + /* READ NEXT SOURCE CHARACTER */ + 422 2 DECLARE (IOB,B,CONCHK) BYTE; + + 423 2 IF PSOURCE - 1 <= RDR THEN /* 1 ... RDR+1 */ + 424 2 DO; IF (BLOCK OR HEXT) AND CONBRK THEN + 426 3 DO; + 427 4 IF READCHAR = ENDFILE THEN RETURN ENDFILE; + 429 4 CALL PRINT(.('READER STOPPING',CR,LF,'$')); + 430 4 RETURN XOFF; + 431 4 END; + 432 3 END; + 433 2 CONCHK = TRUE; /* CONSOLE STATUS CHECK BELOW */ + 434 2 IOB = IOBYTE; /* SAVE IT IN CASE IT IS ALTERED */ + 435 2 DO CASE PSOURCE; + /* CASE 0 IS SOURCE FILE */ + 436 3 DO; IF NSOURCE >= SBLEN THEN CALL FILLSOURCE; + 439 4 B = SBUFF(NSOURCE); + 440 4 NSOURCE = NSOURCE + 1; + 441 4 END; + /* CASE 1 IS INP */ + 442 3 B = INP; + /* CASE 2 IS IRD (INTEL/ICOM) */ + 443 3 B = INTIN; + /* CASE 3 IS PTR */ + 444 3 DO; IOBYTE = 0000$0100B; GO TO RDRL; + 447 4 END; + /* CASE 4 IS UR1 */ + 448 3 DO; IOBYTE = 0000$1000B; GO TO RDRL; + 451 4 END; + /* CASE 5 IS UR2 */ + 452 3 DO; IOBYTE = 0000$1100B; GO TO RDRL; + 455 4 END; + /* CASE 6 IS RDR */ + 456 3 RDRL: + B = MON2(3,0) AND 7FH; + /* CASE 7 IS OUT */ + 457 3 GO TO NOTSOURCE; + /* CASE 8 IS LPT */ + 458 3 GO TO NOTSOURCE; + /* CASE 9 IS UL1 */ + 459 3 GO TO NOTSOURCE; + /* CASE 10 IS PRN */ + 460 3 GO TO NOTSOURCE; + /* CASE 11 IS LST */ + 461 3 GO TO NOTSOURCE; + /* CASE 12 IS PTP */ + 462 3 GO TO NOTSOURCE; + /* CASE 13 IS UP1 */ + 463 3 GO TO NOTSOURCE; + /* CASE 14 IS UP2 */ + 464 3 GO TO NOTSOURCE; + /* CASE 15 IS PUN */ + 465 3 NOTSOURCE: + DO; CALL ERROR(.('NOT A CHARACTER SOURCE$')); + 467 4 END; + PL/M-80 COMPILER PAGE 14 + + + /* CASE 16 IS TTY */ + 468 3 DO; IOBYTE = 0; GO TO CONL; + 471 4 END; + /* CASE 17 IS CRT */ + 472 3 DO; IOBYTE = 01B; GO TO CONL; + 475 4 END; + /* CASE 18 IS UC1 */ + 476 3 DO; IOBYTE = 11B; GO TO CONL; + 479 4 END; + /* CASE 19 IS CON */ + 480 3 CONL: + DO; CONCHK = FALSE; /* DON'T CHECK CONSOLE STATUS */ + 482 4 B = MON2(1,0); + 483 4 END; + 484 3 END; /* OF CASES */ + 485 2 IOBYTE = IOB; /* RESTORE IOBYTE */ + 486 2 IF ECHO THEN /* COPY TO CONSOLE DEVICE */ + 487 2 DO; IOB = PDEST; PDEST = CONP; CALL PUTDEST(B); + 491 3 PDEST = IOB; + 492 3 END; + 493 2 IF CONCHK THEN /* TEST FOR CONSOLE CHAR READY */ + 494 2 DO; + 495 3 IF SCOM THEN /* SOURCE IS A COM FILE */ + 496 3 CONCHK = (CONCNT := CONCNT + 1) = 0; ELSE /* ASCII */ + 497 3 CONCHK = B = LF; + 498 3 IF CONCHK THEN + 499 3 DO; IF CONBRK THEN + 501 4 DO; + 502 5 IF READCHAR = ENDFILE THEN RETURN ENDFILE; + 504 5 CALL ERROR(.('ABORTED$')); + 505 5 END; + 506 4 END; + 507 3 END; + 508 2 IF ZEROP THEN B = B AND 7FH; + 510 2 IF UPPER THEN RETURN UTRAN(B); + 512 2 IF LOWER THEN RETURN LTRAN(B); + 514 2 RETURN B; + 515 2 END GETSOURCEC; + + 516 1 GETSOURCE: PROCEDURE BYTE; + /* GET NEXT SOURCE CHARACTER */ + 517 2 DECLARE CHAR BYTE; + 518 2 MATCH: PROCEDURE(B) BYTE; + /* MATCH START AND QUIT STRINGS */ + 519 3 DECLARE (B,C) BYTE; + 520 3 IF (C:=COMBUFF(B:=(B+MATCHLEN))) = ENDFILE THEN /* END MATCH */ + 521 3 DO; COMBUFF(B) = CHAR; /* SAVE CURRENT CHARACTER */ + 523 4 RETURN TRUE; + 524 4 END; + 525 3 IF C = CHAR THEN MATCHLEN = MATCHLEN + 1; ELSE + 527 3 MATCHLEN = 0; /* NO MATCH */ + 528 3 RETURN FALSE; + 529 3 END MATCH; + 530 2 IF QUITLEN > 0 THEN + 531 2 DO; IF (QUITLEN := QUITLEN - 1) = 1 THEN RETURN LF; + 534 3 RETURN ENDFILE; /* TERMINATED WITH CR,LF,ENDFILE */ + 535 3 END; + PL/M-80 COMPILER PAGE 15 + + + 536 2 DO FOREVER; /* LOOKING FOR START */ + 537 3 IF FEEDLEN > 0 THEN /* GET SEARCH CHARACTERS */ + 538 3 DO; FEEDLEN = FEEDLEN - 1; + 540 4 CHAR = COMBUFF(FEEDBASE); + 541 4 FEEDBASE = FEEDBASE + 1; + 542 4 RETURN CHAR; + 543 4 END; + 544 3 IF (CHAR := GETSOURCEC) = ENDFILE THEN RETURN ENDFILE; + 546 3 IF STARTS > 0 THEN /* LOOKING FOR START STRING */ + 547 3 DO; IF MATCH(STARTS) THEN + 549 4 DO; FEEDBASE = STARTS; STARTS = 0; + 552 5 FEEDLEN = MATCHLEN + 1; + 553 5 END; /* OTHERWISE NO MATCH, SKIP CHARACTER */ + 554 4 END; ELSE + 555 3 IF QUITS > 0 THEN /* PASS CHARACTERS TIL MATCH */ + 556 3 DO; IF MATCH(QUITS) THEN + 558 4 DO; QUITS = 0; QUITLEN = 2; + /* SUBSEQUENTLY RETURN CR, LF, ENDFILE */ + 561 5 RETURN CR; + 562 5 END; + 563 4 RETURN CHAR; + 564 4 END; ELSE + 565 3 RETURN CHAR; + 566 3 END; /* OF DO FOREVER */ + 567 2 END GETSOURCE; + + 568 1 DECLARE DISK BYTE; /* SELECTED DISK */ + + 569 1 GNC: PROCEDURE BYTE; + 570 2 IF (CBP := CBP + 1) >= COMLEN THEN RETURN CR; + 572 2 RETURN UTRAN(COMBUFF(CBP)); + 573 2 END GNC; + + 574 1 DEBLANK: PROCEDURE; + 575 2 DO WHILE (CHAR := GNC) = ' '; + 576 3 END; + 577 2 END DEBLANK; + + 578 1 SCAN: PROCEDURE(FCBA); + 579 2 DECLARE FCBA ADDRESS, /* ADDRESS OF FCB TO FILL */ + FCB BASED FCBA (FSIZE) BYTE; /* FCB TEMPLATE */ + 580 2 DECLARE (I,J,K) BYTE; /* TEMP COUNTERS */ + + /* SCAN LOOKS FOR THE NEXT DELIMITER, DEVICE NAME, OR FILE NAME. + THE VALUE OF CBP MUST BE 255 UPON ENTRY THE FIRST TIME */ + + 581 2 DELIMITER: PROCEDURE(C) BYTE; + 582 3 DECLARE (I,C) BYTE; + 583 3 DECLARE DEL(*) BYTE DATA + (' =.:,<>',CR,LA,LB,RB); + 584 3 DO I = 0 TO LAST(DEL); + 585 4 IF C = DEL(I) THEN RETURN TRUE; + 587 4 END; + 588 3 RETURN FALSE; + 589 3 END DELIMITER; + + 590 2 PUTCHAR: PROCEDURE; + PL/M-80 COMPILER PAGE 16 + + + 591 3 FCB(FLEN:=FLEN+1) = CHAR; + 592 3 IF CHAR = WHAT THEN AMBIG = TRUE; /* CONTAINS AMBIGUOUS REF */ + 594 3 END PUTCHAR; + + 595 2 FILLQ: PROCEDURE(LEN); + /* FILL CURRENT NAME OR TYPE WITH QUESTION MARKS */ + 596 3 DECLARE LEN BYTE; + 597 3 CHAR = WHAT; /* QUESTION MARK */ + 598 3 DO WHILE FLEN < LEN; + 599 4 CALL PUTCHAR; + 600 4 END; + 601 3 END FILLQ; + + 602 2 GETFCB: PROCEDURE(I) BYTE; + 603 3 DECLARE I BYTE; + 604 3 RETURN FCB(I); + 605 3 END GETFCB; + + 606 2 SCANPAR: PROCEDURE; + 607 3 DECLARE (I,J) BYTE; + /* SCAN OPTIONAL PARAMETERS */ + 608 3 PARSET = TRUE; + 609 3 SUSER = CUSER; /* SOURCE USER := CURRENT USER */ + 610 3 CHAR = GNC; /* SCAN PAST BRACKET */ + 611 3 DO WHILE NOT(CHAR = CR OR CHAR = RB); + 612 4 IF (I := CHAR - 'A') > 25 THEN /* NOT ALPHA */ + 613 4 DO; IF CHAR = ' ' THEN CHAR = GNC; ELSE + 616 5 CALL ERROR(.('BAD PARAMETER$')); + 617 5 END; ELSE + 618 4 DO; /* SCAN PARAMETER VALUE */ + 619 5 IF CHAR = 'S' OR CHAR = 'Q' THEN + 620 5 DO; /* START OR QUIT COMMAND */ + 621 6 J = CBP + 1; /* START OF STRING */ + 622 6 DO WHILE NOT ((CHAR := GNC) = ENDFILE OR CHAR = CR); + 623 7 END; + 624 6 CHAR=GNC; + 625 6 END; ELSE + 626 5 IF (J := (CHAR := GNC) - '0') > 9 THEN J = 1; + ELSE + 628 5 DO WHILE (K := (CHAR := GNC) - '0') <= 9; + 629 6 J = J * 10 + K; + 630 6 END; + 631 5 CONT(I) = J; + 632 5 IF I = 6 THEN /* SET SOURCE USER */ + 633 5 DO; + 634 6 IF J > 31 THEN + 635 6 CALL ERROR(.('INVALID USER NUMBER$')); + 636 6 SUSER = J; + 637 6 END; + 638 5 END; + 639 4 END; + 640 3 CHAR = GNC; + 641 3 END SCANPAR; + + 642 2 CHKSET: PROCEDURE; + 643 3 IF CHAR = LA THEN CHAR = '='; + 645 3 END CHKSET; + PL/M-80 COMPILER PAGE 17 + + + + /* INITIALIZE FILE CONTROL BLOCK TO EMPTY */ + 646 2 AMBIG = FALSE; TYPE = ERR; CHAR = ' '; FLEN = 0; + 650 2 DO WHILE FLEN < FSIZE-1; + 651 3 IF FLEN = FNSIZE THEN CHAR = 0; + 653 3 CALL PUTCHAR; + 654 3 END; + + /* DEBLANK COMMAND BUFFER */ + 655 2 CALL DEBLANK; + + /* SAVE STARTING POSITION OF SCAN FOR DIAGNOSTICS */ + 656 2 TCBP = CBP; + + /* MAY BE A SEPARATOR */ + 657 2 IF DELIMITER(CHAR) THEN + 658 2 DO; CALL CHKSET; + 660 3 TYPE = SPECL; RETURN; + 662 3 END; + + /* CHECK PERIPHERALS AND DISK FILES */ + 663 2 DISK = 0; + /* CLEAR PARAMETERS */ + 664 2 DO I = 0 TO 25; CONT(I) = 0; + 666 3 END; + 667 2 PARSET = FALSE; + 668 2 FEEDLEN,MATCHLEN,QUITLEN = 0; + /* SCAN NEXT NAME */ + 669 2 DO FOREVER; + 670 3 FLEN = 0; + 671 3 DO WHILE NOT DELIMITER(CHAR); + 672 4 IF FLEN >= NSIZE THEN /* ERROR, FILE NAME TOO LONG */ + 673 4 RETURN; + 674 4 IF CHAR = '*' THEN CALL FILLQ(NSIZE); ELSE CALL PUTCHAR; + 677 4 CHAR = GNC; + 678 4 END; + + /* CHECK FOR DISK NAME OR DEVICE NAME */ + 679 3 IF CHAR = ':' THEN + 680 3 DO; IF DISK <> 0 THEN RETURN; /* ALREADY SET */ + 683 4 IF FLEN = 1 THEN + /* MAY BE DISK NAME A ... Z */ + 684 4 DO; + 685 5 IF (DISK := GETFCB(1) - 'A' + 1) > 26 THEN + 686 5 /* ERROR, INVALID DISK NAME */ RETURN; + 687 5 CALL DEBLANK; /* MAY BE DISK NAME ONLY */ + 688 5 IF DELIMITER(CHAR) THEN + 689 5 DO; IF CHAR = LB THEN + 691 6 CALL SCANPAR; + 692 6 CBP = CBP - 1; + 693 6 TYPE = DISKNAME; + 694 6 RETURN; + 695 6 END; + 696 5 END; ELSE + + /* MAY BE A THREE CHARACTER DEVICE NAME */ + 697 4 IF FLEN <> 3 THEN /* ERROR, CANNOT BE DEVICE NAME */ + PL/M-80 COMPILER PAGE 18 + + + 698 4 RETURN; ELSE + + /* LOOK FOR DEVICE NAME */ + 699 4 DO; DECLARE (I,J,K) BYTE, M LITERALLY '20', + IO(*) BYTE DATA + ('INPIRDPTRUR1UR2RDROUTLPTUL1PRNLST', + 'PTPUP1UP2PUNTTYCRTUC1CONNULEOF',0); + /* NOTE THAT ALL READER-LIKE DEVICES MUST BE + PLACED BEFORE 'RDR', AND ALL LISTING-LIKE DEVICES + MUST APPEAR BELOW LST, BUT ABOVE RDR. THE LITERAL + DECLARATIONS FOR RDR, LST, AND PUNP MUST INDICATE + THE POSITIONS OF THESE DEVICES IN THE LIST */ + 701 5 J = 255; + 702 5 DO K = 0 TO M; + 703 6 I = 0; + 704 6 DO WHILE ((I:=I+1) <= 3) AND + IO(J+I) = GETFCB(I); + 705 7 END; + 706 6 IF I = 4 THEN /* COMPLETE MATCH */ + 707 6 DO; TYPE = PERIPH; + /* SCAN PARAMETERS */ + 709 7 IF GNC = LB THEN CALL SCANPAR; + 711 7 CBP = CBP - 1; CHAR = K; + 713 7 RETURN; + 714 7 END; + 715 6 /* OTHERWISE TRY NEXT DEVICE */ J = J + 3; + 716 6 END; + + 717 5 /* ERROR, NO DEVICE NAME MATCH */ RETURN; + 718 5 END; + 719 4 IF CHAR = LB THEN /* PARAMETERS FOLLOW */ + 720 4 CALL SCANPAR; + 721 4 END; ELSE + + /* CHAR IS NOT ':', SO FILE NAME IS SET. SCAN REMAINDER */ + 722 3 DO; IF FLEN = 0 THEN /* ERROR, NO PRIMARY NAME */ + 724 4 RETURN; + 725 4 FLEN = FNAM; + 726 4 IF CHAR = '.' THEN /* SCAN FILE TYPE */ + 727 4 DO WHILE NOT DELIMITER(CHAR := GNC); + 728 5 IF FLEN >= FNSIZE THEN + 729 5 /* ERROR, TYPE FIELD TOO LONG */ RETURN; + 730 5 IF CHAR = '*' THEN CALL FILLQ(FNSIZE); + 732 5 ELSE CALL PUTCHAR; + 733 5 END; + + 734 4 IF CHAR = LB THEN + 735 4 CALL SCANPAR; + /* RESCAN DELIMITER NEXT TIME AROUND */ + 736 4 CBP = CBP - 1; + 737 4 TYPE = FILE; + /* DISK IS THE SELECTED DISK (1 2 3 ... ) */ + 738 4 IF DISK = 0 THEN DISK = CDISK + 1; /* DEFAULT */ + 740 4 FCB(0),FCB(32) = 0; + 741 4 RETURN; + 742 4 END; + 743 3 END; + PL/M-80 COMPILER PAGE 19 + + + 744 2 END SCAN; + + 745 1 NULLS: PROCEDURE; + /* SEND 40 NULLS TO OUTPUT DEVICE */ + 746 2 DECLARE I BYTE; + 747 2 DO I = 0 TO 39; CALL PUTDEST(0); + 749 3 END; + 750 2 END NULLS; + + + 751 1 DECLARE FEXTH(FEXTL) BYTE, /* HOLDS DESTINATION FILE TYPE */ + COPYING BYTE; /* TRUE WHILE COPYING TO DEST FILE */ + + 752 1 MOVEXT: PROCEDURE(A); + 753 2 DECLARE A ADDRESS; + /* MOVE THREE CHARACTER EXTENT INTO DEST FCB */ + 754 2 CALL MOVE(A,.DEST(FEXT),FEXTL); + 755 2 END MOVEXT; + + 756 1 EQUAL: PROCEDURE(A,B) BYTE; + /* COMPARE THE STRINGS AT A AND B UNTIL EITHER A MISMATCH OR + A '$' IS ENCOUNTERED IN STRING B */ + 757 2 DECLARE (A,B) ADDRESS, + (SA BASED A, SB BASED B) BYTE; + 758 2 DO WHILE SB <> '$'; + 759 3 IF (SB AND 7FH) <> (SA AND 7FH) THEN RETURN FALSE; + 761 3 A = A + 1; B = B + 1; + 763 3 END; + 764 2 RETURN TRUE; + 765 2 END EQUAL; + + 766 1 READ$EOF: PROCEDURE BYTE; + /* RETURN TRUE IF END OF FILE */ + 767 2 CHAR = GETSOURCE; + 768 2 IF SCOM THEN RETURN HARDEOF < NSOURCE; + 770 2 RETURN CHAR = ENDFILE; + 771 2 END READ$EOF; + + + 772 1 HEXRECORD: PROCEDURE BYTE; + /* READ ONE RECORD INTO SBUFF AND CHECK FOR PROPER FORM + RETURNS 0 IF RECORD OK + RETURNS 1 IF END OF TAPE (:00000) + RETURNS 2 IF ERROR IN RECORD */ + + + 773 2 DECLARE XOFFSET BYTE; /* TRUE IF XOFF RECVD */ + 774 2 DECLARE NOERRS BYTE; /* TRUE IF NO ERRORS IN THIS RECORD */ + + 775 2 PRINTERR: PROCEDURE(A); + /* PRINT ERROR MESSAGE IF NOERRS TRUE */ + 776 3 DECLARE A ADDRESS; + 777 3 IF NOERRS THEN + 778 3 DO; NOERRS = FALSE; + 780 4 CALL PRINT(A); + 781 4 END; + 782 3 END PRINTERR; + PL/M-80 COMPILER PAGE 20 + + + + 783 2 CHECKXOFF: PROCEDURE; + 784 3 IF XOFFSET THEN + 785 3 DO; XOFFSET = FALSE; + 787 4 CALL CLEARBUFF; + 788 4 END; + 789 3 END CHECKXOFF; + + 790 2 SAVECHAR: PROCEDURE BYTE; + /* READ CHARACTER AND SAVE IN BUFFER */ + 791 3 DECLARE I BYTE; + 792 3 IF NOERRS THEN + 793 3 DO; + 794 4 DO WHILE (I := GETSOURCE) = XOFF; XOFFSET = TRUE; + 796 5 END; + 797 4 HBUFF(HSOURCE) = I; + 798 4 IF (HSOURCE := HSOURCE + 1) >= LAST(HBUFF) THEN + 799 4 CALL PRINTERR(.('RECORD TOO LONG$')); + 800 4 RETURN I; + 801 4 END; + 802 3 RETURN ENDFILE; /* ON ERROR FLAG */ + 803 3 END SAVECHAR; + + 804 2 DECLARE (M, RL, CS, RT) BYTE, + LDA ADDRESS; /* LOAD ADDRESS WHICH FOLLOWS : */ + + 805 2 READHEX: PROCEDURE BYTE; + 806 3 DECLARE H BYTE; + 807 3 IF (H := SAVECHAR) - '0' <= 9 THEN RETURN H-'0'; + 809 3 IF H - 'A' > 5 THEN + 810 3 CALL PRINTERR(.('INVALID DIGIT$')); + 811 3 RETURN H - 'A' + 10; + 812 3 END READHEX; + + 813 2 READBYTE: PROCEDURE BYTE; + /* READ TWO HEX DIGITS */ + 814 3 RETURN SHL(READHEX,4) OR READHEX; + 815 3 END READBYTE; + + 816 2 READCS: PROCEDURE BYTE; + /* READ BYTE WITH CHECKSUM */ + 817 3 RETURN CS := CS + READBYTE; + 818 3 END READCS; + + 819 2 READADDR: PROCEDURE ADDRESS; + /* READ DOUBLE BYTE WITH CHECKSUM */ + 820 3 RETURN SHL(DOUBLE(READCS),8) OR READCS; + 821 3 END READADDR; + + 822 2 NOERRS = TRUE; /* NO ERRORS DETECTED IN THIS RECORD */ + + /* READ NEXT RECORD */ + /* SCAN FOR THE ':' */ + 823 2 HSOURCE = 0; + 824 2 DO WHILE (CS := SAVECHAR) <> ':'; + 825 3 HSOURCE = 0; + 826 3 IF CS = ENDFILE THEN + PL/M-80 COMPILER PAGE 21 + + + 827 3 DO; CALL PRINT(.('END OF FILE, CTL-Z',WHAT,'$')); + 829 4 IF READCHAR = ENDFILE THEN RETURN 1; + 831 4 ELSE HSOURCE = 0; + 832 4 END; + 833 3 CALL CHECKXOFF; + 834 3 END; + + /* ':' FOUND */ + 835 2 CS = 0; + 836 2 IF (RL := READCS) = 0 THEN /* END OF TAPE */ + 837 2 DO; DO WHILE (RL := SAVECHAR) <> ENDFILE; + 839 4 CALL CHECKXOFF; + 840 4 END; + 841 3 IF NOERRS THEN RETURN 1; + 843 3 RETURN 2; + 844 3 END; + + /* RECORD LENGTH IS NOT ZERO */ + 845 2 LDA = READADDR; /* LOAD ADDRESS */ + + /* READ WORDS UNTIL RECORD LENGTH EXHAUSTED */ + 846 2 RT = READCS; /* RECORD TYPE */ + 847 2 DO WHILE RL <> 0 AND NOERRS; RL = RL - 1; + 849 3 M = READCS; + /* INCREMENT LA HERE FOR EXACT ADDRESS */ + 850 3 END; + + /* CHECK SUM */ + 851 2 IF CS + READBYTE <> 0 THEN + 852 2 CALL PRINTERR(.('CHECKSUM ERROR$')); + + 853 2 CALL CHECKXOFF; + 854 2 IF NOERRS THEN RETURN 0; + 856 2 RETURN 2; + 857 2 END HEXRECORD; + + 858 1 READTAPE: PROCEDURE; + /* READ HEX FILE FROM HIGH SPEED READER TO 'HEX' FILE, + CHECK EACH RECORD FOR VALID DIGITS, AND PROPER CHECKSUM */ + 859 2 DECLARE (I,A) BYTE; + 860 2 DO FOREVER; + 861 3 DO WHILE (I := HEXRECORD) <= 1; + 862 4 IF NOT (I = 1 AND IGNOR) THEN + 863 4 DO A = 1 TO HSOURCE; + 864 5 CALL PUTDEST(HBUFF(A-1)); + 865 5 END; + 866 4 CALL PUTDEST(CR); CALL PUTDEST(LF); + 868 4 IF I = 1 THEN /* END OF TAPE ENCOUNTERED */ + 869 4 RETURN; + 870 4 END; + 871 3 CALL CRLF; HBUFF(HSOURCE) = '$'; + 873 3 CALL PRINT(.HBUFF); + 874 3 CALL PRINT(.('CORRECT ERROR, TYPE RETURN OR CTL-Z$')); + 875 3 CALL CRLF; + 876 3 IF READCHAR = ENDFILE THEN RETURN; + 878 3 END; + 879 2 END READTAPE; + PL/M-80 COMPILER PAGE 22 + + + + 880 1 FORMERR: PROCEDURE; + 881 2 CALL ERROR(.('INVALID FORMAT$')); + 882 2 END FORMERR; + + 883 1 SETUPDEST: PROCEDURE; + 884 2 CALL SELECT(DDISK); + 885 2 DHEX = EQUAL(.DEST(FEXT),.('HEX$')); + 886 2 CALL MOVE(.DEST(FEXT),.FEXTH,FEXTL); /* SAVE TYPE */ + 887 2 DEST(ROFILE) = DEST(ROFILE) AND 7FH; + 888 2 DEST(SYSFILE)= DEST(SYSFILE)AND 7FH; + 889 2 CALL MOVEXT(.('$$$')); + 890 2 CALL DELETE(.DEST); /* REMOVE OLD $$$ FILE */ + 891 2 CALL MAKE(.DEST); /* CREATE A NEW ONE */ + 892 2 IF DCNT = 255 THEN CALL ERROR(.('NO DIRECTORY SPACE$')); + 894 2 DEST(32),NDEST = 0; + 895 2 END SETUPDEST; + + 896 1 SETUPSOURCE: PROCEDURE; + 897 2 HARDEOF = 0FFFFH; + 898 2 CALL SETSUSER; /* SOURCE USER */ + 899 2 CALL SELECT(SDISK); + 900 2 CALL OPEN(.SOURCE); + 901 2 CALL SETCUSER; /* BACK TO CURRENT USER */ + 902 2 IF (NOT RSYS) AND ROL(SOURCE(SYSFILE),1) THEN + 903 2 DCNT = 255; + 904 2 IF DCNT = 255 THEN CALL ERROR(.('NO FILE$')); + 906 2 SOURCE(32) = 0; + /* CAUSE IMMEDIATE READ */ + 907 2 SCOM = EQUAL(.SOURCE(FEXT),.('COM$')); + 908 2 NSOURCE = SBLEN; + 909 2 END SETUPSOURCE; + + 910 1 CHECK$STRINGS: PROCEDURE; + 911 2 IF STARTS > 0 THEN + 912 2 CALL ERROR(.('START NOT FOUND$')); + 913 2 IF QUITS > 0 THEN + 914 2 CALL ERROR(.('QUIT NOT FOUND$')); + 915 2 END CHECK$STRINGS; + + 916 1 CLOSEDEST: PROCEDURE(DIRECT); + 917 2 DECLARE DIRECT BYTE; + /* DIRECT IS TRUE IF SECTOR-BY-SECTOR COPY */ + 918 2 IF DIRECT THEN + /* GET UNFILLED BYTES FROM SOURCE BUFFER */ + 919 2 DFUB = SFUB; ELSE DFUB = 0; + 921 2 DO WHILE (LOW(NDEST) AND 7FH) <> 0; + 922 3 DFUB = DFUB + 1; + 923 3 CALL PUTDEST(ENDFILE); + 924 3 END; + 925 2 CALL CHECK$STRINGS; + 926 2 CALL WRITEDEST; + 927 2 CALL SELECT(DDISK); + 928 2 CALL CLOSE(.DEST); + 929 2 IF DCNT = 255 THEN + 930 2 CALL ERROR(.('CANNOT CLOSE DESTINATION FILE$')); + 931 2 CALL MOVEXT(.FEXTH); /* RECALL ORIGINAL TYPTE */ + PL/M-80 COMPILER PAGE 23 + + + 932 2 DEST(12) = 0; + 933 2 CALL OPEN(.DEST); + 934 2 IF DCNT <> 255 THEN /* FILE EXISTS */ + 935 2 DO; + 936 3 IF ROL(DEST(ROFILE),1) THEN /* READ ONLY */ + 937 3 DO; + 938 4 IF NOT WRROF THEN + 939 4 DO; + 940 5 CALL PRINT (.('DESTINATION IS R/O, DELETE (Y/N)?$')); + 941 5 IF UTRAN(READCHAR) <> 'Y' THEN + 942 5 DO; CALL PRINT(.('**NOT DELETED**$')); + 944 6 CALL CRLF; + 945 6 CALL MOVEXT(.('$$$')); + 946 6 CALL DELETE(.DEST); + 947 6 RETURN; + 948 6 END; + 949 5 CALL CRLF; + 950 5 END; + 951 4 DEST(ROFILE) = DEST(ROFILE) AND 7FH; + 952 4 CALL SETIND(.DEST); + 953 4 END; + 954 3 CALL DELETE(.DEST); + 955 3 END; + 956 2 CALL MOVE(.DEST,.DEST(16),16); /* READY FOR RENAME */ + 957 2 CALL MOVEXT(.('$$$')); + 958 2 CALL RENAME(.DEST); + 959 2 END CLOSEDEST; + + 960 1 SIZE$NBUF: PROCEDURE; + /* COMPUTE NUMBER OF BUFFERS - 1 FROM DBLEN */ + 961 2 NBUF = (SHR(DBLEN,7) AND 0FFH) - 1; + /* COMPUTED AS DBLEN/128-1, WHERE DBLEN <= 32K (AND THUS + NBUF RESULTS IN A VALUE <= 2**15/2**7-1 = 2**8-1 = 255) */ + 962 2 END SIZE$NBUF; + + 963 1 SET$DBLEN: PROCEDURE; + /* ABSORB THE SOURCE BUFFER INTO THE DEST BUFFER */ + 964 2 SBASE = .MEMORY; + 965 2 IF DBLEN >= 4000H THEN DBLEN = 7F80H; ELSE + 967 2 DBLEN = DBLEN + SBLEN; + 968 2 CALL SIZE$NBUF; + 969 2 END SET$DBLEN; + + 970 1 SIZE$MEMORY: PROCEDURE; + /* SET UP SOURCE AND DESTINATION BUFFERS */ + 971 2 SBASE = .MEMORY + SHR(MEMSIZE - .MEMORY,1); + 972 2 SBLEN, DBLEN = SHR((MEMSIZE - .MEMORY) AND 0FF00H,1); + 973 2 CALL SIZE$NBUF; + 974 2 END SIZE$MEMORY; + + 975 1 COPYCHAR: PROCEDURE; + /* PERFORM THE ACTUAL COPY FUNCTION */ + 976 2 DECLARE RESIZED BYTE; /* TRUE IF SBUFF AND DBUFF COMBINED */ + 977 2 IF (RESIZED := (BLOCK AND PSOURCE <> 0)) THEN /* BLOCK MODE */ + 978 2 CALL SET$DBLEN; /* ABSORB SOURCE BUFFER */ + 979 2 IF HEXT OR IGNOR THEN /* HEX FILE */ + 980 2 CALL READTAPE; ELSE + PL/M-80 COMPILER PAGE 24 + + + 981 2 DO WHILE NOT READ$EOF; + 982 3 CALL PUTDEST(CHAR); + 983 3 END; + 984 2 IF RESIZED THEN + 985 2 DO; CALL CLEARBUFF; + 987 3 CALL SIZE$MEMORY; + 988 3 END; + 989 2 END COPYCHAR; + + 990 1 SIMPLECOPY: PROCEDURE; + 991 2 DECLARE (FASTCOPY,I) BYTE; + 992 2 REAL$EOF: PROCEDURE BYTE; + 993 3 RETURN HARDEOF <> 0FFFFH; + 994 3 END REALEOF; + 995 2 CALL SIZE$MEMORY; + 996 2 TCBP = MCBP; /* FOR ERROR TRACING */ + 997 2 CALL SETUPDEST; + 998 2 CALL SETUPSOURCE; + /* FILES READY FOR DIRECT COPY */ + 999 2 FASTCOPY = TRUE; + /* LOOK FOR PARAMETERS */ +1000 2 DO I = 0 TO 25; +1001 3 IF CONT(I) <> 0 THEN +1002 3 DO; +1003 4 IF NOT(I=6 OR I=14 OR I=17 OR I=21 OR I=22) THEN + /* NOT OBJ OR VERIFY */ +1004 4 FASTCOPY = FALSE; +1005 4 END; +1006 3 END; +1007 2 IF FASTCOPY THEN /* COPY DIRECTLY TO DBUFF */ +1008 2 DO; CALL SET$DBLEN; /* EXTEND DBUFF */ +1010 3 DO WHILE NOT REAL$EOF; +1011 4 CALL FILLSOURCE; +1012 4 IF REAL$EOF THEN +1013 4 NDEST = HARDEOF; ELSE NDEST = DBLEN; +1015 4 CALL WRITEDEST; +1016 4 END; +1017 3 CALL SIZE$MEMORY; /* RESET TO TWO BUFFERS */ +1018 3 END; ELSE +1019 2 CALL COPYCHAR; +1020 2 CALL CLOSEDEST(FASTCOPY); +1021 2 END SIMPLECOPY; + +1022 1 MULTCOPY: PROCEDURE; +1023 2 DECLARE (NEXTDIR, NDCNT, NCOPIED) ADDRESS; +1024 2 PRNAME: PROCEDURE; + /* PRINT CURRENT FILE NAME */ +1025 3 DECLARE (I,C) BYTE; +1026 3 CALL CRLF; +1027 3 DO I = 1 TO FNSIZE; +1028 4 IF (C := DEST(I)) <> ' ' THEN +1029 4 DO; IF I = FEXT THEN CALL PRINTCHAR('.'); +1032 5 CALL PRINTCHAR(C); +1033 5 END; +1034 4 END; +1035 3 END PRNAME; + + PL/M-80 COMPILER PAGE 25 + + +1036 2 NEXTDIR,NCOPIED = 0; +1037 2 DO FOREVER; + /* FIND A MATCHING ENTRY */ +1038 3 CALL SETSUSER; /* SOURCE USER */ +1039 3 CALL SELECT(SDISK); +1040 3 CALL SETDMA(.BUFFER); +1041 3 CALL SEARCH(.SEARFCB); +1042 3 NDCNT = 0; +1043 3 DO WHILE (DCNT <> 255) AND NDCNT < NEXTDIR; +1044 4 NDCNT = NDCNT + 1; +1045 4 CALL SEARCHN; +1046 4 END; +1047 3 CALL SETCUSER; + /* FILE CONTROL BLOCK IN BUFFER */ +1048 3 IF DCNT = 255 THEN +1049 3 DO; IF NCOPIED = 0 THEN +1051 4 CALL ERROR(.('NOT FOUND$')); CALL CRLF; +1053 4 RETURN; +1054 4 END; +1055 3 NEXTDIR = NDCNT + 1; + /* GET THE FILE CONTROL BLOCK NAME TO DEST */ +1056 3 CALL MOVE(.BUFFER+SHL(DCNT AND 11B,5),.DEST,16); +1057 3 DEST(0) = 0; +1058 3 DEST(12) = 0; +1059 3 CALL MOVE(.DEST,.SOURCE,16); /* FILL BOTH FCB'S */ +1060 3 IF RSYS OR NOT ROL(DEST(SYSFILE),1) THEN /* OK TO READ */ +1061 3 DO; +1062 4 IF (NCOPIED := NCOPIED + 1) = 1 THEN +1063 4 CALL PRINT(.('COPYING -$')); +1064 4 CALL PRNAME; +1065 4 CALL SIMPLECOPY; +1066 4 END; +1067 3 END; +1068 2 END MULTCOPY; + +1069 1 SET$SDISK: PROCEDURE; +1070 2 IF DISK > 0 THEN SDISK = DISK - 1; ELSE SDISK = CDISK; +1073 2 END SET$SDISK; + +1074 1 SET$DDISK: PROCEDURE; +1075 2 IF PARSET THEN /* PARAMETERS PRESENT */ CALL FORMERR; +1077 2 IF DISK > 0 THEN DDISK = DISK - 1; ELSE DDISK = CDISK; +1080 2 END SET$DDISK; + +1081 1 CHECK$DISK: PROCEDURE; +1082 2 IF SUSER <> CUSER THEN /* DIFFERENT DISKS */ +1083 2 RETURN; +1084 2 IF DDISK = SDISK THEN CALL FORMERR; +1086 2 END CHECK$DISK; + +1087 1 CHECK$EOL: PROCEDURE; +1088 2 CALL DEBLANK; +1089 2 IF CHAR <> CR THEN CALL FORMERR; +1091 2 END CHECK$EOL; + +1092 1 SCANDEST: PROCEDURE(COPYFCB); +1093 2 DECLARE COPYFCB ADDRESS; + PL/M-80 COMPILER PAGE 26 + + +1094 2 CALL SET$SDISK; +1095 2 CALL CHECK$EOL; +1096 2 CALL MOVE(.SOURCE,COPYFCB,33); +1097 2 CALL CHECK$DISK; +1098 2 END SCANDEST; + +1099 1 SCANEQL: PROCEDURE; +1100 2 CALL SCAN(.SOURCE); +1101 2 IF NOT (TYPE = SPECL AND CHAR = '=') THEN CALL FORMERR; +1103 2 MCBP = CBP; /* FOR ERROR PRINTING */ +1104 2 END SCANEQL; + + +1105 1 PIPENTRY: + /* BUFFER AT 80H CONTAINS REMAINDER OF LINE TYPED + FOLLOWING THE COMMAND 'PIP' - IF ZERO THEN PROMPT TIL CR */ + CALL MOVE(.BUFF,.COMLEN,80H); +1106 1 MULTCOM = COMLEN = 0; + + /* GET CURRENT CP/M VERSION */ +1107 1 IF VERSION < CPMVERSION THEN +1108 1 DO; +1109 2 CALL PRINT(.('REQUIRES CP/M 2.0 OR NEWER FOR OPERATION.$')); +1110 2 CALL BOOT; +1111 2 END; + /* GET CURRENT USER */ +1112 1 CUSER = GETUSER; + /* GET CURRENT DISK */ +1113 1 CDISK = MON2(25,0); + +1114 1 RETRY: + /* ENTER HERE ON ERROR EXIT FROM THE PROCEDURE 'ERROR' */ + CALL SIZE$MEMORY; + /* MAIN PROCESSING LOOP. PROCESS UNTIL CR ONLY */ +1115 1 DO FOREVER; +1116 2 SUSER = CUSER; +1117 2 C1, C2, C3 = 0; /* LINE COUNT = 000000 */ +1118 2 PUTNUM = TRUE; /* ACTS LIKE LF OCCURRED ON ASCII FILE */ +1119 2 CONCNT,COLUMN = 0; /* PRINTER TABS */ +1120 2 LINENO = 254; /* INCREMENTED TO 255 > PAGCNT */ + /* READ FROM CONSOLE IF NOT A ONELINER */ +1121 2 IF MULTCOM THEN +1122 2 DO; CALL PRINTCHAR('*'); CALL READCOM; +1125 3 CALL CRLF; +1126 3 END; +1127 2 CBP = 255; +1128 2 IF COMLEN = 0 THEN /* SINGLE CARRIAGE RETURN */ +1129 2 DO; CALL SELECT(CDISK); +1131 3 CALL BOOT; +1132 3 END; + + /* LOOK FOR SPECIAL CASES FIRST */ +1133 2 DDISK,SDISK,PSOURCE,PDEST = 0; +1134 2 CALL SCAN(.DEST); +1135 2 IF TYPE = PERIPH THEN GO TO SIMPLECOM; +1137 2 IF TYPE = DISKNAME THEN +1138 2 DO; DDISK = DISK - 1; + PL/M-80 COMPILER PAGE 27 + + +1140 3 CALL SCANEQL; +1141 3 CALL SCAN(.SOURCE); + /* MAY BE MULTI COPY */ +1142 3 IF TYPE <> FILE THEN CALL FORMERR; +1144 3 IF AMBIG THEN +1145 3 DO; CALL SCANDEST(.SEARFCB); +1147 4 CALL MULTCOPY; +1148 4 END; ELSE +1149 3 DO; CALL SCANDEST(.DEST); + /* FORM IS A:=B:UFN */ +1151 4 CALL SIMPLECOPY; +1152 4 END; +1153 3 GO TO ENDCOM; +1154 3 END; + + +1155 2 IF TYPE <> FILE OR AMBIG THEN CALL FORMERR; +1157 2 CALL SET$DDISK; +1158 2 CALL SCANEQL; +1159 2 CALL SCAN(.SOURCE); +1160 2 IF TYPE = DISKNAME THEN +1161 2 DO; +1162 3 CALL SET$SDISK; CALL CHECK$DISK; +1164 3 CALL MOVE(.DEST,.SOURCE,33); +1165 3 CALL CHECK$EOL; +1166 3 CALL SIMPLECOPY; +1167 3 GO TO ENDCOM; +1168 3 END; + /* MAY BE POSSIBLE TO DO A FAST DISK COPY */ +1169 2 IF TYPE = FILE THEN /* FILE TO FILE */ +1170 2 DO; CALL DEBLANK; IF CHAR <> CR THEN GO TO SIMPLECOM; + /* FILE TO FILE */ +1174 3 CALL SET$SDISK; +1175 3 CALL SIMPLECOPY; +1176 3 GO TO ENDCOM; +1177 3 END; + +1178 2 SIMPLECOM: + CBP = 255; /* READY FOR RESCAN */ + + /* OTHERWISE PROCESS SIMPLE REQUEST */ +1179 2 CALL SCAN(.DEST); +1180 2 IF (TYPE < FILE) OR AMBIG THEN /* DELIMITER OR ERROR */ +1181 2 CALL ERROR(.('UNRECOGNIZED DESTINATION$')); + +1182 2 DHEX = FALSE; +1183 2 IF TYPE = FILE THEN +1184 2 DO; /* DESTINATION IS A FILE, SAVE EXTENT NAME */ +1185 3 CALL SET$DDISK; +1186 3 CALL SETUPDEST; +1187 3 CHAR = 255; +1188 3 END; ELSE + /* PERIPHERAL NAME */ +1189 2 IF CHAR >= NULP OR CHAR <= RDR THEN CALL ERROR(.('CANNOT WRITE$')); + + IF (PDEST := CHAR + 1) = PUNP THEN CALL NULLS; + + PL/M-80 COMPILER PAGE 28 + + + /* NOW SCAN THE DELIMITER */ +1193 2 CALL SCAN(.SOURCE); +1194 2 IF TYPE <> SPECL OR CHAR <> '=' THEN +1195 2 CALL ERROR(.('INVALID PIP FORMAT$')); + + /* OTHERWISE SCAN AND COPY UNTIL CR */ +1196 2 COPYING = TRUE; +1197 2 DO WHILE COPYING; +1198 3 SUSER = CUSER; +1199 3 CALL SCAN(.SOURCE); + /* SUSER MAY HAVE BEEN RESET */ +1200 3 SCOM = FALSE; +1201 3 IF TYPE = FILE AND NOT AMBIG THEN /* A SOURCE FILE */ +1202 3 DO; +1203 4 CALL SET$SDISK; +1204 4 CALL SETUPSOURCE; +1205 4 CHAR = 255; +1206 4 END; ELSE + +1207 3 IF TYPE <> PERIPH OR (CHAR <= LST AND CHAR > RDR) THEN +1208 3 CALL ERROR(.('CANNOT READ$')); + + + SCOM = SCOM OR OBJ; /* MAY BE ABSOLUTE COPY */ +1210 3 PSOURCE = CHAR + 1; +1211 3 IF CHAR = NULP THEN CALL NULLS; ELSE +1213 3 IF CHAR = EOFP THEN CALL PUTDEST(ENDFILE); ELSE +1215 3 DO; /* DISK COPY */ +1216 4 IF (CHAR < HSRDR AND DHEX) THEN HEXT = 1; + /* HEX FILE SET IF SOURCE IS RDR AND DEST IS HEX FILE */ +1218 4 IF PDEST = PRNT THEN +1219 4 DO; NUMB = 1; +1221 5 IF TABS = 0 THEN TABS = 8; +1223 5 IF PAGCNT = 0 THEN PAGCNT = 1; +1225 5 END; +1226 4 CALL COPYCHAR; +1227 4 END; + +1228 3 CALL CHECK$STRINGS; + /* READ ENDFILE, GO TO NEXT SOURCE */ +1229 3 CALL SCAN(.SOURCE); +1230 3 IF TYPE <> SPECL OR (CHAR <> ',' AND CHAR <> CR) THEN +1231 3 CALL ERROR(.('INVALID SEPARATOR$')); + +1232 3 COPYING = CHAR <> CR; +1233 3 END; + + /* IF NECESSARY, CLOSE FILE OR PUNCH TRAILER */ +1234 2 IF PDEST = PUNP THEN +1235 2 DO; CALL PUTDEST(ENDFILE); CALL NULLS; +1238 3 END; +1239 2 IF PDEST = 0 THEN /* FILE HAS TO BE CLOSED AND RENAMED */ +1240 2 CALL CLOSEDEST(FALSE); + + /* COMLEN SET TO 0 IF NOT PROCESSING MULTIPLE COMMANDS */ +1241 2 ENDCOM: + COMLEN = MULTCOM; + PL/M-80 COMPILER PAGE 29 + + + +1242 2 END; /* DO FOREVER */ +1243 1 END; + + + + +MODULE INFORMATION: + + CODE AREA SIZE = 1C34H 7220D + VARIABLE AREA SIZE = 01D8H 472D + MAXIMUM STACK SIZE = 0034H 52D + 1594 LINES READ + 0 PROGRAM ERROR(S) + +END OF PL/M-80 COMPILATION + \ No newline at end of file diff --git a/ISIS PLM/PIP.MOD b/ISIS PLM/PIP.MOD new file mode 100644 index 0000000000000000000000000000000000000000..c37a39a44902504c1d2af6baf28ff2343782e79e GIT binary patch literal 12928 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 literal 0 HcmV?d00001 diff --git a/ISIS PLM/PIP.OBJ b/ISIS PLM/PIP.OBJ new file mode 100644 index 0000000000000000000000000000000000000000..a5d1dbfd2d147a69697f0905d55d92ebec6b6a18 GIT binary patch literal 12672 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 CBEp0K literal 0 HcmV?d00001 diff --git a/ISIS PLM/PIP.PLM b/ISIS PLM/PIP.PLM new file mode 100644 index 0000000..da6d3de --- /dev/null +++ b/ISIS PLM/PIP.PLM @@ -0,0 +1,1594 @@ +PIPMOD: +DO; +/* P E R I P H E R A L I N T E R C H A N G E P R O G R A M + + COPYRIGHT (C) 1976, 1977, 1978, 1979, 1980 + DIGITAL RESEARCH + BOX 579 + PACIFIC GROVE, CA + 93950 + */ + +DECLARE + CPMVERSION LITERALLY '0020H'; /* REQUIRED FOR OPERATION */ + +DECLARE + IOBYTE BYTE EXTERNAL, /* IOBYTE AT 0003H */ + MAXB ADDRESS EXTERNAL, /* ADDR FIELD OF JMP BDOS */ + FCB (33) BYTE EXTERNAL, /* DEFAULT FILE CONTROL BLOCK */ + BUFF(128)BYTE EXTERNAL; /* DEFAULT BUFFER */ + +DECLARE + ENDFILE LITERALLY '1AH', /* END OF FILE MARK */ + JMP LITERALLY '0C3H', /* 8080 JUMP INSTRUCTION */ + RET LITERALLY '0C9H'; /* 8080 RETURN */ + +/* THE FIRST PORTION OF THE PIP PROGRAM 'FAKES' THE PAGE ONE +(100H - 1FFH) SECTION OF PIP WHICH CONTAINS A JUMP TO PIPENTRY, AND +SPACE FOR CUSTOM I/O DRIVERS (WHICH CAN BE 'PATCHED' USING DDT) IN THE +REMAINING PAGE ONE AREA. THE PIP PROGRAM ACTUALLY STARTS AT 200H */ + +DECLARE JUMP BYTE DATA(JMP); /* JMP INSTRUCTION TO */ +/* JMP .PIPENTRY-3 WHERE THE LXI SP,STACK ACTUALLY OCCURS */ +DECLARE JADR ADDRESS DATA(.PIPENTRY-3); /* START OF PIP */ +DECLARE INPSUB(3) BYTE DATA(RET,0,0); /* INP: RET NOP NOP */ +DECLARE OUTSUB(3) BYTE DATA(RET,0,0); /* OUT: RET NOP NOP */ +DECLARE INPDATA BYTE DATA(ENDFILE); /* RETURNED DATA */ + /* NOTE: PAGE 1 AT 100H CONTAINS THE FOLLOWING + 100H: JMP PIPENTRY ;TO START THE PIP PROGRAM + 103H: RET ;INP: DEFAULTS TO EMPTY INPUT (DATA 1AH AT 109H) + 104H: NOP + 105H: NOP + 106H: RET ;OUT: DEFAULTS TO EMPTY OUTPUT + 107H: NOP + 108H: NOP + 109H: 1AH=ENDFILE ;DATA FROM INP: FUNCTION IS STORED HERE ON + ;RETURN FROM THE INP: ENTRY POINT + 10AH: - 1FFH ;SPACE RESERVED FOR SPECIAL PURPOSE + ; DRIVERS - IF INCLUDED, THEN REPLACE 103H AND 106H BY JMP'S + ; TO THE PROPER LOCATIONS WITHIN THE RESERVED AREA. + ; ALSO, RETURN DATA FROM INP: ENTRY POINT AT 109H. + ; THESE DRIVERS ARE MOST EASILY INSERTED WITH THE DDT PROGRAM + ; UNDER CP/M + */ + +DECLARE /* 16 BYTE MESSAGE */ + FREEMEMORY LITERALLY '''(INP:/OUT:SPACE)''', + /* 256 BYTE AREA FOR INP: OUT: PATCHING */ + RESERVED(*) BYTE DATA(0,0,0,0,0,0, + FREEMEMORY, FREEMEMORY, FREEMEMORY, + FREEMEMORY, FREEMEMORY, FREEMEMORY, FREEMEMORY, + FREEMEMORY, FREEMEMORY, FREEMEMORY, FREEMEMORY, + FREEMEMORY, FREEMEMORY, FREEMEMORY, FREEMEMORY); + + + + + DECLARE COPYRIGHT(*) BYTE DATA ( + ' COPYRIGHT (C) 1979, DIGITAL RESEARCH, PIP VERS 1.5'); + + DECLARE INPLOC ADDRESS DATA (.INPSUB); /* ADDRESS OF INP: DEVICE */ + DECLARE OUTLOC ADDRESS DATA (.OUTSUB); /* ADDRESS OF OUT: DEVICE */ + +OUT: PROCEDURE(B); + DECLARE B BYTE; + /* SEND B TO OUT: DEVICE */ + CALL OUTLOC; + END OUT; + +INP: PROCEDURE BYTE; + CALL INPLOC; + RETURN INPDATA; + END INP; + + +TIMEOUT: PROCEDURE; + /* WAIT FOR 50 MSEC */ + CALL TIME(250); CALL TIME(250); + END TIMEOUT; + + /* LITERAL DECLARATIONS */ + DECLARE + LIT LITERALLY 'LITERALLY', + LPP LIT '60', /* LINES PER PAGE */ + TAB LIT '09H', /* HORIZONTAL TAB */ + FF LIT '0CH', /* FORM FEED */ + LA LIT '05FH', /* LEFT ARROW */ + LB LIT '05BH', /* LEFT BRACKET */ + RB LIT '05DH', /* RIGHT BRACKET */ + XOFF LIT '13H', /* TRANSMIT BUFFER FUNCTION */ + + RDR LIT '5', + LST LIT '10', + PUNP LIT '15', /* POSITION OF 'PUN' + 1 */ + CONP LIT '19', /* CONSOLE */ + NULP LIT '19', /* NUL: BEFORE INCREMENT */ + EOFP LIT '20', /* EOF: BEFORE INCREMENT */ + HSRDR LIT 'RDR', /* READER DEVICES */ + PRNT LIT '10', /* PRINTER */ + + + FSIZE LIT '33', + FRSIZE LIT '36', /* SIZE OF RANDOM FCB */ + NSIZE LIT '8', + FNSIZE LIT '11', + MDISK LIT '1', + FNAM LIT '8', + FEXT LIT '9', + FEXTL LIT '3', + ROFILE LITERALLY '9', /* READ ONLY FILE FIELD */ + SYSFILE LITERALLY '10', /* SYSTEM FILE FIELD */ + FREEL LIT '12', /* REEL NUMBER FIELD OF FCB */ + + HBUFS LIT '80', /* "HEX" BUFFER SIZE */ + + ERR LIT '0', + SPECL LIT '1', + FILE LIT '2', + PERIPH LIT '3', + DISKNAME LIT '4'; + +DECLARE + COLUMN BYTE, /* COLUMN COUNT FOR PRINTER TABS */ + LINENO BYTE, /* LINE WITHIN PAGE */ + AMBIG BYTE, /* SET FOR AMBIGUOUS FILE REFS */ + PARSET BYTE, /* TRUE IF PARAMETERS PRESENT */ + FEEDBASE BYTE, /* USED TO FEED SEARCH CHARACTERS */ + FEEDLEN BYTE, /* LENGTH OF FEED STRING */ + MATCHLEN BYTE, /* USED IN MATCHING STRINGS */ + QUITLEN BYTE, /* USED TO TERMINATE QUIT COMMAND */ + NBUF BYTE, /* NUM BUFFERS-1 IN SBUFF AND DBUFF */ + CDISK BYTE, /* CURRENT DISK */ + BUFFER LITERALLY 'BUFF', /* DEFAULT BUFFER */ + SEARFCB LITERALLY 'FCB', /* SEARCH FCB IN MULTI COPY */ + MEMSIZE LITERALLY 'MAXB', /* MEMORY SIZE */ + SBLEN ADDRESS, /* SOURCE BUFFER LENGTH */ + DBLEN ADDRESS, /* DEST BUFFER LENGTH */ + SBASE ADDRESS, /* SOURCE BUFFER BASE */ + /* THE VECTORS DBUFF AND SBUFF ARE DECLARED WITH DIMENSION + 1024, BUT ACTUALLY VARY WITH THE FREE MEMORY SIZE */ + DBUFF(1024) BYTE AT (.MEMORY), /* DESTINATION BUFFER */ + SBUFF BASED SBASE (1024) BYTE, /* SOURCE BUFFER */ + SDISK BYTE, /* SOURCE DISK */ + (SCOM, DHEX) BYTE, /* SOURCE IS 'COM' FILE IF TRUE */ + /* DEST IS 'HEX' FILE IF TRUE */ + SOURCE (FSIZE) BYTE, /* SOURCE FCB */ + SFUB BYTE AT(.SOURCE(13)), /* UNFILLED BYTES FIELD */ + DEST (FRSIZE) BYTE, /* DESTINATION FCB */ + DESTR ADDRESS AT(.DEST(33)), /* RANDOM RECORD POSITION */ + DESTO BYTE AT(.DEST(35)), /* RANDOM OVERFLOW BYTE */ + DFUB BYTE AT (.DEST(13)), /* UNFILLED BYTES FIELD */ + DDISK BYTE, /* DESTINATION DISK */ + HBUFF(HBUFS) BYTE, /* HEX FILE BUFFER */ + HSOURCE BYTE, /* NEXT HEX SOURCE CHARACTER */ + + NSOURCE ADDRESS, /* NEXT SOURCE CHARACTER */ + HARDEOF ADDRESS, /* SET TO NSOURCE ON REAL EOF */ + NDEST ADDRESS; /* NEXT DESTINATION CHARACTER */ + +DECLARE + /* SUBMIT FILE CONTROL BLOCK FOR ERROR DELETE */ + SUBFCB (*) BYTE DATA (0,'$$$ SUB',0,0,0); + + DECLARE + PDEST BYTE, /* DESTINATION DEVICE */ + PSOURCE BYTE; /* CURRENT SOURCE DEVICE */ + + DECLARE + MULTCOM BYTE, /* FALSE IF PROCESSING ONE LINE */ + PUTNUM BYTE, /* SET WHEN READY FOR NEXT LINE NUM */ + CONCNT BYTE, /* COUNTER FOR CONSOLE READY CHECK */ + CHAR BYTE, /* LAST CHARACTER SCANNED */ + TYPE BYTE, /* TYPE OF CHARACTER SCANNED */ + FLEN BYTE; /* FILE NAME LENGTH */ + +MON1: PROCEDURE(F,A) EXTERNAL; + DECLARE F BYTE, + A ADDRESS; + END MON1; + +MON2: PROCEDURE(F,A) BYTE EXTERNAL; + DECLARE F BYTE, + A ADDRESS; + END MON2; + +MON3: PROCEDURE(F,A) ADDRESS EXTERNAL; + DECLARE F BYTE, + A ADDRESS; + END MON3; + +BOOT: PROCEDURE EXTERNAL; + /* SYSTEM REBOOT */ + END BOOT; + +READRDR: PROCEDURE BYTE; + /* READ CURRENT READER DEVICE */ + RETURN MON2(3,0); + END READRDR; + +READCHAR: PROCEDURE BYTE; + /* READ CONSOLE CHARACTER */ + RETURN MON2(1,0); + END READCHAR; + +DECLARE + TRUE LITERALLY '1', + FALSE LITERALLY '0', + FOREVER LITERALLY 'WHILE TRUE', + CR LITERALLY '13', + LF LITERALLY '10', + WHAT LITERALLY '63'; + +PRINTCHAR: PROCEDURE(CHAR); + DECLARE CHAR BYTE; + CALL MON1(2,CHAR AND 7FH); + END PRINTCHAR; + +CRLF: PROCEDURE; + CALL PRINTCHAR(CR); + CALL PRINTCHAR(LF); + END CRLF; + +PRINT: PROCEDURE(A); + DECLARE A ADDRESS; + /* PRINT THE STRING STARTING AT ADDRESS A UNTIL THE + NEXT DOLLAR SIGN IS ENCOUNTERED */ + CALL CRLF; + CALL MON1(9,A); + END PRINT; + +DECLARE DCNT BYTE; + +VERSION: PROCEDURE ADDRESS; + RETURN MON3(12,0); /* VERSION NUMBER */ + END VERSION; + +INITIALIZE: PROCEDURE; + CALL MON1(13,0); + END INITIALIZE; + +SELECT: PROCEDURE(D); + DECLARE D BYTE; + CALL MON1(14,D); + END SELECT; + +OPEN: PROCEDURE(FCB); + DECLARE FCB ADDRESS; + DCNT = MON2(15,FCB); + END OPEN; + +CLOSE: PROCEDURE(FCB); + DECLARE FCB ADDRESS; + DCNT = MON2(16,FCB); + END CLOSE; + +SEARCH: PROCEDURE(FCB); + DECLARE FCB ADDRESS; + DCNT = MON2(17,FCB); + END SEARCH; + +SEARCHN: PROCEDURE; + DCNT = MON2(18,0); + END SEARCHN; + +DELETE: PROCEDURE(FCB); + DECLARE FCB ADDRESS; + CALL MON1(19,FCB); + END DELETE; + +DISKREAD: PROCEDURE(FCB) BYTE; + DECLARE FCB ADDRESS; + RETURN MON2(20,FCB); + END DISKREAD; + +DISKWRITE: PROCEDURE(FCB) BYTE; + DECLARE FCB ADDRESS; + RETURN MON2(21,FCB); + END DISKWRITE; + +MAKE: PROCEDURE(FCB); + DECLARE FCB ADDRESS; + DCNT = MON2(22,FCB); + END MAKE; + +RENAME: PROCEDURE(FCB); + DECLARE FCB ADDRESS; + CALL MON1(23,FCB); + END RENAME; + +DECLARE + CUSER BYTE, /* CURRENT USER NUMBER */ + SUSER BYTE; /* SOURCE USER NUMBER ('G' PARAMETER) */ + +SETIND: PROCEDURE(FCB); + DECLARE FCB ADDRESS; + CALL MON1(30,FCB); + END SETIND; + +GETUSER: PROCEDURE BYTE; + RETURN MON2(32,0FFH); + END GETUSER; + +SETUSER: PROCEDURE(USER); + DECLARE USER BYTE; + CALL MON1(32,USER); + END SETUSER; + +SETCUSER: PROCEDURE; + CALL SETUSER(CUSER); + END SETCUSER; + +SETSUSER: PROCEDURE; + CALL SETUSER(SUSER); + END SETSUSER; + +READ$RANDOM: PROCEDURE(FCB) BYTE; + DECLARE FCB ADDRESS; + RETURN MON2(33,FCB); + END READ$RANDOM; + +WRITE$RANDOM: PROCEDURE(FCB) BYTE; + DECLARE FCB ADDRESS; + RETURN MON2(34,FCB); + END WRITE$RANDOM; + +SET$RANDOM: PROCEDURE(FCB); + DECLARE FCB ADDRESS; + /* SET RANDOM RECORD POSITION */ + CALL MON1(36,FCB); + END SET$RANDOM; + +DECLARE CBUFF(130) BYTE, /* COMMAND BUFFER */ + MAXLEN BYTE AT (.CBUFF(0)), /* MAX BUFFER LENGTH */ + COMLEN BYTE AT (.CBUFF(1)), /* CURRENT LENGTH */ + COMBUFF (128) BYTE AT (.CBUFF(2)); /* COMMAND BUFFER CONTENTS */ +DECLARE (TCBP,CBP) BYTE; /* TEMP CBP, COMMAND BUFFER POINTER */ + +READCOM: PROCEDURE; + /* READ INTO COMMAND BUFFER */ + MAXLEN = 128; + CALL MON1(10,.MAXLEN); + END READCOM; + +DECLARE MCBP BYTE; + +CONBRK: PROCEDURE BYTE; + /* CHECK CONSOLE CHARACTER READY */ + RETURN MON2(11,0); + END CONBRK; + +DECLARE /* CONTROL TOGGLE VECTOR */ + CONT(26) BYTE, /* ONE FOR EACH ALPHABETIC */ + /* 00 01 02 03 04 05 06 07 08 09 10 11 12 13 + A B C D E F G H I J K L M N + 14 15 16 17 18 19 20 21 22 23 24 25 + O P Q R S T U V W X Y Z */ + BLOCK BYTE AT(.CONT(1)), /* BLOCK MODE TRANSFER */ + DELET BYTE AT(.CONT(3)), /* DELETE CHARACTERS */ + ECHO BYTE AT(.CONT(4)), /* ECHO CONSOLE CHARACTERS */ + FORMF BYTE AT(.CONT(5)), /* FORM FILTER */ + GETU BYTE AT(.CONT(6)), /* GET FILE, USER # */ + HEXT BYTE AT(.CONT(7)), /* HEX FILE TRANSFER */ + IGNOR BYTE AT(.CONT(8)), /* IGNORE :00 RECORD ON FILE */ + LOWER BYTE AT(.CONT(11)), /* TRANSLATE TO LOWER CASE */ + NUMB BYTE AT(.CONT(13)), /* NUMBER OUTPUT LINES */ + OBJ BYTE AT(.CONT(14)), /* OBJECT FILE TRANSFER */ + PAGCNT BYTE AT(.CONT(15)), /* PAGE LENGTH */ + QUITS BYTE AT(.CONT(16)), /* QUIT COPY */ + RSYS BYTE AT(.CONT(17)), /* READ SYSTEM FILES */ + STARTS BYTE AT(.CONT(18)), /* START COPY */ + TABS BYTE AT(.CONT(19)), /* TAB SET */ + UPPER BYTE AT(.CONT(20)), /* UPPER CASE TRANSLATE */ + VERIF BYTE AT(.CONT(21)), /* VERIFY EQUAL FILES ONLY */ + WRROF BYTE AT(.CONT(22)), /* WRITE TO R/O FILE */ + ZEROP BYTE AT(.CONT(25)); /* ZERO PARITY ON INPUT */ + + SETDMA: PROCEDURE(A); + DECLARE A ADDRESS; + CALL MON1(26,A); + END SETDMA; + + /* INTELLEC 8 INTEL/ICOM READER INPUT */ + +INTIN: PROCEDURE BYTE; + /* READ THE INTEL / ICOM READER */ + DECLARE PTRI LITERALLY '3', /* DATA */ + PTRS LITERALLY '1', /* STATUS */ + PTRC LITERALLY '1', /* COMMAND */ + PTRG LITERALLY '0CH', /* GO */ + PTRN LITERALLY '08H'; /* STOP */ + + /* STROBE THE READER */ + OUTPUT(PTRC) = PTRG; + OUTPUT(PTRC) = PTRN; + DO WHILE NOT ROL(INPUT(PTRS),3); /* NOT READY */ + END; + /* DATA READY */ + RETURN INPUT(PTRI) AND 7FH; + END INTIN; + + +DECLARE ZEROSUP BYTE, /* ZERO SUPPRESSION */ + (C3,C2,C1) BYTE; /* LINE COUNT ON PRINTER */ + + ERROR: PROCEDURE(A); + DECLARE A ADDRESS, I BYTE; + CALL SETCUSER; + CALL PRINT(A); CALL PRINTCHAR(':'); CALL PRINTCHAR(' '); + DO I = TCBP TO CBP; + IF I < COMLEN THEN CALL PRINTCHAR(COMBUFF(I)); + END; + /* ZERO THE COMLEN IN CASE THIS IS A SINGLE COMMAND */ + COMLEN = 0; + /* DELETE ANY $$$.SUB FILES IN CASE BATCH PROCESSING */ + /* DELETE SUB FILE ONLY IF PRESENT (MAY BE R/O DISK) */ + CALL SEARCH(.SUBFCB); + IF DCNT <> 255 THEN CALL DELETE(.SUBFCB); + CALL CRLF; + GO TO RETRY; + END ERROR; + + MOVE: PROCEDURE(S,D,N); + DECLARE (S,D) ADDRESS, N BYTE; + DECLARE A BASED S BYTE, B BASED D BYTE; + DO WHILE (N:=N-1) <> 255; + B = A; S = S+1; D = D+1; + END; + END MOVE; + + + FILLSOURCE: PROCEDURE; + /* FILL THE SOURCE BUFFERS */ + DECLARE (I,J) BYTE; + NSOURCE = 0; + CALL SELECT(SDISK); + CALL SETSUSER; /* SOURCE USER NUMBER SET */ + DO I = 0 TO NBUF; + /* SET DMA ADDRESS TO NEXT BUFFER POSIITION */ + CALL SETDMA(.SBUFF(NSOURCE)); + IF (J := DISKREAD(.SOURCE)) <> 0 THEN + DO; IF J <> 1 THEN + CALL ERROR(.('DISK READ ERROR$')); + /* END - OF - FILE */ + HARDEOF = NSOURCE; /* SET HARD END-OF-FILE */ + SBUFF(NSOURCE) = ENDFILE; I = NBUF; + END; ELSE + NSOURCE = NSOURCE + 128; + END; + NSOURCE = 0; + CALL SETCUSER; /* BACK TO CURRENT USER NUMBER */ + END FILLSOURCE; + + + WRITEDEST: PROCEDURE; + /* WRITE OUTPUT BUFFERS UP TO BUT NOT INCLUDING POSITION + NDEST - THE LOW ORDER 7 BITS OF NDEST ARE ZERO */ + DECLARE (I, J, N) BYTE; + DECLARE DMA ADDRESS; + DECLARE DATAOK BYTE; + IF (N := LOW(SHR(NDEST,7)) - 1) = 255 THEN RETURN ; + NDEST = 0; + CALL SELECT(DDISK); + CALL SETRANDOM(.DEST); /* SET BASE RECORD FOR VERIFY */ + DO I = 0 TO N; + /* SET DMA ADDRESS TO NEXT BUFFER */ + DMA = .DBUFF(NDEST); + CALL SETDMA(DMA); + IF DISKWRITE(.DEST) <> 0 THEN + CALL ERROR(.('DISK WRITE ERROR$')); + NDEST = NDEST + 128; + END; + IF VERIF THEN /* VERIFY DATA WRITTEN OK */ + DO; + NDEST = 0; + CALL SETDMA(.BUFF); /* FOR COMPARE */ + DO I = 0 TO N; + DATAOK = READRANDOM(.DEST) = 0; + DESTR = DESTR + 1; /* NEXT RANDOM READ */ + J = 0; + /* PERFORM COMPARISON */ + DO WHILE DATAOK AND J < 80H; + DATAOK = BUFFER(J) = DBUFF(NDEST+J); + J = J + 1; + END; + NDEST = NDEST + 128; + IF NOT DATAOK THEN + CALL ERROR(.('VERIFY ERROR$')); + END; + DATAOK = DISKWRITE(.DEST); + /* NOW READY TO CONTINUE THE WRITE OPERATION */ + END; + NDEST = 0; + END WRITEDEST; + + PUTDCHAR: PROCEDURE(B); + DECLARE (B,IOB) BYTE; + /* WRITE BYTE B TO THE DESTINATION DEVICE GIVEN BY PDEST */ + IF B >= ' ' THEN + DO; COLUMN = COLUMN + 1; + IF DELET > 0 THEN /* MAY BE PAST RIGHT SIDE */ + DO; IF COLUMN > DELET THEN RETURN; + END; + END; + IOB = IOBYTE; /* IN CASE IT IS ALTERED */ + DO CASE PDEST; + /* CASE 0 IS THE DESTINATION FILE */ + DO; + IF NDEST >= DBLEN THEN CALL WRITEDEST; + DBUFF(NDEST) = B; + NDEST = NDEST+1; + END; + /* CASE 1 IS ARD (ADDMASTER) */ + GO TO NOTDEST; + /* CASE 2 IS IRD (INTEL/ICOM) */ + GO TO NOTDEST; + /* CASE 3 IS PTR */ + GO TO NOTDEST; + /* CASE 4 IS UR1 */ + GO TO NOTDEST; + /* CASE 5 IS UR2 */ + GO TO NOTDEST; + /* CASE 6 IS RDR */ + NOTDEST: + CALL ERROR(.('NOT A CHARACTER SINK$')); + /* CASE 7 IS OUT */ + CALL OUT(B); + /* CASE 8 IS LPT */ + DO; IOBYTE = 1000$0000B; GO TO LSTL; + END; + /* CASE 9 IS UL1 */ + DO; IOBYTE = 1100$0000B; GO TO LSTL; + END; + /* CASE 10 IS PRN (TABS EXPANDED, LINES LISTED, CHANGED TO LST) */ + DO; IOBYTE = 1000$0000B; GO TO LSTL; + END; + /* CASE 11 IS LST */ + LSTL: + CALL MON1(5,B); + /* CASE 12 IS PTP */ + DO; IOBYTE = 0001$0000B; GO TO PUNL; + END; + /* CASE 13 IS UP1 */ + DO; IOBYTE = 0010$0000B; GO TO PUNL; + END; + /* CASE 14 IS UP2 */ + DO; IOBYTE = 0011$0000B; GO TO PUNL; + END; + /* CASE 15 IS PUN */ + PUNL: + CALL MON1(4,B); + /* CASE 16 IS TTY */ + DO; IOBYTE = 0; GO TO CONL; + END; + /* CASE 17 IS CRT */ + DO; IOBYTE = 1; GO TO CONL; + END; + /* CASE 18 IS UC1 */ + DO; IOBYTE = 11B; GO TO CONL; + END; + /* CASE 19 IS CON */ + CONL: + CALL MON1(2,B); + END; + IOBYTE = IOB; + END PUTDCHAR; + +PUTDESTC: PROCEDURE(B); + DECLARE (B,I) BYTE; + /* WRITE DESTINATION CHARACTER, TAB EXPANSION */ + IF B <> TAB THEN CALL PUTDCHAR(B); ELSE + IF TABS = 0 THEN CALL PUTDCHAR(B); ELSE + /* B IS TAB CHAR, TABS > 0 */ + DO; I = COLUMN; + DO WHILE I >= TABS; + I = I - TABS; + END; + I = TABS - I; + DO WHILE I > 0; + I = I - 1; + CALL PUTDCHAR(' '); + END; + END; + IF B = CR THEN COLUMN = 0; + END PUTDESTC; + +PRINT1: PROCEDURE(B); + DECLARE B BYTE; + IF (ZEROSUP := ZEROSUP AND B = 0) THEN CALL PUTDESTC(' '); ELSE + CALL PUTDESTC('0'+B); + END PRINT1; + +PRINTDIG: PROCEDURE(D); + DECLARE D BYTE; + CALL PRINT1(SHR(D,4)); CALL PRINT1(D AND 1111B); + END PRINTDIG; + +NEWLINE: PROCEDURE; + DECLARE ONE BYTE; + ONE = 1; + ZEROSUP = NUMB = 1; + C1 = DEC(C1+ONE); C2 = DEC(C2 PLUS 0); C3 = DEC(C3 PLUS 0); + CALL PRINTDIG(C3); CALL PRINTDIG(C2); CALL PRINTDIG(C1); + IF NUMB = 1 THEN /* USUALLY PRINTER OUTPUT */ + DO; CALL PUTDESTC(':'); CALL PUTDESTC(' '); + END; ELSE + CALL PUTDESTC(TAB); + END NEWLINE; + +CLEARBUFF: PROCEDURE; + /* CLEAR OUTPUT BUFFER IN BLOCK MODE TRANSMISION */ + DECLARE NA ADDRESS; + DECLARE I BYTE; + I = LOW(NDEST) AND 7FH; /* REMAINING PARTIAL BUFFER LENGTH */ + NA = NDEST AND 0FF80H; /* START OF SEGMENT NOT WRITTEN */ + CALL WRITEDEST; /* CLEARS BUFFERS */ + CALL MOVE(.DBUFF(NA),.DBUFF,I); + /* DATA MOVED TO BEGINNING OF BUFFER */ + NDEST = I; + END CLEARBUFF; + +PUTDEST: PROCEDURE(B); + DECLARE (I,B) BYTE; + /* WRITE DESTINATION CHARACTER, CHECK TABS AND LINES */ + IF FORMF THEN /* SKIP FORM FEEDS */ + DO; IF B = FF THEN RETURN; + END; + IF PUTNUM THEN /* END OF LINE OR START OF FILE */ + DO; + IF B <> FF THEN /* NOT FORM FEED */ + DO; + IF (I:=PAGCNT) <> 0 THEN /* PAGE EJECT */ + DO; IF I=1 THEN I=LPP; + IF (LINENO := LINENO + 1) >= I THEN + DO; LINENO = 0; /* NEW PAGE */ + CALL PUTDESTC(FF); + END; + END; + IF NUMB > 0 THEN + CALL NEWLINE; + PUTNUM = FALSE; + END; + END; + IF BLOCK THEN /* BLOCK MODE TRANSFER */ + DO; + IF B = XOFF AND PDEST = 0 THEN + DO; CALL CLEARBUFF; /* BUFFERS WRITTEN */ + RETURN; /* DON'T PASS THE X-OFF */ + END; + END; + IF B = FF THEN LINENO = 0; + CALL PUTDESTC(B); + IF B = LF THEN PUTNUM = TRUE; + END PUTDEST; + + +UTRAN: PROCEDURE(B) BYTE; + DECLARE B BYTE; + /* TRANSLATE ALPHA TO UPPER CASE */ + IF B >= 110$0001B AND B <= 111$1010B THEN /* LOWER CASE */ + B = B AND 101$1111B; /* TO UPPER CASE */ + RETURN B; + END UTRAN; + +LTRAN: PROCEDURE(B) BYTE; + DECLARE B BYTE; + /* TRANSLATE TO LOWER CASE ALPHA */ + IF B >= 'A' AND B <= 'Z' THEN B = B OR 10$0000B; /* TO LOWER */ + RETURN B; + END LTRAN; + +GETSOURCEC: PROCEDURE BYTE; + /* READ NEXT SOURCE CHARACTER */ + DECLARE (IOB,B,CONCHK) BYTE; + + IF PSOURCE - 1 <= RDR THEN /* 1 ... RDR+1 */ + DO; IF (BLOCK OR HEXT) AND CONBRK THEN + DO; + IF READCHAR = ENDFILE THEN RETURN ENDFILE; + CALL PRINT(.('READER STOPPING',CR,LF,'$')); + RETURN XOFF; + END; + END; + CONCHK = TRUE; /* CONSOLE STATUS CHECK BELOW */ + IOB = IOBYTE; /* SAVE IT IN CASE IT IS ALTERED */ + DO CASE PSOURCE; + /* CASE 0 IS SOURCE FILE */ + DO; IF NSOURCE >= SBLEN THEN CALL FILLSOURCE; + B = SBUFF(NSOURCE); + NSOURCE = NSOURCE + 1; + END; + /* CASE 1 IS INP */ + B = INP; + /* CASE 2 IS IRD (INTEL/ICOM) */ + B = INTIN; + /* CASE 3 IS PTR */ + DO; IOBYTE = 0000$0100B; GO TO RDRL; + END; + /* CASE 4 IS UR1 */ + DO; IOBYTE = 0000$1000B; GO TO RDRL; + END; + /* CASE 5 IS UR2 */ + DO; IOBYTE = 0000$1100B; GO TO RDRL; + END; + /* CASE 6 IS RDR */ + RDRL: + B = MON2(3,0) AND 7FH; + /* CASE 7 IS OUT */ + GO TO NOTSOURCE; + /* CASE 8 IS LPT */ + GO TO NOTSOURCE; + /* CASE 9 IS UL1 */ + GO TO NOTSOURCE; + /* CASE 10 IS PRN */ + GO TO NOTSOURCE; + /* CASE 11 IS LST */ + GO TO NOTSOURCE; + /* CASE 12 IS PTP */ + GO TO NOTSOURCE; + /* CASE 13 IS UP1 */ + GO TO NOTSOURCE; + /* CASE 14 IS UP2 */ + GO TO NOTSOURCE; + /* CASE 15 IS PUN */ + NOTSOURCE: + DO; CALL ERROR(.('NOT A CHARACTER SOURCE$')); + END; + /* CASE 16 IS TTY */ + DO; IOBYTE = 0; GO TO CONL; + END; + /* CASE 17 IS CRT */ + DO; IOBYTE = 01B; GO TO CONL; + END; + /* CASE 18 IS UC1 */ + DO; IOBYTE = 11B; GO TO CONL; + END; + /* CASE 19 IS CON */ + CONL: + DO; CONCHK = FALSE; /* DON'T CHECK CONSOLE STATUS */ + B = MON2(1,0); + END; + END; /* OF CASES */ + IOBYTE = IOB; /* RESTORE IOBYTE */ + IF ECHO THEN /* COPY TO CONSOLE DEVICE */ + DO; IOB = PDEST; PDEST = CONP; CALL PUTDEST(B); + PDEST = IOB; + END; + IF CONCHK THEN /* TEST FOR CONSOLE CHAR READY */ + DO; + IF SCOM THEN /* SOURCE IS A COM FILE */ + CONCHK = (CONCNT := CONCNT + 1) = 0; ELSE /* ASCII */ + CONCHK = B = LF; + IF CONCHK THEN + DO; IF CONBRK THEN + DO; + IF READCHAR = ENDFILE THEN RETURN ENDFILE; + CALL ERROR(.('ABORTED$')); + END; + END; + END; + IF ZEROP THEN B = B AND 7FH; + IF UPPER THEN RETURN UTRAN(B); + IF LOWER THEN RETURN LTRAN(B); + RETURN B; + END GETSOURCEC; + +GETSOURCE: PROCEDURE BYTE; + /* GET NEXT SOURCE CHARACTER */ + DECLARE CHAR BYTE; + MATCH: PROCEDURE(B) BYTE; + /* MATCH START AND QUIT STRINGS */ + DECLARE (B,C) BYTE; + IF (C:=COMBUFF(B:=(B+MATCHLEN))) = ENDFILE THEN /* END MATCH */ + DO; COMBUFF(B) = CHAR; /* SAVE CURRENT CHARACTER */ + RETURN TRUE; + END; + IF C = CHAR THEN MATCHLEN = MATCHLEN + 1; ELSE + MATCHLEN = 0; /* NO MATCH */ + RETURN FALSE; + END MATCH; + IF QUITLEN > 0 THEN + DO; IF (QUITLEN := QUITLEN - 1) = 1 THEN RETURN LF; + RETURN ENDFILE; /* TERMINATED WITH CR,LF,ENDFILE */ + END; + DO FOREVER; /* LOOKING FOR START */ + IF FEEDLEN > 0 THEN /* GET SEARCH CHARACTERS */ + DO; FEEDLEN = FEEDLEN - 1; + CHAR = COMBUFF(FEEDBASE); + FEEDBASE = FEEDBASE + 1; + RETURN CHAR; + END; + IF (CHAR := GETSOURCEC) = ENDFILE THEN RETURN ENDFILE; + IF STARTS > 0 THEN /* LOOKING FOR START STRING */ + DO; IF MATCH(STARTS) THEN + DO; FEEDBASE = STARTS; STARTS = 0; + FEEDLEN = MATCHLEN + 1; + END; /* OTHERWISE NO MATCH, SKIP CHARACTER */ + END; ELSE + IF QUITS > 0 THEN /* PASS CHARACTERS TIL MATCH */ + DO; IF MATCH(QUITS) THEN + DO; QUITS = 0; QUITLEN = 2; + /* SUBSEQUENTLY RETURN CR, LF, ENDFILE */ + RETURN CR; + END; + RETURN CHAR; + END; ELSE + RETURN CHAR; + END; /* OF DO FOREVER */ + END GETSOURCE; + +DECLARE DISK BYTE; /* SELECTED DISK */ + + GNC: PROCEDURE BYTE; + IF (CBP := CBP + 1) >= COMLEN THEN RETURN CR; + RETURN UTRAN(COMBUFF(CBP)); + END GNC; + + DEBLANK: PROCEDURE; + DO WHILE (CHAR := GNC) = ' '; + END; + END DEBLANK; + + SCAN: PROCEDURE(FCBA); + DECLARE FCBA ADDRESS, /* ADDRESS OF FCB TO FILL */ + FCB BASED FCBA (FSIZE) BYTE; /* FCB TEMPLATE */ + DECLARE (I,J,K) BYTE; /* TEMP COUNTERS */ + + /* SCAN LOOKS FOR THE NEXT DELIMITER, DEVICE NAME, OR FILE NAME. + THE VALUE OF CBP MUST BE 255 UPON ENTRY THE FIRST TIME */ + + DELIMITER: PROCEDURE(C) BYTE; + DECLARE (I,C) BYTE; + DECLARE DEL(*) BYTE DATA + (' =.:,<>',CR,LA,LB,RB); + DO I = 0 TO LAST(DEL); + IF C = DEL(I) THEN RETURN TRUE; + END; + RETURN FALSE; + END DELIMITER; + + PUTCHAR: PROCEDURE; + FCB(FLEN:=FLEN+1) = CHAR; + IF CHAR = WHAT THEN AMBIG = TRUE; /* CONTAINS AMBIGUOUS REF */ + END PUTCHAR; + + FILLQ: PROCEDURE(LEN); + /* FILL CURRENT NAME OR TYPE WITH QUESTION MARKS */ + DECLARE LEN BYTE; + CHAR = WHAT; /* QUESTION MARK */ + DO WHILE FLEN < LEN; + CALL PUTCHAR; + END; + END FILLQ; + + GETFCB: PROCEDURE(I) BYTE; + DECLARE I BYTE; + RETURN FCB(I); + END GETFCB; + + SCANPAR: PROCEDURE; + DECLARE (I,J) BYTE; + /* SCAN OPTIONAL PARAMETERS */ + PARSET = TRUE; + SUSER = CUSER; /* SOURCE USER := CURRENT USER */ + CHAR = GNC; /* SCAN PAST BRACKET */ + DO WHILE NOT(CHAR = CR OR CHAR = RB); + IF (I := CHAR - 'A') > 25 THEN /* NOT ALPHA */ + DO; IF CHAR = ' ' THEN CHAR = GNC; ELSE + CALL ERROR(.('BAD PARAMETER$')); + END; ELSE + DO; /* SCAN PARAMETER VALUE */ + IF CHAR = 'S' OR CHAR = 'Q' THEN + DO; /* START OR QUIT COMMAND */ + J = CBP + 1; /* START OF STRING */ + DO WHILE NOT ((CHAR := GNC) = ENDFILE OR CHAR = CR); + END; + CHAR=GNC; + END; ELSE + IF (J := (CHAR := GNC) - '0') > 9 THEN J = 1; + ELSE + DO WHILE (K := (CHAR := GNC) - '0') <= 9; + J = J * 10 + K; + END; + CONT(I) = J; + IF I = 6 THEN /* SET SOURCE USER */ + DO; + IF J > 31 THEN + CALL ERROR(.('INVALID USER NUMBER$')); + SUSER = J; + END; + END; + END; + CHAR = GNC; + END SCANPAR; + + CHKSET: PROCEDURE; + IF CHAR = LA THEN CHAR = '='; + END CHKSET; + + /* INITIALIZE FILE CONTROL BLOCK TO EMPTY */ + AMBIG = FALSE; TYPE = ERR; CHAR = ' '; FLEN = 0; + DO WHILE FLEN < FSIZE-1; + IF FLEN = FNSIZE THEN CHAR = 0; + CALL PUTCHAR; + END; + + /* DEBLANK COMMAND BUFFER */ + CALL DEBLANK; + + /* SAVE STARTING POSITION OF SCAN FOR DIAGNOSTICS */ + TCBP = CBP; + + /* MAY BE A SEPARATOR */ + IF DELIMITER(CHAR) THEN + DO; CALL CHKSET; + TYPE = SPECL; RETURN; + END; + + /* CHECK PERIPHERALS AND DISK FILES */ + DISK = 0; + /* CLEAR PARAMETERS */ + DO I = 0 TO 25; CONT(I) = 0; + END; + PARSET = FALSE; + FEEDLEN,MATCHLEN,QUITLEN = 0; + /* SCAN NEXT NAME */ + DO FOREVER; + FLEN = 0; + DO WHILE NOT DELIMITER(CHAR); + IF FLEN >= NSIZE THEN /* ERROR, FILE NAME TOO LONG */ + RETURN; + IF CHAR = '*' THEN CALL FILLQ(NSIZE); ELSE CALL PUTCHAR; + CHAR = GNC; + END; + + /* CHECK FOR DISK NAME OR DEVICE NAME */ + IF CHAR = ':' THEN + DO; IF DISK <> 0 THEN RETURN; /* ALREADY SET */ + IF FLEN = 1 THEN + /* MAY BE DISK NAME A ... Z */ + DO; + IF (DISK := GETFCB(1) - 'A' + 1) > 26 THEN + /* ERROR, INVALID DISK NAME */ RETURN; + CALL DEBLANK; /* MAY BE DISK NAME ONLY */ + IF DELIMITER(CHAR) THEN + DO; IF CHAR = LB THEN + CALL SCANPAR; + CBP = CBP - 1; + TYPE = DISKNAME; + RETURN; + END; + END; ELSE + + /* MAY BE A THREE CHARACTER DEVICE NAME */ + IF FLEN <> 3 THEN /* ERROR, CANNOT BE DEVICE NAME */ + RETURN; ELSE + + /* LOOK FOR DEVICE NAME */ + DO; DECLARE (I,J,K) BYTE, M LITERALLY '20', + IO(*) BYTE DATA + ('INPIRDPTRUR1UR2RDROUTLPTUL1PRNLST', + 'PTPUP1UP2PUNTTYCRTUC1CONNULEOF',0); + /* NOTE THAT ALL READER-LIKE DEVICES MUST BE + PLACED BEFORE 'RDR', AND ALL LISTING-LIKE DEVICES + MUST APPEAR BELOW LST, BUT ABOVE RDR. THE LITERAL + DECLARATIONS FOR RDR, LST, AND PUNP MUST INDICATE + THE POSITIONS OF THESE DEVICES IN THE LIST */ + J = 255; + DO K = 0 TO M; + I = 0; + DO WHILE ((I:=I+1) <= 3) AND + IO(J+I) = GETFCB(I); + END; + IF I = 4 THEN /* COMPLETE MATCH */ + DO; TYPE = PERIPH; + /* SCAN PARAMETERS */ + IF GNC = LB THEN CALL SCANPAR; + CBP = CBP - 1; CHAR = K; + RETURN; + END; + /* OTHERWISE TRY NEXT DEVICE */ J = J + 3; + END; + + /* ERROR, NO DEVICE NAME MATCH */ RETURN; + END; + IF CHAR = LB THEN /* PARAMETERS FOLLOW */ + CALL SCANPAR; + END; ELSE + + /* CHAR IS NOT ':', SO FILE NAME IS SET. SCAN REMAINDER */ + DO; IF FLEN = 0 THEN /* ERROR, NO PRIMARY NAME */ + RETURN; + FLEN = FNAM; + IF CHAR = '.' THEN /* SCAN FILE TYPE */ + DO WHILE NOT DELIMITER(CHAR := GNC); + IF FLEN >= FNSIZE THEN + /* ERROR, TYPE FIELD TOO LONG */ RETURN; + IF CHAR = '*' THEN CALL FILLQ(FNSIZE); + ELSE CALL PUTCHAR; + END; + + IF CHAR = LB THEN + CALL SCANPAR; + /* RESCAN DELIMITER NEXT TIME AROUND */ + CBP = CBP - 1; + TYPE = FILE; + /* DISK IS THE SELECTED DISK (1 2 3 ... ) */ + IF DISK = 0 THEN DISK = CDISK + 1; /* DEFAULT */ + FCB(0),FCB(32) = 0; + RETURN; + END; + END; + END SCAN; + + NULLS: PROCEDURE; + /* SEND 40 NULLS TO OUTPUT DEVICE */ + DECLARE I BYTE; + DO I = 0 TO 39; CALL PUTDEST(0); + END; + END NULLS; + + + DECLARE FEXTH(FEXTL) BYTE, /* HOLDS DESTINATION FILE TYPE */ + COPYING BYTE; /* TRUE WHILE COPYING TO DEST FILE */ + + MOVEXT: PROCEDURE(A); + DECLARE A ADDRESS; + /* MOVE THREE CHARACTER EXTENT INTO DEST FCB */ + CALL MOVE(A,.DEST(FEXT),FEXTL); + END MOVEXT; + +EQUAL: PROCEDURE(A,B) BYTE; + /* COMPARE THE STRINGS AT A AND B UNTIL EITHER A MISMATCH OR + A '$' IS ENCOUNTERED IN STRING B */ + DECLARE (A,B) ADDRESS, + (SA BASED A, SB BASED B) BYTE; + DO WHILE SB <> '$'; + IF (SB AND 7FH) <> (SA AND 7FH) THEN RETURN FALSE; + A = A + 1; B = B + 1; + END; + RETURN TRUE; + END EQUAL; + +READ$EOF: PROCEDURE BYTE; + /* RETURN TRUE IF END OF FILE */ + CHAR = GETSOURCE; + IF SCOM THEN RETURN HARDEOF < NSOURCE; + RETURN CHAR = ENDFILE; + END READ$EOF; + + +HEXRECORD: PROCEDURE BYTE; + /* READ ONE RECORD INTO SBUFF AND CHECK FOR PROPER FORM + RETURNS 0 IF RECORD OK + RETURNS 1 IF END OF TAPE (:00000) + RETURNS 2 IF ERROR IN RECORD */ + + + DECLARE XOFFSET BYTE; /* TRUE IF XOFF RECVD */ + DECLARE NOERRS BYTE; /* TRUE IF NO ERRORS IN THIS RECORD */ + + PRINTERR: PROCEDURE(A); + /* PRINT ERROR MESSAGE IF NOERRS TRUE */ + DECLARE A ADDRESS; + IF NOERRS THEN + DO; NOERRS = FALSE; + CALL PRINT(A); + END; + END PRINTERR; + + CHECKXOFF: PROCEDURE; + IF XOFFSET THEN + DO; XOFFSET = FALSE; + CALL CLEARBUFF; + END; + END CHECKXOFF; + + SAVECHAR: PROCEDURE BYTE; + /* READ CHARACTER AND SAVE IN BUFFER */ + DECLARE I BYTE; + IF NOERRS THEN + DO; + DO WHILE (I := GETSOURCE) = XOFF; XOFFSET = TRUE; + END; + HBUFF(HSOURCE) = I; + IF (HSOURCE := HSOURCE + 1) >= LAST(HBUFF) THEN + CALL PRINTERR(.('RECORD TOO LONG$')); + RETURN I; + END; + RETURN ENDFILE; /* ON ERROR FLAG */ + END SAVECHAR; + + DECLARE (M, RL, CS, RT) BYTE, + LDA ADDRESS; /* LOAD ADDRESS WHICH FOLLOWS : */ + + READHEX: PROCEDURE BYTE; + DECLARE H BYTE; + IF (H := SAVECHAR) - '0' <= 9 THEN RETURN H-'0'; + IF H - 'A' > 5 THEN + CALL PRINTERR(.('INVALID DIGIT$')); + RETURN H - 'A' + 10; + END READHEX; + + READBYTE: PROCEDURE BYTE; + /* READ TWO HEX DIGITS */ + RETURN SHL(READHEX,4) OR READHEX; + END READBYTE; + + READCS: PROCEDURE BYTE; + /* READ BYTE WITH CHECKSUM */ + RETURN CS := CS + READBYTE; + END READCS; + + READADDR: PROCEDURE ADDRESS; + /* READ DOUBLE BYTE WITH CHECKSUM */ + RETURN SHL(DOUBLE(READCS),8) OR READCS; + END READADDR; + + NOERRS = TRUE; /* NO ERRORS DETECTED IN THIS RECORD */ + + /* READ NEXT RECORD */ + /* SCAN FOR THE ':' */ + HSOURCE = 0; + DO WHILE (CS := SAVECHAR) <> ':'; + HSOURCE = 0; + IF CS = ENDFILE THEN + DO; CALL PRINT(.('END OF FILE, CTL-Z',WHAT,'$')); + IF READCHAR = ENDFILE THEN RETURN 1; + ELSE HSOURCE = 0; + END; + CALL CHECKXOFF; + END; + + /* ':' FOUND */ + CS = 0; + IF (RL := READCS) = 0 THEN /* END OF TAPE */ + DO; DO WHILE (RL := SAVECHAR) <> ENDFILE; + CALL CHECKXOFF; + END; + IF NOERRS THEN RETURN 1; + RETURN 2; + END; + + /* RECORD LENGTH IS NOT ZERO */ + LDA = READADDR; /* LOAD ADDRESS */ + + /* READ WORDS UNTIL RECORD LENGTH EXHAUSTED */ + RT = READCS; /* RECORD TYPE */ + DO WHILE RL <> 0 AND NOERRS; RL = RL - 1; + M = READCS; + /* INCREMENT LA HERE FOR EXACT ADDRESS */ + END; + + /* CHECK SUM */ + IF CS + READBYTE <> 0 THEN + CALL PRINTERR(.('CHECKSUM ERROR$')); + + CALL CHECKXOFF; + IF NOERRS THEN RETURN 0; + RETURN 2; + END HEXRECORD; + +READTAPE: PROCEDURE; + /* READ HEX FILE FROM HIGH SPEED READER TO 'HEX' FILE, + CHECK EACH RECORD FOR VALID DIGITS, AND PROPER CHECKSUM */ + DECLARE (I,A) BYTE; + DO FOREVER; + DO WHILE (I := HEXRECORD) <= 1; + IF NOT (I = 1 AND IGNOR) THEN + DO A = 1 TO HSOURCE; + CALL PUTDEST(HBUFF(A-1)); + END; + CALL PUTDEST(CR); CALL PUTDEST(LF); + IF I = 1 THEN /* END OF TAPE ENCOUNTERED */ + RETURN; + END; + CALL CRLF; HBUFF(HSOURCE) = '$'; + CALL PRINT(.HBUFF); + CALL PRINT(.('CORRECT ERROR, TYPE RETURN OR CTL-Z$')); + CALL CRLF; + IF READCHAR = ENDFILE THEN RETURN; + END; + END READTAPE; + +FORMERR: PROCEDURE; + CALL ERROR(.('INVALID FORMAT$')); + END FORMERR; + +SETUPDEST: PROCEDURE; + CALL SELECT(DDISK); + DHEX = EQUAL(.DEST(FEXT),.('HEX$')); + CALL MOVE(.DEST(FEXT),.FEXTH,FEXTL); /* SAVE TYPE */ + DEST(ROFILE) = DEST(ROFILE) AND 7FH; + DEST(SYSFILE)= DEST(SYSFILE)AND 7FH; + CALL MOVEXT(.('$$$')); + CALL DELETE(.DEST); /* REMOVE OLD $$$ FILE */ + CALL MAKE(.DEST); /* CREATE A NEW ONE */ + IF DCNT = 255 THEN CALL ERROR(.('NO DIRECTORY SPACE$')); + DEST(32),NDEST = 0; + END SETUPDEST; + +SETUPSOURCE: PROCEDURE; + HARDEOF = 0FFFFH; + CALL SETSUSER; /* SOURCE USER */ + CALL SELECT(SDISK); + CALL OPEN(.SOURCE); + CALL SETCUSER; /* BACK TO CURRENT USER */ + IF (NOT RSYS) AND ROL(SOURCE(SYSFILE),1) THEN + DCNT = 255; + IF DCNT = 255 THEN CALL ERROR(.('NO FILE$')); + SOURCE(32) = 0; + /* CAUSE IMMEDIATE READ */ + SCOM = EQUAL(.SOURCE(FEXT),.('COM$')); + NSOURCE = SBLEN; + END SETUPSOURCE; + +CHECK$STRINGS: PROCEDURE; + IF STARTS > 0 THEN + CALL ERROR(.('START NOT FOUND$')); + IF QUITS > 0 THEN + CALL ERROR(.('QUIT NOT FOUND$')); + END CHECK$STRINGS; + +CLOSEDEST: PROCEDURE(DIRECT); + DECLARE DIRECT BYTE; + /* DIRECT IS TRUE IF SECTOR-BY-SECTOR COPY */ + IF DIRECT THEN + /* GET UNFILLED BYTES FROM SOURCE BUFFER */ + DFUB = SFUB; ELSE DFUB = 0; + DO WHILE (LOW(NDEST) AND 7FH) <> 0; + DFUB = DFUB + 1; + CALL PUTDEST(ENDFILE); + END; + CALL CHECK$STRINGS; + CALL WRITEDEST; + CALL SELECT(DDISK); + CALL CLOSE(.DEST); + IF DCNT = 255 THEN + CALL ERROR(.('CANNOT CLOSE DESTINATION FILE$')); + CALL MOVEXT(.FEXTH); /* RECALL ORIGINAL TYPTE */ + DEST(12) = 0; + CALL OPEN(.DEST); + IF DCNT <> 255 THEN /* FILE EXISTS */ + DO; + IF ROL(DEST(ROFILE),1) THEN /* READ ONLY */ + DO; + IF NOT WRROF THEN + DO; + CALL PRINT (.('DESTINATION IS R/O, DELETE (Y/N)?$')); + IF UTRAN(READCHAR) <> 'Y' THEN + DO; CALL PRINT(.('**NOT DELETED**$')); + CALL CRLF; + CALL MOVEXT(.('$$$')); + CALL DELETE(.DEST); + RETURN; + END; + CALL CRLF; + END; + DEST(ROFILE) = DEST(ROFILE) AND 7FH; + CALL SETIND(.DEST); + END; + CALL DELETE(.DEST); + END; + CALL MOVE(.DEST,.DEST(16),16); /* READY FOR RENAME */ + CALL MOVEXT(.('$$$')); + CALL RENAME(.DEST); + END CLOSEDEST; + +SIZE$NBUF: PROCEDURE; + /* COMPUTE NUMBER OF BUFFERS - 1 FROM DBLEN */ + NBUF = (SHR(DBLEN,7) AND 0FFH) - 1; + /* COMPUTED AS DBLEN/128-1, WHERE DBLEN <= 32K (AND THUS + NBUF RESULTS IN A VALUE <= 2**15/2**7-1 = 2**8-1 = 255) */ + END SIZE$NBUF; + +SET$DBLEN: PROCEDURE; + /* ABSORB THE SOURCE BUFFER INTO THE DEST BUFFER */ + SBASE = .MEMORY; + IF DBLEN >= 4000H THEN DBLEN = 7F80H; ELSE + DBLEN = DBLEN + SBLEN; + CALL SIZE$NBUF; + END SET$DBLEN; + +SIZE$MEMORY: PROCEDURE; + /* SET UP SOURCE AND DESTINATION BUFFERS */ + SBASE = .MEMORY + SHR(MEMSIZE - .MEMORY,1); + SBLEN, DBLEN = SHR((MEMSIZE - .MEMORY) AND 0FF00H,1); + CALL SIZE$NBUF; + END SIZE$MEMORY; + +COPYCHAR: PROCEDURE; + /* PERFORM THE ACTUAL COPY FUNCTION */ + DECLARE RESIZED BYTE; /* TRUE IF SBUFF AND DBUFF COMBINED */ + IF (RESIZED := (BLOCK AND PSOURCE <> 0)) THEN /* BLOCK MODE */ + CALL SET$DBLEN; /* ABSORB SOURCE BUFFER */ + IF HEXT OR IGNOR THEN /* HEX FILE */ + CALL READTAPE; ELSE + DO WHILE NOT READ$EOF; + CALL PUTDEST(CHAR); + END; + IF RESIZED THEN + DO; CALL CLEARBUFF; + CALL SIZE$MEMORY; + END; + END COPYCHAR; + +SIMPLECOPY: PROCEDURE; + DECLARE (FASTCOPY,I) BYTE; + REAL$EOF: PROCEDURE BYTE; + RETURN HARDEOF <> 0FFFFH; + END REALEOF; + CALL SIZE$MEMORY; + TCBP = MCBP; /* FOR ERROR TRACING */ + CALL SETUPDEST; + CALL SETUPSOURCE; + /* FILES READY FOR DIRECT COPY */ + FASTCOPY = TRUE; + /* LOOK FOR PARAMETERS */ + DO I = 0 TO 25; + IF CONT(I) <> 0 THEN + DO; + IF NOT(I=6 OR I=14 OR I=17 OR I=21 OR I=22) THEN + /* NOT OBJ OR VERIFY */ + FASTCOPY = FALSE; + END; + END; + IF FASTCOPY THEN /* COPY DIRECTLY TO DBUFF */ + DO; CALL SET$DBLEN; /* EXTEND DBUFF */ + DO WHILE NOT REAL$EOF; + CALL FILLSOURCE; + IF REAL$EOF THEN + NDEST = HARDEOF; ELSE NDEST = DBLEN; + CALL WRITEDEST; + END; + CALL SIZE$MEMORY; /* RESET TO TWO BUFFERS */ + END; ELSE + CALL COPYCHAR; + CALL CLOSEDEST(FASTCOPY); + END SIMPLECOPY; + +MULTCOPY: PROCEDURE; + DECLARE (NEXTDIR, NDCNT, NCOPIED) ADDRESS; + PRNAME: PROCEDURE; + /* PRINT CURRENT FILE NAME */ + DECLARE (I,C) BYTE; + CALL CRLF; + DO I = 1 TO FNSIZE; + IF (C := DEST(I)) <> ' ' THEN + DO; IF I = FEXT THEN CALL PRINTCHAR('.'); + CALL PRINTCHAR(C); + END; + END; + END PRNAME; + + NEXTDIR,NCOPIED = 0; + DO FOREVER; + /* FIND A MATCHING ENTRY */ + CALL SETSUSER; /* SOURCE USER */ + CALL SELECT(SDISK); + CALL SETDMA(.BUFFER); + CALL SEARCH(.SEARFCB); + NDCNT = 0; + DO WHILE (DCNT <> 255) AND NDCNT < NEXTDIR; + NDCNT = NDCNT + 1; + CALL SEARCHN; + END; + CALL SETCUSER; + /* FILE CONTROL BLOCK IN BUFFER */ + IF DCNT = 255 THEN + DO; IF NCOPIED = 0 THEN + CALL ERROR(.('NOT FOUND$')); CALL CRLF; + RETURN; + END; + NEXTDIR = NDCNT + 1; + /* GET THE FILE CONTROL BLOCK NAME TO DEST */ + CALL MOVE(.BUFFER+SHL(DCNT AND 11B,5),.DEST,16); + DEST(0) = 0; + DEST(12) = 0; + CALL MOVE(.DEST,.SOURCE,16); /* FILL BOTH FCB'S */ + IF RSYS OR NOT ROL(DEST(SYSFILE),1) THEN /* OK TO READ */ + DO; + IF (NCOPIED := NCOPIED + 1) = 1 THEN + CALL PRINT(.('COPYING -$')); + CALL PRNAME; + CALL SIMPLECOPY; + END; + END; + END MULTCOPY; + +SET$SDISK: PROCEDURE; + IF DISK > 0 THEN SDISK = DISK - 1; ELSE SDISK = CDISK; + END SET$SDISK; + +SET$DDISK: PROCEDURE; + IF PARSET THEN /* PARAMETERS PRESENT */ CALL FORMERR; + IF DISK > 0 THEN DDISK = DISK - 1; ELSE DDISK = CDISK; + END SET$DDISK; + +CHECK$DISK: PROCEDURE; + IF SUSER <> CUSER THEN /* DIFFERENT DISKS */ + RETURN; + IF DDISK = SDISK THEN CALL FORMERR; + END CHECK$DISK; + +CHECK$EOL: PROCEDURE; + CALL DEBLANK; + IF CHAR <> CR THEN CALL FORMERR; + END CHECK$EOL; + +SCANDEST: PROCEDURE(COPYFCB); + DECLARE COPYFCB ADDRESS; + CALL SET$SDISK; + CALL CHECK$EOL; + CALL MOVE(.SOURCE,COPYFCB,33); + CALL CHECK$DISK; + END SCANDEST; + +SCANEQL: PROCEDURE; + CALL SCAN(.SOURCE); + IF NOT (TYPE = SPECL AND CHAR = '=') THEN CALL FORMERR; + MCBP = CBP; /* FOR ERROR PRINTING */ + END SCANEQL; + + +PIPENTRY: + /* BUFFER AT 80H CONTAINS REMAINDER OF LINE TYPED + FOLLOWING THE COMMAND 'PIP' - IF ZERO THEN PROMPT TIL CR */ + CALL MOVE(.BUFF,.COMLEN,80H); + MULTCOM = COMLEN = 0; + + /* GET CURRENT CP/M VERSION */ + IF VERSION < CPMVERSION THEN + DO; + CALL PRINT(.('REQUIRES CP/M 2.0 OR NEWER FOR OPERATION.$')); + CALL BOOT; + END; + /* GET CURRENT USER */ + CUSER = GETUSER; + /* GET CURRENT DISK */ + CDISK = MON2(25,0); + + RETRY: + /* ENTER HERE ON ERROR EXIT FROM THE PROCEDURE 'ERROR' */ + CALL SIZE$MEMORY; + /* MAIN PROCESSING LOOP. PROCESS UNTIL CR ONLY */ + DO FOREVER; + SUSER = CUSER; + C1, C2, C3 = 0; /* LINE COUNT = 000000 */ + PUTNUM = TRUE; /* ACTS LIKE LF OCCURRED ON ASCII FILE */ + CONCNT,COLUMN = 0; /* PRINTER TABS */ + LINENO = 254; /* INCREMENTED TO 255 > PAGCNT */ + /* READ FROM CONSOLE IF NOT A ONELINER */ + IF MULTCOM THEN + DO; CALL PRINTCHAR('*'); CALL READCOM; + CALL CRLF; + END; + CBP = 255; + IF COMLEN = 0 THEN /* SINGLE CARRIAGE RETURN */ + DO; CALL SELECT(CDISK); + CALL BOOT; + END; + + /* LOOK FOR SPECIAL CASES FIRST */ + DDISK,SDISK,PSOURCE,PDEST = 0; + CALL SCAN(.DEST); + IF TYPE = PERIPH THEN GO TO SIMPLECOM; + IF TYPE = DISKNAME THEN + DO; DDISK = DISK - 1; + CALL SCANEQL; + CALL SCAN(.SOURCE); + /* MAY BE MULTI COPY */ + IF TYPE <> FILE THEN CALL FORMERR; + IF AMBIG THEN + DO; CALL SCANDEST(.SEARFCB); + CALL MULTCOPY; + END; ELSE + DO; CALL SCANDEST(.DEST); + /* FORM IS A:=B:UFN */ + CALL SIMPLECOPY; + END; + GO TO ENDCOM; + END; + + + IF TYPE <> FILE OR AMBIG THEN CALL FORMERR; + CALL SET$DDISK; + CALL SCANEQL; + CALL SCAN(.SOURCE); + IF TYPE = DISKNAME THEN + DO; + CALL SET$SDISK; CALL CHECK$DISK; + CALL MOVE(.DEST,.SOURCE,33); + CALL CHECK$EOL; + CALL SIMPLECOPY; + GO TO ENDCOM; + END; + /* MAY BE POSSIBLE TO DO A FAST DISK COPY */ + IF TYPE = FILE THEN /* FILE TO FILE */ + DO; CALL DEBLANK; IF CHAR <> CR THEN GO TO SIMPLECOM; + /* FILE TO FILE */ + CALL SET$SDISK; + CALL SIMPLECOPY; + GO TO ENDCOM; + END; + +SIMPLECOM: + CBP = 255; /* READY FOR RESCAN */ + + /* OTHERWISE PROCESS SIMPLE REQUEST */ + CALL SCAN(.DEST); + IF (TYPE < FILE) OR AMBIG THEN /* DELIMITER OR ERROR */ + CALL ERROR(.('UNRECOGNIZED DESTINATION$')); + + DHEX = FALSE; + IF TYPE = FILE THEN + DO; /* DESTINATION IS A FILE, SAVE EXTENT NAME */ + CALL SET$DDISK; + CALL SETUPDEST; + CHAR = 255; + END; ELSE + /* PERIPHERAL NAME */ + IF CHAR >= NULP OR CHAR <= RDR THEN CALL ERROR(.('CANNOT WRITE$')); + + IF (PDEST := CHAR + 1) = PUNP THEN CALL NULLS; + + /* NOW SCAN THE DELIMITER */ + CALL SCAN(.SOURCE); + IF TYPE <> SPECL OR CHAR <> '=' THEN + CALL ERROR(.('INVALID PIP FORMAT$')); + + /* OTHERWISE SCAN AND COPY UNTIL CR */ + COPYING = TRUE; + DO WHILE COPYING; + SUSER = CUSER; + CALL SCAN(.SOURCE); + /* SUSER MAY HAVE BEEN RESET */ + SCOM = FALSE; + IF TYPE = FILE AND NOT AMBIG THEN /* A SOURCE FILE */ + DO; + CALL SET$SDISK; + CALL SETUPSOURCE; + CHAR = 255; + END; ELSE + + IF TYPE <> PERIPH OR (CHAR <= LST AND CHAR > RDR) THEN + CALL ERROR(.('CANNOT READ$')); + + + SCOM = SCOM OR OBJ; /* MAY BE ABSOLUTE COPY */ + PSOURCE = CHAR + 1; + IF CHAR = NULP THEN CALL NULLS; ELSE + IF CHAR = EOFP THEN CALL PUTDEST(ENDFILE); ELSE + DO; /* DISK COPY */ + IF (CHAR < HSRDR AND DHEX) THEN HEXT = 1; + /* HEX FILE SET IF SOURCE IS RDR AND DEST IS HEX FILE */ + IF PDEST = PRNT THEN + DO; NUMB = 1; + IF TABS = 0 THEN TABS = 8; + IF PAGCNT = 0 THEN PAGCNT = 1; + END; + CALL COPYCHAR; + END; + + CALL CHECK$STRINGS; + /* READ ENDFILE, GO TO NEXT SOURCE */ + CALL SCAN(.SOURCE); + IF TYPE <> SPECL OR (CHAR <> ',' AND CHAR <> CR) THEN + CALL ERROR(.('INVALID SEPARATOR$')); + + COPYING = CHAR <> CR; + END; + + /* IF NECESSARY, CLOSE FILE OR PUNCH TRAILER */ + IF PDEST = PUNP THEN + DO; CALL PUTDEST(ENDFILE); CALL NULLS; + END; + IF PDEST = 0 THEN /* FILE HAS TO BE CLOSED AND RENAMED */ + CALL CLOSEDEST(FALSE); + + /* COMLEN SET TO 0 IF NOT PROCESSING MULTIPLE COMMANDS */ +ENDCOM: + COMLEN = MULTCOM; + + END; /* DO FOREVER */ +END; + \ No newline at end of file diff --git a/ISIS PLM/PIP.SYM b/ISIS PLM/PIP.SYM new file mode 100644 index 0000000..218520c --- /dev/null +++ b/ISIS PLM/PIP.SYM @@ -0,0 +1,7 @@ +0000 PIP +0000 X0100 +0004 BDISK 0000 BOOT 0080 BUFF 0050 CMDRV 005C FCB +006C FCB16 0053 LEN0 0056 LEN1 0006 MAXB 0005 MON1 +0005 MON2 0005 MON2A 0005 MON3 0000 OFFSET 0051 PASS0 +0054 PASS1 0080 TBUFF + \ No newline at end of file diff --git a/ISIS PLM/PLM80 b/ISIS PLM/PLM80 new file mode 100644 index 0000000000000000000000000000000000000000..94b25677ea70a73cd6dbd469bf518dc16069dabc GIT binary patch literal 21632 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 literal 0 HcmV?d00001 diff --git a/ISIS PLM/PLM80.OV0 b/ISIS PLM/PLM80.OV0 new file mode 100644 index 0000000000000000000000000000000000000000..e322d6279d7d02cd2db2c666e3f5165ccfcc0672 GIT binary patch literal 18816 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 literal 0 HcmV?d00001 diff --git a/ISIS PLM/PLM80.OV1 b/ISIS PLM/PLM80.OV1 new file mode 100644 index 0000000000000000000000000000000000000000..4866af32174e75d9f5fc173f377e18876c8d938c GIT binary patch literal 29184 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

*+#`UM>HSZ&GXktP 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

5izQc~@9IZUs?b!Td ze>wK;u^z`mYJr?dCE5*@@ckpy_0ny<{#y;5NJ%`*;i) z7yYYDgA&-IC*&jQYW(q0=Hv-jgfT+-x(%qi4*Hj4j zM?%2YPfD+;6oA2f@k!-JYT8BBxBR5?8hMoSBI7OuDjFfKix5|zGsGz3tQXbb+q)?S z$$F=qSKEoK{yu6Q6Wp{>3Sy)6!;|nr2%kKyGs(@|uc^MVcmtsO=5j!8KhetpmzTps z<#35|{OuG;7BOPV<{fbg0Vr7qESxV$9+mJ=#0jSqmzvhB`pQlz9`cY}yU?w`Fn)a(2k7nkN1*km8+2G`7_({usr52~-{X;~tV;zcgFN2B}!=deCgrR%Ep z_45$UXF@oor=>U5D?nh6Qc?)2`}OM4@WvD7*J0wiKRV7o z^PB~#Hsw!x&XOfWMgEGT2uPdq7Xu|MBawZycf>PNvcX-P?h(bs#H;)nDaD918(A?vXzhR*xn9v2rM&rMk)VSMEOiDS_4;e&?ThLb6a>|IGoRcsLKj{He# zXlU5KKL_s?Z8*O_{A(LNe0UP<-Ef8jhd&|-|E2W!4#@$@DtJKPl)Yz?P2^C;ZhBT# zRjn$+&!;!R^`Jps&*%T1Ll{x&&n;O&F%C@36XR9rHN?sB|vw(%UUI?$zu%&ZaEOyJm~MmuwI^F+cSj19eu zd!N%O!HMmcz~Ze^T(_h|Go6$-#jpX%7QWLENh~Ch?Ug^tG1%vb>p^~QSdKUG8#>9+ z*eig+Rs073M~p~=UrB1k7m(7sDqTMZ-$NrW!We zSo|*{hb=MAW}B2-qWkp!OqBTjvyiBw;^M+_n6*%HN@%MnE6gv#zcJ!d78Y&9;~yDK znN(hwUpj75(agdETS4K}qWqh%@h^~qbXY=eWo2PWS*5MA)K*$nILVfaZ*h5HZov!@ zrW{$~q*7bOl>G5L9kUS3R#ah|R$f$DXe%o(tt`yPbcuC0A|{nq+DbvlR!~$iu@E`1 zo;oL$Gs+5W6iqWOFrNoX(~2s`^Z(d1sQ@f<8dE9?SugVO!j>0Ko>EkfIM6gG3Re0} zno=yJVk?|pSvaWz|GJ5Fgq4X(Vk^t7sI(Q9j)i&;mE(q$>9C>da) zDP5d&lwdS=#d_xlPqgXxdQi2CK+W8ltLMcLp z4!$rTLbAR9u#)VN-abQvV2X#&8T(4-h!h{08()ymz98m|ue?BW##B>76g&TdjB(>O zk8&GNN~X5Nvk0X131BhLboo|f#f-sZuCBQ3?_H;^xK z;sD60h8*;{pVG&p?1nZ-u`jjA7%n?nZJFz{=2FDe5(Z6u#Q9&;OD-3W#^ z|8*s&ztYX-p?Qpw1{wqLH^_rY)}0=2vx*I14Qw(`nS3(~uil8wB z>F=WS!>NrSJzPrPeij%=KU}28fR6JsnWA+nnI0@AraQ4>9N`gx2Plx`QAQx9U9o$5 zpMiV_y(sL3cxhDE+{62idp(v&x%@@F{}_J@#1E~x9!r$`kbzSwxCmbXfbSB)_nR*& zMIJ|~r`h|=i+*_9l!+edaf(oLMIHpw(Lc<;9o?)ZxB>fV_=yL|e@Yhs9t@~_Q*}c!M#s2pD zd$RUE+Y#7n1fECWxyAm160~Gz(v6JvBN^@c4y@dGbaD5*Hag7N?n=g z{iuoFn07g1TQd%XO)5!awL@KQv(%-RFvmj*I}6d8RbR{s2S?|1ThtMd2R-n6W9H#J*)6tdo7)+0ohA zX)*mwVzq8ULJZw&q)!e$WwBMPs-Y~WVb}Xf!($s__p=76f$fhywd;N6VP7?rarl0= zpPh<5&!O+fe#+?c6+Y+rM}$4;Qo1xy8YE>(`O?D2QJFQXa1rEixw>!J9)w6%E@CZ7F1MLq)+WD zO_T=XLoQfm)%eW9Up)Iv`ds>h^k?a7X&-x!#becy%u-l8|D0vV*2J%f_<_Y$7ZEPIzN5emt-W5c)2pG>9{Sm9R-{8Y^RySvjj< mmH77oQ&AN@_7+O_u|!Hzjw_H7`^x#YMPgrvYt8@M|Gxm49oty| literal 0 HcmV?d00001 diff --git a/ISIS PLM/PLM80.OV2 b/ISIS PLM/PLM80.OV2 new file mode 100644 index 0000000000000000000000000000000000000000..7eefa839bda7ab3a89b63d43415120dc3ed7c8e8 GIT binary patch literal 8192 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
CE5Dl=)xhTz8`W$dc2H?D{$~3x)SEKb*1Rnwo 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 literal 0 HcmV?d00001 diff --git a/ISIS PLM/PLM80.OV4 b/ISIS PLM/PLM80.OV4 new file mode 100644 index 0000000000000000000000000000000000000000..d0f87969d22692fe9c311a426add7660502f0292 GIT binary patch literal 8960 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 Q%n+a literal 0 HcmV?d00001 diff --git a/ISIS PLM/PLM80.OV5 b/ISIS PLM/PLM80.OV5 new file mode 100644 index 0000000000000000000000000000000000000000..8ff4e289bd5b0b27f2c7f0a5baba46f6df4e0bd6 GIT binary patch literal 8960 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 : ; and space + +All other characters are unrecognized by PL/M in the sense that they +are regarded as equivalent to the space character. + +PL/M Identifiers +================ +Identifiers may be from 1 to 31 characters in length. An alphabetic +must be the first character in an identifer name; the remainder may +be alphabetic or numeric. In addition, dollar signs may be imbedded +within a variable name to improve readability. They are ignored by +PL/M. (The identifiers LINE$COUNT and LINECOUNT are interpreted +as identical names.) + +The following are all reserved words, and may not be used as +identifier names: + + ADDRESS DATA EOF LABEL PROCEDURE + AND DECLARE GO LITERALLY RETURN + BASED DISABLE GOTO MINUS THEN + BY DO HALT MOD TO + BYTE ELSE IF NOT WHILE + CALL ENABLE INITIAL OR XOR + CASE END INTERRUPT PLUS + +PL/M Data Types +=============== +There are two data types in PL/M. The data type BYTE refers to +8-bit data; ADDRESS, to 16. It is also possible to construct +arrays of either type and pointers to either type. + +PL/M Constants +================ +Numeric constants may be expressed as binary, octal, decimal, and +hexadecimal numbers. The radix for the number is specified by a +letter appended to the number: B for binary, O and Q for octal, +D for decimal, and H for hexadecimal. If the letter suffix is +omitted, the number is treated as decimal. Hexadecimal constants +must begin with a numeric to avoid confusion with identifier names. +As with identifiers, dollar signs may be imbedded in numeric constants +to improve readability. However a number is expressed, it must be +representable in 16 bits. + +Character string constants are enclosed in apostrophes. An apostrophe +within the string must be doubled. Character strings are represented +using 7-bit ASCII codes. Character strings constants of length 1 are +treated as BYTE values; length 2 as ADDRESS values. Longer strings +are only useful with the "dot" operator. + +PL/M Expressions +================ +There are seven arithmetic operators in PL/M. All perform unsigned +arithmetic operations on either BYTE or ADDRESS values. + + + Binary addition operator. + - Binary subtraction operator, or unary negation. + PLUS Binary addition-with-carry operator. + MINUS Binary subtraction-with-carry operator. + * Binary multiplication operator. + / Binary division operator. + MOD Binary remainder operator. + +Multiply and divide always produce ADDRESS results. The others +produce BYTE results if both operands are BYTE values; ADDRESS, +otherwise. + +There are four boolean operators in PL/M. All perform either 8-bit +or 16-bit boolean operations of their operands. + + NOT Unary complement operator. + AND Binary conjunction operator. + OR Binary disjunction operator. + XOR Binary exclusive-disjunction operator. + +The operators produce BYTE results if both operands are BYTE values. +If at least one is of type ADDRESS, the other is extended with +high-order zeroes if necessary, and the result is type ADDRESS. + +There are six relational operators. All return a true/false result +with 0FFH representing "true" and 00H, "false". + + < Binary less-than operator. + <= Binary less-than-or-equal operator. + = Binary equal operator. + >= Binary greater-than-or-equal operator. + > Binary greater-than operator. + <> Binary not-equal operator. + +There is one other PL/M operator, the so-called "dot" operator. It +is a unary operator that returns the memory address of its operand. +The operator may be used in the following forms: + + .variable + .constant + .(constant) + .(constant, ...) + +The construction " .(08H, 'Message', 0DH) " might best be considered +as the address of a nine-element BYTE array. + +Expression evaluation obeys operator precedence unless modified by +parenthesis. The following lists the operators in order of precedence: + + Highest: . + * / MOD + + - PLUS MINUS + < <= = => > <> + NOT + AND + Lowest: OR XOR + +PL/M Executable Statements +========================== +Commentary. + /* Not really an executable statement, but... */ +Assignment. + variable = expression ; + -or- variable, variable, ... = expression ; + +Imbedded assignment. (May be used within an expression.) + (variable := expression) + +Do-End. (Simple statement grouping.) + DO; + statement; ...; + END; + +Do-While. (Loop while rightmost bit of expression = 1.) + DO WHILE expression; + statement; ...; + END; + +Iterative Do. + DO variable = expression1 to expression2; + statement; ...; + END; + +Do-Case. (Execute i-th statement, numbered from 0.) + DO CASE expression; + statement0; + statement1; + ...; + END; + +If-Then. + IF expression THEN statement; + +If-Then-Else. + IF expression THEN statement; ELSE statement; + +Go To. (GO TO and GOTO are synonomous.) + GO TO label; + -or- GO TO number; + -or- GO TO variable; +The first form causes a GOTO the statement prefixed with 'label:'. +The latter two forms cause a GOTO an absolute storage location. + +Disable interrupts. + DISABLE; + +Enable interrupts. + ENABLE; + +PL/M Variable Declarations +========================== +Identifiers are defined with the DECLARE statement. The following +are typical forms for the DECLARE statement. + + Single identifier: DECLARE identifier type; + Group of identifiers: DECLARE (identifier, ...) type; + Array: DECLARE identifier (constant) type; + Multiple: DECLARE id type, id type, ...; + +Array subscripts start at 0. Thus, DECLARE A(10) BYTE; defines the +array of elements A(0)...A(9). + +Declared variables may have initial values specified by including +the INITIAL attribute after the type on the DECLARE statement: + + DECLARE A(10) BYTE INITIAL(10,11,12,13,14,15,16,17,18,19); + +Variables declared with the INITIAL attribute are preset at program +load time. They are not reset at procedure invocation or anywhere +else. The INITIAL attribute may specify fewer values then would +be needed for the declared variables. + +A DATA attribute is available for declaring storage constants. No +type or array sizes are specified; BYTE is assumed and the array +size is implicitly determined from the DATA value. The values of +identifiers declared as DATA must not be changed during program +execution. + + DECLARE GREETINGS DATA ('Hello, world.'); + +PL/M also supports a limited macro facility. Identifiers may be +declared with the LITERALLY attribute. The literal value is +substituted in the program source text where ever the identifier is +used. + + DECLARE FOREVER LITERALLY 'WHILE TRUE'; + . . . + DO FOREVER; + + Variables may be declared as BASED, as in + + DECLARE A$PTR ADDRESS, + A BASED A$PTR BYTE; + +In this example, the memory location associated with variable A is +determined by the address stored in variable A$PTR. + +Labels are declared using LABEL for the type. An identifier so +declared should also appear before an executable statement, separated +from the statement by a colon. (It is often not strictly necessary +to declare all labels. An implicit DECLARE results when an otherwise +undeclared label is encountered in the program. That is, + + COME$HERE: CALL PRT$MESSAGE(3); + +is equivalent to + + DECLARE COME$HERE LABEL; + COME$HERE: CALL PRT$MESSAGE(3); + +However, due to scope rules, a earlier reference to the label (in a +GOTO statement) may be flagged in error, because the implicit DECLARE +is physically latter in the program. + +PL/M Procedure Declarations +=========================== +Procedures must be defined before they are used. This declaration +form is: + + identifier: PROCEDURE (arg, ...) type; + statement; ...; + END identifier; + +The 'identifier' (which appears in two places) specifies the name for +the procedure. If no result is returned, the 'type' is omitted from +the PROCEDURE statement. + +Return from a procedure is implicit after the last statement of the +procedure, although no value is returned in this case. Return may be +explicitly specified with the RETURN statement: + + No value: RETURN ; + Value: RETURN expression ; + +Procedures may be declared with the special type INTERRUPT followed +by a number in the range 0 through 7. Such a procedure will be used +as an interrupt handler for the corresponding RST instruction. +Interrupts are re-enabled on return from an interrupt procedure. + +Procedures may not be recursive. Procedures are invoked either with +the CALL statement, or within an expression. + + Stand-alone: CALL identifier (arg, ...); + Within expressions: identifier (arg, ...) + +Built-in Procedures +=================== +INPUT(number) + Returns a BYTE value from the I/O port specified by 'number'. + +OUTPUT(number) = expression; + Sends the BYTE value of 'expression' to the I/O port specified + by 'number'. + +LENGTH(identifier) + Returns the number of elements in the array 'identifier'. + +LAST(identifier) + Returns the highest subscript for array 'identifier'. Note that + LAST = LENGTH - 1. + +LOW(expression) + Returns the low-order byte of 'expression'. + +HIGH(expression) + Returns the high-order byte of 'expression'. + +DOUBLE(expression) + Returns an ADDRESS value equivalent to 'expression'. High-order + zeroes are used to pad BYTE expressions. + +ROL(expr1, expr2) and ROR(expr1, expr2) + Returns the value of 'expr1' rotated left/right the number of bits + specified by 'expr2'. Both expressions must be BYTE values. The + value of 'expr2' must not be zero. + +SCL(expr1, expr2) and SCR(expr1, expr2) + Returns the value of 'expr1' rotated left/right the number of bits + specified by 'expr2'. The carry flag participates in the rotate. + 'expr2' must be a BYTE value; 'expr1' may be BYTE or ADDRESS. The + value returned is of the same type as 'expr1'. The value of + 'expr2' must not be zero. + +SHL(expr1, expr2) and SHR(expr1, expr2) + Returns the value of 'expr1' shifted left/right the number of bits + specified by 'expr2'. The last bit shifted out ends up in the + carry flag. 'expr2' must be a BYTE value; 'expr1' may be BYTE or + ADDRESS. The value returned is of the same type as 'expr1'. The + value of 'expr2' must not be zero. + +CALL TIME(expression) + The expression is evaluated as a BYTE value. The TIME procedure + delays 100 microseconds times the value. (Timing is based on + instruction execution times for the standard i8080 cpu.) + +DEC(expr1 + expr2) and DEC(expr1 PLUS expr2) + The two expressions must be unsubscripted variables, constants, + or expressions that represent BCD values. The DEC function does + the necessary decimal adjustment to produce the BCD result from + the addition. + +Pre-defined Variables +===================== +CARRY, ZERO, SIGN, PARITY + The values of these variables reflect the current values of the + cpu flags. + +MEMORY + The MEMORY variable is assigned the to the first memory location + following the PL/M program. It is useful for determining where + free memory begins. + +STACKPTR + The STACKPTR variable's value reflects the current value of the + SP register. The variable may be assigned a new value to alter + the stack register. + \ No newline at end of file diff --git a/ISIS PLM/PRLCOM.COM b/ISIS PLM/PRLCOM.COM new file mode 100644 index 0000000000000000000000000000000000000000..c3d2c185ab12dc846d3b3d0d9a64ea9ae8415c35 GIT binary patch literal 1024 zcmcJNO=uHA6vt8H*F-!G|wOFxeQ7f@@;%YfJS7OxCsljpudJBHcfH;TgR{pjBqtKVK;k$d?rZFBi*B0;v9K+;{bH(z%w%DO z+^^dzLVbj&gzPv9LLtE=$WdF#;?Pp6g)~Ak=KyCJxQ+8+&WC`*oI{+0z!A=2&TYUQ zoZC4oz@3~sI7fiHICpXG1dei^l$X>gc?4x9m{#oh@ z8bMwoUZGZ$gwNi~aiiWvW_roy@}{u>pGu}nx;+Dsb$I1C0SA$jqS$1alG2T zuI)4lG$q@__yMcLgdknN@`oRr2DeCjXad$Dmr{$}jkFpPW)_6WXq#mrR3R2d8_s#J zzd|dd{lHR^`=0lFJm;L}oa>~1XWR8eLJG>gWc1L1L9%xy6qZR;ipcxO)Xp&3pX855}t_UC&dp7GcY(Z<{3V4kR%mSdj4DxKmz~_J@2++ZCQM%n zhY6;c0O)~GG)U${$ytICi&3QBvP%}`9#jW<%bISF9|}?Wl>K`Sjtm!r0IITnBJST+ z?VIV3jUL=p%JV)sqfIrU|7k;%=+gpw6eGG)+vOlRnp8-oTH4N)!ZP067 zF~)w~*BDHyjHTYBoJe}ySevr(_@S|J5Z%`tVq^MPtXA$*e2`a<0LjLV3?KH8gTT~y zC^(xWKCicnOfQn7auT>W=ATvK(H$g)Cr^T%_DlYVM~Mf~L(`{-xK;JU0GW@6l1VuV z6mKn7U}C4wIxsUE3KxawH1jXC%K&CXO9D2KtZ5a^RjTueY5*M$)u$ zN*|#4P&feN6c3QZTr8%gHrDeRm7RjU?_2d%*=(uXfP^E0mAs$+}cc}Xn>VfMoxeL zH2@znheV{Le-;2Vw_?vpTs}Dm3}z`X=6H7dI$J&P!+F}f;Rzl%PZ!GI#Cdw~H~VPU z1#01P*{Cr)W6EiJg;YjBSq+l~D-zMl=}OvHgv?W!S8?zIp#+=q*PKC{t`w=0h zeZJ~EE{I-ESIY=WuzADezGG@>zGHG<;Dg$Cgv@(pdV%jU&;~9?S9uI6ZgN^!$b8>S zKQQLBO%r`^%hgFC^Ol)90Pm(rYjIKo2ToIW%=993tl{t)tzxx!HkQxds0DZK=Q(!y5*l>XfCl{SbiIZ~Ejp57(BpNL zIN||L`?`>MryAN(PWz^i`Jh_#=4RuP?>w)jXtk}xY;Dz|7_;4?wOX`gKw6f3=b$*} z_+VQbg393|6lpD=py&7wEMH;j96t%<==noi+mdgYQ&Gq=m`?+vL<@&D(AJwTu*l3$ zG$?vlMSorg>QK{MC7&-2jSRbBrw@&Pv^7D@nuT$dWNu&#q0=%ECUt{3UI80}btOCF=arzW*U zA@kjGj3`(%n3+X}t}u(ICf%zL5Y&EQ5%+U=V1q<^As*A!^Fe|EkO!<-AE+r|e1uIN4 zK0I#~4V?QE6SDkCtJtJh7!DCD{bFh4Qb`-CFm>8qB~7ha;X=H|H|B5$KnS1}NLrwq zKsI#xwiVh7#)=sOZLmOBt>6*IOFzDCO%2&nZB~?kCQL`84Xp7QO7pQ5{dYAL-MVsH zTv=^fTs7Lj6;=zfD{iwj6aBqOEsW-h;&EY3J1>Z9xc^{34YD=mz6b?{MH949XL9b-&?p=i;D|q^N*}-KgF$F^wiE20ml%F+-}E<(z4Qvy~1SZuZsW- z3}&co529ex4l#r zxVhg^l}A4-(4!7|8S+m(?qI;LLg33f8@?bQG~U48Z}SfNOGX(;B6ZdwwsYkMGT>T5)>aQT}jk>Cf ztEm=&{*aLvQ?1$3vWJ9Hs^u;Gr{X3A#Na4(+_}E?{&3+->2>(Mps2w#p0hd4#AVmj z^wN*JZ>VW)T*#*f9?h#taGzLsrZC_&So-sYXYzgI?`f!De_G8IM%Qn2r}NOg{&fEI ztN%JHFj+e9`lmYZTLLPle{w_ZP7e-)6X$lc1}}Z&AL-n?O>Yp3ZQ(}`n;TkOx7F^o z^)yUxKWqk9&4Zik+1$I?_3WPP#)o;AxUDAdvTZZwUFQ5?aL>kUFuVS%JsbI7r}K#x z+v1fQar{kgrwy&Gt?b{ou_p$$ey=Z{AjJ+Rrs%MUFFGMzvBv3WNSQb)JJtEVj}ALK zT$X(ex9+NaAMJ3ixy@YLMqd4}S9bo4825eV*4^K5V@HQZ$A<>U#LnFwug~MH{=b0i g?(XgE>Fwy;&K>XZl2}~v%ZUVh`LF&~`+tl7ALOG{A^-pY literal 0 HcmV?d00001 diff --git a/ISIS PLM/README.TXT b/ISIS PLM/README.TXT new file mode 100644 index 0000000..31dfa20 --- /dev/null +++ b/ISIS PLM/README.TXT @@ -0,0 +1,89 @@ +This ZIP file contains the ISIS-II PLM-80 v3.1 compiler. + +These files were pulled from the MPM2 source code disks and from the ISIS environment for MS-DOS provided by INTEL. + +The file to invoke the ISIS environment under CP/M or MP/M is called ISX.COM. Some of the submit files included with the MP/M II source refered to a IS14.COM file, so I just copied the ISX.COM to IS14.COM and ISIS.COM leaving 3 files that do the exact same thing. + +Now, when the ISIS environment is running, it refers to the drives using the following syntax: + + :F0: - This is the CP/M drive A: + :F1: - This is the CP/M drive B: + :F2: - This is the CP/M drive C: + :F3: - This is the CP/M drive D: + +Get the picture? ISIS doesn't know anything about user numbers, so all files MUST be in USER 0 on each drive for the system to work. Also, if the ISIS environment can't find the file it is looking for in the current drive, it defaults to :F0:, then it fails. + +Several of the CP/M commands have direct equivalant versions, e.g.; + + CP/M ISIS-II + ---- ------- + DIR DIR + ERA ERA + TYPE TYPE + REN REN + DDT DBUG - This does some form of trace (asks, "TRACE LEVEL:" + ! - This is a comment indicator + A: :F0: + B: :F1: + C: :F2: + D: :F3: + +While the ISIS environment is running, your command prompt will be the floppy number followed by the greater than symbol, e.g.; for floppy drive A: (defualt) = "0>", for drive B: = "1>", etc. + +Some programs may allow you to extend the command line by supplying an ampersand "&" as the last character before pressing return. I haven't tried this yet. + +I haven't tried to compile CP/M using this system, so you will have to figure out how best to set up your environment to compile it. There is a site in the UK that has some instructions for compiling CPM 3 using the MS-DOS ISIS emulator, which I believe is also available through their site, which is http://www.seasip.demon.co.uk/Cpm/ + +I don't have ANY idea what the command syntax is for any of these commands. If anyone out there has documentation for the ISIS environment and utilities, I would appreciate a copy (!!!PLEASE!!!) + +Here is a brief description of the files, all files WITHOUT an extension are ISIS-II executable programs, some of the programs I didn't have time to figure out. + +ASM80 - ISIS-II 8080 Assembler, runs ONLY from ISIS environment. +CC.SUB - SUBMIT file to compile & link a PLM program for execution at 0x0100. +CONV86 - ISIS 8080 to 8086 assembler converter. +CPM - ISIS program to return to CPM from ISIS environment (used in SUBMIT files) + this program displays some garbage on my screen just before exiting ISIS. + This program also trashes the Z-System shell stack (don't know why, haven't + looked into it) + +*.LIT - Literal definitions for PLM programs. + +GENHEX.COM - CP/M OBJ to HEX converter utility. +GENMOD.COM - +HEXOBJ - ISIS hex to obj converter utility. + +IS14.COM, +ISX.COM, +ISIS.COM - The ISIS-II Environment for CP/M systems. + +IXREF - ISIS cross reference utility. +LIB - ISIS Librarian utility. +LINK - ISIS Linker utility. +LINK.OVL - ISIS Linker overlay file. +LOCATE - ISIS Object file locater utility. +MONX - +OBJCPM.COM - Used in CC.SUB script. +OBJHEX - +P.SUB - + +PLM80 - The ISIS-II PL/M-80 Compiler version 3.1 +PLM80.LIB - Runtime library. All programs link to this library. +PLM80.OV# - Overlay files for the compiler. + +PLMLANG.DOC - Brief description of the PL/M Language. +PLMSAMP.PLM - A Sample program written in PL/M. +READ.ME - This file. +SETEOF.COM - Used in CC.SUB script. +SUBMIT - ISIS-II Submit command (similar to CP/M's SUBMIT utility) + +X0#00 +X0#00.ASM - Link files for PL/M Programs. See CC.SUB script for usage. + +Enjoy, + +Rick Campbell +Sr. Technical Specialist +SpaceLabs Medical +rickca@jps.net + + \ No newline at end of file diff --git a/ISIS PLM/RSETSIMH.COM b/ISIS PLM/RSETSIMH.COM new file mode 100644 index 0000000000000000000000000000000000000000..e055f07a9a16d97b2849d970633e74ff226d9173 GIT binary patch literal 128 zcmZQ;u;aV@kM$4>qg4aL_7hf34FAFo2+A??ah_#mILXTulv!FaDSCU$k wmYAHXkdmL5s>jQv;*e=B%d=eBu;o~)fF$p;#~M4NxP<%|7#QYB0STf209!g6lmGw# literal 0 HcmV?d00001 diff --git a/ISIS PLM/RSETSIMH.MAC b/ISIS PLM/RSETSIMH.MAC new file mode 100644 index 0000000..0292a03 --- /dev/null +++ b/ISIS PLM/RSETSIMH.MAC @@ -0,0 +1,34 @@ + .Z80 ; mnemonics only + +SIMHPORT EQU 0FEH +resetSIMHInterfaceCmd EQU 14 +maxOut EQU 128 +printStringCmd EQU 09h +BDOS EQU 5 +CR EQU 13 +LF EQU 10 +CMDLINE EQU 80H + + ASEG + ORG 100H + + LD B,maxOut + LD A,resetSIMHInterfaceCmd +OUTAGN: OUT (SIMHPORT),A + DEC B + JP NZ,OUTAGN + LD A,(CMDLINE) ; number of character in command line + OR A + RET Z ; return if no command line + LD A,(CMDLINE+2) ; get first character (skip ' ') + CP 'V' ; if no 'V' (for verbose) + RET NZ ; done + LD DE,MSG + LD C,printStringCmd + CALL BDOS + RET + +MSG: DB CR,LF,'Reset SIMH interface done.',CR,LF,'$' + + END + \ No newline at end of file diff --git a/ISIS PLM/SETEOF.COM b/ISIS PLM/SETEOF.COM new file mode 100644 index 0000000000000000000000000000000000000000..6bb58000e060491493bb23eb10c71ce0fb97c52f GIT binary patch literal 128 zcmY#nV6aq*U^J{^6pUfu<3G#FU~?*%kxv=O1G2Sh8MKvZ8Tb?--0g>g83h>_6*C#k l7^J2CNgZ-wG&yX^sF=l2_pH90PXMYZg7N1`27*8e3;=_S70v(v literal 0 HcmV?d00001 diff --git a/ISIS PLM/SHOWSEC.COM b/ISIS PLM/SHOWSEC.COM new file mode 100644 index 0000000000000000000000000000000000000000..666fad0e3f55ab4ab2e36c17ac9e8cf22d5f272a GIT binary patch literal 1920 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 a46@w7Q0O2BlgIi&yq_Zp7T^EV@4o<7q91es literal 0 HcmV?d00001 diff --git a/ISIS PLM/SPEED.COM b/ISIS PLM/SPEED.COM new file mode 100644 index 0000000000000000000000000000000000000000..0df902a4c59a82ac6596aa2b9ca0d5d63abb3b32 GIT binary patch literal 1152 zcmb_bTWb?R6rSCk#3s^Ws7O*lXJa5uO5(Owdx4}FTd0>}X={tMRzfna(U{dFwY4Z- zet`Jqi@(5^MO5@jXtvg_GGHja1Qv<14|NGDQnh_(o!z8fz()sm&z|pm=km?YCA!U*|6fr3Wui$K4#3*kP z|H(k;(BKJ_NK1(e=xi2Wp2C^LRg*fr6=Mq4b zHUar{ppz1(nqv(g9_UBr+^H;1hU=X^GsxR1VTmI{?De*BR<`V^nw_ZG)2z%-vaWHK zfq?9VrN=C#k!INWLz!b~L?`bV@(hwsP$fmkbBqZDZvv5WO7B=c3A~Gp;^+9=z`MXm zBK3j`Oh%-05)UkKT-ECWWH&7Nx!@u*ayk(31au28dR%WdJk^{%G~caIf+?8~RU0ib zW}kzc@`fW4OUutQltGy^y@eV}rpJ=WZ}aP9%GwpaX;ZjP)nLg8&NH5($4p)@3wF-& zW7Yce)o!zvS2;z8pJ&Ktj#jp&xL?C*qiueQTi|mGR6fCS@xwsnq*|u$8A%pZ)7Nxj z16o;D$qHwvv7?48iBVVOd?h9@jvk|O-iV+tszLXrM>VcJSo13y+%E% zeC^4i+@b1ko1P=b)|rRR_QpN#uX0DRtkVC}qn;UavpY7*n*LTRYhBvvvf*~^Vh#7! zUC?mbjb5>9^_-}c=ekyn7j&YXvyWcgf%dwFE%k+4&{ntsqd=L4(L<5KUHZAq_(|IrGivw3Tkk;yf!M%bq_W)DmK8cL3ujzQG@MnN3?NiU5|clZfAs$eV*IT@ literal 0 HcmV?d00001 diff --git a/ISIS PLM/STAT.COM b/ISIS PLM/STAT.COM new file mode 100644 index 0000000000000000000000000000000000000000..abf37e09628a807c5155c5cd6af782176f85cf62 GIT binary patch literal 5376 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 literal 0 HcmV?d00001 diff --git a/ISIS PLM/SUBMIT b/ISIS PLM/SUBMIT new file mode 100644 index 0000000000000000000000000000000000000000..aad1097c8c9634fb063b1388319b4fc41ea1e5da GIT binary patch literal 7168 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 G{{0Vow+9{o literal 0 HcmV?d00001 diff --git a/ISIS PLM/SUBMIT.COM b/ISIS PLM/SUBMIT.COM new file mode 100644 index 0000000000000000000000000000000000000000..82325ad21315e195033dffee5ac92b83d6a58d38 GIT binary patch literal 1280 zcmbVMU1%It6ux(7?v@SYs;w4Ww7Ihx+d5k@owge?Y*xtDQlW8+wfdqB)9fU>bTiXV zCi|10&Bhn8&?oUhQHn1Wgg*GvCKL+Uv4siFg9Gk^KdFC>KcS?kMf%{zb7vdz!6z@v zob!F>obMd&J*?KhnO3h6_ZA*6ID1E*X8Q;F`}eVYalGj0C1x9whHj4*Sa+BFylq=H z%bDz0(KMKR;^fea7TW`64?9vU8SFSuHXZqJaq)3rpmzH8G)^c{VgPHfDfA z*|5h-R^=c5Wy@m6EOT5wuG{*A;XqEO@CCE1mx_6owM@shN-SG|gi(k?58D`ZEW5^z zOqEJRFZF=ATEaIOR{I=-7Nj&KrayEHR z`I@ZLn13Gdw;{d-_#yuSQCETbKBT?_>ftTw$B_B~s2yR|T8M80eiTwX>E{st1o*KK z{~F?70PozA*dUWhXr26g8NOd=8)Q)3AnnbSOA%$A+*a<8<*o{Ny@_=Kpf_=cxbqQD z`kgD`z1aT~<7D`~LcmvkBZr5%y-V(UcmdtmHIM%w{@IAqK)VsRu@u4@zOhTd1_Bzt zhWu?2Z528;1pyCY|D%ZHL{kkfGY|H9@RYz)1|w~>!h}rR<3Xf3(X{GB2Xj#*HBhXs zPDR_@&C`OmNYd&e$z=wXg42SuNK$>tdb+ZOuX21)n~Jvdc06zd@YY747OaP_5r3F> zc}u`2_!OR0hEDKai87UDX$otzv?pkYQkABV9~0C$+KS)Yym(IoryHE*qaXGJXGDPQ zu9ZS)~4~R;wBbE@|PP0=@oi}Ugq3+{L!7C#EAk;m@_0l=sx*%>1aY+aV zZ{dsTELExaT z&Cqj7nfAiXJ+isYf0qQSBF^(sfW_r#Oq-zeZ|Dfmmov*DfdS9m5OeMMkP zz01F6qN~!ay-vC$6AgNBT2O|WsJ2b3F1-L`* z5b>*m3u>Spf1q6>_-5D}W=q1ve7?HpBIFYO^9k}iZ)7K$dB>W5f80a=dHVYHGa1RU O%=m%7AjpdUuk$z6sHfQg literal 0 HcmV?d00001 diff --git a/ISIS PLM/SURVEY.COM b/ISIS PLM/SURVEY.COM new file mode 100644 index 0000000000000000000000000000000000000000..2b0bf4e468b7d5b6413b89c0e121d32e9028562c GIT binary patch literal 1152 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

fLfS2ClLD{C$_>i4*0s_ zG1%!~Ec-6kaH58p4PTSW<1nK$PS7Uf!~(aPoIk?SHf{%H^RF-xy zhdyjTaIV^+C-YVqx@?D@O@$TkPiYE19A~B?)!m10IIbN=PPJ@RHy*mmt0z^28H^K`bav|GUU~7cmwoL3l8OwRd(y+)%$&x z2M!Eb-tBMy`I7jU<;5SDN46`DZk+4IV^OmE~K(U7IZ}qd?aP4)ZU+x-} qb6x3IXis0}-1$uJxfFWme3~w3YEIU5xXLy8gHi!*a&~bZ=>G@rctkn? literal 0 HcmV?d00001 diff --git a/ISIS PLM/SYSCPM2.SUB b/ISIS PLM/SYSCPM2.SUB new file mode 100644 index 0000000..972d9f4 --- /dev/null +++ b/ISIS PLM/SYSCPM2.SUB @@ -0,0 +1,48 @@ +; Create a bootable image on disk A: of CP/M with CCP +; Based on original Digital Research sources for CCP and BDOS +; Required sources are CFGCCP.LIB, MOVER.MAC, CCP.MAC, BDOS.MAC, CBIOSX.MAC +; Required programs: M80.COM, L80.COM, DDT.COM, BOOT.COM, BOOTGEN.COM +XSUB +; get correct configuration +PIP MEMCFG.LIB=CFGCCP.LIB +; create MOVER.COM +M80 =MOVER/M +L80 MOVER,MOVER/N/E +ERA MOVER.REL +; create CCP.COM +M80 =CCP/M +L80 CCP,CCP/N/E +ERA CCP.REL +; create BDOS.COM +M80 =BDOS/M +L80 BDOS,BDOS/N/E +ERA BDOS.REL +; create CBIOSX.COM +M80 =CBIOSX/M +L80 CBIOSX,CBIOSX/N/E +ERA CBIOSX.REL +; put pieces together +DDT +F100 5C00 0 +IMOVER.COM +R0000 +ICCP.COM +R0900 +IBDOS.COM +R1100 +ICBIOSX.COM +R1F00 +G0 +; create boot file +SAVE 44 CPMBOOT.COM +ERA MOVER.COM +ERA CCP.COM +ERA BDOS.COM +ERA CBIOSX.COM +ERA MEMCFG.LIB +; now perform a cold boot to get rid of XSUB +; this restores the original BIOS jump vector which is required by BOOTGEN +BOOT +; write boot file to reserved tracks, must be last command +BOOTGEN CPMBOOT.COM A: + \ No newline at end of file diff --git a/ISIS PLM/SYSDAT.LIT b/ISIS PLM/SYSDAT.LIT new file mode 100644 index 0000000..1eabc7b --- /dev/null +++ b/ISIS PLM/SYSDAT.LIT @@ -0,0 +1,111 @@ + + /* + System Data: byte assignments + ----------------------------- + + 000-000 Mem$top, top page of memory + 001-001 Nmb$cns, number of consoles + 002-002 Brkpt$RST, breakpoint RST # + 003-003 Add system call user stacks, boolean + 004-004 Bank switched, boolean + 005-005 Z80 version, boolean + 006-006 banked bdos, boolean + 007-007 RESBDOS top+1 (BNKBDOS XIOS jmp tbl) base page + 008-008 RESBDOS base page + 009-010 used by CP/NET for mstr cfg tbl addr + 011-011 XDOS base page + 012-012 RSP's (BNKXIOS top+1) base page + 013-013 BNKXIOS base page + 014-014 BNKBDOS base page + 015-015 Max$mem$seg, max memory segment number + 016-047 Memory segment table, filled in by GENSYS if + memory bank switched, otherwise by MPMLDR + 048-063 Breakpoint vector table, filled in by DDTs + 064-079 Unassigned + 080-095 System call user stacks + 096-119 Unassigned + 120-121 Nmb records in MPM.SYS + 122-122 # ticks/sec + 123-123 System Drive + 124-124 Common Memory Base Page + 125-125 Number of Rsp's + 126-127 Listcp Address + 128-143 Subflg, submit flag array + 144-180 Copyright message + 181-186 Serial # + 187-187 Max locked records/process + 188-188 Max open files/process + 189-190 # list items + 191-192 Pointer to base of lock table free space + 193-193 Total system locked records + 194-194 Total system open files + 195-195 Dayfile logging + 196-196 Temporary file drive + 197-197 Number of printers + 198-240 Unassigned + 241-241 Common Xdos base + 242-242 Banked Xdos base + 243-243 Tmp pd base + 244-244 Console dat base + 245-246 Bdos/Xdos address + 247-247 Tmp base address + 248-248 Nmbrsps + 249-249 Brsp base address + 250-251 Brspl, non-resident rsp process link + 252-253 Sysdatadr, MP/M data page address + 254-255 Rspl, resident system process link, the address + of the next Rsp, list terminates with a zero. + */ + + declare mem$top byte at (.system$data(000)); + declare nmb$cns byte at (.system$data(001)); + declare brkpt$RST byte at (.system$data(002)); + declare sys$call$stks boolean at (.system$data(003)); + declare bank$switched boolean at (.system$data(004)); + declare z80$cpu boolean at (.system$data(005)); + declare banked$bdos boolean at (.system$data(006)); + declare xios$jmp$tbl$base byte at (.system$data(007)); + declare resbdos$base byte at (.system$data(008)); + declare xdos$base byte at (.system$data(011)); + declare rsp$base byte at (.system$data(012)); + declare bnkxios$base byte at (.system$data(13)); + declare bnkbdos$base byte at (.system$data(14)); + declare nmb$mem$seg byte at (.system$data(015)); + declare mem$seg$tbl (8) structure ( + base byte, + size byte, + attrib byte, + bank byte ) + at (.system$data(016)); + declare breakpoint$vector (8) address at (.system$data(048)); + declare user$stacks (8) address at (.system$data(080)); + declare nmb$records address at (.system$data(120)); + declare ticks$per$second byte at (.system$data(122)); + declare system$drive byte at (.system$data(123)); + declare common$base byte at (.system$data(124)); + declare nmb$rsps byte at (.system$data(125)); + declare listcpadr address at (.system$data(126)); + declare submit$flags (16) address at (.system$data(128)); +/*declare copyright (37) byte at (.system$data(144));*/ +/*declare serial$number (6) byte at (.system$data(181));*/ + declare max$locked$records byte at (.system$data(187)); + declare max$open$files byte at (.system$data(188)); + declare total$list$items address at (.system$data(189)); + declare lock$free$space$adr address at (.system$data(191)); + declare total$system$locked$records byte at (.system$data(193)); + declare total$system$open$files byte at (.system$data(194)); + declare day$file byte at (.system$data(195)); + declare temp$file$drive byte at (.system$data(196)); + declare nmb$printers byte at (.system$data(197)); + declare cmnxdos$base byte at (.system$data(241)); + declare bnkxdos$base byte at (.system$data(242)); + declare tmpd$base byte at (.system$data(243)); + declare console$dat$base byte at (.system$data(244)); + declare bdos$xdos$adr address at (.system$data(245)); + declare tmp$base byte at (.system$data(247)); + declare nmb$brsps byte at (.system$data(248)); + declare brsp$base byte at (.system$data(249)); + declare brspl address at (.system$data(250)); + declare rspl address at (.system$data(254)); + + \ No newline at end of file diff --git a/ISIS PLM/TIMER.COM b/ISIS PLM/TIMER.COM new file mode 100644 index 0000000000000000000000000000000000000000..83e6e68842ba2f259ef8acde0649e66d73464674 GIT binary patch literal 256 zcmX?H&KO#pn4W5-5aQ|U8l(_h6HpV#%cY points to (letter, command)^3 ld b,3 ; 3 elements in table again: cp (hl) ; compare command line letter with table entry inc hl ; point to command jp z,found ; if found inc hl ; otherwise proceed to next entry dec b ; decrement loop counter jp nz,again ; try next character pusage: ld de,usage ; address of usage text ld c,printStringCmd ; CP/M command for print jp bdos ; print it, get ret from bdos found: ld a,(hl) ; get SIMH command out (SIMHPort),a ; send to SIMH port ret ; and done table: db 'S',starttimercmd db 'P',printTimerCmd db 'Q',quitTimerCmd timend equ $ ds 0200h-timend ; fill remainder with zeroes end  \ No newline at end of file diff --git a/ISIS PLM/TRINT.LST b/ISIS PLM/TRINT.LST new file mode 100644 index 0000000..9dddbf3 --- /dev/null +++ b/ISIS PLM/TRINT.LST @@ -0,0 +1,39 @@ + + + +:F2:ASM80 :F3:TRINT.SRC + + +ISIS-II 8080/8085 MACRO ASSEMBLER, V2.0 MODULE PAGE 1 + + + LOC OBJ SEQ SOURCE STATEMENT + + 1 ; PIP INTERFACE TO BDOS (CAN BE USED FOR OTHER TRANSIENTS) + 2 PUBLIC BOOT,IOBYTE,BDISK,BDOS,MON1,MON2,MON3 + 3 PUBLIC MAXB,FCB,BUFF + 0000 4 BOOT EQU 0000H ;WARM START + 0003 5 IOBYTE EQU 0003H ;IO BYTE + 0004 6 BDISK EQU 0004H ;BOOT DISK # + 0005 7 BDOS EQU 0005H ;BDOS ENTRY + 0005 8 MON1 EQU 0005H ;BDOS ENTRY + 0005 9 MON2 EQU 0005H ;BDOS ENTRY + 0005 10 MON3 EQU 0005H ;BDOS ENTRY + 0006 11 MAXB EQU 0006H ;MAX MEM BASE + 005C 12 FCB EQU 005CH ;DEFAULT FCB + 0080 13 BUFF EQU 0080H ;DEFAULT BUFFER + 14 END + +PUBLIC SYMBOLS +BDISK A 0004 BDOS A 0005 BOOT A 0000 BUFF A 0080 FCB A 005C IOBYTE A 0003 MAXB A 0006 +MON1 A 0005 MON2 A 0005 MON3 A 0005 + +EXTERNAL SYMBOLS + + +USER SYMBOLS +BDISK A 0004 BDOS A 0005 BOOT A 0000 BUFF A 0080 FCB A 005C IOBYTE A 0003 MAXB A 0006 +MON1 A 0005 MON2 A 0005 MON3 A 0005 + +ASSEMBLY COMPLETE, NO ERRORS + \ No newline at end of file diff --git a/ISIS PLM/TRINT.OBJ b/ISIS PLM/TRINT.OBJ new file mode 100644 index 0000000000000000000000000000000000000000..004933599015e12af6c6cec131fabe904c10f6b8 GIT binary patch literal 128 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 literal 0 HcmV?d00001 diff --git a/ISIS PLM/UNERA.COM b/ISIS PLM/UNERA.COM new file mode 100644 index 0000000000000000000000000000000000000000..91be243c65b40cc3095f977bab9f7e8c48cb77fd GIT binary patch literal 1664 zcmc&!ZAcqu9DkC#`@5>iIAtFqY(B|#piwiIL19N1@g=J=TgA=_#kFL5+OUvpm&8q~ zsj!#N`!ELkCTt%z26cm#z)DL@6msXD57`JS`?N4((W@(pmfFI(|6S^~5B=VQ#FlL)QQCDIb=spc7kI$fi-dR7G&32Io8e<2pK;Y9_u|HrWX`7 z8BN6LtAXH2SN)sOn9`PPr(?=gVop(&Y1%~xM#lSw!?b@e-2WEsQ)UvXLdTQQ_$*?nFyakIlPLuKmoQ03 z;<0%PWE8!lk#tg_SRI|VsHUz&;J^oC)3#}4CX$Y&Xf#Qu z(yFS&Q|#)k%Bf z^QkLV-QgIjLVJHAoOR2)Qd!;A)~jW=^Di;3D{CAbYi1A_Yy zya&N8@H&X^0eF{4Myh_AI7R#obw-7?@n!ZaSE_m&h{velj-AHPjAVA|b6f{{Gwema zXb$UH&K%WqoOw~#kn0nhBE$Bag$*HegalII3l0y)@nPFOl%XL+o0^6E?_7y>^Y9$o z;WB0*CxP|R8+jYuuQ%~c5=NoZGDroE$6F(>g?g;yCLRshq8TWfokf#s8I$Iu0xGYf zP+9M@Q1U^(QqqiyQPNg|2LL=4x}Gts`DMOpSBj;bsg~E-9=}?u=vVnC6$|+YUs&et zW-jxmh`bHvk^UuLed)+ettovNdLHqxw0&3=De(yTQC>d4o^SB}hj4a)eGmQz&@ph9 zeFp40uq;mHYr($*9ljmQBVp4G{~kySKj#*2<}gR{J$y0@&37Lp!`;xbdF^)oHKAE@ zV@lSGr>A?7RkhJfQKi<@?w|1KPAeg_dh z2bjn-HA_PNPXSRrc3S(5DA=fl8^xz}(y>I?k03t+v-=M(gdD5_>?hcC{O!=HVk7a$ zyKuX5r!0PBLrJ(>Ll6q!O5$#9UNh<1o)g)IK$8u~7R%yycAVRRa!pSE4LkZ*&EhIx et1_^%&^o)=n$Y}@!C<#=vKo1IkCQwD{(k@svK^BE literal 0 HcmV?d00001 diff --git a/ISIS PLM/UNERA.MAC b/ISIS PLM/UNERA.MAC new file mode 100644 index 0000000000000000000000000000000000000000..5d3e4f3b06f89d74955be581bad806525f02b7b0 GIT binary patch literal 15488 zcmdU0?{C{ilkQg;@IP>$_J9|V)5^AFC#`Fvc#onei7`d0Bo)U#+ySyp$3kQ&C&_7Z zfBikr%q~gEzO?u8f;N%J+1c6I`SHx`>cWiEWRQBJ^Ts3&QZEb4!*XSA{Be4^zjtB0 zNj^-{^F|u_Loe+aKZ#>L{}7~En8fFe&QXWodtM%#HyWKYGn#%gXK&?MkcJ<;T*!pE zIXOBp2Pf~$`{y}`PT!PsoxD!py*7g&4lrw;C!BYGj}te7-zSaENuzP`wOFlZ%Y|7y zKiw89A-HfWGI?Usz)vv3$jW-AA4WmeGOw_`F#Xl?$%Kndv3i)^6~_Bim|k&Lkgw_d zde$*tKAFzjpY0r9PmbE=(6oO!J~=%;J8g`X_p^stac?$Db6c3Ztb^RHVytcH0kW_v+el1KoUEJGe@9->KeKo`7!-IYF7LUf$=efyO)7fHbpPs%XJi#OX zak`q%3X^T1PfOat^X}>yTJ6rKpNsXpDDcKm1S&BtHs8KLbq_Ch-~d}-&N^?7pr~Q7 zSba0;a`T8S`2+^~pUJ*K(NCuMujlEekhPKdXtsbI-#tzjpNh4){bt4mw$@~KkIU6U z?9Lw_kIbn#==^&4e!4h3X}3?_?Cl3Yx!jXy(Jn~b>f(vjgS^L{cK z!x8*ENkQC8)Gqnzr}n#{CFgVFdr`Dao_8nxzAzX1Gw{FYh1sPEj}yap0eJTPZbkCW zCrQxvCQ&YiOkd2?Br@G7@h^q?q$2;B9JC(3sIz>Sm`VSbUwWmWwC&pYn=&jbYSkW09HnAuw6)`Ily#L&puTC-1T`K7;H) z-o0rJBmItHeh_1E^0FW2UY9Sa+ngL2Wf)dW?2Q70w^5+9y`c3@VpQk ({eL_PaH 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 literal 0 HcmV?d00001 diff --git a/ISIS PLM/USQ.COM b/ISIS PLM/USQ.COM new file mode 100644 index 0000000000000000000000000000000000000000..db941ac3dcf83f7b719adf534e8892488afaf025 GIT binary patch literal 1920 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 literal 0 HcmV?d00001 diff --git a/ISIS PLM/WM.HLP b/ISIS PLM/WM.HLP new file mode 100644 index 0000000..080a75f --- /dev/null +++ b/ISIS PLM/WM.HLP @@ -0,0 +1,65 @@ + VIDEO MODE SUMMARY (TYPE ^J FOR NEXT FRAME) + +^O INSERTION ON/OFF RUB DELETE CHR LEFT +^S CURSOR LEFT CHAR ^G DELETE CHR RIGHT +^D CURSOR RIGHT CHAR ^\ DELETE WORD LEFT +^A CURSOR LEFT WORD ^T DELETE WORD RIGHT +^F CURSOR RIGHT WORD ^U DELETE LINE LEFT +^Q CURSOR RIGHT TAB ^K DELETE LINE RIGHT +^E CURSOR UP LINE ^Y DELETE WHOLE LINE +^X CURSOR DOWN LINE ^I PUT TAB IN FILE +^^ CURSOR TOP/BOT SCREEN ^N PUT CRLF IN FILE +^B CURSOR RIGHT/LEFT LINE ^@ DO NEXT CHR 4X +^W FILE DOWN 1 LINE ^P NEXT CHR IN FILE +^Z FILE UP 1 LINE ^V NEXT CHR(S) TO VIDEO +^R FILE DOWN SCREEN ESC EXIT VIDEO MODE +^C FILE UP SCREEN ^J DISPLAY THIS + COMMAND MODE SUMMARY (TYPE ^J FOR NEXT FRAME) + ++- MEANS + OR - ALLOWED HERE, + ASSUMED IF OMITTED +@ MEANS CARRIAGE RETURN OR LINE FEED NECESSARY HERE +$ MEANS ESC OR ^Z OR CARRIAGE RETURN NECESSARY HERE +n MEANS A NUMBER, 1 ASSUMED IF OMITTED, # = 65535 + ++-nC MOVE n CHARACTERS +-nD DELETE n CHARACTERS ++-nL MOVE n LINES +-nK KILL(DELETE) n LINES ++-nT TYPE n LINES nZ SLEEP n SECONDS ++-nP MOVE, TYPE n PAGES +-n@ MOVE n LINES, TYPE 1 ++-B MOVE TOP/BOTTOM FILE ^J SAME AS 1@ + +nItext$ INSERT text n TIMES +I@ ENTER INSERT MODE (ESC OR ^Z EXITS MODE) +A@, nAtext$ (APPEND) DO 1L THEN JUST LIKE INSERT +n<....> LOOP: REPEAT .... n TIMES (DEFAULT = 65535) +nM....@ (MACRO) SAME AS ABOVE + COMMAND MODE SUMMARY (TYPE ^J FOR NEXT FRAME) + ++-nFkey$ (FIND) SHORT SEARCH FOR key n TIMES ++-nNkey$ (NEXT) LONG SEARCH FOR key n TIMES ++-nSkey$text$ SUBSTITUTE AFTER SHORT SEARCH n TIMES ++-nRkey$text$ (REPLACE) SUBSTITUTE AFTER LONG SEARCH +/F,/N,/S,/R SAME, EXCEPT EXIT <..> OR QX IF NOT FOUND + +Y[d:]name.typ$ (YANK) READS FILE IN AT CURSOR +nW[d:]name.typ$ WRITE n LINES INTO THE FILE NAMED + +^N CRLF INSIDE TEXT OR KEY ^Y ESC INSIDE TEXT OR KEY +^A MATCHES ANY IN KEY ^S MATCHES SEPERATOR IN KEY +^OX MATCHES NOT X IN KEY + COMMAMD MODE SUMMARY (TYPE ^J TO RETURN TO EDITING) + +nQP PUT n LINES INTO Q BUFFER, DELETE FROM FILE, n>0 +n/QP APPEND n LINES TO Q BUFFER, DELETE FROM FILE, n>0 +nQG (GET) COPY Q BUFFER INTO FILE n TIMES +nQT TYPE Q BUFFER n TIMES +nQK (KILL) CLEAR Q BUFFER +nQX EXECUTE COMMANDS IN Q BUFFER n TIMES +nQLtext$ (LOAD) PUT text INTO Q BUFFER +n/QLtext$ APPEND text TO Q BUFFER n TIMES + +V ENTER VIDEO MODE N! PUT CHR CODE N INTO FILE +; ALL FOLLOWING IS COMMENT E END EDIT +H END EDIT AND START OVER Q (QUIT) ABANDON EDIT +O RETURN TO ORIGINAL FILE ^Q DISPLAY HELP FILE +^V NEXT CHR(S) TO VIDEO ^C INTERRUPT COMMAND + \ No newline at end of file diff --git a/ISIS PLM/X0100 b/ISIS PLM/X0100 new file mode 100644 index 0000000000000000000000000000000000000000..2635cb000545e1458ce164087c1965cae427fb01 GIT binary patch literal 384 zcmchTF%E)25Jf+*Luo+_2`1iQ7ZZCH*u*G;?ury1!CG6d)PSM+!=!glvl;J#Q}lIHI5*Ln!`e@ z%C$t>Qz3+?vQC4T^;!)~nZ!QLhQkaSP?K3JagWDQG5Kj;VM;u$ literal 0 HcmV?d00001 diff --git a/ISIS PLM/X0100.ASM b/ISIS PLM/X0100.ASM new file mode 100644 index 0000000..e21b2b5 --- /dev/null +++ b/ISIS PLM/X0100.ASM @@ -0,0 +1,27 @@ +$title ('PRL Externals') + name x0100 + CSEG +offset equ 0000h + +mon1 equ 0005h+offset +mon2 equ 0005h+offset +mon2a equ 0005h+offset +mon3 equ 0005h+offset + public mon1,mon2,mon2a,mon3 +cmdrv equ 0050h+offset +fcb equ 005ch+offset +pass0 equ 0051h+offset +len0 equ 0053h+offset +fcb16 equ 006ch+offset +pass1 equ 0054h+offset +len1 equ 0056h+offset +tbuff equ 0080h+offset + public cmdrv,fcb,pass0,len0 + public fcb16,pass1,len1,tbuff +bdisk equ 0004h+offset +maxb equ 0006h+offset +buff equ 0080h+offset +boot equ 0000h+offset + public bdisk,maxb,buff,boot + END + \ No newline at end of file diff --git a/ISIS PLM/X0200 b/ISIS PLM/X0200 new file mode 100644 index 0000000000000000000000000000000000000000..2708a91226c926f7880da97815df87507a987310 GIT binary patch literal 384 zcmchTF$%&!5Jmr(os8wWm* zKU4hAwEEy$=UM{np} WaqSH8srTJ1DsJBQXcO*(pXLc@Z9J_2 literal 0 HcmV?d00001 diff --git a/ISIS PLM/X0200.ASM b/ISIS PLM/X0200.ASM new file mode 100644 index 0000000..29c3208 --- /dev/null +++ b/ISIS PLM/X0200.ASM @@ -0,0 +1,27 @@ +$title ('PRL Externals') + name x0200 + CSEG +offset equ 0100h + +mon1 equ 0005h+offset +mon2 equ 0005h+offset +mon2a equ 0005h+offset +mon3 equ 0005h+offset + public mon1,mon2,mon2a,mon3 +cmdrv equ 0050h+offset +fcb equ 005ch+offset +pass0 equ 0051h+offset +len0 equ 0053h+offset +fcb16 equ 006ch+offset +pass1 equ 0054h+offset +len1 equ 0056h+offset +tbuff equ 0080h+offset + public cmdrv,fcb,pass0,len0 + public fcb16,pass1,len1,tbuff +bdisk equ 0004h+offset +maxb equ 0006h+offset +buff equ 0080h+offset +boot equ 0000h+offset + public bdisk,maxb,buff,boot + END + \ No newline at end of file diff --git a/ISIS PLM/XDOS.LIT b/ISIS PLM/XDOS.LIT new file mode 100644 index 0000000..47efd0f --- /dev/null +++ b/ISIS PLM/XDOS.LIT @@ -0,0 +1,45 @@ +$nolist +/* + Xdos Literals +*/ + + declare abs$request literally '128', + rel$request literally '129', + memory$free literally '130', + poll literally '131', + flag$wait literally '132', + flag$set literally '133', + make$queue literally '134', + open$queue literally '135', + delete$queue literally '136', + read$queue literally '137', + cond$read$queue literally '138', + write$queue literally '139', + cond$write$queue literally '140', + delay literally '141', + dispatch literally '142', + terminate literally '143', + create literally '144', + set$priority literally '145', + attach literally '146', + detach literally '147', + set$console literally '148', + assign$console literally '149', + send$cli$command literally '150', + call$res$sys$p literally '151', + parse$fname literally '152', + get$console$nmb literally '153', + system$data$adr literally '154', + get$tod literally '155', + rtn$pd$adr literally '156', + abort$spcfd$proc literally '157', + attach$list literally '158', + detach$list literally '159', + set$list literally '160', + cond$attach$list literally '161', + cond$attach literally '162', + mpm$ver literally '163', + get$list$nmb literally '164'; + +$list + \ No newline at end of file diff --git a/ISIS PLM/XFORMAT.COM b/ISIS PLM/XFORMAT.COM new file mode 100644 index 0000000000000000000000000000000000000000..f7fd118234370999317c0a42682f112a23555177 GIT binary patch literal 1664 zcmc&!U2NM_6n1WGL$hYW450+Hah*ifV%jK8|JI1MtgXfatva>cidMnM64%M5#lbdg zkybRp+a7u38C9i}x~kf>;)N9pQ43k3nh;VX3!=$Xt(ONRBvc+c&b8YPBwi7Ix#v6Q zJLi1oTW+a*;? zdELjLSWYX+WuGq=eD{=6(nKsO3d{vDPX;I;I(!uX3Ze#rjxxfbA-PgjN>Wk7WH@}S ziZ22~!4vtStdv_pHlUR1q1SWyn<-h5!l7{JCF;NUtPa*Lvyx+%X?uootTiUKf{YQ? z_uDhi97n!+8sVF$WA_F!-XLrqc|OUpjyzn5@~c|Uv$c*OpQh}0X!|k~b*uwqOa-6D zccAfef5VR%E=~C~sQoF+_Xiwn4+(cE$!cY5w}X7pa~LZO_w^IuBT9AjC zQvmtG3X(|Y&w~6q>JAy7duKEMY`_ujBVhf2fI{m16yzWH4WJSc$D2pxg>@t~rdLq( zLVTten?v5QjD$H9kAIk1MLNe&0Q~Sg;%G`(g|?KCaSqhxFz85x?84&52gP5fN= zIMX52WU?{6jI14II~rR=+z=&v4CB&lZIkA&{!?Dnhl?mq_Qucpa2a{%o`?9r@hbBE zDxlJrG?XPJzoL2DqrnFGIOOf2%o^hEQo@?Qw4Z6N1x34^_$_`7bw*&Tu_Y8+K*AD= zgC#7Z#`F>*>+NEo6>%*(U?3{Z{yHG*WZ#hD_k=%yEZE}M z+9<=nOgTg~+zWpK%odOZCj4rU?3p1jmwYqqPv>2sWYwA4Jj4I)uYr(ZDa~-eFGKi% zq8fwRjw|9@- z7Fg=leOKSj8tgiz`(Jo?@EtXAab$dQWDt9Aa3+;*_nzTlG2fQ%#_c`Xu5;PWt|WEk aTpCvtIWMXzJbQ}x-uorRf8PGb{(k}CVnQwe literal 0 HcmV?d00001 diff --git a/ISIS PLM/XSUB.COM b/ISIS PLM/XSUB.COM new file mode 100644 index 0000000000000000000000000000000000000000..15e86abfc94ac7ae15b0db899aec96d711d56e58 GIT binary patch literal 768 zcmaJ-Ur19?82`SZbGy2mb7AblcK>F2M6D4sMuW6^oJmsllHu|`jC9jEbE6uwq?cZL z2z=-{=%I+BkU|FA#fN+0K1^AGK_H?ad+MRr*>|<)&cpe>^EWg|hr`^;SmQvJ9SI37E$JA6N z?XaaxR+^p8=~-q}kFc|QHe;7%{=PB@kp=OJhH|(riuHkN33wm z)TxRl(m_>vMB^N1$^gn(n0*c<>?w~u?3MdO@_84cTHYyhY%JVhpF+WF3H!Mh*F(19 zi7>GV)_X2S6|FT6U%BiLULq>vC)}t&^N~K$Sm*pDpo<_mkX{L-lIFTn8XeI(0X(wb Y+cM%=k)A5D2B>txs!Q>=Q276^zh*|>DF6Tf literal 0 HcmV?d00001 diff --git a/ISIS PLM/ZAP.COM b/ISIS PLM/ZAP.COM new file mode 100644 index 0000000000000000000000000000000000000000..47ffcbb8372e3560e5564daa0b2ea165d31a0930 GIT binary patch literal 9856 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 F{~uk{?9TuI literal 0 HcmV?d00001 diff --git a/ISIS PLM/ZSID.COM b/ISIS PLM/ZSID.COM new file mode 100644 index 0000000000000000000000000000000000000000..5a15b66d402992b00dd0590e2040655c44554d2f GIT binary patch literal 10240 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 F{{)kE?c@Le literal 0 HcmV?d00001 diff --git a/SysCon PLMX/GKSL.TXT b/SysCon PLMX/GKSL.TXT new file mode 100644 index 0000000..2df0aed --- /dev/null +++ b/SysCon PLMX/GKSL.TXT @@ -0,0 +1,766 @@ +GKSL.WS4 +-------- + +- "Systems Languages: Management's Key to Controlled Software Evolution" + Gary Kildall + Proceedings of the 1974 western electronics show and convention (WESCON), + September 1974 ("1974 WESCON Technical Papers", Volume 18, Session 19/2) + +(Retyped by Emmanuel ROCHE.) + + +Abstract +-------- + +Current industry trends forecast widespread use of microcomputers to simplify +the design, development, and manufacture of many digital electronics products. +The effects of microcomputer software design upon the production cycle is +presented, emphasizing the necessity for well-organized software systems. +High-level systems languages are introduced as an aid in software +organization, using Intel's PL/M as a specific example. + + +Introduction +------------ + +The general availability of the low-cost microcomputer, or "CPU on a chip", is +undoubtedly the greatest single breakthrough in digital design technology in +this decade. Although relatively inexpensive general-purpose computers have +been packaged as end-user oriented minicomputers for several years, it is now +economically feasible to design-in a microcomputer set into the heart of a +digital system produced in large quantities. Though only recently introduced, +microcomputers have been applied to a wide spectrum of digital processing, +from simple device controllers through sophisticated word-processing systems. +In fact, the ability to treat a microprocessor as simply another relatively +inexpensive component has led to simplification of many current product +designs, and opened the door to a vast array of digital applications limited +only by one's imagination. + +Simply stated, the microcomputer allows us to economically substitute +programming for wiring. Although there are tremendous savings in software +development when compared with hardware breadboarding, there are also inherent +difficulties in controlling the evolution of a software-based product. Control +over software evolution becomes especially important in the more comprehensive +microcomputer applications, such as small business systems. The purpose here +is to identify and investigate some of these difficulties from the project +manager's viewpoint. The notion of a "systems language" is introduced as an +aid to control of software evolution in high-quantity microcomputer-based +products where a significant software investment is involved. As a specific +example, Intel's high-level systems language, called PL/M, is presented. + +The general product evolution cycle is discussed first, in order to +characterize the effects of software development upon this cycle. + + +Product evolution +----------------- + +The wealth of new digital applications, when coupled with rapid technological +change, place severe demands upon the project manager. A product must be +planned with change in mind, in order to extend its sales window beyond the +next unpredictable technological breakthrough. In fact, product evolution can +be considered the cyclic process of change involving the product definition in +order to adapt to the environment. The product environment, in turn, involves +such factors as market trends, customer requirements, competitor reaction, and +new technology. It is obvious that the adaptability of a product to a changing +environment directly determines its survival in the marketplace. The product +evolution cycle is shown graphically in Figure 1, distinguishing the 2 major +branches of engineering and manufacturing, and marketing. The advent of the +LSI microprocessor is an example of a technological advancement which affects +the product evolution cycle. Random logic or custom chip fabrication can now +be economically replaced by any of a number of low-cost ROM-driven digital +processors which can perform complicated logic, arithmetic, and sequencing +operations. As a result, the microprocessor can provide central and peripheral +control and processing in many designs, greatly reducing time and cost in +product specification, development, and production. + + | + V + +--------------------> Formulation <--------------------+ + | | | + | +---------+--------+ | + | | | | + | V | | + +-----> Internal specification | | + | | V | + | | External documentation <-----+ + | V | | + +-----> Design, Check-out V | + | | Marketing strategy <-----+ + | V | | + +-----> Manufacturing | | + | | | | + | +--> Sales, Distribution <--+ | + | | | + | V | + +--<--------------- Customer response --------------->--+ + + Figure 1. The product evolution cycle + +The effects of microcomputer use on the marketing cycle have been investigated +elsewhere [Ref.1], and thus the discussion turns to engineering and +manufacturing aspects. Referring to Figure 1, product specification efforts +are reduced, since operation of a device can be specified in terms of +conceptually simpler computer programs, rather than complicated logic +diagrams. Further, the circuitry necessary for interfacing with the electronic +environment is generally reduced to specification of simple modular units. + +Design, development, and check-out efforts are reduced in a number of ways. +First, the flexibility inherent in programming allows principal algorithms to +be written, tested, and reprogrammed in a relatively short period, using the +software development tools which are available from the major microcomputer +manufacturers. This flexibility allows the designer to develop programs in a +software "test bed", roughly equivalent to a hardware breadboard for circuit +testing. Subroutines communicate with a standard device, such as a teletype, +where data is manually entered, representing information which would normally +be expected from the corresponding circuitry. This technique allows the +principal control functions to be developed and independently checked before +system integration. In addition, the forced modularity of the peripheral +circuitry implies that each individual module can also be designed, +breadboarded, and tested independently. + +System integration is thus simplified, since each hardware and software +subsystem has been verified. The simulating subroutines and simulated devices +are individually replaced by their corresponding actual circuitry and drivers, +thus isolating system design errors at each step of the integration. + +Finally, manufacturing is simplified, since standard microprocessor modules +can either be purchased from OEM suppliers, or developed in-house. These +standard modules generally involve fewer parts than corresponding random logic +designs, thus reducing both PC (ROCHE> Note that Gary Kildall uses the term +"PC" 7 years (!) before the birth of the "IBM Clown"...) board layout efforts +and costs for board production and testing. Given that the microprocessor +modules are properly checked-out, the transition from software prototype to +production software is immediate. Further, production changes often involve +software modifications which affect ROM contents, rather than requiring +assembly alterations. + +Thus, the use of microcomputers and their associated software development +tools can significantly reduce the time and costs for the first engineering +and manufacturing cycle of an electronic product. + +Consider now the cyclic evolution of a microcomputer-based product as it +adapts to market pressures. Clearly, the adaptability of the product is +directly governed by the adaptability of its software system. That is to say, +since most modifications are accomplished through program changes, one can +consider the product's evolution in terms of the evolution of its associated +software. Changes may arise in a number of ways, including requests from +customers for increased facilities, alterations required by design errors +detected through field use, or modifications caused by cost advantages in +using newly available hardware devices or software techniques. Thus, software +evolution must be a major concern of the project manager: with proper control, +each cyclic regeneration of software systems improves upon its predecessor. +Loss of control over software evolution results in a maze of over-specialized +algorithms and data structures which hinder successive product cycles, to the +point where entire systems must be re-developed. Factors affecting software +evolution are presented in the paragraphs which follow. + + +Software evolution +------------------ + +Similar to product evolution, the evolution of a software system can be +considered the cyclic process of change in program design and expression, in +order to adapt to the changing product definition. The 3 factors which most +affect software adaptability are listed below. + + 1) Maintainability is a mesure of the ease with which a particular + program can be corrected when an error is found in the product. + + 2) Expandability determines the effort required to add new features or + subsystems as the product definition changes. + + 3) Portability among programmers, machine designs, and manufacturers + determines the extent to which a software system depends upon a + particular software or hardware designer and design philosophy. + +Maintainability, expandability, and portability of software directly determine +time and cost for program regeneration. Programs are developed only once, but +are maintained throughout their lifetime. Thus, the ease of program correction +is a major concern in the overall software evolution cycle. Second, as new +features or capabilities are added to the product, corresponding extensions +are necessary to the programs. Programs written with expansion as a principal +design goal adapt easily, while those which are not cause excessive delay +during redesign. When time constraints prevent proper redesign of non- +expandable programs, the resulting "interim" software is often undependable +and cannot be properly maintained, thus adversely affecting subsequent +evolution. Finally, unlike random logic designs, software systems easily +become dependent upon a particular programmer, or upon a particular machine +architecture or manufacturer. In most cases, if the project manager finds +advantages in changing any of these variables, the software must be mainly +reconstructed, often obviating those advantages. In fact, in this rapidly +moving industry, the ease with which programs can be effectively moved between +machines of differing design, while being readily understood by a number of +different programmers, may be the most important single influence upon the +software evolution cycle. + +Clearly, there are many aspects of software design which determine +maintainability, expandability, and portability, and a complete treatment of +all factors is beyond the scope of this paper. The reader is encouraged, +however, to refer to notes on structured programming [Ref.2 and 3], software +engineering [Ref.4], and programming management [Ref.5] for additional +details. One important, but intangible, factor is the training, experience, +and problem insight of the project programmers. Even the most experienced +programmer, however, depends upon the programming tools that are available to +express his or her solution. As a result, these tools have a profound effect +upon the adaptability of the product's software. + + +Programming tools +----------------- + +The discussion of software evolution now focuses upon the degree of +adaptability obtained from the various approaches to microcomputer +programming. In particular, a programming language is the programmer's +principal means of expressing the algorithms and data structures which perform +the specified product function. There are 4 basic methods used in +microcomputer software development for expressing programs: machine language, +assembly language, macro assembly language, and high-level language +programming. These 4 methods are briefly reviewed below for completeness. + +1) Machine language programming uses the bit patterns recognized by the +microprocessor as a means for expressing programs. All program and data +locations are referenced by their absolute addresses in memory. + +2) Assembly language programming is one step removed from a machine level +expression of a program. It allows the programmer to use symbolic names for +each of the processor's operation codes, and automatically translates these +codes to the proper bit patterns for microcomputer execution. The programmer +references program and data addresses by freely-assigned symbolic names, +rather than absolute addresses. In all cases, however, there is a one-to-one +correspondence between symbolic instructions written by the programmer and the +translated machine level instructions. Thus, an assembly language can be +considered a convenient means of expressing machine level instructions. Figure +2 shows a sample assembly language program, and the corresponding machine +level code for an Intel 8080 microcomputer [Ref.6]. Note that the memory +locations and machine operation codes are given as hexadecimal values in this +figure. + + +------------- Location + | +-------- Machine language + | | Assembly language and comments + | | | + V V V + ; Sample assembly language program + ; for the Intel 8080 microcomputer. + ; + ; Compare the values of X and Y, + ; store the larger value into Z. + ; + ;-------------------------------- + 0100 ORG 0100H ; Start program code at 0100H + ;-------------------------------- + ; + 0100 211301 LXI H,y ; Address Y + 0103 7E MOV A,M ; Load + 0104 EB XCHG ; Exchange DE,HL + 0105 211201 LXI H,x ; Address X + 0108 BE CMP M ; Compare memory + ; + ; Carry is set if X > Y + ; + 0109 DA0D01 JC setc ; Jump if no Carry + ; + ; X is less or equal + ; + 010C EB XCHG ; Exchange DE,HL + ; + 010D 7E setc: MOV A,M ; Load X or Y + 010E 321401 STA z ; Store + ; + ;-------------------------------- + 0111 76 HLT ; Halt processor + ;-------------------------------- + ; Variable definitions. + ; + 0112 00 x DB 0 + 0113 00 y DB 0 + 0114 00 z DB 0 + ; + ;-------------------------------- + 0115 END 0100H + + Figure 2. Machine language and assembly language programs for the + Intel 8080 microcomputer. + +3) Macro assembly language is similar to assembly language coding, except that +the programmer is allowed to define and use macros. A macro is a predefined +group of assembly language statements which is given a macro name. Each use of +the macro name causes the predefined instructions or data definitions to be +directly substituted for the name. Thus, for example, the programmer can +effectively "invent" new machine operations as necessary for concise +expression of a particular problem. Additional facilities, such as conditional +assembly and assembly-time expression evaluation, are usually present in a +macro assembly language, which make it considerably more flexible than a +simple assembly language. + +4) High-level language programming is one step further removed from assembly +language programming. Normally, the notation used in a high-level language +more closely resembles common mathematical symbolism, rather than relying upon +complicated sequences of machine instructions to perform a specific function. +For example, the hih-level statement + + IF x > y THEN z = x; ELSE z = y + +is read as follows: "if the value of X is greater than the value of Y, then +store X's value into Z; otherwise, store Y's value into Z". The effect is that +Z's new value is the larger of X and Y. Each high-level statement is +translated into a sequence of machine level instructions by a compiler for the +language. The statement given above is translated into the equivalent machine +code shown in Figure 2 by Intel's PL/M compiler for the 8080 microcomputer +[Ref.7]. In general, a high-level language provides primitive operations, data +types, and control structures which are appropriate for expressing programs +within a particular problem environment. Thus, a high-level language is +reasonably independent of a particular machine design and, instead, tends to +depend upon the type of problem being solved. These concepts are examined in +later sections. + +How do these various language levels affect software evolution? First, machine +level coding is generally considered inappropriate for even moderate projects, +due to the non-symbolic nature of the resulting programs. Assembly language +programming, with or without macro capabilities, may be appropriate for +moderately-sized programs. However, the adaptability of the final product is +highly dependent upon the coding practices of the project programmers, as well +as the coding standards set forth and enforced by the project manager. +Portability between programmers is relatively difficult, and depends +principally upon the quality of the program's documentation, rather than the +programs themselves. Portability from machine to machine is severely +restricted, and is usually accomplished only at the option of the +manufacturer. Assembly language programs written for Intel's 8008 +microcomputer, for example, can be re-assembled for their new 8080 +microcomputer with only minor changes in the original program. Although the +resulting programs benefit from the increased speed of the new processor, they +must be rewritten to take advantage of the 8080's expanded instruction set. +High-level languages, however, currently provide the highest degree of +maintainability, expandability, and portability of any of these programming +tools. In fact, a specific class of high-level languages, called systems +languages, are considered the most appropriate tool for controlling software +evolution. + + +Systems languages +----------------- + +As stated previously, a high-level language is relatively independent of a +particular machine architecture, and is primarily intended to provide a +concise means for expressing programs in a particular problem environment. The +BASIC and FORTRAN programming languages, for example, are high-level languages +which assume a scientific computation problem environment. The actual machine +on which a BASIC or FORTRAN program executes should have little effect on the +resulting output. + +A high-level systems language is more specialized, since it assumes the +problem environment is the control of a particular machine or class of +machines. Thus, the goals are somewhat different than those of a pure high- +level language: a high-level systems language must be relatively independent +of the exact computer, while providing the necessary control structures, data +types, and basic operations for clear and concise expression of systems for a +particular type of computer. It follows that such a systems language must +allow complete control of all machine functions, and, at the same time, +eliminate the needless trivialities of assembly language. In addition, a +systems language must also be structured in such a way that it can be easily +translated to efficient machine language programs for the target machine. Each +operation in the systems language has a direct counterpart in the machine, +resulting in little or no run-time support software. + +The primitive operations and data types for a microcomputer systems language +are fairly simple. Bit-level data occur frequently when communicating with +peripheral circuitry, such as the status information received from an input or +output device. Thus, bit-level data types must be present, along with +corresponding shifting, masking, and bit-testing operations. Character +handling is also an important function in word-processing and data +communication applications. As a result, string data types should be allowed, +with facilities for comparing strings, selection of substrings, and conversion +between other data types. Fundamental arithmetic processing is also necessary, +but the data types may depend heavily upon the microcomputer architecture. +Based upon current offerings, the useful arithmetic data types include 4-bit +decimal (BCD) operands, and 8-, 16-, and 32-bit fixed-point binary quantities, +along with the usual arithmetic and relational operations. Finally, +communication primitives must be provided for environmental monitoring and +control. + +Given that a particular microcomputer can support these functions, it is +certainly the case that the operations and data types can be included in a +macro assembly language for the processor. In a systems language, however, +these facilities are imbedded in a convenient expressional notation, and +enhanced by comprehensive data definition and program control facilities. That +is to say, along with the necessary basic functions, the programmer is +provided with language statements which allow program expression in a readable +or "well-structured" [Ref.8] form. These structures normally include a natural +notation for statement grouping, conditional branching, and iteration or loop +control. Furthermore, subroutine definition, parameter specification, and +subroutine invocation mechanisms are normally provided. As a result, +subroutine linkage standards are enforced, modular programming is encouraged, +and construction of comprehensive subroutine libraries becomes practical. The +PL/M microcomputer systems language presented in the following section is used +to illustrate these capabilities. + + +A case in point +--------------- + +Intel's PL/M high-level language provides an example of a systems language for +programming their 8-bit microcomputers. The statement structure of PL/M +resembles IBM's PL/1 programming language and, in fact, was derived from XPL +which is a dialect of PL/1. The similarity, however, is only superficial; +differences in control structures, operations, and data types make PL/1 useful +for general applications programming, while those of XPL make it appropriate +for compiler implementation. PL/M was designed with the special needs of +microcomputer systems in mind, as given in the previous section, and thus is +neither a subset nor superset of these languages. The important point is that +PL/M belongs to the general family of "PL languages", and thus a programmer +who is familiar with one of these languages finds it relatively easy to learn +any of the others. Figure 3 contains a listing of a PL/M program similar to +one proposed by Popper [Ref.9] for comparing high-level and assembly language +microcomputer programming. Although Popper gives a complete description of the +program in his notes, the overall structure is presented as an example of PL/M +program organization. + +/* Quicksort procedure + +This PL/M procedure sorts an array into ascending order +using the QUICKSORT algorithm. Included in this listing +is the procedure, QUICKSORT, and a test driver program +to demonstrate the calling sequence. Note that the +procedure is written with an assumption that the number +of elements to be sorted is less than or equal to 256 +(low,high,uptr,dptr,lstack,hstack,array$size,a1, +and a2 are byte variables) and that the precision of +the array elements is 8 bits (list,temp, and ref are +byte variables). These restrictions may be lifted by +changing the declarations. Note also that the +working arrays (lstack and hstack) are dimensioned +by stack$size, where + + stack$size >= log2 (array$size) + +*/ + +quicksort: + PROCEDURE (array, array$size); + DECLARE stack$size LITERALLY '10'; + DECLARE array ADDRESS; + DECLARE array$size BYTE; + DECLARE list BASED array BYTE; + DECLARE lstack (stack$size) BYTE, hstack (stack$size) BYTE; + DECLARE top BYTE; + DECLARE (low, dptr, uptr, high) BYTE; + DECLARE (ref, temp) BYTE; + + push: + PROCEDURE (a1, a2); + DECLARE (a1, a2) BYTE; + + lstack (top) = a1; + hstack (top) = a2; + top = top + 1; + END push; + + /* Main program */ + + top = 0; + CALL push (0, array$size); + DO WHILE top <> 0; + top = top - 1; + IF (dptr := (low := lstack (top))) + <> (uptr := (high := hstack (top))) THEN + DO ; + ref = list (low); + down: + DO WHILE list (dptr) <= ref AND high > dptr; + dptr = dptr + 1; + END; + DO WHILE list (uptr) >= ref AND low < uptr; + uptr = uptr - 1; + END; + IF dptr < uptr THEN + DO ; + temp = list (uptr); + list (uptr) = list (dptr); + list (dptr) = temp; + dptr = dptr + 1; + uptr = uptr - 1; + GO TO down; + END; + IF uptr > low THEN + DO ; + list (low) = list (uptr); + list (uptr) = ref; + uptr = uptr - 1; + END; + CALL push (low, uptr); + CALL push (dptr, high); + END; + END; + END quicksort; + +/* Begin test driver */ + +DECLARE test$array (16) BYTE INITIAL + (0,15,1,14,2,13,3,12,4,11,5,10,6,9,7,8); + + CALL quicksort (.test$array, last (test$array)); + +EOF + + Figure 3. A QUICKSORT program in PL/M + +As described in the program "comment" at the start of Figure 3, the subroutine +QUICKSORT is used to sort a list of numbers into ascending order. The +subroutine begins with a number of declarations which define variables and +macros used within the QUICKSORT subroutine. These declarations are then +followed by a nested subroutine, called PUSH, which performs a function local +to QUICKSORT. The remainder of the QUICKSORT subroutine then manipulates the +locally-defined variables, along with a list of numbers passed to the +subroutine, to produce a list in sorted order. + +Following the end of the QUICKSORT subroutine, a list of test values is +defined, called TEST$ARRAY. This test list is then passed to QUICKSORT in the +CALL statement near the end of the program, to verify that QUICKSORT works +correctly. The program is terminated by the symbol EOF. + +The PL/M compiler is then used to translate this program into machine +language. The resulting machine language can be loaded into the memory of an +Intel 8-bit microcomputer, and executed. There is no output operation shown in +this example, and thus the resulting sorted list is simply left in the +machine's memory. In fact, the QUICKSORT subroutine would normally become a +distinct software module in a microcomputer application, such as a small +inventory control system, and hence the program in Figure 3 is simply a test +of the module. The overall organization of the PL/M programming system has +been presented in some detail elsewhere [Ref.10], along with operating and +debugging practices. + +How does PL/M affect adaptability of software systems? First, the high degree +of self-documentation found in high-level language programming greatly +enhances maintainability, expandability, and portability among programmers. +This fact has been shown many times over in large-scale computer programming +using PL languages, and easily carries over to microcomputer programming in +PL/M. Portability between machines has been demonstrated by Intel in their 8- +bit processor line. Specifically, Intel offers a PL/M compiler for both their +8008 and newer 8080 microcomputer which allow strict upward PL/M +compatibility. That is to say, although 8080 PL/M provides additional +programming features, any PL/M program written for the 8008 CPU can be +recompiled for the 8080 CPU without modification. The only difference is that +the resulting 8080 machine level program requires less storage, and executes +faster. Furthermore, Intel's long term commitment to PL/M means that customers +can expect their programs to execute on future processors, while taking +advantage of each new machine design. + +Portability among manufacturers is more difficult in PL/M, but not impossible. +First, the 8- and 16-bit class of microcomputer appears to be a popular +architecture. Thus, PL/M programs could execute on another manufacturer's +machine if a PL/M compiler for that particular machine were available. +Construction of a compiler is generally considered a formidable task. PL/M, +however, is a small language with simple grammar rules, simple statement +execution rules, and no run-time support requirements. Given that a company +has a significant investment in software, a specialized compiler for PL/M +could be developed in-house for nearly any manufacturer's microcomputer. Using +well-known automatic compiler generation techniques [Ref.11], a specialized +PL/M compiler of this sort would require only a few man-months of effort to +write, debug, and document. This approach not only allows portability among +manufacturers, but also solves the second source problem to some degree. + +Thus, given that a high-level language exists for a particular application, +one cannot argue its merit as an aid in developing adaptable software. + + +The efficiency question +----------------------- + +High-level languages have traditionally been under attack for their relative +inefficiency when compared to tightly-coded assembly language programs. As +stated by Weinberg [Ref.12] "when we ask for efficiency, we are often asking +for tight coding that will be difficult to modify. In terms of higher-level +languages, we often descend to the (assembly) language level to make a program +more efficient. This loses at least one of the benefits of having the program +in the higher-level language -- that of transportability between machines. In +fact, it has the effect of freezing us to a machine or implementation that, we +have admitted by our very act, is unsatisfactory. However, the same managers +who scream for efficiency are the ones who tear their hair when told the cost +of modifications". Weinberg's comments are especially true in the large-scale +computer community. When discussing microcomputer systems, however, one might +argue that the relative inefficiencies of high-level language programming are +intolerable, due to the added cost of memory in large quantity production. + +Concentrating only on the question of efficiency for a moment, one should note +that it is impossible to categorically state that all high-level languages are +necessarily inefficient. Efficiency depends upon at least 2 factors: the +proximity of the language to the target machine, and the quality of the +compiler which performs the translation to machine language. In fact, this is +a principal point: a high-level systems language is closely related to the +architecture of the machines it is to control, which leads to "good" machine +level programs. Statements in PL/M, for example, translate into short machine +instruction sequences, since PL/M statements reflect the machine architecture. +Conversely, FORTRAN language statements are difficult to process on a small +machine, and would produce long sequences of machine instructions. As a +result, systems languages are potentially the most efficient subclass of the +high-level languages. + +The quality of the high-level language translator can be measured in terms of +the degree of "program optimization" that it performs. That is to say, an +optimizing compiler is one which analyzes the program structure to produce +machine level code which best uses the target machine's resources. Optimizing +compilers are themselves evolutionary, and are generally improved over time. +Several versions of Intel's PL/M compiler have been released since its first +introduction in June of 1973. Each version has additional program optimizing +features which reduce the amount of generated machine language. As an example, +consider the QUICKSORT subroutine shown in Figure 3, which was proposed by +Popper [Ref.9] as an indication of relative inefficiency. Popper gives an +equivalent QUICKSORT subroutine using Intel 8008 assembly language. The +assembly language version is highly 8008 machine-dependent, resulting in a +tightly-coded 215 statement program. Table 1 shows a comparison of the PL/M +and assembly language versions of QUICKSORT, giving the relative inefficiency +of PL/M as the measure + + Mp - Ma + ------- + Ma + +where Mp and Ma represent the memory requirements of the PL/M and assembly +language versions, respectively. + +Table 1. QUICKSORT comparison + +Translator Program size Relative + (in bytes) inefficiency +-------------- ------------ ------------ +8008 assembler 300 - +8008 PL/M Ver1 426 42% +8008 PL/M Ver3 391 30% +8008 PL/M Ver3 +(subscript optim.) 336 12% +8080 PL/M Ver1 330 10% + +Note: Program size based upon body of QUICKSORT procedure. + +The June 1973 release of PL/M produced 42% more program storage, while the +February 1974 release produced 30% more instructions. Because of the +relatively small program size, and the large number of subscripted variable +references, this particular program can be considered a "worst case" for PL/M. +Thus, Table 1 also shows the result of compilation with the 8008 PL/M +subscript optimization options enabled. These options allow the PL/M compiler +to insert short subroutines for subscript computations, rather than inline +code, which both decreases the memory requirements and increases the execution +speed. Using these options, the relative inefficiency is reduced to 12%. Note +also that the first version of the 8080 PL/M compiler, released in March 1974, +produced only 10% more machine instructions. + +(ROCHE> PL/M dates: + +8008 PL/M Version 1: June 1973 +8008 PL/M Version 2: ? 1973 +8008 PL/M Version 3: February 1974 +8080 PL/M Version 1: March 1974) + +There are several points to consider in this comparison. First, it is clear +that the assembly language version could be completely rewritten for the 8080 +CPU, further reducing memory requirements. This, however, is the entire point: +given the 2 original programs, one in PL/M, the other in assembly language, +the PL/M program improves without alteration as new new compilers and machine +designs are introduced, while the assembly language version requires +reprogramming to adapt. Further, the experience a manufacturer gains in +processing the high-level language can be used in designing future processors +which more effectively execute these programs. + +It must also be noted that the relative inefficiency measure cannot be +considered an absolute comparison. The numbers vary widely with program +complexity, programming style, and programmer experience. Due to the +complexity of large programs, it quite often happens that relative +inefficiency becomes negative. That is to say, experience has shown that, for +programs larger than 1000-2000 bytes, the PL/M compiler actually produces +better machine level programs that hand-coded versions. This effect is +principally due to the fact that the compiler more readily accounts for +machine resources, where assembly language coding becomes confused and +disorganized. + +In fact, the entire discussion of relative inefficiency may be a moot point, +given the current and projected costs for memory. In quantity, 2K by 8-bit +ROM's are currently available for less than $15 apiece, and hence the +incremental difference in production cost is hardly appreciable when compared +to the adaptability of the product. + + +Summary +------- + +Current microcomputer designs and applications merely predict their promising +future. However, due to a microcomputer-based product's heavy dependence upon +software systems, the major hurdle in the near future will be in software +design methodology. Never before has software design been as important: +reliability and correctness of programs directly determines the quality of a +product manufactured in the thousands. As customers, we must encourage the +industry to offer and support the tools necessary for effective program +development and adaptability. + +One tool, high-level systems languages, has been shown to be a viable approach +to microcomputer systems development. When coupled with proper management and +programmer experience, high-level systems languages provide the means to +produce quality software systems for supporting a constantly evolving product +definition. + + +References +---------- + +1 +"Processors and profits: how microprocessors boost them" + Davidow, W. +"Electronics", July 11, 1974 + +2 +"Structured Programming" + Dahl, O. et al. + Academic Press, 1972 + +3 +"A brief look at structured programming and top-down program design" + Yourdon, E. +"Modern Data", June, 1974 + +4 +"Software Engineering Techniques" + Buxton, J. (Editor) + Nato Science Committee, OTAN/NATO, 1110 Bruxelles, Belgium, April 1970 + +5 +"Managing a programming project" + Metzger, P. + Prentice-Hall, 1973 + +6 +"8080 Assembly Language Programming Manual" + Intel Corp. + +7 +"A Guide to PL/M Programming" + Intel Corp. + +8 +"The Elements of Programming Style" + Kernighan, B. et al. + McGraw-Hill, 1974 + +9 +"Advanced Microcomputer Software Techniques" + Popper, C. + National Electronics Conference, + Professional Growth in Engineering Seminar, 1974 + +10 +"High-level language simplifies microcomputer programming" + Kildall, G. +"Electronics", June 27, 1974 + +11 +"A Compiler Generator" + McKeeman, W. et al. + Prentice-Hall, 1970 + +12 +"???" + Weinberg + ??? + + +EOF + \ No newline at end of file diff --git a/SysCon PLMX/IATABLE.FOR b/SysCon PLMX/IATABLE.FOR new file mode 100644 index 0000000000000000000000000000000000000000..1368d224b3f395f1e32998549b06a8ce2ab242ec GIT binary patch literal 1664 zcmb_c&u`R46n~%hX6C#5-R+O#ntZj`N59&p) za1(DFH1S}9A@O8l^rCX$puvL)Au%!GqKQ#2CYqRdBI|pzCFKurv-9S?&%BxWeBQiW zA`p|1qff#|;kLUXugY6;gFkf}{+{~@Q{f#y8UFQE|2zJ{1N@24_@@8CANKeBG2i3g z2(S6?{FnSnDDZFmu^(~+ZZJG>SKU>Ai&IrM`Q3l*D)J|y|cn|0$ z@XL~L6?s<$Jq6m!vc4&9eY0$4RQ&oTnp`kj3kpu5(Q*wc`y{T^!h-GT*wloM&2qG( zn%1FPHO;22u;2|Hwatc>L#DP`_GC_>4B@JAM_ulrOIZ!M5A=i(<)lh^oAv4P5F|PR zXqmkxWuu-fn&Jsr6j)MKl$xT{6s3Bn3ubG9DpFh}7^I})N-Z=+X`d=mql(n31hu9p zPFtZWvNhXmi>j!$s*21}MZ7MwPHEOyXDROp8OmjpJx>Z{D4mSllW2nkuJ$1@0euK8 zGevPTvu37>j%KE2i{MtKsaEhB)9jkl;!uKm%J{VAO>etrDHC!v^z0*W|2EvO@WYgT zO;2LmpuXSoV|fX|i0`v%+tchLy@x#-L?7jdrZh^Jwuoi=2-7qg6>9>aphBA|H&1yc zTXz|xlpBZz$VCTyP-uYCgW!3Pb|DwQo!~snus+>zC)2Q2DFN4m_k*7SKL^^)k)xx- z*-b2immLkh z2!2co2$qybCnMvZ!saXuYs#y|5U2p;wc8g?1X;JzHez zF0vdd3LUaeX$H4|p9Z~Pa)dCZ-5@Rny|83F>}m%ZbfZOWN$w^4b-m0JY7A> zjMpWprc+#gN`~ast1pOdW1HpaSS{zehjWPbru?|tJ4}4nr;57IgctPmg z+`<<1VARjMtW7q28i8#$h9N3EAAQrbV45mSl?yC$6`>1rl}JPHQ1PgM^bhF&`TPe0 CcGa~2 literal 0 HcmV?d00001 diff --git a/SysCon PLMX/IETABLE.FOR b/SysCon PLMX/IETABLE.FOR new file mode 100644 index 0000000000000000000000000000000000000000..561a06070a4c62677abe08a45688890811e49ed3 GIT binary patch literal 10880 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 K`iH49yZC>?sYw+8 literal 0 HcmV?d00001 diff --git a/SysCon PLMX/IHTABLE.FOR b/SysCon PLMX/IHTABLE.FOR new file mode 100644 index 0000000000000000000000000000000000000000..0fc7435bed565f24a8bcafd8ad9f650d16228ad4 GIT binary patch literal 640 zcmb`DPe@cz6vpTG-RFC+9xrk+FfIm?TGT?)z?De07<&`6kes+iBB7NdOlA-?wJ#+i zM=1I)+OC}|cUqwB!i|dx_pKx-iqMVs`HyMu;ljE1JNNsYb8knK>7agjXYmWr4d)?& zB3$6mCFq3`Tt*i9;0n45{b&GPLxV5`*Wm`-gkdPd2&MwJU=)qP9fB&{hX+It;Sr3( z1bU436eghtQ+UtO3wQ~y;5EE~x9|?8(G1MOdx8%HbNKTF3$O?u;S**FmfIqHa zY)aFqmd-eKR22)!#a+XHY44EeXzoeZ9#h$Ez4KhLAmy9t8XRlAeQ)?=CUo#5G&bE- fb{MWtv)u*sDV=ir5p`boGyAd|Dc{tr%z?!ga0O!y literal 0 HcmV?d00001 diff --git a/SysCon PLMX/IOCLD.SRC b/SysCon PLMX/IOCLD.SRC new file mode 100644 index 0000000..07f6d2b --- /dev/null +++ b/SysCon PLMX/IOCLD.SRC @@ -0,0 +1,197 @@ +/* + Following is a total list of I/O procedures available to the + PLMX user. Refer to Digital Research "CP/M Interface Guide" + for a description of CP/M 1.4 system level procedures. Refer to + the "PLMX User's Guide" for a description of all other procedures. + It is suggested that the user extract those procedures which are + applicable to his application, possibly putting them in an INCLUDE + file. +*/ + +/* CP/M system level procedures */ + +RD$CON: +PROCEDURE BYTE EXTERNAL; +END RD$CON; + +WR$CON: +PROCEDURE (CHAR) EXTERNAL; + DECLARE CHAR BYTE; +END WR$CON; + +RD$RDR: +PROCEDURE BYTE EXTERNAL; +END RD$RDR; + +PUNCH: +PROCEDURE (CHAR) EXTERNAL; + DECLARE CHAR BYTE; +END PUNCH; + +PRINT: +PROCEDURE (CHAR) EXTERNAL; + DECLARE CHAR BYTE; +END PRINT; + +G$STAT: +PROCEDURE BYTE EXTERNAL; +END G$STAT; + +S$STAT: +PROCEDURE (STAT) EXTERNAL; + DECLARE STAT BYTE; +END S$STAT; + +PR$BUF: +PROCEDURE (ADRS) EXTERNAL; + DECLARE ADRS ADDRESS; +END PR$BUF; + +RD$BUF: +PROCEDURE (BUF) ADDRESS EXTERNAL; + DECLARE BUF BYTE; +END RD$BUF; + +CN$RDY: +PROCEDURE BYTE EXTERNAL; +END CN$RDY; + +LFT$HD: +PROCEDURE EXTERNAL; +END LFT$HD; + +INIT: +PROCEDURE EXTERNAL; +END INIT; + +LOGIN: +PROCEDURE (DSK) EXTERNAL; + DECLARE DSK BYTE; +END LOGIN; + +OPEN: +PROCEDURE (FCB) BYTE EXTERNAL; + DECLARE FCB BYTE; +END OPEN; + +CLOSE: +PROCEDURE (FCB) BYTE EXTERNAL; + DECLARE FCB BYTE; +END CLOSE; + +SERCH: +PROCEDURE (FCB) BYTE EXTERNAL; + DECLARE FCB BYTE; +END SERCH; + +SR$NXT: +PROCEDURE (FCB) BYTE EXTERNAL; + DECLARE FCB BYTE; +END SR$NXT; + +DLETE: +PROCEDURE EXTERNAL; +END DLETE; + +RD$DSK: +PROCEDURE (FCB) BYTE EXTERNAL; + DECLARE FCB ADDRESS; +END RD$DSK; + +WR$DSK: +PROCEDURE (FCB) BYTE EXTERNAL; + DECLARE FCB ADDRESS; +END WR$DSK; + +MAKE: +PROCEDURE (FCB) BYTE EXTERNAL; + DECLARE FCB ADDRESS; +END MAKE; + +RNAME: +PROCEDURE (FCB) ADDRESS EXTERNAL; + DECLARE FCB ADDRESS; +END RNAME; + +RL$VEC: +PROCEDURE BYTE EXTERNAL; +END RL$VEC; + +DRIVE: +PROCEDURE BYTE EXTERNAL; +END DRIVE; + +STDMA: +PROCEDURE (BUF) EXTERNAL; + DECLARE BUF ADDRESS; +END STDMA; + + +/* PLMX read and write line procedures */ + +READ: +PROCEDURE (FUNCTION, BUFFER, COUNT, ACTUAL, STATUS) EXTERNAL; + DECLARE (FUNCTION, BUFFER, COUNT, ACTUAL, STATUS) ADDRESS; +END READ; + +WRITE: +PROCEDURE (FUNCTION, BUFFER, COUNT, STATUS) EXTERNAL; + DECLARE (FUNCTION, BUFFER, COUNT, STATUS) ADDRESS; +END WRITE; + + +/* Disk I/O procedures */ + +DRCHR: +PROCEDURE (FCB, SEC$BUFFER, SEC$COUNT, CHAR, STATUS) EXTERNAL; + DECLARE (FCB, SEC$BUFFER, SEC$COUNT, CHAR, STATUS) ADDRESS; +END DRCHR; + +DWCHR: +PROCEDURE (FCB, SEC$BUFFER, SEC$COUNT, CHAR, STATUS) EXTERNAL; + DECLARE (FCB, SEC$BUFFER, SEC$COUNT, CHAR, STATUS) ADDRESS; +END DWCHR; + +DRLIN: +PROCEDURE (FCB, SEC$BUF, SEC$CNT, BUFFER, COUNT, STATUS) EXTERNAL; + DECLARE (FCB, SEC$BUF, SEC$CNT, BUFFER, COUNT, STATUS) ADDRESS; +END DRLIN; + +DWLIN: +PROCEDURE (FCB, SEC$BUF, SEC$COUNT, BUFFER, COUNT, STATUS) EXTERNAL; + DECLARE (FCB, SEC$BUF, SEC$COUNT, BUFFER, COUNT, STATUS) ADDRESS; +END DWLIN; + +OPENR: +PROCEDURE (FCB, SEC$COUNT, STATUS) EXTERNAL; + DECLARE (FCB, SEC$COUNT, STATUS) ADDRESS; +END OPENR; + +CLOSR: +PROCEDURE (FCB, STATUS) EXTERNAL; + DECLARE (FCB, STATUS) ADDRESS; +END CLOSR; + +OPENW: +PROCEDURE (FCB, SEC$COUNT, STATUS) EXTERNAL; + DECLARE (FCB, SEC$COUNT, STATUS) ADDRESS; +END OPENW; + +CLOSW: +PROCEDURE (FCB, SEC$BUF, SEC$COUNT, STATUS) EXTERNAL; + DECLARE (FCB, SEC$BUF, SEC$COUNT, STATUS) ADDRESS; +END CLOSW; + +/* Other procedures */ + +NUMIN: /* Convert ASCII number to 16-bit unsigned binary */ +PROCEDURE (BUFFER) ADDRESS EXTERNAL; + DECLARE BUFFER ADDRESS; +END NUMIN; + +NMOUT: /* Convert 16-bit unsigned binary number to ASCII string */ +PROCEDURE (VALUE, BASE, LC, BUFFADR, WIDTH) EXTERNAL; + DECLARE (VALUE, BUFFADR) ADDRESS; + DECLARE (BASE, LC, WIDTH) BYTE; +END NMOUT; + \ No newline at end of file diff --git a/SysCon PLMX/IOLIB.MAC b/SysCon PLMX/IOLIB.MAC new file mode 100644 index 0000000..bd3b99a --- /dev/null +++ b/SysCon PLMX/IOLIB.MAC @@ -0,0 +1,1985 @@ +; IOLIB.MAC +; --------- +; +; CP/M 1.4 -- IOLIB of PLMX +; +; Disassembled by: +; +; Mr Emmanuel ROCHE +; Chemin de Boisrond +; 17430 Tonnay-Charente +; FRANCE +; +; (Most probably the result of a PLMX compilation.) +; +;-------------------------------- +; ORG 0100H ; Standard CP/M RELocatable file +;-------------------------------- +; +Co0000 EQU 0000H ; -C--I +Io0001 EQU 0001H ; ----I +I$0002 EQU 0002H ; ----I +Io0003 EQU 0003H ; ----I +Io0004 EQU 0004H ; ----I +BDOS EQU 0005H ; ----I +I$0007 EQU 0007H ; ----I +I$0008 EQU 0008H ; ----I +I$0009 EQU 0009H ; ----I +Io000A EQU 000AH ; ----I +I$000B EQU 000BH ; ----I +I$000C EQU 000CH ; ----I +I$000D EQU 000DH ; ----I +I$000E EQU 000EH ; ----I +Io000F EQU 000FH ; ----I +I$0010 EQU 0010H ; ----I +I$0011 EQU 0011H ; ----I +I$0012 EQU 0012H ; ----I +I$0013 EQU 0013H ; ----I +I$0014 EQU 0014H ; ----I +I$0015 EQU 0015H ; ----I +I$0016 EQU 0016H ; ----I +I$0017 EQU 0017H ; ----I +I$0018 EQU 0018H ; ----I +I$0019 EQU 0019H ; ----I +I$001A EQU 001AH ; ----I +Io00FF EQU 00FFH ; ----I +I$FFFF EQU 0FFFFH ; ----I +; +;-------------------------------- +lf EQU 0AH ; Line Feed +cr EQU 0DH ; Carriage Return +;-------------------------------- +; +Qo0100: JMP J$01A5 ; Jump around statement +; +;-------------------------------- +; +Qo0103: XCHG + SHLD Do0D57 + MOV L,C + MOV H,B + SHLD Do0D55 + POP H + XTHL + SHLD Do0D53 + POP H + XTHL + SHLD Do0D51 + POP H + XTHL + SHLD Do0D4F + LHLD Do0D53 + MOV A,M + MVI L,80H + CALL Co0000 + RRC + JNC J$0169 + LHLD Do0D51 + MOV C,L + MOV B,H + CALL Co0ABF + LHLD Do0D4F + MOV C,L + MOV B,H + CALL Co0B2D + STA Do0D5B + LHLD Do0D5B + MVI H,00H + XCHG + LHLD Do0D57 + MOV M,E + INX H + MOV M,D + MVI A,00H + LHLD Do0D57 + MOV E,M + INX H + MOV D,M + XCHG + CALL Co0000 + RRC + JNC J$015A + JMP J$0193 +; +J$015A: LHLD Do0D51 + SHLD Do0D59 + MVI A,00H + LHLD Do0D53 + MOV M,A + JMP J$0176 +; +J$0169: LHLD Do0D53 + MOV A,M + LHLD Do0D51 + CALL Co0000 + SHLD Do0D59 +J$0176: LHLD Do0D55 + MOV A,M + LHLD Do0D59 + MOV M,A + LHLD Do0D59 + INX H + SHLD Do0D59 + LHLD Do0D53 + MOV A,M + MVI L,01H ; 1 + CALL Co0000 + LHLD Do0D53 + MOV M,A + RET +; +J$0193: LXI H,Io00FF + XCHG + LHLD Do0D57 + MOV M,E + INX H + MOV M,D + LXI B,I$01A8 + CALL Co0C78 + RET +; +Qo01A4: RET +; +;-------------------------------- +J$01A5: CALL Co0000 +; +I$01A8: DB 'WRITE ERROR', cr, lf, '$' +; +Qo01B6: JMP J$0265 ; Jump around statement +;-------------------------------- +; +Qo01B9: XCHG + SHLD Do0D67 + MOV L,C + MOV H,B + SHLD Do0D65 + POP H + XTHL + SHLD Do0D63 + POP H + XTHL + SHLD Do0D61 + POP H + XTHL + SHLD Do0D5F + LHLD Do0D63 + MOV A,M + MVI L,00H + CALL Co0000 + RRC + JNC J$0216 + LHLD Do0D61 + MOV C,L + MOV B,H + CALL Co0ABF + LHLD Do0D5F + MOV C,L + MOV B,H + CALL Co0B4A + STA Do0D6B + LHLD Do0D6B + MVI H,00H + XCHG + LHLD Do0D67 + MOV M,E + INX H + MOV M,D + MVI A,00H + LHLD Do0D67 + MOV E,M + INX H + MOV D,M + XCHG + CALL Co0000 + RRC + JNC J$0210 + JMP J$0253 +; +J$0210: MVI A,80H + LHLD Do0D63 + MOV M,A +J$0216: LHLD Do0D63 + MOV L,M + MVI A,80H + CALL Co0000 + LHLD Do0D61 + CALL Co0000 + SHLD Do0D69 + MOV A,M + LHLD Do0D65 + MOV M,A + LHLD Do0D69 + MOV A,M + MVI L,1AH + CALL Co0000 + RRC + JNC J$0245 + LXI H,Io0001 + XCHG + LHLD Do0D67 + MOV M,E + INX H + MOV M,D + RET +; +J$0245: LHLD Do0D63 + MOV A,M + MVI L,01H ; 1 + CALL Co0000 + LHLD Do0D63 + MOV M,A + RET +; +J$0253: LXI H,Io00FF + XCHG + LHLD Do0D67 + MOV M,E + INX H + MOV M,D + LXI B,I$0268 + CALL Co0C78 + RET +; +Qo0264: RET +; +;-------------------------------- +J$0265: CALL Co0000 +; +I$0268: DB 'READ ERROR', cr, lf, '$' +; +Qo0275: JMP J$0331 ; Jump around statement +;-------------------------------- +; +Qo0278: XCHG + SHLD Do0D75 + MOV L,C + MOV H,B + SHLD Do0D73 + POP H + XTHL + SHLD Do0D71 + POP H + XTHL + SHLD Do0D6F + LXI H,Co0000 + XCHG + LHLD Do0D75 + MOV M,E + INX H + MOV M,D + LHLD Do0D71 + MOV C,L + MOV B,H + CALL Co0ABF + LHLD Do0D73 + MOV A,M + MVI L,00H + CALL Co0000 + RRC + JNC J$02F7 + LHLD Do0D73 + MOV A,M + MVI L,01H ; 1 + CALL Co0000 + STA Do0D79 + JMP J$02C4 +; +J$02B9: MVI A,01H ; 1 + LHLD Do0D79 + CALL Co0000 + STA Do0D79 +J$02C4: MVI L,80H + LDA Do0D79 + CALL Co0000 + RRC + JNC J$02E0 + MVI A,1AH + LHLD Do0D77 + MOV M,A + LHLD Do0D77 + INX H + SHLD Do0D77 + JMP J$02B9 +; +J$02E0: LHLD Do0D6F + MOV C,L + MOV B,H + CALL Co0B2D + STA Do0D7A + LHLD Do0D7A + MVI H,00H + XCHG + LHLD Do0D75 + MOV M,E + INX H + MOV M,D +J$02F7: LHLD Do0D6F + MOV C,L + MOV B,H + CALL Co0BBE + STA Do0D7A + LHLD Do0D75 + MOV E,M + INX H + MOV D,M + XCHG + LDA Do0D7A + CALL Co0000 + XCHG + LHLD Do0D75 + MOV M,E + INX H + MOV M,D + MVI A,0FFH + LHLD Do0D75 + MOV E,M + INX H + MOV D,M + XCHG + CALL Co0000 + RRC + JNC J$0330 + LXI H,Co0000 + XCHG + LHLD Do0D75 + MOV M,E + INX H + MOV M,D +J$0330: RET +; +;-------------------------------- +J$0331: CALL Co0000 +; + JMP J$0372 ; Jump around statement +;-------------------------------- +; +Qo0337: XCHG + SHLD Do0D7F + MOV L,C + MOV H,B + SHLD Do0D7D + LHLD Do0D7D + MOV C,L + MOV B,H + CALL Co0BBE + STA Do0D81 + LHLD Do0D81 + MVI H,00H + XCHG + LHLD Do0D7F + MOV M,E + INX H + MOV M,D + MVI A,0FFH + LHLD Do0D7F + MOV E,M + INX H + MOV D,M + XCHG + CALL Co0000 + RRC + JNC J$0371 + LXI H,Co0000 + XCHG + LHLD Do0D7F + MOV M,E + INX H + MOV M,D +J$0371: RET +; +;-------------------------------- +J$0372: CALL Co0000 +; + JMP J$0435 ; Jump around statement +;-------------------------------- +; +Qo0378: XCHG + SHLD Do0D87 + MOV L,C + MOV H,B + SHLD Do0D85 + POP H + XTHL + SHLD Do0D83 + JMP J$03C4 +; +Co0389: MVI A,0CH ; 12 + LHLD Do0D83 + CALL Co0000 + SHLD Do0D89 + MVI A,01H ; 1 + STA Do0D8B + JMP J$03A7 +; +J$039C: MVI A,01H ; 1 + LHLD Do0D8B + CALL Co0000 + STA Do0D8B +J$03A7: MVI L,15H + LDA Do0D8B + CALL Co0000 + RRC + JNC J$03C3 + MVI A,00H + LHLD Do0D89 + MOV M,A + LHLD Do0D89 + INX H + SHLD Do0D89 + JMP J$039C +; +J$03C3: RET +; +J$03C4: CALL Co0389 + LHLD Do0D83 + MOV C,L + MOV B,H + CALL C$0B67 + CALL Co0389 + LHLD Do0D83 + MOV C,L + MOV B,H + CALL C$0B10 + STA Do0D8F + LHLD Do0D8F + MVI H,00H + XCHG + LHLD Do0D87 + MOV M,E + INX H + MOV M,D + MVI A,0FFH + LHLD Do0D87 + MOV E,M + INX H + MOV D,M + XCHG + CALL Co0000 + RRC + JNC J$03FA + RET +; +J$03FA: CALL Co0389 + LHLD Do0D83 + MOV C,L + MOV B,H + CALL Co0BDB + STA Do0D8F + LHLD Do0D8F + MVI H,00H + XCHG + LHLD Do0D87 + MOV M,E + INX H + MOV M,D + MVI A,0FFH + LHLD Do0D87 + MOV E,M + INX H + MOV D,M + XCHG + CALL Co0000 + RRC + JNC J$042E + LXI H,Co0000 + XCHG + LHLD Do0D87 + MOV M,E + INX H + MOV M,D +J$042E: MVI A,00H + LHLD Do0D85 + MOV M,A + RET +; +;-------------------------------- +J$0435: CALL Co0000 +; + JMP J$04B8 ; Jump around statement +;-------------------------------- +; +Qo043B: XCHG + SHLD Do0D95 + MOV L,C + MOV H,B + SHLD Do0D93 + POP H + XTHL + SHLD Do0D91 + MVI A,0CH ; 12 + CALL Co0000 + SHLD Do0D97 + MVI A,01H ; 1 + STA Do0D99 + JMP J$0464 +; +J$0459: MVI A,01H ; 1 + LHLD Do0D99 + CALL Co0000 + STA Do0D99 +J$0464: MVI L,15H + LDA Do0D99 + CALL Co0000 + RRC + JNC J$0480 + MVI A,00H + LHLD Do0D97 + MOV M,A + LHLD Do0D97 + INX H + SHLD Do0D97 + JMP J$0459 +; +J$0480: LHLD Do0D91 + MOV C,L + MOV B,H + CALL Co0BDB + STA Do0D9C + LHLD Do0D9C + MVI H,00H + XCHG + LHLD Do0D95 + MOV M,E + INX H + MOV M,D + MVI A,0FFH + LHLD Do0D95 + MOV E,M + INX H + MOV D,M + XCHG + CALL Co0000 + RRC + JNC J$04B1 + LXI H,Co0000 + XCHG + LHLD Do0D95 + MOV M,E + INX H + MOV M,D +J$04B1: MVI A,00H + LHLD Do0D93 + MOV M,A + RET +; +;-------------------------------- +J$04B8: CALL Co0000 +; + JMP J$05C6 ; Jump around statement +;-------------------------------- +; +Qo04BE: XCHG + SHLD Do0DA8 + MOV L,C + MOV H,B + SHLD Do0DA6 + POP H + XTHL + SHLD Do0DA4 + POP H + XTHL + SHLD Do0DA2 + POP H + XTHL + SHLD Do0DA0 + POP H + XTHL + SHLD Do0D9E + JMP J$053A +; +C$04DE: LHLD Do0DA2 + MOV A,M + MVI L,80H + CALL Co0000 + RRC + JNC J$052C + LHLD Do0DA0 + MOV C,L + MOV B,H + CALL Co0ABF + LHLD Do0D9E + MOV C,L + MOV B,H + CALL Co0B2D + STA Do0DAE + LHLD Do0DAE + MVI H,00H + XCHG + LHLD Do0DA8 + MOV M,E + INX H + MOV M,D + MVI A,00H + LHLD Do0DA8 + MOV E,M + INX H + MOV D,M + XCHG + CALL Co0000 + RRC + JNC J$051D + JMP J$05B4 +; +J$051D: LHLD Do0DA0 + SHLD Do0DAA + MVI A,00H + LHLD Do0DA2 + MOV M,A + JMP J$0539 +; +J$052C: LHLD Do0DA2 + MOV A,M + LHLD Do0DA0 + CALL Co0000 + SHLD Do0DAA +J$0539: RET +; +J$053A: LHLD Do0DA4 + SHLD Do0DAC +J$0540: CALL C$04DE +J$0543: LHLD Do0DA2 + MOV A,M + MVI L,80H + CALL Co0000 + STA Do0DB2 + MVI A,00H + LHLD Do0DA6 + MOV E,M + INX H + MOV D,M + XCHG + CALL Co0000 + STA Do0DB3 + LHLD Do0DB3 + LDA Do0DB2 + CALL Co0000 + RRC + JNC J$05A0 + LHLD Do0DAC + MOV A,M + LHLD Do0DAA + MOV M,A + LHLD Do0DAA + INX H + SHLD Do0DAA + LHLD Do0DAC + INX H + SHLD Do0DAC + LHLD Do0DA6 + MOV E,M + INX H + MOV D,M + XCHG + DCX H + XCHG + LHLD Do0DA6 + MOV M,E + INX H + MOV M,D + LHLD Do0DA2 + MOV A,M + MVI L,01H ; 1 + CALL Co0000 + LHLD Do0DA2 + MOV M,A + JMP J$0543 +; +J$05A0: MVI A,00H + LHLD Do0DA6 + MOV E,M + INX H + MOV D,M + XCHG + CALL Co0000 + RRC + JNC J$05B3 + JMP J$0540 +; +J$05B3: RET +; +J$05B4: LXI H,Io00FF + XCHG + LHLD Do0DA8 + MOV M,E + INX H + MOV M,D + LXI B,I$05C9 + CALL Co0C78 + RET +; +Qo05C5: RET +; +;-------------------------------- +J$05C6: CALL Co0000 +; +I$05C9: DB 'WRITE ERROR', cr, lf, '$' +; +Qo05D7: JMP J$06D8 ; Jump around statement +;-------------------------------- +; +Qo05DA: XCHG + SHLD Do0DC4 + MOV L,C + MOV H,B + SHLD Do0DC2 + POP H + XTHL + SHLD Do0DC0 + POP H + XTHL + SHLD Do0DBE + POP H + XTHL + SHLD Do0DBC + POP H + XTHL + SHLD Do0DBA + LXI H,Co0000 + XCHG + LHLD Do0DC2 + MOV M,E + INX H + MOV M,D + LHLD Do0DC0 + SHLD Do0DC8 +J$0607: LHLD Do0DBE + MOV A,M + MVI L,00H + CALL Co0000 + RRC + JNC J$064C + LHLD Do0DBC + MOV C,L + MOV B,H + CALL Co0ABF + LHLD Do0DBA + MOV C,L + MOV B,H + CALL Co0B4A + STA Do0DCA + LHLD Do0DCA + MVI H,00H + XCHG + LHLD Do0DC4 + MOV M,E + INX H + MOV M,D + MVI A,00H + LHLD Do0DC4 + MOV E,M + INX H + MOV D,M + XCHG + CALL Co0000 + RRC + JNC J$0646 + JMP J$06C6 +; +J$0646: MVI A,80H + LHLD Do0DBE + MOV M,A +J$064C: LHLD Do0DBE + MOV L,M + MVI A,80H + CALL Co0000 + LHLD Do0DBC + CALL Co0000 + SHLD Do0DC6 + MOV A,M + MVI L,1AH + CALL Co0000 + RRC + JNC Jo0673 + LXI H,Io0001 + XCHG + LHLD Do0DC4 + MOV M,E + INX H + MOV M,D + RET +; +Jo0673: LHLD Do0DC6 + MOV A,M + LHLD Do0DC8 + MOV M,A + LHLD Do0DBE + MOV A,M + MVI L,01H ; 1 + CALL Co0000 + LHLD Do0DBE + MOV M,A + LHLD Do0DC2 + MOV E,M + INX H + MOV D,M + XCHG + INX H + XCHG + LHLD Do0DC2 + MOV M,E + INX H + MOV M,D + LHLD Do0DC6 + INX H + SHLD Do0DC6 + LHLD Do0DC8 + MOV A,M + MVI L,0AH ; 10 + CALL Co0000 + RRC + JNC J$06AC + RET +; +J$06AC: LHLD Do0DC8 + INX H + SHLD Do0DC8 + LHLD Do0DBE + MOV A,M + MVI L,00H + CALL Co0000 + RRC + JNC J$06C3 + JMP Jo0673 +; +J$06C3: JMP J$0607 +; +J$06C6: LXI H,Io00FF + XCHG + LHLD Do0DC4 + MOV M,E + INX H + MOV M,D + LXI B,I$06DB + CALL Co0C78 + RET +; +Qo06D7: RET +; +;-------------------------------- +J$06D8: CALL Co0000 +; +I$06DB: DB 'READ ERROR', cr, lf, '$' +; +Qo06E8: JMP J$084A ; Jump around statement +;-------------------------------- +; +Qo06EB: MOV L,C + MOV H,B + SHLD Do0DD0 + LXI H,Co0000 + SHLD Do0DD4 + SHLD Do0DD6 + SHLD Do0DD8 + SHLD Do0DDA + LHLD Do0DD0 + MOV E,M + INX H + MOV D,M + XCHG + SHLD Do0DD2 +J$0709: LHLD Do0DD2 + MOV A,M + MVI L,20H ; " " + CALL Co0000 + RRC + JNC J$0720 + LHLD Do0DD2 + INX H + SHLD Do0DD2 + JMP J$0709 +; +J$0720: MVI A,0FFH + STA Do0DDD +J$0725: LDA Do0DDD + RRC + JNC J$07E1 + MVI A,00H + STA Do0DDD + MVI A,00H + STA Do0DDC + JMP J$0744 +; +J$0739: MVI A,01H ; 1 + LHLD Do0DDC + CALL Co0000 + STA Do0DDC +J$0744: LXI H,Io000F + LDA Do0DDC + CALL Co0000 + RRC + JNC J$07DE + LHLD Do0DDC + MVI H,00H + XCHG + LXI H,I$084D + DAD D + SHLD Do0DDF + LHLD Do0DD2 + MOV A,M + LHLD Do0DDF + MOV L,M + CALL Co0000 + RRC + JNC J$07DB + MVI L,02H ; 2 + LDA Do0DDC + CALL Co0000 + RRC + JNC J$078A + LHLD Do0DD4 + XCHG + LHLD Do0DD4 + DAD D + LDA Do0DDC + CALL Co0000 + SHLD Do0DD4 +J$078A: LHLD Do0DD6 + PUSH H + LXI D,Io0003 + POP B + CALL Co0000 + LDA Do0DDC + CALL Co0000 + SHLD Do0DD6 + MVI L,0AH ; 10 + LDA Do0DDC + CALL Co0000 + RRC + JNC J$07BB + MVI A,0AH ; 10 + LHLD Do0DD8 + CALL Co0000 + LDA Do0DDC + CALL Co0000 + SHLD Do0DD8 +J$07BB: LHLD Do0DDA + PUSH H + LXI D,Io0004 + POP B + CALL Co0000 + LDA Do0DDC + CALL Co0000 + SHLD Do0DDA + LHLD Do0DD2 + INX H + SHLD Do0DD2 + MVI A,0FFH + STA Do0DDD +J$07DB: JMP J$0739 +; +J$07DE: JMP J$0725 +; +J$07E1: LHLD Do0DD2 + INX H + XCHG + LHLD Do0DD0 + MOV M,E + INX H + MOV M,D + LHLD Do0DD2 + MOV A,M + MVI L,48H ; "H" + CALL Co0000 + RRC + JNC J$07FD + LHLD Do0DDA + RET +; +J$07FD: LHLD Do0DD2 + MOV A,M + MVI L,51H ; "Q" + CALL Co0000 + STA Do0DDE + LHLD Do0DD2 + MOV A,M + MVI L,4FH ; "O" + CALL Co0000 + STA Do0DE3 + LHLD Do0DE3 + LDA Do0DDE + CALL Co0000 + RRC + JNC J$0826 + LHLD Do0DD6 + RET +; +J$0826: LHLD Do0DD2 + XCHG + LHLD Do0DD0 + MOV M,E + INX H + MOV M,D + LHLD Do0DD2 + DCX H + SHLD Do0DD2 + MOV A,M + MVI L,42H ; "B" + CALL Co0000 + RRC + JNC J$0845 + LHLD Do0DD4 + RET +; +J$0845: LHLD Do0DD8 + RET +; +Qo0849: RET +; +;-------------------------------- +J$084A: CALL Co0000 +; +I$084D: DB '0123456789ABCDEF' +; +Qo085D: JMP J$093B ; Jump around statement +;-------------------------------- +; +Qo0860: XCHG + MOV A,L + STA Do0DEA + MOV L,C + MOV H,B + SHLD Do0DE6 + POP H + XTHL + MOV A,L + STA Do0DE9 + POP H + XTHL + MOV A,L + STA Do0DE8 + POP H + XTHL + SHLD Do0DE4 + MVI A,01H ; 1 + STA Do0DEB + JMP J$088E +; +J$0883: MVI A,01H ; 1 + LHLD Do0DEB + CALL Co0000 + STA Do0DEB +J$088E: LHLD Do0DEA + LDA Do0DEB + CALL Co0000 + RRC + JNC J$08DC + LDA Do0DE8 + LHLD Do0DE4 + CALL Co0000 + XCHG + LXI H,I$093E + DAD D + SHLD Do0DED + LHLD Do0DEB + LDA Do0DEA + CALL Co0000 + STA Do0DEC + LHLD Do0DEC + MVI H,00H + XCHG + LHLD Do0DE6 + DAD D + SHLD Do0DEF + LHLD Do0DED + MOV A,M + LHLD Do0DEF + MOV M,A + LDA Do0DE8 + LHLD Do0DE4 + CALL Co0000 + SHLD Do0DE4 + JMP J$0883 +; +J$08DC: MVI A,00H + STA Do0DEB +J$08E1: MVI L,01H ; 1 + LDA Do0DEA + CALL Co0000 + STA Do0DEC + LHLD Do0DEC + LDA Do0DEB + CALL Co0000 + STA Do0DEC + LHLD Do0DEB + MVI H,00H + XCHG + LHLD Do0DE6 + DAD D + MOV A,M + MVI L,30H ; "0" + CALL Co0000 + STA Do0DF1 + LHLD Do0DF1 + LDA Do0DEC + CALL Co0000 + RRC + JNC J$093A + LHLD Do0DEB + MVI H,00H + XCHG + LHLD Do0DE6 + DAD D + SHLD Do0DEF + LDA Do0DE9 + LHLD Do0DEF + MOV M,A + MVI L,01H ; 1 + LDA Do0DEB + CALL Co0000 + STA Do0DEB + JMP J$08E1 +; +J$093A: RET +; +;-------------------------------- +J$093B: CALL Co0000 +; +I$093E: DB '0123456789ABCDEF' +; +Qo094E: JMP J$09C8 ; Jump around statement +;-------------------------------- +; +Qo0951: XCHG + SHLD Do0DF8 + MOV L,C + MOV H,B + SHLD Do0DF6 + POP H + XTHL + SHLD Do0DF4 + POP H + XTHL + SHLD Do0DF2 + MVI A,0FFH + LHLD Do0DF8 + MOV M,A + MVI A,02H ; 2 + LHLD Do0DF2 + CALL Co0000 + RRC + JNC J$0977 + RET +; +J$0977: MVI A,00H + LHLD Do0DF8 + MOV M,A +J$097D: MVI A,00H + LHLD Do0DF6 + CALL Co0000 + RRC + JNC J$09C7 + JMP J$098C +; +J$098C: LHLD Do0DF2 + CALL Co0000 + SBB B + DAD B + ANA D + DAD B + XRA H + DAD B + LHLD Do0DF4 + MOV C,M + CALL Co0D1D + JMP Jo09B6 +; +Qo09A2: LHLD Do0DF4 + MOV C,M + CALL C$0CCA + JMP Jo09B6 +; +Qo09AC: LHLD Do0DF4 + MOV C,M + CALL C$0CE8 + JMP Jo09B6 +; +Jo09B6: LHLD Do0DF4 + INX H + SHLD Do0DF4 + LHLD Do0DF6 + DCX H + SHLD Do0DF6 + JMP J$097D +; +J$09C7: RET +; +;-------------------------------- +J$09C8: CALL Co0000 +; + JMP J$0AA2 ; Jump around statement +;-------------------------------- +; +Qo09CE: XCHG + SHLD Do0E07 + MOV L,C + MOV H,B + SHLD Do0E05 + POP H + XTHL + SHLD Do0E03 + POP H + XTHL + SHLD Do0E01 + POP H + XTHL + SHLD Do0DFF + MVI A,0FFH + LHLD Do0E07 + MOV M,A + MVI A,01H ; 1 + LHLD Do0DFF + CALL Co0000 + RRC + JNC J$09F9 + RET +; +J$09F9: MVI A,00H + LHLD Do0E07 + MOV M,A + LXI H,Co0000 + XCHG + LHLD Do0E05 + MOV M,E + INX H + MOV M,D +J$0A09: LHLD Do0E03 + DCX H + SHLD Do0E0A + LHLD Do0E0A + SHLD Do0E03 + LHLD Do0E0A + XCHG + LXI H,I$FFFF + CALL Co0000 + RRC + JNC J$0AA1 + MVI A,00H + LHLD Do0DFF + CALL Co0000 + RRC + JNC J$0A3A + CALL C$0D3B + LHLD Do0E01 + MOV M,A + JMP J$0A41 +; +J$0A3A: CALL Co0D06 + LHLD Do0E01 + MOV M,A +J$0A41: LHLD Do0E01 + MOV A,M + MVI L,0DH ; 13 + CALL Co0000 + RRC + JNC J$0A88 + LHLD Do0E01 + INX H + SHLD Do0E01 + MVI A,0AH ; 10 + LHLD Do0E01 + MOV M,A + MVI A,00H + LHLD Do0DFF + CALL Co0000 + RRC + JNC J$0A70 + LXI B,Io000A + CALL Co0D1D + JMP J$0A77 +; +J$0A70: CALL Co0D06 + LHLD Do0E01 + MOV M,A +J$0A77: LHLD Do0E05 + MOV E,M + INX H + MOV D,M + XCHG + INX H + INX H + XCHG + LHLD Do0E05 + MOV M,E + INX H + MOV M,D + RET +; +J$0A88: LHLD Do0E01 + INX H + SHLD Do0E01 + LHLD Do0E05 + MOV E,M + INX H + MOV D,M + XCHG + INX H + XCHG + LHLD Do0E05 + MOV M,E + INX H + MOV M,D + JMP J$0A09 +; +J$0AA1: RET +; +;-------------------------------- +J$0AA2: CALL Co0000 +; + JMP J$0AB9 ; Jump around statement +;-------------------------------- +; +Qo0AA8: LXI B,I$0019 + PUSH B + LXI D,Co0000 + POP B + LXI H,I$0AB8 + PUSH H + LHLD D$0E0E + PCHL +; +I$0AB8: RET +; +;-------------------------------- +J$0AB9: CALL Co0000 +; + JMP J$0AD6 ; Jump around statement +;-------------------------------- +; +Co0ABF: MOV L,C + MOV H,B + SHLD Do0E12 + LXI B,I$001A + PUSH B + LHLD Do0E12 + XCHG + POP B + LXI H,I$0AD5 + PUSH H + LHLD D$0E10 + PCHL +; +I$0AD5: RET +; +;-------------------------------- +J$0AD6: CALL Co0000 +; + JMP J$0AED ; Jump around statement +;-------------------------------- +; +Qo0ADC: LXI B,I$0018 + PUSH B + LXI D,Co0000 + POP B + LXI H,I$0AEC + PUSH H + LHLD D$0E14 + PCHL +; +I$0AEC: RET +; +;-------------------------------- +J$0AED: CALL Co0000 +; + JMP J$0B0A ; Jump around statement +;-------------------------------- +; +Qo0AF3: MOV L,C + MOV H,B + SHLD Do0E18 + LXI B,I$0017 + PUSH B + LHLD Do0E18 + XCHG + POP B + LXI H,I$0B09 + PUSH H + LHLD D$0E16 + PCHL +; +I$0B09: RET +; +;-------------------------------- +J$0B0A: CALL Co0000 +; + JMP J$0B27 ; Jump around statement +;-------------------------------- +; +C$0B10: MOV L,C + MOV H,B + SHLD Do0E1C + LXI B,I$0016 + PUSH B + LHLD Do0E1C + XCHG + POP B + LXI H,I$0B26 + PUSH H + LHLD D$0E1A + PCHL +; +I$0B26: RET +; +;-------------------------------- +J$0B27: CALL Co0000 +; + JMP J$0B44 ; Jump around statement +;-------------------------------- +; +Co0B2D: MOV L,C + MOV H,B + SHLD Do0E20 + LXI B,I$0015 + PUSH B + LHLD Do0E20 + XCHG + POP B + LXI H,I$0B43 + PUSH H + LHLD D$0E1E + PCHL +; +I$0B43: RET +; +;-------------------------------- +J$0B44: CALL Co0000 +; + JMP J$0B61 ; Jump around statement +;-------------------------------- +; +Co0B4A: MOV L,C + MOV H,B + SHLD Do0E24 + LXI B,I$0014 + PUSH B + LHLD Do0E24 + XCHG + POP B + LXI H,I$0B60 + PUSH H + LHLD D$0E22 + PCHL +; +I$0B60: RET +; +;-------------------------------- +J$0B61: CALL Co0000 +; + JMP J$0B7E ; Jump around statement +;-------------------------------- +; +C$0B67: MOV L,C + MOV H,B + SHLD Do0E28 + LXI B,I$0013 + PUSH B + LHLD Do0E28 + XCHG + POP B + LXI H,I$0B7D + PUSH H + LHLD D$0E26 + PCHL +; +I$0B7D: RET +; +;-------------------------------- +J$0B7E: CALL Co0000 +; + JMP J$0B9B ; Jump around statement +;-------------------------------- +; +Qo0B84: MOV L,C + MOV H,B + SHLD Do0E2C + LXI B,I$0012 + PUSH B + LHLD Do0E2C + XCHG + POP B + LXI H,I$0B9A + PUSH H + LHLD D$0E2A + PCHL +; +I$0B9A: RET +; +;-------------------------------- +J$0B9B: CALL Co0000 +; + JMP J$0BB8 ; Jump around statement +;-------------------------------- +; +Qo0BA1: MOV L,C + MOV H,B + SHLD Do0E30 + LXI B,I$0011 + PUSH B + LHLD Do0E30 + XCHG + POP B + LXI H,I$0BB7 + PUSH H + LHLD D$0E2E + PCHL +; +I$0BB7: RET +; +;-------------------------------- +J$0BB8: CALL Co0000 +; + JMP J$0BD5 ; Jump around statement +;-------------------------------- +; +Co0BBE: MOV L,C + MOV H,B + SHLD Do0E34 + LXI B,I$0010 + PUSH B + LHLD Do0E34 + XCHG + POP B + LXI H,I$0BD4 + PUSH H + LHLD D$0E32 + PCHL +; +I$0BD4: RET +; +;-------------------------------- +J$0BD5: CALL Co0000 +; + JMP J$0BF2 ; Jump around statement +;-------------------------------- +; +Co0BDB: MOV L,C + MOV H,B + SHLD Do0E38 + LXI B,Io000F + PUSH B + LHLD Do0E38 + XCHG + POP B + LXI H,I$0BF1 + PUSH H + LHLD D$0E36 + PCHL +; +I$0BF1: RET +; +;-------------------------------- +J$0BF2: CALL Co0000 +; + JMP J$0C10 ; Jump around statement +;-------------------------------- +; +Qo0BF8: MOV L,C + MOV H,B + MOV A,L + STA Do0E3C + LXI B,I$000E + PUSH B + LDA Do0E3C + MOV E,A + POP B + LXI H,I$0C0F + PUSH H + LHLD D$0E3A + PCHL +; +I$0C0F: RET +; +;-------------------------------- +J$0C10: CALL Co0000 +; + JMP J$0C27 ; Jump around statement +;-------------------------------- +; +Qo0C16: LXI B,I$000D + PUSH B + LXI D,Co0000 + POP B + LXI H,I$0C26 + PUSH H + LHLD D$0E3D + PCHL +; +I$0C26: RET +; +;-------------------------------- +J$0C27: CALL Co0000 +; + JMP J$0C3E ; Jump around statement +;-------------------------------- +; +Qo0C2D: LXI B,I$000C + PUSH B + LXI D,Co0000 + POP B + LXI H,I$0C3D + PUSH H + LHLD D$0E3F + PCHL +; +I$0C3D: RET +; +;-------------------------------- +J$0C3E: CALL Co0000 +; + JMP J$0C55 ; Jump around statement +;-------------------------------- +; +Qo0C44: LXI B,I$000B + PUSH B + LXI D,Co0000 + POP B + LXI H,I$0C54 + PUSH H + LHLD D$0E41 + PCHL +; +I$0C54: RET +; +;-------------------------------- +J$0C55: CALL Co0000 +; + JMP J$0C72 ; Jump around statement +;-------------------------------- +; +Qo0C5B: MOV L,C + MOV H,B + SHLD Do0E45 + LXI B,Io000A + PUSH B + LHLD Do0E45 + XCHG + POP B + LXI H,I$0C71 + PUSH H + LHLD D$0E43 + PCHL +; +I$0C71: RET +; +;-------------------------------- +J$0C72: CALL Co0000 +; + JMP J$0C8F ; Jump around statement +;-------------------------------- +; +Co0C78: MOV L,C + MOV H,B + SHLD Do0E49 + LXI B,I$0009 + PUSH B + LHLD Do0E49 + XCHG + POP B + LXI H,I$0C8E + PUSH H + LHLD D$0E47 + PCHL +; +I$0C8E: RET +; +;-------------------------------- +J$0C8F: CALL Co0000 +; + JMP J$0CAD ; Jump around statement +;-------------------------------- +; +Qo0C95: MOV L,C + MOV H,B + MOV A,L + STA Do0E4D + LXI B,I$0008 + PUSH B + LDA Do0E4D + MOV E,A + POP B + LXI H,I$0CAC + PUSH H + LHLD D$0E4B + PCHL +; +I$0CAC: RET +; +;-------------------------------- +J$0CAD: CALL Co0000 +; + JMP J$0CC4 ; Jump around statement +;-------------------------------- +; +Qo0CB3: LXI B,I$0007 + PUSH B + LXI D,Co0000 + POP B + LXI H,I$0CC3 + PUSH H + LHLD D$0E4E + PCHL +; +I$0CC3: RET +; +;-------------------------------- +J$0CC4: CALL Co0000 +; + JMP J$0CE2 ; Jump around statement +;-------------------------------- +; +C$0CCA: MOV L,C + MOV H,B + MOV A,L + STA Do0E52 + LXI B,BDOS + PUSH B + LDA Do0E52 + MOV E,A + POP B + LXI H,I$0CE1 + PUSH H + LHLD D$0E50 + PCHL +; +I$0CE1: RET +; +;-------------------------------- +J$0CE2: CALL Co0000 +; + JMP J$0D00 ; Jump around statement +;-------------------------------- +; +C$0CE8: MOV L,C + MOV H,B + MOV A,L + STA Do0E55 + LXI B,Io0004 + PUSH B + LDA Do0E55 + MOV E,A + POP B + LXI H,I$0CFF + PUSH H + LHLD D$0E53 + PCHL +; +I$0CFF: RET +; +;-------------------------------- +J$0D00: CALL Co0000 +; + JMP J$0D17 ; Jump around statement +;-------------------------------- +; +Co0D06: LXI B,Io0003 + PUSH B + LXI D,Co0000 + POP B + LXI H,I$0D16 + PUSH H + LHLD D$0E56 + PCHL +; +I$0D16: RET +; +;-------------------------------- +J$0D17: CALL Co0000 +; + JMP J$0D35 ; Jump around statement +;-------------------------------- +; +Co0D1D: MOV L,C + MOV H,B + MOV A,L + STA Do0E5A + LXI B,I$0002 + PUSH B + LDA Do0E5A + MOV E,A + POP B + LXI H,I$0D34 + PUSH H + LHLD D$0E58 + PCHL +; +I$0D34: RET +; +;-------------------------------- +J$0D35: CALL Co0000 +; + JMP J$0D4C ; Jump around statement +;-------------------------------- +; +C$0D3B: LXI B,Io0001 + PUSH B + LXI D,Co0000 + POP B + LXI H,I$0D4B + PUSH H + LHLD D$0E5B + PCHL +; +I$0D4B: RET +; +;-------------------------------- +J$0D4C: CALL Co0000 ; End of code... +;-------------------------------- +; +Do0D4F: DB 0,0 +Do0D51: DB 0,0 +Do0D53: DB 0,0 +Do0D55: DB 0,0 +Do0D57: DB 0,0 +Do0D59: DB 0,0 +Do0D5B: DB 0,0,0,0 +Do0D5F: DB 0,0 +Do0D61: DB 0,0 +Do0D63: DB 0,0 +Do0D65: DB 0,0 +Do0D67: DB 0,0 +Do0D69: DB 0,0 +Do0D6B: DB 0,0,0,0 +Do0D6F: DB 0,0 +Do0D71: DB 0,0 +Do0D73: DB 0,0 +Do0D75: DB 0,0 +Do0D77: DB 0,0 +Do0D79: DB 0 +Do0D7A: DB 0,0,0 +Do0D7D: DB 0,0 +Do0D7F: DB 0,0 +Do0D81: DB 0,0 +Do0D83: DB 0,0 +Do0D85: DB 0,0 +Do0D87: DB 0,0 +Do0D89: DB 0,0 +Do0D8B: DB 0,0,0,0 +Do0D8F: DB 0,0 +Do0D91: DB 0,0 +Do0D93: DB 0,0 +Do0D95: DB 0,0 +Do0D97: DB 0,0 +Do0D99: DB 0,0,0 +Do0D9C: DB 0,0 +Do0D9E: DB 0,0 +Do0DA0: DB 0,0 +Do0DA2: DB 0,0 +Do0DA4: DB 0,0 +Do0DA6: DB 0,0 +Do0DA8: DB 0,0 +Do0DAA: DB 0,0 +Do0DAC: DB 0,0 +Do0DAE: DB 0,0,0,0 +Do0DB2: DB 0 +Do0DB3: DB 0,0,0,0,0,0,0 +Do0DBA: DB 0,0 +Do0DBC: DB 0,0 +Do0DBE: DB 0,0 +Do0DC0: DB 0,0 +Do0DC2: DB 0,0 +Do0DC4: DB 0,0 +Do0DC6: DB 0,0 +Do0DC8: DB 0,0 +Do0DCA: DB 0,0,0,0,0,0 +Do0DD0: DB 0,0 +Do0DD2: DB 0,0 +Do0DD4: DB 0,0 +Do0DD6: DB 0,0 +Do0DD8: DB 0,0 +Do0DDA: DB 0,0 +Do0DDC: DB 0 +Do0DDD: DB 0 +Do0DDE: DB 0 +Do0DDF: DB 0,0,0,0 +Do0DE3: DB 0 +Do0DE4: DB 0,0 +Do0DE6: DB 0,0 +Do0DE8: DB 0 +Do0DE9: DB 0 +Do0DEA: DB 0 +Do0DEB: DB 0 +Do0DEC: DB 0 +Do0DED: DB 0,0 +Do0DEF: DB 0,0 +Do0DF1: DB 0 +Do0DF2: DB 0,0 +Do0DF4: DB 0,0 +Do0DF6: DB 0,0 +Do0DF8: DB 0,0,0,0,0,0,0 +Do0DFF: DB 0,0 +Do0E01: DB 0,0 +Do0E03: DB 0,0 +Do0E05: DB 0,0 +Do0E07: DB 0,0,0 +Do0E0A: DB 0,0,0,0 +D$0E0E: DCR B + NOP +D$0E10: DCR B + DB 0 +Do0E12: DB 0,0 +D$0E14: DCR B + NOP +D$0E16: DCR B + DB 0 +Do0E18: DB 0,0 +D$0E1A: DCR B + DB 0 +Do0E1C: DB 0,0 +D$0E1E: DCR B + DB 0 +Do0E20: DB 0,0 +D$0E22: DCR B + DB 0 +Do0E24: DB 0,0 +D$0E26: DCR B + DB 0 +Do0E28: DB 0,0 +D$0E2A: DCR B + DB 0 +Do0E2C: DB 0,0 +D$0E2E: DCR B + DB 0 +Do0E30: DB 0,0 +D$0E32: DCR B + DB 0 +Do0E34: DB 0,0 +D$0E36: DCR B + DB 0 +Do0E38: DB 0,0 +D$0E3A: DCR B + DB 0 +Do0E3C: DB 0 +D$0E3D: DCR B + NOP +D$0E3F: DCR B + NOP +D$0E41: DCR B + NOP +D$0E43: DCR B + DB 0 +Do0E45: DB 0,0 +D$0E47: DCR B + DB 0 +Do0E49: DB 0,0 +D$0E4B: DCR B + DB 0 +Do0E4D: DB 0 +D$0E4E: DCR B + NOP +D$0E50: DCR B + DB 0 +Do0E52: DB 0 +D$0E53: DCR B + DB 0 +Do0E55: DB 0 +D$0E56: DCR B + NOP +D$0E58: DCR B + DB 0 +Do0E5A: DB 0 +D$0E5B: DCR B + NOP +; +;-------------------------------- +; + END ; Standard CP/M RELocatable file + \ No newline at end of file diff --git a/SysCon PLMX/IOLIB.REL b/SysCon PLMX/IOLIB.REL new file mode 100644 index 0000000000000000000000000000000000000000..9d7f2cf5276db4d51ab3bf26e12bb2d41d25402b GIT binary patch literal 6784 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 RU`p@nqowZu7Slk%{2vp_C-49O literal 0 HcmV?d00001 diff --git a/SysCon PLMX/MEAN.COM b/SysCon PLMX/MEAN.COM new file mode 100644 index 0000000000000000000000000000000000000000..6d9690528c4705f2ba7e428543a7822756629ecf GIT binary patch literal 1152 zcmcgr!AlfT7=Q2WxVZ{Rnl2K{rb4kwE_e|{cA)~Jh`nhZ%H0Tu?J~!9be@nPNYNp3 z4@D9rK^Pq@7oj@syZAPyXrK-TQF&RLLoOnb1onMzW?bkGXkowa`~BYU&G-A>n;|6l zbrI4XqA4;Eru~tjFty*X7UvA@4bv0E?HZ$Rt-Fy9 zHPV3wYPYf|Yb8eypE}mq)n_Gjo;2i@o>5ois7hC9HlK)W;9cXj_k%NOSC2yXf2w_YWGleF_GOCr48(h1=7QF> zS2QjQE9)IiVu!Yuw`sF*sT4n%_{GE?6Z=fCklPz3zum1JLCAE`n0lylna!_Rah=DF zSot`U=1J_kF~m|t471ceqRKf$=Y6y{is+J$eq2K|>7zN6moPlR@EpS(42u|wDtw}k zFlYE(!}>x>0F#PWtj-ryE(SCb{<=z+I|!)ldoZh4dUFT$E8yo0>m7l?N=D!UJb2Wi zks>&A5i_<{oe|Wlv@;kgRR%+YbxN+g4wqe}@YtxI~+o9f)z@P%kpQ_SMPAgS%ns-tMO4ZpH%z|JR1a;0U z&t8O2F}1y$n2t_NMaP_FEdu|x+VI{3Fz24WV3##FD7ZXAh+WlO+z@vYuJcjriEez= z_)Tlx`L0E9-&;*Ko5@TeIU?1kQ^2du=D9Qv#mf5{BC{n{jx=EPA<;S0Gihx7pZ+I67=ADq9Y|n$;PINV!PtR;q1tOs1J?!# zh8Ya61+H9RIQb*AfkAQs14B0h19yY+8a9Tr3=C`$JdEv52iOlR3}awOYhYl~;bO2l zuz*>I1tiP#Kw$!d2A^2lK_VN{gX9AQp6GTN5RRfu<7#P8>Ue3V4Fi#3dPyhhLzc}as literal 0 HcmV?d00001 diff --git a/SysCon PLMX/MEAN.SRC b/SysCon PLMX/MEAN.SRC new file mode 100644 index 0000000..b583506 --- /dev/null +++ b/SysCon PLMX/MEAN.SRC @@ -0,0 +1,22 @@ +/***********************************************************/ +/* A PROGRAM TO FIND THE MEAN OF THE 10 VALUES OF AN ARRAY */ +/***********************************************************/ + + +MEAN$VAL: +DO; + + DECLARE X (10) BYTE DATA (23,2,18,0,20,14,45,27,8,33); + DECLARE SUM ADDRESS; + DECLARE (MEAN, I) BYTE; + + SUM = 0; + I = 0; + DO WHILE I <= 9; + SUM = SUM + X (I); + I = I + 1; + END; + MEAN = SUM / 10; + +END MEAN$VAL; + \ No newline at end of file diff --git a/SysCon PLMX/PARSER.PLM b/SysCon PLMX/PARSER.PLM new file mode 100644 index 0000000000000000000000000000000000000000..7af27c4828b3f73d08cd6154c54e4caf59a7d31f GIT binary patch literal 20224 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 y``CWfTHcyKYrm3ayk< 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 literal 0 HcmV?d00001 diff --git a/SysCon PLMX/PLMX.SUB b/SysCon PLMX/PLMX.SUB new file mode 100644 index 0000000..77462df --- /dev/null +++ b/SysCon PLMX/PLMX.SUB @@ -0,0 +1,4 @@ +plmx $1 +m80 =$1.mac +l80 $1,rlib,$1/n/e + \ No newline at end of file diff --git a/SysCon PLMX/PLMXUG.TXT b/SysCon PLMX/PLMXUG.TXT new file mode 100644 index 0000000..c9b03be --- /dev/null +++ b/SysCon PLMX/PLMXUG.TXT @@ -0,0 +1,2500 @@ +PLMXUG.WS4 (= PLMX User's Guide) +---------- + +CP/M 1.4 -- PLMX User's Guide, System Consultants, Inc., 1980 + +(Retyped by Emmanuel ROCHE.) + + + PLMX User's Guide + + 8080/8085/Z-80 + (CP/M 1.4) + + PLMX User's Guide, 8080/8085/Z-80 (CP/M) - SCI-PDG-100B + + +Table of Contents +----------------- + +Section +------- + + 1 Introduction + + 2 References + + 3 Creation of Source Files + + 4 Modular Programming + + 5 Invocation of the Compiler + + 6 File Names Used by PLMX + + 7 Error Message Formats + + 8 Error Recovery + + 9 Output of the Compiler + + 10 Linkage of Programs + + 11 Implementation Specifics + + 11.1 RE-ENTRANT Procedures + 11.2 INTERRUPT Attribute + 11.3 Variable Initialization + 11.4 Macro Declarations + 11.5 EXTERNAL and PUBLIC Names + 11.6 Restrictions on Names + 11.7 DO-CASE Restrictions + 11.8 Maximum Nesting Levels + 11.9 Optimization + 11.10 Maximum Parameter List Size + 11.11 INCLUDE Pseudo-operation + 11.12 Size Limits + 11.13 AT Attribute + 11.14 Compile-Time Stack Checking + 11.15 Label Declarations + 11.16 Run-Time Library + + 12 Built-In Procedures and Predeclared Variables + + 12.1 INPUT Procedure + 12.2 LENGTH, LAST, and SIZE Procedures + 12.3 LOW, HIGH, and DOUBLE Procedures + 12.4 ROL and ROR Procedures + 12.5 SHR and SHL Procedures + 12.6 MOVE Procedure + 12.7 TIME Procedure + 12.8 OUTPUT Array + 12.9 MEMORY Array + 12.10 STACKPTR Variable + + 13 Features Involving Hardware Flags + + 13.1 PLUS and MINUS Operators + 13.2 CARRY and ROTATION Procedures + 13.3 DEC Procedure + 13.4 CARRY, SIGN, ZERO, and PARITY procedures + + 14 Producing an Executable Object File + + +Appendix +-------- + + A Command Line and Command Line Switches + + A.1 Command Line + A.2 Command Line Switches + + B Semantic Errors of PLMX + + C System Error Procedure + + D I/O Procedures + + D.1 CP/M system-Level Procedures + D.2 Read and Write Line Procedures + + D.2.1 Procedure READ + D.2.2 Procedure WRITE + + D.3 Disk I/O Procedures + + D.3.1 Procedure DRCHR + D.3.2 Procedure DWCHR + D.3.3 Procedure DRLIN + D.3.4 Procedure DWLIN + D.3.5 Procedure OPENR + D.3.6 Procedure CLOSR + D.3.7 Procedure OPENW + D.3.8 Procedure CLOSW + + D.4 Other Procedures + + D.4.1 Procedure NUMIN + D.4.2 Procedure NMOUT + + E Sample Output + + F IOCLD.SRC Listing + + G PLMX Advertisements + + H ROCHE Addenda + + +Section 1: Introduction +----------------------- + +This document provides guidelines for use of the PLMX compiler on the CP/M +1.4 Operating System. The PLMX language is identical to the Intel PL/M +programming language. Familiarity with PL/M and CP/M is assumed throughout +this document. Detailed descriptions of the PL/M programming language are +found in the publications listed in Section 2. Notational conventions used in +this document are: + + - Anything enclosed in angle brackets < > is a generic name. + + - Anything enclosed in square brackets [] is optional. + + - ::= means "is defined as". + + - | means "or". + +The output of the PLMX compiler must be assembled, linked, and loaded. The +Microsoft M80 Utility Software Package is provided for this purpose. See +Reference 5, Section 2, for the M80 software package documentation. + + +Section 2: References +--------------------- + +The following publications pertain to the PL/M programming language: + + 1. Daniel D. McCracken + "A Guide to PL/M Programming for Microcomputer Applications" + Addison-Wesley, 1978. + +(References in this publication to the ISIS-II Operating System are not +pertinent to PLMX.) + + 2. "PL/M-80 Programming Manual" + Intel Corporation, 3065 Bowers Avenue, Santa Clara, + California 95051, 1976-1977. + +The following publications pertain to the CP/M 1.4 Operating System: + + 3. "An Introduction to CP/M Features and Facilities" + Digital Research, P. 0. Box 579, + Pacific Grove, CA 93950, 1976, 1977, 1978. + + 4. "CP/M Interface Guide" + Digital Research, 1975, 1976. + +The M80 Utility Software Package for use on CP/M Operating Systems is +described in: + + 5. "MICROSOFT Utility Software Manual" + Microsoft, 10800 NE Eighth, Suite 819, + Bellevue, WA 98004, 1978. + + +Section 3: Creation of Source Files +----------------------------------- + +Source files for PLMX may be created using the CP/M ED editor or any editor +which produces ED-compatible text files. + +The source text for PLMX is free format. Spaces, tabs, Carriage-Returns, and +Line-Feeds are ignored, except when within the body of a string literal. +Comments may occur anywhere in the source text, except within reserved words, +identifier names, and numbers. Comments may not be nested. Tabs are assumed to +be at eight-column intervals. + + +Section 4: Modular Programming +------------------------------ + +PLMX is well suited to good programming practices such as modular programming +and structured program design. Modules may be compiled separately and used as +necessary. Several people may work on the same program independently. Data +structures may be designed independently of other modules. Modules and data +structures may be modified easily without affecting the entire program. + +The size of modules which can be compiled with PLMX depends on the size of the +CP/M system. A minimum of 56K of RAM is recommended, although small programs +can be compiled in a 48K system. + +References 1 and 2 contain detailed information on modular programming in +PL/M. + + +Section 5: Invocation of the Compiler +------------------------------------- + +The PLMX compiler disk may be located on any disk drive. The PLMX compiler is +invoked at the command level of CP/M by typing a command line which may take +one of the following forms: + + 1. PLMX x + + 2. PLMX x.y + + 3. PLMX x ; S + + 4. PLMX x.y ; S + +If form 1 is used, the source file is x.SRC and the default switch settings +are in effect. + +If form 2 is used, the source file is x.y and the default switch settings are +in effect. + +If form 3 is used, the source file is x.SRC and the switch settings S are in +effect where they differ from the default switch settings. + +If form 4 is used, the source file is x.y and the switch settings S are in +effect where they differ from the default switch settings. + +Switch S is actually a list of switches, each separated by zero or more +spaces. Individual switches consist of a letter followed immediately by a "+" +or a "-". + +The output file is always stored on the same disk as the source file. The +source file need not be on the same disk as compiler files. + +See Appendix A for a modified BNF description of the command line, examples of +command lines, and the meaning of command line switches. + + +Section 6: File Names Used by PLMX +---------------------------------- + +PLMX creates several temporary files during compilation. If the source file +name is SFNAME.X, the temporary file names will be SFNAME.TOK, SFNAME.RAM, and +SFNAME.ROM. Any existing files of these names will be erased if they are on +the same disk as the source file. + +PLMX produces an assembly language output file, unless that option is turned +off by a command line switch. If the source file name is SFNAME.X, the output +file name will be SFNAME.MAC. Any existing file with this name will also be +erased if it is on the same disk as the source file. + +There is a PLMX compiler patch facility built into the PLMX compiler. A patch +file may be associated with each PLMX compiler file. As each PLMX compiler +file is loaded, the compiler disk is searched for its associated patch file. +If found, it is loaded, and the PLMX compiler file is patched. Patch files +have the names PL.HEX, PP.HEX, PI.HEX, and PF.HEX. If files with these names +exist on the compiler disk, they will be treated as patch files. No files with +these names should be created for use with the PLMX compiler, unless +specifically recommended by SCI. + +Included on the master disk is a file, IOCLD.SRC, containing the external +procedure declaration for all I/O procedures from which the user may choose +for his application. A description of each of the procedures is given in +Appendix D and Digital Research "CP/M 1.4 Interface Guide". + + +Section 7: Error Message Formats +-------------------------------- + +PLMX recognizes syntactic errors in a table-driven manner, and indicates the +approximate location of errors on the console device and/or on the listing. + +Other errors result from semantic restrictions to the language. For example, +variables must be defined before they are used. PLMX handles these errors in a +case-by-case manner, and displays their numbers as shown below in type 4. +Refer to Appendix B for the semantic errors and error numbers. + +Error messages are displayed on the console if the C+ and L+ switches are in +effect. Error messages will be displayed on the printer if the L+ and C- +switches are in effect. + +There are several formats for error messages printed by the PLMX compiler: + + Type 1. Errors detected at the PLMX compiler's executive level are + indicated by messages such as "FILE ERROR", which usually + means a non-existent file. + + Type 2. Low-level syntactic errors are printed as a statement of the + error type, followed by an indication of where the error was + detected. For example: "ILLEGAL CHARACTER ON LINE xxx NEAR + COLUMN yyy". + + Type 3. Other syntactic errors are printed as "ERROR ON LINE xxx NEAR + COLUMN yyy". + + Type 4. Semantic errors are printed as "SEMANTIC ERROR NUMBER nn ON + LINE xxx NEAR COLUMN yyy". + + Type 5. The illegal GOTO error message is printed as "ILLEGAL GOTO ON + LINE xxx". + + Type 6. The system error message is printed as "SYSTEM ERROR AT nnnn". + +For error types 3 and 4, the PLMX compiler will write a list of up to ten +tokens to the console, and terminate in the token which precipitated the +error. Since these tokens represent a reformatting of the internal +representation of the compiled program, the list will not appear as it does in +the source file. In particular, comments are not included, and numeric +constants are all in hexadecimal notations. + +The first ten errors of types 3 and 4 are also flagged in the interleaved +output listing in the following manner: + + IF FLAG THEN X = Y; + A + B = 5; + **************? + FLAG = FALSE; + +A type 6 error message indicates that the PLMX compiler has encountered one of +a general class of conditions from which it cannot recover. See Appendix C for +the procedure to follow in this case. + + +Section 8: Error Recovery +------------------------- + +The PLMX compiler attempts to recover from errors as the errors are +encountered. If possible, the statement in which the error occurred will be +ignored, and the compilation will continue with the following statement. If +recovery from the error is not possible, the compilation will be aborted, and +a message printed to indicate at which phase the compilation was aborted. + + +Section 9: Output of the Compiler +--------------------------------- + +The PLMX compiler produces an assembly language source file as output. The Z- +80 PLMX compiler produces MOSTEK mnemonics. The output file may be edited +before assembling, if fine tuning is required. + +The following pseudo-ops are used in the assembly language file: DB, DW, DS, +ORG, END, CSEG, ASEG, DSEG, and "$", which has the same meaning as defined by +the Microsoft M80 Assembler. + +The output includes simple expressions involving the operators "+" and "-". +The operands are hexadecimal constants or "$". The hexadecimal constants +consist of up to four hexadecimal digits preceded by a zero and followed by +the letter "H". + +The PLMX compiler will also produce a listing if the "L" switch is set to "+". +If the "I" switch is set to "+" (the default state), the listing will be an +assembly language listing with PLMX source statements interleaved as comments. +If the "I" switch is set to "-", the listing will be a source file listing +with line numbers added, and will include the text of included files. + +The "C" switch affects the destination of the listing. If the "C" switch is +set to "-" (the default state), the listing will go to the printer. If set to +"+", the listing will go to the console. See Appendix A.2 for further +definition of command line switches. See Appendix E for a sample output file. + + +Section 10: Linkage of Programs +------------------------------- + +Assembly language programs may be linked to programs compiled by PLMX. It is +possible to call assembly language procedures from a PLMX program and, +likewise, to call PLMX procedures from assembly language programs. + +Parameters are passed to procedures as follows: + + 1. One-parameter case: + + a. A BYTE parameter is passed in register C. + + b. An ADDRESS parameter is passed in register pair BC, with the high- + order byte in register B. + + 2. Two-parameter case: + + a. The first parameter is passed as described in 1 above. + + b. The second parameter is passed in register E if it is a BYTE parameter + and in register pair DE if it is an ADDRESS parameter, with the high- + order byte in register D. + + 3. More-than-two-parameter case: + + a. The last parameter is passed in register pair DE. + + b. The next-to-last parameter is passed in register pair BC. + + c. The remaining parameters are passed on the stack, with the first + parameter being PUSHed first. + + d. When extracting parameters from the stack, remember that the return + address will be on the top of the stack, then the parameters. + +Parameters are returned from function procedures in the following manner: + + 1. A BYTE procedure returns its parameters in register A. + + 2. An ADDRESS procedure returns its result in register pair HL, with the + high-order byte in register H. + + +Section 11: Implementation Specifics +------------------------------------ + +This section presents aspects of PLMX which differ from the Intel PL/M-80 +compiler. Some items are specific to this release version. + + +11.1 RE-ENTRANT Procedures +-------------------------- + +This version of PLMX does not implement the translation of RE-ENTRANT +procedures. Although this feature will be included in a future release, the +programmer should be aware that procedure linkages and data references within +such a procedure are extremely space and time inefficient. Furthermore, a +time- and I/O-independent algorithm can always be restructured in a non- +recursive manner. The run-time routines are all re-entrant, so that the user +may easily create a multiprogramming environment. + + +11.2 INTERRUPT Attribute +------------------------ + +This version of PLMX does not implement the INTERRUPT attribute of procedures +because of the many ways in which interrupts can be serviced. Since the +assembly language output of the PLMX compiler is available to the programmer, +and PLMX allows linkage to assembly language routines, interrupt procedures +can be specified for many types of architectures. + + +11.3 Variable Initialization +---------------------------- + +When the programmer uses text strings to initialize variables in a factored +variable declaration, he should be aware that, if the string is longer than +the datum currently being initialized, the rest of the string will be lost. +For instance: + + DECLARE (A, B) (5) BYTE INITIAL ('123456789'); + +would initialize A to '12345' but would leave B un-initialized. The following +declaration should be used to initialize B also: + + DECLARE (A, B) (5) BYTE INITIAL ('12345', '6789'); + + +11.4 Macro Declarations +----------------------- + +Macro declarations may be nested. For instance: + + DECLARE CHI BYTE; + DECLARE OMEGA LITERALLY 'LITERALLY ''IF CHI''; + DECLARE OMICRON OMEGA; + OMICRON THEN DO; + ---- + ---- + ---- + END; + + +11.5 EXTERNAL and PUBLIC Names +------------------------------ + +All identifiers declared to be PUBLIC or EXTERNAL, and all module names, will +be truncated to five letters, and used by the PLMX compiler in that form. +Thus, the user should ensure that these identifiers are unique in the first +five letters. + + +11.6 Restrictions on Names +-------------------------- + +Compiler-generated names may occasionally conflict with names declared to be +PUBLIC or EXTERNAL. A complete list of names which the PLMX compiler may +generate follows: + + 1. The letter A, T, L, or G, followed by four hexadecimal digits. + For example: G0004. + + 2. Names of the form BPnn@, where n is a decimal digit. One or more of + these names will be created upon reference to a built-in procedure or + predeclared variable. + + 3. Any of the following names: + + INIT@ EXIT@ AAAAA@ AAAAB@ SCAT@ + + 4. Names reserved for I/O procedures. See Appendix D. + +Do not use global identifier names which conflict with register names of the +target microprocessor, because the output of PLMX must be assembled. + + +11.7 DO-CASE Restrictions +------------------------- + +There may not be more than 32,767 branches on a DO-CASE statement. + +If a conditional statement is used as a unit of a DO-CASE block, it must be +bracketed by a DO-BLOCK of some sort. For example: + + DO CASE J: + X=Y; + DO; + IF P=Q THEN J=F; + END; + END; + + +11.8 Maximum Nesting Levels +--------------------------- + +DO blocks may be nested to 32 levels. Conditional statements may be nested to +32 levels. + + +11.9 Optimization +----------------- + +This version of PLMX performs peephole optimization, constant folding, and +temporary minimization by default. Other types of optimization will be +implemented in a future release. + + +11.10 Maximum Parameter List Size +--------------------------------- + +A procedure declaration may have up to 11 formal parameters. + + +11.11 INCLUDE Pseudo-Operation +------------------------------ + +This version implements only the INCLUDE pseudo-operation. Other pseudo- +operations may be implemented in future releases. The INCLUDE pseudo-op must +occur on a line by itself, and consists of five elements: + + - "$" in column 1 + + - The word "INCLUDE" + + - A left parenthesis "(" + + - A CP/M file name, with default type of SRC + + - A right parenthesis ")" + +There may be zero or more spaces between each of the five items. The nesting +of INCLUDE files is limited to 4, counting the main file as one level. + +The INCLUDE pseudo-op can be placed on any line in the user program, and will +be recognized. + + +11.12 Size Limits +----------------- + +String constants are limited to 255 characters. The input line is limited to +80 characters. + + +11.13 AT Attribute +------------------ + +If the programmer uses the AT attribute with the DATA form of initialization, +the restricted expression following AT must refer to a previous declaration +with a DATA initialization. The reason for this restriction is that the word +DATA implies that the datum is to be placed with the executable code in its +SECTION, instead of in the SECTION where variables are usually placed. Not +adhering to this restriction would mean that the PLMX compiler will try to +overlay a RAM datum with a ROM datum, which is an obviously illogical +condition. + +The AT attribute should never be used with the dot operator and an externally +declared variable. Some assemblers (including Microsoft's M80) cannot resolve +that condition. Based variables can be used to overlay one variable on +another. + + +11.14 Compile-Time Stack Checking +--------------------------------- + +There is no compile-time checking for stack overflow in PLMX, and there is no +PLMX compiler option to change the size of the stack. The Stack Pointer is +initially set to the top of the Temporary Program Area (TPA). To modify or +examine the Stack Pointer, use the pseudo-variable or built-in variable +STACKPTR. + + +11.15 Label Declarations +------------------------ + +Labels with no attributes need not be declared. Factored label declarations +are not recognized in this version. They must be declared individually. + + +11.16 Run-Time Library +---------------------- + +The run-time library provides code for all operators and byte/address +combinations, built-in procedures, and procedures using hardware flags. The +source code for the run-time library is available from SCI. It enables the +user to substitute or add to these routines, as desired. The following +routines are included in the library: + + a. Operations + ---------- + (Byte/Byte, 2-Byte/Byte, Byte/2-Byte, and 2-Byte/2-Byte cases) + + ADD SUBTRACT + OR EQUAL + AND LESS THAN + XOR GREATER THAN + MOD DIVIDE + LESS THAN OR EQUAL MULTIPLY + GREATER THAN OR EQUAL NOT EQUAL + + b. Built-In Procedures: + + Procedure Type + --------- ---- + ROL Byte + ROR Byte + SHL Byte/2-Byte + SHR Byte/2-Byte + MOVE Byte + TIME Byte + + c. Procedures Utilizing Hardware Flags: + + Procedure Type + --------- ---- + PLUS (Same as Operations) + MINUS (Same as Operations) + SCL Byte/2-Byte + SCR Byte/2-Byte + DEC Byte + +The register usage for interfacing with the library is: + + a. Operations + ---------- + + (1) 2-Byte/2-Byte case: + + Parameters located in DE and HL. + + (2) 2-Byte/Byte case: + + Byte parameters in A, 2-Byte parameters located located in HL. + + (3) Byte/Byte case: + + Parameters located in A and L. + + b. Built-In Procedures and Flag Procedures + --------------------------------------- + + Register usage for built-in procedures follow the convention described + in Section 10. Consider the MOVE procedure, for example: + + (1) Last parameter (DESTINATION) in DE + (2) Next-to-last parameter (SOURCE) in BC + (3) Remaining parameter (COUNT) on stack + + +Section 12: Built-in Procedures and Predeclared Variables +--------------------------------------------------------- + +Built-in procedures and predeclared variables need not be declared. If, +however, the identifier of a built-in procedure or predeclared variable is +used in a declaration within the program, the scope of the predeclared +variable or built-in procedure is interrupted by the scope of the declaration +in the program. This distinguishes these identifiers from reserved words, +which cannot be used as identifiers in declarations. + +The built-in procedures provided by PLMX are: + + INPUT DOUBLE + LENGTH ROL + LAST ROR + SIZE MOVE + LOW TIME + HIGH + +The predeclared variables are: + + OUTPUT + STACKPTR + +A detailed description of these procedures and variables is given in the +"PL/M-80 Programming Manual" (Reference 2). Only those which are not fully +described in Reference 1 are described here. + + +12.1 INPUT Procedure +-------------------- + +INPUT is a BYTE procedure. It is called by a function reference with the form: +INPUT (numeric *constant*). It must appear on the right side of an assignment +statement. The constant must be in the range 0 to 255 to specify one of the +256 input ports of the 8080 or Z-80 CPU. The value returned by INPUT is the +BYTE quantity latched into the specified input port. + + +12.2 LENGTH, LAST, and SIZE Procedures +-------------------------------------- + +(See Reference 1 or 2.) + + +12.3 LOW, HIGH, and DOUBLE Procedures +------------------------------------- + +Two built-in BYTE procedures convert ADDRESS values to BYTE values. Calls to +these procedures are function references with the forms: + + LOW (expression) + HIGH (expression) + +If the expression has an ADDRESS value, LOW returns the low-order (least +significant) byte of the value, whereas HIGH returns the high-order (most +significant) byte of the value. If the expression has a BYTE value, LOW will +return this value unchanged. HIGH will return zero. + +The address procedure DOUBLE converts a BYTE value to an ADDRESS value. A call +to DOUBLE is a function reference with the form: + + DOUBLE (expression) + +If the expression has a BYTE value, the procedure appends 8 high-order zeros +to convert it to an ADDRESS value, and returns this ADDRESS value. If the +expression has an ADDRESS value, the procedure returns this value unchanged. + +There is no uniformity among microprocessors regarding which is the most +significant byte and which is the least significant byte of an ADDRESS +identifier. For this reason, the use of the HIGH and LOW procedures may be +more useful than shift procedures for extraction of bytes of an ADDRESS +identifier. Source code will then be microprocessor-independent. + + +12.4 ROL and ROR Procedures +--------------------------- + +ROL and ROR are BYTE rotation procedures. Bits are moved off one end and moved +onto the other end. They are called by function references with the forms: + + ROL (pattern, count) + ROR (pattern, count) + +where "pattern" and "count" are both expressions. The values of these +expressions are converted, if necessary, to BYTE values. The first parameter +is handled as an 8-bit pattern which is rotated to the left (by ROL) or to the +right (by ROR). The bit count is given by the second parameter. If the value +of this expression is 0, the result is undefined. The following are examples +of the action of these procedures: + + ROR (10011101B, 1) returns a value of 11001110B + ROL (10011101B, 2) returns a value of 01110110B + + +12.5 SHR and SHL Procedures +--------------------------- + +These procedures shift bits off one end of the pattern and zeros move into the +pattern from the other end. The procedure type depends on the value of the +expression given as the actual parameter. (See Reference 1 or 2). + + +12.6 MOVE Procedure +------------------- + +The untyped procedure MOVE is used to transfer a set of contiguous bytes of +information from one location in memory to another. The form of the call is: + + CALL MOVE (count, source, destination) + +where "count", "source", and "destination" are expressions which, if +necessary, are converted to ADDRESS values. The source parameter is the memory +address to which this type is to be moved. Subsequent bytes are taken from +subsequent addresses following source, and moved to subsequent addresses +following destination. + + +12.7 TIME Procedure +------------------- + +(See Reference 1 or 2). + + +12.8 OUTPUT Array +----------------- + +This, and the remaining two items of this section, are predeclared variables. + +Each element corresponds to one of the 256 output ports of the 8080 CPU. + +A reference to OUTPUT must always be subscripted with a numeric constant in +the range 0 to 255, and may only appear as the left part of an assignment +statement or embedded assignment. (Anywhere else it is illegal.) The effect of +such an assignment is to latch the BYTE value of the expression on the right +side of the assignment into the specified output port. Since OUTPUT is a BYTE +array, the value of the expression will be automatically converted to type +BYTE, if necessary. + + +12.9 MEMORY Array +----------------- + +The PL/M-80 MEMORY array is not implemented. However, a memory management +suite of subroutines will be available from SCI. + + +12.10 STACKPTR Variable +----------------------- + +STACKPTR is a predeclared ADDRESS variable which provides access to the +Stack Pointer register. The current value of the Stack Pointer register will +be returned when STACKPTR is used on the right side of an assignment. For +example: + + R = STACKPTR + +Cautious use of STACKPTR on the left side of an assignment is recommended, +since taking control of the stack can confuse compile-time checks. The +Stack Pointer register will be set to the value provided. For example: + + STACKPTR = .STACK (LENGTH (STACK)) + + +Section 13: Features Involving Hardware Flags +--------------------------------------------- + +The PLMX features described in this section make use of hardware flags. The +programmer should use them with caution, however, since the exact sequence of +machine code produced from a sequence of PLMX source statements cannot be +predicted accurately. This uncertainty is caused by PLMX compiler optimization +of machine code. In addition, the setting and clearing of hardware flags vary +among microprocessors. + + +13.1 PLUS and MINUS Operators +----------------------------- + +The operators PLUS and MINUS perform similarly to + and - arithmetic +operators, and have the same precedence. However, they utilize the current +setting of the 8080 CPU hardware CARRY flag to perform the operation. + + +13.2 CARRY and ROTATION Procedures +---------------------------------- + +SCL and SCR are built-in procedures whose type depends on the parameter type. +They also utilize the current setting of the 8080 CPU hardware CARRY flag. +They are called by function references with the forms: + + SCL (pattern, count) + SCR (pattern, count) + +where "pattern" and "count" are both expressions. The value of count will be +converted, if necessary, to a BYTE quantity. If the value of count is zero, +the result is undefined. The value of the pattern may be either a BYTE value +or an ADDRESS value, and will not be converted. If it is a BYTE value, the +procedure will return a BYTE value. If it is an ADDRESS value, the procedure +will return an ADDRESS value. + +The value of the first parameter (pattern) is rotated left (by SCL) or right +(by SCR). The bit count is given by the second parameter (count). The rotation +includes the CARRY flag: the bit rotated off one end of the argument is +rotated into CARRY, and the old value of CARRY is rotated into the other end +of the argument. In effect, SCL and SCR perform 9-bit rotations on 8-bit +values, and 17-bit rotations on 16-bit values. + + +13.3 DEC Procedure +------------------ + +DEC is a built-in BYTE procedure which uses the value of the hardware CARRY +flag internally. It is called by a function reference with the form: + + DEC (expression) + +where the value of the expression will be converted, if necessary, to a BYTE +value. This procedure performs a decimal adjust operation on the actual +parameter value, and returns the result. + + +13.4 CARRY, SIGN, ZERO, and PARITY Procedures +--------------------------------------------- + +There are four built-in procedures that return the logical values of the +hardware flags. These procedures take no parameters, and are called by +function references with the forms: + + CARRY + ZERO + SIGN + PARITY + +The occurrence of one of these calls in an expression initiates a test of the +corresponding condition flag. If the flag is set (= 1), a value of 0FFH is +returned. If the flag is clear (= 0), a value of 00H is returned. + + +Section 14: Producing an Executable Object File +----------------------------------------------- + +PLMX produces an assembly language source file as its output. Refer to section +5 for the name of the output file. To produce an executable object file, the +output file must be assembled with MACRO-80, linked with all other relevant, +relocatable object files by LINK-80, and the linked program saved to disk, +either by LINK-80 or the CP/M 1.4 SAVE command. RLIB will almost always need +to be linked, and IOLIB will be required if any of its procedures are used. +IOLIB should precede RLIB when they are linked. Because RLIB and IOLIB are +libraries, the /S switch should be used with them, to search for and link only +those procedures which are required. The link program is then run by typing +its name. + +See reference 5 for details of the syntax and use of the Microsoft MACRO-80 +relocatable macro assembler, LINK-80 linker, LIB-80 library manager, and CREF- +80 cross-reference facility. + + +Appendix A: Command Line and Command Line Switches +-------------------------------------------------- + +A.1 Command Line +---------------- + +The PLMX command line, using an extended BNF notation, is as follows: + + PLMX [[]]CR + +where: + + ::= [.] + ::= ; + ::= + + + ::= A|L|I|M|O|C|S|F + ::= +|- + +Examples of valid PLMX command lines are: + + PLMX MYFILE ; M+L + + PLMX MYFILE.SRC; A- C+ + + PLMX YOURFILE; + + PLMX YOURFILE + +Examples of invalid PLMX command lines are: + + PLMXMYFILE + + PLMX MYFILE; +I + + PLMX ; M+L- + + +A.2 Command Line Switches +------------------------- + +Command line switches have the following meanings: + +Switch State Default Meaning +------ ----- ------- ------- + A + + Generate an assembly language file on the diskette on + which the source file resides. + + - Do not generate an assembly language file. + + L + + Generate a listing. Send it and error information to + the LST: device if the C switch is in its default + state; otherwise, send the listing to the CON: device. + + - Do not generate a listing. + + I + + Interleave source statements and assembly language + statements in the listing. + + - Print source statements only. + + M + - Make this module a Main Program module (see Ref 1, p. + 225). + + - Do not make this module a Main Program module. + + O + + Optimize assembly language output, i.e., register + analysis and peephole optimization. + + - Do not optimize. + + S + + Optimize for minimum space, i.e., replace in-line code + with CALLs whenever possible. + + - Optimize for speed, i.e., do not use CALLs. + + C + - Send the listing to the CON: device. + + - Send the listing to the LST: device. + + F + - Perform a "fast" compilation. Check for syntax errors, + but do not optimize or produce an output file. + + - Perform a normal compilation. + + +If no CP/M file type is supplied, the default is "SRC". This applies to +included files as well. The absence of a compilation switch means that the +default condition is in effect for the duration of the compilation. + + +Appendix B: Semantic Errors of PLMX +----------------------------------- + +Error Meaning +----- ------- + 1 An EXTERNAL or PUBLIC factored label declaration which is not at the + outermost level. + + 2 An EXTERNAL or PUBLIC unfactored label declaration which is not at the + outermost level. + + 3 An implicit dimension without an initialization. + + 4 A PUBLIC or EXTERNAL variable is declared to be BASED. + + 5 An undefined base specifier in a declaration. The base specifier + should be or .. + + 6 An EXTERNAL or PUBLIC variable declaration which is not at the + outermost level. + + 7 The first in a restricted reference is undefined in a + declaration. + + 8 An undefined restricted reference in a declaration. + + 9 A declaration has a reference to an undefined name in a locator. + + 10 A declaration has a reference to an EXTERNAL name in a locator. + + 11 A variable declaration with a locator is declared EXTERNAL. + + 12 Array declaration error. + + 13 An EXTERNAL procedure is not declared at the outermost level. + + 14 There are undeclared formal parameters in a procedure declaration. + + 15 There is an undefined name in a procedure call. + + 16 There is an illegal argument to LENGTH, LAST, or SIZE built-in + procedures. + + 17 There is an undefined name in a procedure call. + + 18 The number of formal parameters does not match the number of real + parameters in a procedure call. + + 19 The same as 16. + + 20 A RETURN statement without an argument is encountered outside of a + procedure. + + 21 There is no argument to a RETURN statement within a typed procedure. + + 22 A RETURN statement with an argument is outside of a procedure. + + 23 A RETURN statement with an argument is in an untyped procedure. + + 24 The name following an END statement is not the same as the name + preceding the DO statement. + + 25 An undefined function reference (without parameters). + + 26 A procedure referenced in a function call (without parameters) is not + typed. + + 27 System error. + + 28 An undefined function reference (with parameters). + + 29 The procedure referenced in a function call (with parameters) is not + typed. + + 30 System error. + + 31 The number of formal parameters does not match the number of real + parameters in a function call. + + 32 The same as 16. + + 33 An undefined subscripted structure reference. + + 34 An undefined unsubscripted structure reference. + + 35 An undefined subscripted variable reference. + + 36 A function reference having one real parameter references a procedure + which is untyped. + + 37 The same as 16. + + 38 An undefined unsubscripted variable reference. + + 39 An undefined simple variable in the index part of an iterative DO + statement. + + 40 An EXTERNAL variable occurs in an INITIAL statement. + + 41 A BASED variable occurs in an INITIAL statement. + + 42 An undefined structure reference occurs in a BASED variable + declaration. + + 43 An undefined structure reference. + + 44 An undefined procedure or function reference with parameters. + + 45 The argument to the INPUT function is not an integer. + + 46 The argument to the OUTPUT array is not an integer. + + 47 A variable or macro is defined twice at the same nesting level. + + 48 A procedure is defined twice at the same nesting level. + + 49 A function which requires more than one argument has been called with + one argument. + + 50 A function reference appears on the left-hand side of an assignment + statement. + + +Appendix C: System Error Procedure +---------------------------------- + +If a system error message is printed by the PLMX compiler, the following steps +should be taken. Review your source program for illegal syntax which may have +escaped diagnostic detection. If the source program is syntactically correct, +send a letter to SCI describing the circumstances under which the system error +was encountered. Include with the letter a listing of the program which was +being compiled when the system error occurred and, if possible, send a disk +with the source file of the program which was being compiled. + +If a PLMX compiler error is found, SCI will return an updated PLMX compiler in +accordance with our warranty. + + +Appendix D: I/O Procedures +-------------------------- + +A library of I/O procedures is supplied with the PLMX compiler. These external +procedures provide a link to the Basic I/O Facilities and Disk Access +Primitives of CP/M 1.4. Additionally, there are procedures to do line-oriented +I/O to non-disk peripherals, procedures to do character- and line-oriented I/O +to the disk, and utility routines to convert numbers between ASCII and binary +representations. + + +D.1 CP/M System-Level Procedures +-------------------------------- + +All of the CP/M 1.4 basic I/O facilities and disk access primitives are +provided, with the exception of the Interrogate Allocation primitive. The +procedures are presented below by CP/M function number. In the typical call +examples, "A" is an ADDRESS variable and "B" is a BYTE variable. See reference +4 for descriptions of the entry parameters and returned values. + +CP/M Function Number Typical Call +-------------------- ------------ + 0 ---- + 1 B = RD$CON; + 2 CALL WR$CON (B); + 3 B = RD$RDR; + 4 CALL PUNCH (B); + 5 CALL PRINT (B); + 6 ---- + 7 B = G$STAT; + 8 CALL S$STAT (B); + 9 CALL PR$BUF (A); + 10 CALL RD$BUF (A); + 11 B = CN$RDY; + 12 CALL LFT$HD; + 13 CALL INIT; + 14 CALL LOGIN (B); + 15 B = OPEN (A); + 16 B = CLOSE (A); + 17 B = SRCH (A); + 18 B = SR$NXT (A); + 19 CALL DLETE (A); + 20 B = RD$DSK (A); + 21 B = WR$DSK (A); + 22 B = MAKE (A); + 23 B = RNAME (A); + 24 B = LG$VEC; + 25 B = DRIVE; + 26 CALL STDMA (A); + + +D.2 Read and Write Line Procedures +---------------------------------- + +Two procedures are provided for reading and writing lines for non-disk +devices. All arguments to both procedures are ADDRESS parameters. + + +D.2.1 Procedure READ +-------------------- + +This procedure reads a line of characters. + +Arguments are: + + 1. Function: + 0 means read from the CON: device; + 1 means read from the RDR: device. + + 2. Destination buffer address. + + 3. Maximum number of bytes to read. + + 4. Address of the actual number of bytes read. + + 5. Address of the status word. + +The status returned is 00H if no error occurred, and 0FFH if an illegal +function number was given or an error occurred. Procedure READ stops reading +when either of two conditions is met: + + 1. The number of characters read equals the number specified by argument + 3. + + 2. A Carriage-Return is read. In this case, the Carriage-Return and a + Line-Feed are placed in the read buffer, and a Line-Feed is echoed if + the function number is 0. + +Procedure READ does not check for destination buffer overflow. + +The following is an example of the declaration and use of procedure READ: + + READ: + PROCEDURE (FUNCTION, BUFFER, COUNT, ACTUAL, STATUS) EXTERNAL; + DECLARE (FUNCTION, BUFFER, COUNT, ACTUAL, STATUS) ADDRESS; + END READ; + + DECLARE STRING (128) BYTE; + DECLARE (COUNT, STATUS) ADDRESS; + + ---- + ---- + + CALL READ (0, .STRING, 128, .COUNT, .STATUS); + + +D.2.2 Procedure WRITE +--------------------- + +This procedure writes a line of characters. + +Arguments are: + + 1. Function: + 0 means write to the CON: device; + 1 means write to the LST: device; + 2 means write to the PUN: device. + + 2. Source buffer address. + + 3. Number of bytes to write. + + 4. Address of the status word. + +The following is an example of the declaration and use of procedure WRITE: + + WRITE: + PROCEDURE (FUNCTION, BUFFER, COUNT, STATUS) EXTERNAL; + DECLARE (FUNCTION, BUFFER, COUNT, STATUS) ADDRESS; + END WRITE; + + DECLARE BUFFER (128) BYTE; + DECLARE STATUS ADDRESS; + + ---- + ---- + + CALL WRITE (0, .BUFFER, 2, .STATUS); + + +D.3 Disk I/O Procedures +----------------------- + +Disk I/O procedures are provided for character-oriented reading and writing, +line-oriented reading and writing, file opening, and file closing. + +There are several arguments which are common to the disk I/O procedures and +which are required by CP/M. All the procedures in this section require the +address of the File Control Block. The FCB address must be initialized in a +declaration. Examples are provided with each procedure in this section. See +section 3.2 of reference 4 for more information on the File Control Block. + +Another argument required by most of the procedures in this section is the +address of the DMA buffer. The DMA buffer is a BYTE array of 128 bytes used by +the CP/M disk access primitives for transferring a sector at a time from and +to disk. Examples of the declaration of the DMA buffer occur with each +procedure in this section which requires it as an argument. + +A third argument common to many of the procedures in this section is the +number of bytes remaining in the DMA buffer. This variable is maintained by +the procedures in this section, and should never be altered by user programs. + +A fourth argument common to all these procedures in this section is the +address of the status word. The status word is an output parameter which +should be tested after a procedure is CALLed. The information returned in this +status word is described with each procedure. + +All the arguments of the procedures in this section are ADDRESS parameters. +Parameters whose addresses are passed must be the same type as shown in the +examples associated with each function below. In argument descriptions, the +term "word" refers to an ADDRESS identifier. + + +D.3.1 Procedure DRCHR +--------------------- + +This procedure reads a character from a disk file. The first CALL to DRCHR +must be preceded by a CALL to procedure OPENR (see D.3.5). The last CALL to +DRCHR must be followed by a CALL to procedure CLOSR (see D.3.6). + +Arguments are: + + 1. File Control Block address. + + 2. CP/M DMA buffer address. + + 3. Address of the number of bytes in the DMA buffer. + + 4. Address at which the byte is to be stored. + + 5. Address of the status word. + +The character is returned to the address specified in argument 4. If the end- +of-file (EOF) is encountered, a Control-Z (1AH) is returned. The status +returned is 00H if no error occurred and the EOF was not encountered; 01H if +no error occurred and the EOF was encountered; and 0FFH if an error occurred. +The message "READ ERROR" is printed at the console if an error occurred. + +The following is an example of the declaration and use of procedure DRCHR: + + DRCHR: + PROCEDURE (FCB, SECTOR$BUFFER, SECTOR$COUNT, CHAR, STATUS) EXTERNAL; + DECLARE (FCB, SECTOR$BUFFER, SECTOR$COUNT, CHAR, STATUS) ADDRESS; + END DRCHR; + + DECLARE (SCNT, DSTAT) ADDRESS; + DECLARE RFCB (33) BYTE INITIAL (0, 'INDEXS ', 'TXT') ; + DECLARE SBUFF (128) BYTE; + DECLARE CHR BYTE; + + ---- + ---- + + CALL DRCHR (.RFCB, .SBUFF, .SCNT, .CHR, .DSTAT); + + +D.3.2 Procedure DWCHR +--------------------- + +This procedure writes a byte to a disk file. The first CALL to DWCHR must be +preceded by a CALL to procedure OPENW (see D.3.7). The last CALL to DWCHR must +be followed by a CALL to procedure CLOSW (see D.3.8) or the last sector will +not be written to disk. + +Arguments are: + + 1. File Control Block address. + + 2. CP/M DMA buffer address. + + 3. Address of the number of bytes in the DMA buffer. + + 4. Address at which the byte to be written is stored. + + 5. Address of the status word. + +The status returned is 00H if no error occurred, or 0FFH if a write error +occurred. The message "WRITE ERROR" is printed at the console if a write error +occurred. + +The following is an example of the declaration and use of procedure DWCHR: + + DWCHR: + PROCEDURE (FCB, SECTOR$BUFFER, SECTOR$COUNT, CHAR, STATUS) EXTERNAL; + DECLARE (FCB, SECTOR$BUFFER, SECTOR$COUNT, CHAR, STATUS) ADDRESS; + END DWCHR; + + DECLARE (SCNT, DSTAT) ADDRESS; + DECLARE WFCB (33) BYTE INITIAL (0, 'OUTFILE ', 'TXT'); + DECLARE SBUFF (128) BYTE; + DECLARE CHR BYTE; + + ---- + ---- + + CALL DWCHR (.WFCB, .SBUFF, .SCNT, .CHR, .DSTAT); + + +D.3.3 Procedure DRLIN +--------------------- + +This procedure reads a line from the disk. The first CALL to DRLIN must be +preceded by a CALL to OPENR (see D.3.5). The last CALL to DRLIN must be +followed by a CALL to CLOSR (see D.3.6). + +Arguments are: + + 1. File Control Block address. + + 2. CP/M DMA buffer address. + + 3. Address of the number of bytes in the DMA buffer. + + 4. Address of the buffer into which the line is to be placed. + + 5. Address of the count of bytes transferred to the input buffer. + + 6. Address of the status word. + +Characters are transferred from the disk file to the input buffer until a +Line-Feed is encountered. No check is made for input buffer overflow. The +status returned is the same as for procedure DRCHR. Procedure DRLIN prints the +message "READ ERROR" at the console if an error occurs. + +The following is an example of the declaration and use of procedure DRLIN: + + DRLIN: + PROCEDURE (FCB, SECTOR$BUFFER, SECTOR$COUNT, BUFFER, COUNT, + STATUS) EXTERNAL; + DECLARE (FCB, SECTOR$BUFFER, SECTOR$COUNT, BUFFER, COUNT, + STATUS) ADDRESS; + END DRLIN; + + DECLARE RFCB (33) BYTE INITIAL (0, 'INDEXS ', 'TXT'); + DECLARE (SBUFF, TEXT) (128) BYTE; + DECLARE (SCNT, COUNT, DSTAT) ADDRESS; + + ---- + ---- + + CALL DRLIN (.RFCB, .SBUFF, .SCNT, .TEXT., .COUNT, .DSTAT); + + +D.3.4 Procedure DWLIN +--------------------- + +This procedure writes a line to a disk file. The first CALL to procedure DWLIN +must be preceded by a CALL to procedure OPENW (see D.3.6). The last CALL to +procedure DWLIN must be followed by a CALL to procedure CLOSW (see D.3.7) or +the last sector will not be written to disk. + +Arguments are: + + 1. File Control Block address. + + 2. CP/M DMA buffer address. + + 3. Address of the number of bytes in the DMA buffer. + + 4. Address of the buffer from which the line is to be taken. + + 5. Count of bytes to be written to the disk file. + + 6. Address of the status word. + +The status returned and the error message printed at the console are the same +as for procedure DWCHR (see D.3.2). + +The following is an example of the declaration and use of procedure DWLIN: + + DWLIN: + PROCEDURE (FCB, SECTOR$BUFFER, SECTOR$COUNT, BUFFER, COUNT, + STATUS) EXTERNAL; + DECLARE (FCB, SECTOR$BUFFER, SECTOR$COUNT, BUFFER, COUNT, + STATUS) ADDRESS; + END DWLIN; + + DECLARE WFCB (33) BYTE INITIAL (0, 'QFILE ', 'XY '); + DECLARE (SBUFF, TEXT) (128) BYTE; + DECLARE (SCNT, COUNT, DSTAT) ADDRESS; + + ---- + ---- + + CALL DWLIN (.WFCB, .SBUFF, .SCNT, .TEXT., .COUNT, .DSTAT); + + +D.3.5 Procedure OPENR +--------------------- + +This procedure opens a disk file for reading. Procedure OPENR initializes the +last 21 bytes of the File Control Block to zeroes, and initializes the count +of bytes in the DMA buffer to 0. This procedure does not read the first sector +into the DMA buffer. + +Arguments are: + + 1. File Control Block address. + + 2. Address of the number of bytes in the CP/M DMA buffer. + + 3. Address of the status word. + +The following is an example of the declaration and use of procedure OPENR: + + OPENR: + PROCEDURE (FCB, SECTOR$COUNT, STATUS) EXTERNAL; + DECLARE (FCB, SECTOR$COUNT, STATUS) ADDRESS; + END OPENR; + + DECLARE RFCB (33) BYTE INITIAL (0, 'INDEXS ', 'TXT'); + DECLARE (SCNT, DSTAT) ADDRESS; + + ---- + ---- + + CALL OPENR (.RFCB, .SCNT, .DSTAT); + + +D.3.6 Procedure CLOSR +--------------------- + +This procedure closes a file used for disk reading. A file must be closed if +it is to be re-read. The file is closed and a status of 00H is returned if no +error occurred; otherwise, a status of 0FFH is returned. + +Arguments are: + + 1. File Control Block address. + + 2. Address of the status word. + +The following is an example of the declaration and use of procedure CLOSR: + + CLOSR: + PROCEDURE (FCB, STATUS) EXTERNAL; + DECLARE (FCB, STATUS) ADDRESS; + END CLOSR; + + DECLARE RFCB (33) BYTE INITIAL (0, 'INDEXS ', 'TXT'); + DECLARE DSTAT ADDRESS; + + ---- + ---- + + CALL CLOSR (.RFCB, .DSTAT); + + +D.3.7 Procedure OPENW +--------------------- + +This procedure opens a file to be used for output. + +Arguments are: + + 1. File Control Block address. + + 2. Address of the number of bytes in the CP/M DMA buffer. + + 3. Address of the status word. + +Procedure OPENW must be CALLed before any CALLs to procedures DWCHR or DWLIN +are made. Files of the same name as the file being opened will be erased. The +status returned is 00H if no error occurred; otherwise, 0FFH. The last 21 +bytes of the File Control Block are initialized to zeroes and the count of +bytes in the DMA buffer is initialized to 0. This procedure does not read the +first sector into the DMA buffer. + +The following is an example of the declaration and use of procedure OPENW: + + OPENW: + PROCEDURE (FCB, SECTOR$COUNT, STATUS) EXTERNAL; + DECLARE (FCB, SECTOR$COUNT, STATUS) ADDRESS; + END OPEN; + + DECLARE WFCB (33) BYTE INITIAL (0, 'QFILE ', 'XY '); + DECLARE (SCNT, DSTAT) ADDRESS; + + ---- + ---- + + CALL OPENW (.WFCB, .SCNT, .DSTAT); + + +D.3.8 Procedure CLOSW +--------------------- + +This procedure closes a file used for output. + +Arguments are: + + 1. File Control Block address. + + 2. CP/M DMA buffer address. + + 3. Address of the number of bytes in the DMA buffer. + + 4. Address of the status word. + +Procedure CLOSW writes the last sector to the disk file, and closes the file. +The last sector is padded with Control-Zs (1AH, CP/M's End-Of-File indicator). +If the last sector contains 128 bytes prior to padding, an additional sector +full of Control-Zs (1AHs) is not written. The status returned is 00H if no +error occurred; otherwise, 0FFH. + +The following is an example of the declaration and use of procedure CLOSW: + + CLOSW: + PROCEDURE (FCB, SECTOR$BUFFER, SECTOR$COUNT, STATUS) EXTERNAL; + DECLARE (FCB, SECTOR$BUFFER, SECTOR$COUNT, STATUS) ADDRESS; + END CLOSW; + + DECLARE WFCB (33) BYTE INITIAL (0, 'RECORD ', 'ISM'); + DECLARE SBUFF (128) BYTE; + DECLARE (SCNT, DSTAT) ADDRESS; + + ---- + ---- + + CALL CLOSW (.WFCB, .SBUFF, .SCNT, .DSTAT); + + +D.4 Other Procedures +-------------------- + +D.4.1 Procedure NUMIN +--------------------- + +This procedure converts a number in ASCII string form into a 16-bit unsigned +binary number. + +Argument: The address of the pointer to the buffer area which contains the +ASCII string. + +See reference 1, page 147 for details of this procedure. + +The following is an example of the declaration and use of procedure NUMIN: + + NUMIN: + PROCEDURE (BUFFER) ADDRESS EXTERNAL; + DECLARE BUFFER ADDRESS; + END NUMIN; + + DECLARE BUFFER (128) BYTE; + DECLARE BUFFPTR ADDRESS; + DECLARE N ADDRESS; + + ---- + ---- + + BUFFPTR = .BUFFER; + N = NUMIN (.BUFFPTR); + + +D.4.2 Procedure NMOUT +--------------------- + +This procedure converts a 16-bit unsigned binary number into an ASCII string. + +Arguments are: + + 1. Number whose printable representation is desired. + + 2. Integer between 2 and 16 inclusive, specifying the base in which the + first argument is to be interpreted. + + 3. ASCII character to be used as leading character(s) in the printable + representation, e.g., '0', ' ', 0 or 00H (ASCII NUL). + + 4. Address of a buffer into which the printable representation is to be + placed. + + 5. Number of characters desired in the printable representation. The + buffer of argument 4 must be large enough to contain this many + characters. + +See reference 1, page 143 for details of this procedure. + +The following is an example of the declaration and use of procedure NMOUT: + + NMOUT: + PROCEDURE (VALUE, BASE, LC, BUFFADR, WIDTH) EXTERNAL; + DECLARE (VALUE, BUFFADR) ADDRESS; + DECLARE (BASE, LC, WIDTH) BYTE; + END NMOUT; + + DECLARE BUFFER (128) BYTE; + DECLARE ROOT ADDRESS; + + ---- + ---- + + CALL NMOUT (ROOT, 10, ' ', .BUFFER, 5); + + +Appendix E: Sample Output +------------------------- + +This section contains the input and output file listings for a PLMX program +which computes the average of an array of 10 numbers. + + +E.a The source file listing +---------------------------- + +/***********************************************************/ +/* A PROGRAM TO FIND THE MEAN OF THE 10 VALUES OF AN ARRAY */ +/***********************************************************/ + + +MEAN$VAL: +DO; + + DECLARE X (10) BYTE DATA (23,2,18,0,20,14,45,27,8,33); + DECLARE SUM ADDRESS; + DECLARE (MEAN, I) BYTE; + + SUM = 0; + I = 0; + DO WHILE I <= 9; + SUM = SUM + X (I); + I = I + 1; + END; + MEAN = SUM / 10; + +END MEAN$VAL; + + + + +E.b The output file listing +--------------------------- + + TITLE MEANV + NAME ('MEANV') + +MEANV:: + EXTRN INIT@ + PUBLIC AAAAB@,AAAAA@ + +AAAAA@: + LXI H,$+6 + JMP INIT@ +AAAAB@: +; +;/***********************************************************/ +;/* A PROGRAM TO FIND THE MEAN OF THE 10 VALUES OF AN ARRAY */ +;/***********************************************************/ +; +;MEAN$VAL: +; +;DO; +; +; +; DECLARE X (10) BYTE DATA (23,2,18,0,20,14,45,27,8,33); +; +; DECLARE SUM ADDRESS; +; +; DECLARE (MEAN, I) BYTE; +; +; +; SUM = 0; + LXI H,0H +; +; I = 0; + SHLD A0003 + MVI A,0H +; +; DO WHILE I <= 9; + STA A0005 +G0007: + MVI L,09H + LDA A0005 + EXTRN BP36@ + CALL BP36@ +; +; SUM = SUM + X (I); + RRC + JNC G0008 + LHLD A0005 + MVI H,0 + XCHG + LXI H,A0001 + DAD D + MOV A,M + LHLD A0003 + EXTRN BP57@ + CALL BP57@ +; +; I = I + 1; + SHLD A0003 + MVI L,01H + LDA A0005 + EXTRN BP25@ + CALL BP25@ +; +; END; + STA A0005 + JMP G0007 +; +; MEAN = SUM / 10; +G0008: + MVI A,0AH + LHLD A0003 + EXTRN BP71@ + CALL BP71@ + SHLD T0009 + LDA T0009 +; +; +;END MEAN$VAL; + STA A0004 + EXTRN EXIT@ +SCAT@: + CALL EXIT@ +A0001: + DB 017H + DB 02H + DB 012H + DB 0H + DB 014H + DB 0EH + DB 02DH + DB 01BH + DB 08H + DB 021H + DSEG +A0003: + DS 02H +A0004: + DS 01H +A0005: + DS 01H +T0006: + DS 01H +T0009: + DS 02H + END AAAAA@ + + +Appendix F: IOCLD.SRC Listing +----------------------------- + +/* + Following is a total list of I/O procedures available to the + PLMX user. Refer to Digital Research "CP/M Interface Guide" + for a description of CP/M 1.4 system level procedures. Refer to + the "PLMX User's Guide" for a description of all other procedures. + It is suggested that the user extract those procedures which are + applicable to his application, possibly putting them in an INCLUDE + file. +*/ + +/* CP/M system level procedures */ + +RD$CON: +PROCEDURE BYTE EXTERNAL; +END RD$CON; + +WR$CON: +PROCEDURE (CHAR) EXTERNAL; + DECLARE CHAR BYTE; +END WR$CON; + +RD$RDR: +PROCEDURE BYTE EXTERNAL; +END RD$RDR; + +PUNCH: +PROCEDURE (CHAR) EXTERNAL; + DECLARE CHAR BYTE; +END PUNCH; + +PRINT: +PROCEDURE (CHAR) EXTERNAL; + DECLARE CHAR BYTE; +END PRINT; + +G$STAT: +PROCEDURE BYTE EXTERNAL; +END G$STAT; + +S$STAT: +PROCEDURE (STAT) EXTERNAL; + DECLARE STAT BYTE; +END S$STAT; + +PR$BUF: +PROCEDURE (ADRS) EXTERNAL; + DECLARE ADRS ADDRESS; +END PR$BUF; + +RD$BUF: +PROCEDURE (BUF) ADDRESS EXTERNAL; + DECLARE BUF BYTE; +END RD$BUF; + +CN$RDY: +PROCEDURE BYTE EXTERNAL; +END CN$RDY; + +LFT$HD: +PROCEDURE EXTERNAL; +END LFT$HD; + +INIT: +PROCEDURE EXTERNAL; +END INIT; + +LOGIN: +PROCEDURE (DSK) EXTERNAL; + DECLARE DSK BYTE; +END LOGIN; + +OPEN: +PROCEDURE (FCB) BYTE EXTERNAL; + DECLARE FCB BYTE; +END OPEN; + +CLOSE: +PROCEDURE (FCB) BYTE EXTERNAL; + DECLARE FCB BYTE; +END CLOSE; + +SERCH: +PROCEDURE (FCB) BYTE EXTERNAL; + DECLARE FCB BYTE; +END SERCH; + +SR$NXT: +PROCEDURE (FCB) BYTE EXTERNAL; + DECLARE FCB BYTE; +END SR$NXT; + +DLETE: +PROCEDURE EXTERNAL; +END DLETE; + +RD$DSK: +PROCEDURE (FCB) BYTE EXTERNAL; + DECLARE FCB ADDRESS; +END RD$DSK; + +WR$DSK: +PROCEDURE (FCB) BYTE EXTERNAL; + DECLARE FCB ADDRESS; +END WR$DSK; + +MAKE: +PROCEDURE (FCB) BYTE EXTERNAL; + DECLARE FCB ADDRESS; +END MAKE; + +RNAME: +PROCEDURE (FCB) ADDRESS EXTERNAL; + DECLARE FCB ADDRESS; +END RNAME; + +RL$VEC: +PROCEDURE BYTE EXTERNAL; +END RL$VEC; + +DRIVE: +PROCEDURE BYTE EXTERNAL; +END DRIVE; + +STDMA: +PROCEDURE (BUF) EXTERNAL; + DECLARE BUF ADDRESS; +END STDMA; + + +/* PLMX read and write line procedures */ + +READ: +PROCEDURE (FUNCTION, BUFFER, COUNT, ACTUAL, STATUS) EXTERNAL; + DECLARE (FUNCTION, BUFFER, COUNT, ACTUAL, STATUS) ADDRESS; +END READ; + +WRITE: +PROCEDURE (FUNCTION, BUFFER, COUNT, STATUS) EXTERNAL; + DECLARE (FUNCTION, BUFFER, COUNT, STATUS) ADDRESS; +END WRITE; + + +/* Disk I/O procedures */ + +DRCHR: +PROCEDURE (FCB, SEC$BUFFER, SEC$COUNT, CHAR, STATUS) EXTERNAL; + DECLARE (FCB, SEC$BUFFER, SEC$COUNT, CHAR, STATUS) ADDRESS; +END DRCHR; + +DWCHR: +PROCEDURE (FCB, SEC$BUFFER, SEC$COUNT, CHAR, STATUS) EXTERNAL; + DECLARE (FCB, SEC$BUFFER, SEC$COUNT, CHAR, STATUS) ADDRESS; +END DWCHR; + +DRLIN: +PROCEDURE (FCB, SEC$BUF, SEC$CNT, BUFFER, COUNT, STATUS) EXTERNAL; + DECLARE (FCB, SEC$BUF, SEC$CNT, BUFFER, COUNT, STATUS) ADDRESS; +END DRLIN; + +DWLIN: +PROCEDURE (FCB, SEC$BUF, SEC$COUNT, BUFFER, COUNT, STATUS) EXTERNAL; + DECLARE (FCB, SEC$BUF, SEC$COUNT, BUFFER, COUNT, STATUS) ADDRESS; +END DWLIN; + +OPENR: +PROCEDURE (FCB, SEC$COUNT, STATUS) EXTERNAL; + DECLARE (FCB, SEC$COUNT, STATUS) ADDRESS; +END OPENR; + +CLOSR: +PROCEDURE (FCB, STATUS) EXTERNAL; + DECLARE (FCB, STATUS) ADDRESS; +END CLOSR; + +OPENW: +PROCEDURE (FCB, SEC$COUNT, STATUS) EXTERNAL; + DECLARE (FCB, SEC$COUNT, STATUS) ADDRESS; +END OPENW; + +CLOSW: +PROCEDURE (FCB, SEC$BUF, SEC$COUNT, STATUS) EXTERNAL; + DECLARE (FCB, SEC$BUF, SEC$COUNT, STATUS) ADDRESS; +END CLOSW; + +/* Other procedures */ + +NUMIN: /* Convert ASCII number to 16-bit unsigned binary */ +PROCEDURE (BUFFER) ADDRESS EXTERNAL; + DECLARE BUFFER ADDRESS; +END NUMIN; + +NMOUT: /* Convert 16-bit unsigned binary number to ASCII string */ +PROCEDURE (VALUE, BASE, LC, BUFFADR, WIDTH) EXTERNAL; + DECLARE (VALUE, BUFFADR) ADDRESS; + DECLARE (BASE, LC, WIDTH) BYTE; +END NMOUT; + + +Appendix G: PLMX Advertisements +------------------------------- + +- "PLMX communicates with all 8/16-bit micros" + "IEEE Micro", February 1981, p.106 + +PLMX, a universal high-level language for microprocessors, generates code for +any 8- or 16-bit device. Designed for use in microcomputer product development +and real-time process control, it is priced at half the cost of PL/M and other +non-universal microprocessor software packages, according to its developer, +System Consultants, Inc. + +PLMX takes PL/M to its logical conclusion, says the company. PL/M, originally +derived from PL/1, is used only on 8080- or 8086-based systems. Other +versions, such as PL/Z for the Z-80 and PL/65 for the 6500, are used only with +those processors. PLMX combines the features of PL/M with universality, +allowing users to employ new microprocessor architectures without having to +develop new software for them. + +PLMX's syntax is identical to PL/M's, which means that the entire library of +existing PL/M programs can be compiled under PLMX. Hence, PL/M programs may be +used on microprocessors other than the 8080, via the PLMX compiler. + +Currently, the PLMX compiler runs under the CP/M 1.4 and Tektronix TEKDOS +Operating Systems. Interfaces to other operating systems will be available +during 1981. In addition, PLMX is a true compiler, not an interpretive +compiler such as BASIC or Pascal in some of their current implementations. +Since an interpreter must be resident in ROM for execution of programs, and +thus must have a considerable amount of memory space, its usefulness in +developing ROM-based products is limited. The programs compiled by PLMX, +however, run an average of 15 times faster than those on an interpreter, since +at run time the programs are already in memory in executable form. This, says +Systems Consultants, makes PLMX appropriate for real-time applications. + +With no arbitrary formatting rules or line numbers, PLMX source statements +resemble simple English declarations, and follow a well-defined logic +structure. The source text can contain comments anywhere, except within +reserved words, identifier names, and numbers. + +PLMX is priced at $1000; an eight-inch compiler diskette and instruction +manuals are included. Additional copies for the same microprocessor type are +substantially discounted. PLMX is available for immediate delivery, with +program development support and other engineering services also available. + + +- "Microprocessor-Independent Program Library" + The *unique* cross-compiler for microprocessor independence + "IEEE Micro", Vol.2, No.4, Oct/Dec 1982, p.8 + +With PLMX, you are no longer restricted to any one microprocessor. PLMX is a +flexible cross-compiler that generates code for the 8080/8085, Z-80, 1802, +6800/6802/6809, and 9900 microprocessors, and executes under TEKDOS (*), +DOS/50 (*), CP/M (**), and CP/M-derivative Operating Systems. This flexibility +enables you to convert your existing PL/M libraries into a Microprocessor- +Independent Program Library. + +PLMX implements the structured syntax of PL/M, and produces assembly language +source files which can be assembled for ROM-based applications. + +And PLMX offers the features you are looking for in a software development +tool: portability, better program organization, more efficient management of +large programming jobs, and savings in programming time and money. Protect +your software investment, contact Roger Carlson - TODAY. He will tell you all +about PLMX. + +SYSCON Corporation +4015 hancock Street +San Diego +CA 92110 + +* = TEKDOS and DOS/50 are trademarks of Tektronix, Inc. +** = CP/M is a trademark of Digital Research, Inc. + + +Appendix H: ROCHE Addenda +------------------------- + +The "PL/M-80 Programming Manual" (1980) is available on the BitSavers Web +server. However, due to its success, this server is often overwhelmed by +demand. So, if you cannot access it, try one of its multiple mirrors. Then, +search for the "Intel" directory. The manual is in the "PLM" directory. + +A few short PL/M programs are available at the same address, in the "insite" +directory. Open one of the two 600-pages catalogues, then search for any small +PL/M program that were incorporated in the catalogues. (There is even a "Game +of Life"!) + +The PLMX "distribution disk" (except IOCLD.SRC?) is available at: + +http://z80cpu.eu/archive/rlee/S/SYSTEM%20CONSULTANTS/PLMX/ + +The "PLMX User's Guide" is pretty small... For example, my "Mallard BASIC +Introduction and Reference" manual, explaining a 30KB interpreter, is 300- +pages long! (Ten pages per kilobyte.) The PLMX Compiler is 85KB (the minimum +to run it), yet its manual is... 24-pages long! Obviously, Roger Carlson +expects its user to be pretty "familiar" about PL/M and CP/M... + +For the sake of Internet "Newbies", I decided to at least show them how to +generate a CP/M COMmand file (even if PLMX is designed to produce "modules" to +be put in a "library" and retrieved by a linker). + +So, I went to my Old Faithful Epson QX-10... which did not boot?!? Since there +was no time to tinker with hardware, I decided to use an IBM Clown. Since I +wanted to show what was happening, I needed to redirect the screen output into +a file. Under MS-DOS, this is tricky: you need to type the command blindly +(!). So, CP/M(-86) Plus to the rescue! With CP/M Plus, I can have an unplanned +session at the console, redirecting the screen output to a file. + +A>put console output to file plmx.asc [system] + +Since PLMX is an 8080 CP/M 1.4 program, we need an emulator to run it under +8086 CP/M 3.1. Me, I use Jim Lopushinsky's Z80.CMD Version 1.3. + +A>z80 plmx.com mean ; C+L+ +Z80 CP/M-80 emulator for CP/M-86 vers 1.3 - 11/30/97 +Copyright (c) 1985-1997 Jim Lopushinsky +PLMX COMPILER VERSION 2.3 +COPYRIGHT (C) 1980, SYSTEMS CONSULTANTS, INC. + +(See Appendix E for the PLMX compiler output. The only reason why "C+L+" are +in uppercase is that, on my French keyboard, the "+" sign is uppercase. +Anyway, since this is a command line, the CCP translates it to uppercase.) + +END OF COMPILATION +000 ERROR(S) DETECTED + +PLMX produced a MAC file. So, we now use M80 to produce the REL file. (We +could use Digital Research's RMAC for 8080-only code (the one outputted by +this version of PLMX). The advantage of M80 is that only one assembler is +needed to generate code for the 8080 and the Z-80. The (big) drawback of M80 +is that one additional step (compared to ASM and MAC) is needed: linking of +the REL modules (you can load HEX files directly into the DDT or SID +debuggers). For the Newbies, the M80 syntax is: M80 REL,PRN=MAC. The shortest +form is: M80 =MAC. + +A>z80 m80.com mean,mean=mean +Z80 CP/M-80 emulator for CP/M-86 vers 1.3 - 11/30/97 +Copyright (c) 1985-1997 Jim Lopushinsky + +No Fatal error(s) + +Finally, we need to link the modules. As explained in the "PLMX User's Guide", +RLIB.REL contains the run-time library and IOLIB.REL contains the I/O +Procedures. Also, "IOLIB should precede RLIB when they are linked." Probably +the only advantage of using a Linker is that (with an option) it can retrieve +from the library only the modules needed (else, it includes everything). +(Roger Carlson do not mention it but, normally, you put your assembled +relocatable modules inside a "library".) + +For the Newbies, it could be possible to bypass the Linker, by using INCLUDE +files containing the full code of RLIB and IOLIB. Of course, there would be +some overhead, since all the routines would be included, even if you just +printed "Hello, World!". (A problem with the code of RLIB is that it contains +twice the BP67@ subroutine... So, no assembler can assemble correctly the run- +time library! This is another problem with Linkers: they do not remember which +modules they put inside a file! In this case, Roger Carlson linked *TWICE* +module BP67@... If he had used a single file to contain the source code of all +the run-time routines, the assembler would have complained about this doubly- +defined subroutine. As he was using a Linker, the Linker, not remembering +which modules were already inside the library, simply added twice the module, +with the same name and the same code... Do you understand, now, why I prefer +absolute macro-assemblers?) (XREF is also an indispensable tool, to verify +that no labels have been forgotten, once you have got the code right. Note +that XREF works only for single file... How do you cross-ref a library made of +73 modules?) + +A>z80 link.com mean,iolib[s],rlib[s] +Z80 CP/M-80 emulator for CP/M-86 vers 1.3 - 11/30/97 +Copyright (c) 1985-1997 Jim Lopushinsky +LINK 1.31 + +BP25@ 0171 BP36@ 0176 BP57@ 0157 BP71@ 019A +EXIT@ 016D MEANV 0100 BP41@ 017F BP42@ 0187 +BP43@ 018A BP44@ 018F BP45@ 0192 BP58@ 015A +BP59@ 015D BP60@ 0160 BP61@ 0163 INIT@ 0166 +BP87@ 01A3 BP88@ 01AC + +ABSOLUTE 0000 +CODE SIZE 00E2 (0100-01E1) +DATA SIZE 0007 (01E2-01E8) +COMMON SIZE 0000 +USE FACTOR 03 + +Now, for the Newbies, I will be obliged to include comments inside the +redirected output of SID. + +A>z80 sid.com +Z80 CP/M-80 emulator for CP/M-86 vers 1.3 - 11/30/97 +Copyright (c) 1985-1997 Jim Lopushinsky +CP/M 3 SID - Version 3.0 + +Since SID is a *symbolic* debugger, it allows us to debug using the name of +the labels of the program, instead of mere hexadecimal values. (Hence the +"SYMBOLS" message. The first "mean" is the COM file, the second "mean" is the +SYM file.) + +#emean,mean +SYMBOLS +NEXT MSZE PC END +0200 0200 0100 D46F + +First, let us have a look to the code produced. + +#d100,1FF +0100: 21 00 00 22 E2 01 3E 00 32 E5 01 2E 09 3A E5 01 !.."..>.2....:.. +0110: CD 76 01 0F D2 39 01 2A E5 01 26 00 EB 21 4D 01 .v...9.*..&..!M. +0120: 19 7E 2A E2 01 CD 57 01 22 E2 01 2E 01 3A E5 01 .~*...W."....:.. +0130: CD 71 01 32 E5 01 C3 0B 01 3E 0A 2A E2 01 CD 9A .q.2.....>.*.... +0140: 01 22 E7 01 3A E7 01 32 E4 01 CD 6D 01 17 02 12 ."..:..2...m.... +0150: 00 14 0E 2D 1B 08 21 C3 7F 01 C3 87 01 C3 8A 01 ...-..!......... +0160: C3 8F 01 C3 92 01 EB 2A 06 00 F9 EB E9 F3 C3 00 .......*........ +0170: 00 85 6F 26 00 C9 67 7D 94 9F 2F 6F 26 00 C9 85 ..o&..g}../o&... +0180: 6F 7C CE 00 67 7D C9 B5 6F C9 A5 6F 26 00 C9 AD o|..g}..o..o&... +0190: 6F C9 8D 6F 7C CE 00 67 7D C9 5F 16 00 EB CD A3 o..o|..g}._..... +01A0: 01 7D C9 EB 42 4B CD B4 01 EB 7D C9 EB 42 4B CD .}..BK....}..BK. +01B0: B4 01 7D C9 11 00 00 CD DA 01 EB 3E F0 F5 29 1F ..}........>..). +01C0: EB 29 EB D2 C7 01 23 17 DA D2 01 7D 81 7C 88 D2 .)....#....}.|.. +01D0: D4 01 09 13 F1 3C FA BD 01 C9 0B 79 2F 4F 78 2F .....<.....y/Ox/ +01E0: 47 C9 00 00 00 00 00 00 00 1A 1A 1A 1A 1A 1A 1A G............... +01F0: 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A ................ + +Ok. 200h bytes = 1/2 kilobytes. Less than 512 bytes. (The "1A"s are the CP/M +End-Of-File characters.) Let us now see the names of the modules (compare them +with those mentioned by LINK-80 at the preceding step). + +#h +0171 BP25@ +0176 BP36@ +0157 BP57@ +019A BP71@ +016D EXIT@ +0100 MEANV +017F BP41@ +0187 BP42@ +018A BP43@ +018F BP44@ +0192 BP45@ +015A BP58@ +015D BP59@ +0160 BP60@ +0163 BP61@ +0166 INIT@ +01A3 BP87@ +01AC BP88@ + +Notice that one module is named MEANV... This is the name of the module. As +explained in the "PLMX User's Guide", there is an option to make a "Main +Program" module straight from a module, but we are not using it, here. I must +leave you some exercises to do... Ok. So, our COMmand file contains a MEANV +module: let us see what code was produced (compare with the listing of +Appendix E). (SID lists only 11 lines, to fill only half a screen of 24 +lines.) + +#l.meanv +MEANV: + 0100 LXI H,0000 + 0103 SHLD 01E2 + 0106 MVI A,00 + 0108 STA 01E5 + 010B MVI L,09 + 010D LDA 01E5 + 0110 CALL 0176 .BP36@ + 0113 RRC + 0114 JNC 0139 + 0117 LHLD 01E5 + 011A MVI H,00 +#l + 011C XCHG + 011D LXI H,014D + 0120 DAD D + 0121 MOV A,M + 0122 LHLD 01E2 + 0125 CALL 0157 .BP57@ + 0128 SHLD 01E2 + 012B MVI L,01 + 012D LDA 01E5 + 0130 CALL 0171 .BP25@ + 0133 STA 01E5 +#l + 0136 JMP 010B + 0139 MVI A,0A + 013B LHLD 01E2 + 013E CALL 019A .BP71@ + 0141 SHLD 01E7 + 0144 LDA 01E7 + 0147 STA 01E4 + 014A CALL 016D .EXIT@ + 014D RAL + 014E STAX B + 014F STAX D + +Stop! This code contains a "CALL EXIT@"... And, just before EXITing, it stores +a value inside a byte. So, 2 questions: what is the value of this byte, and +what is the code of EXIT? (I leave it to you the question of the purposes of +the various BP??@ run-time routines...) + +#d1E4,1E5 +01E4: 00 00 +#l.exit@ +EXIT@: + 016D DI + 016E JMP 0000 +BP25@: + 0171 ADD L + 0172 MOV L,A + 0173 MVI H,00 + 0175 RET +BP36@: + 0176 MOV H,A + 0177 MOV A,L + 0178 SUB H + 0179 SBB A + 017A CMA + +(Again, SID listed 11 lines, but only the code at EXIT@ interests us. +Fortunately, it is only 2 lines long. So, the EXIT@ routine of the run-time +library disables interrupts (in case the program re-enabled them) then goes +back to CP/M, by jumping to the BIOS entry point (normally, you put 0 into the +C-register, then call the BDOS. By the way, notice that Appendix D.1 "CP/M +System-Level Procedures" does not mention EXIT@...). + +Ok. So, we have seen the binary contents of the COMmand file. Now, we would +like to know if the program produces the right value (re-read Appendix E. What +are the values at A0001? By the way, the 10 values can be seen in the dump, at +addresses 014D-0156. Do you see them, between the code shown in Appendix E and +the code of the run-time routines added by LINK?) To know this, we need to run +this program... But we have just seen that it goes back to CP/M after "poking" +the result in memory. So, we need to interrupt it. We could put a "breakpoint" +at EXIT@ (read the "SID User's Guide"). In this case, let us do it simpler (a +way compatible with DDT for CP/M 2.2). SID uses an "entry point" located in +the CP/M 2.2 "Page Zero" (you have the BIOS entry point at 0000H, and the BDOS +entry point at 0005H). The only problem is that SID can use any of the +"restart points" of the 8080 (and Z-80) CPU. In practice, most SIDs use RST 6 +or 7, which correspond to 0030H and 0038H (hence the famous "RST 38" of the Z- +80...). So, let us see which one is used, in this case. + +#l0030 + 0030 JMP DB86 + 0033 NOP + 0034 NOP + 0035 NOP + 0036 NOP + 0037 NOP + 0038 NOP + 0039 NOP + 003A NOP + 003B NOP + 003C NOP + +Well... It is obvious that RST 6 (at 0030H) is used by SID. So, let us patch +our COMmand file so that, instead of jumping to the BIOS ("warm-booting"), it +will jump back to SID. (In numbers: replace 0000H by 0030H.) + +#s.exit@ +016D F3 +016E C3 +016F 00 30 +0170 00 . + +Now that the COMmand file is patched, let us run the program at full speed. + +#g.meanv + +*014D + +SID prompted us ("*"), telling us that it stopped executing the program at +014D (the byte *after* the "CALL EXIT@", because the CPU increased the PC by +1). Ok, let us now see the value computed. + +#d1E4,1E5 +01E4: 13 0A + +SID has a command to display hexadecimal values in decimal for mere humans... + +#h13 +0013 #19 + +Well... This is the value that I computed with a pencil on the back of an +envelope from the data in Appendix E. And you? + +#^C +A>put console to console + +Ok. Now that we have seen that PLMX is running, let us start to improve it. I +have not had enough time to find where are made the links between the PLMX +keywords and the run-time and I/O routines. However, during my tests, I was +annoyed with typing a ; to separate the options from the SRC filename. (By the +way, the PLM files of PLMX are not PL/M source code files, and the FOR files +are not, too, FORTRAN files... I have no idea why Roger Carlson chose such +common filetypes for his overlays?) Under CP/M Plus, the "standard" option +separator is [ (it was $ for CP/M 2.2), so let us patch PLMX, so it is more +"standard". The addresses to patch are: + +0A61 +0A7D +0A8E +0AB2 +1993 + +So far, I have had not problem with those patches, but I am a beginner in PLMX +programming. What is sure is that PLMX is the most incredible piece of +CP/M software to have appeared since... the death of CP/M! + +The look of PLMX programs is incredibly different from the look of my assembly +language programs, yet they produce the same code! With PLMX, since you no +longer hard code the control structures but see only the data, you have the +impression of manipulating only the data, and the code appears without effort! +This PLMX compiler is really something worth... $1000! My hat off to Roger +Carlson. + +That's all, folks! + + +EOF + + + + + + + + + + + + \ No newline at end of file diff --git a/SysCon PLMX/PLMXadv.pdf b/SysCon PLMX/PLMXadv.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a1482eee996225b5bd25fd5b0ce11491102981e2 GIT binary patch literal 1377481 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 z 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

a@9>Gr-*h+yJmBDHd$<~NO^K7!l&c` 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 ~`K(<&;_O@~md7U; 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