IMD 1.16: 31/05/2007 20:32:45 FOGCPM.141 --FOGCPM141UPDATE COMUPDATE DOC!UPDATE AZM, TIMEON COMTIMEON AZMFTIMEOFF COMTIMEOFF AZML !"#LOGON COM$LOGON AZM2%&'()*+LOGOFF COM,LOGOFF AZM--./012OSNAKE COM>3456789:OSNAKE DOC;TDUCK COMu<=>?@ABCDEFGHIJTDUCK PASmKLMNOPQRSTUVWXJOURNEY COMYZ[\]^_`abcdefghJOURNEY COMijklmnopqrstuvwxJOURNEY COMyz{|}~-09-00 86 -CPM141 DOCJOURNEY DOCJOURNEY DOCbJOURNEY INSJOURNEY SSSThis is the disk name. !9"81Z:] *5"]\ a> >P2~ ~::!#=ʇ}6#‡ʛ\\<² ÿ!|6\\*8 enter the date: $ date = $ new date = $ Not enough directory space$DA$LOGONOF.DOC = "LOG ON / LOG OFF DOCUMENT" :::::::::::::::::: UPDATE AND LOGBOOK PROGRAMS :::::::::::::::::: Robert E. Daniels 124 Windsor Circle Chapel Hill, NC 27514 March 17, 1986 This submission consists of a series of small programs: UPDATE which creates an object file named DA LOGON which creates an object file named LOGBOOK LOGOFF TIMEON \ alternate versions of LOGON and LOGOFF TIMEOFF / All these programs are simple variants of the same underlying structure. They are not particularly elegant, but are functional and hopefully well enough documented to suggest improvements. I wrote these programs to keep track of dates on files and of overall computer use (inspired by the IRS). UPDATE and DA: Create a file containing the current date........................ UPDATE accepts the current date from keyboard input and stores that date in a data file called "DA". If DA does not yet exist on the disk in the logged drive, UPDATE creates a new file with that name. If DA exists, UPDATE overwrites it with the new entry. DA can be called up in WordStar files, etc. with a special function key. LOGON, LOGOFF, and LOGBOOK: Create a cumulative file of computer use......................... LOGON displays a prompt header and then reads in the date from DA. It assumes that a DA file exists on the logged drive. If not, it bails out with an error message. LOGON then checks for a data file named LOGBOOK. If none exists on the disk in the logged drive, it creates one. LOGON then accepts a four digit time of logging on (HHMM) from keyboard entry. As soon as the fourth digit is entered, LOGON writes the current date and time logged on to the first or next record in LOGBOOK. Any of the first 20 bytes following the date taken from DA are filled with blanks (20H), and then the rest of that record following the time logged on is filled with blanks (20H again). LOGOFF reads through the records in LOGBOOK and leave untouched those that have information following the LOGON date (i.e. time logged off and notes, if any). When LOGOFF finds the latest record (containing only the current date and time when logged on), it displays a prompt header, the current date and time logged on, and then accepts, from keyboard entry, a four digit time of logging off (HHMM), to be followed by two spaces and notes, if any. LOGOFF then writes this new information to the most recent file in LOGBOOK, adding carriage returns and line feeds later in the record to create a doublespaced ASCII text. TIMEON and TIMEOFF............................................... These are simply variants of LOGON and LOGOFF that take advantage of the clock function in my Micro Management OZROM (Version 1E, 1984). In these two programs the time is automatically entered by reading the current time in the OZROM memory (set with the utility TIME.COM), rather than requiring keyboard entry. Other versions of the OZROM may require changing the memory address in the equates table. As far as the creation of LOGBOOK is concerned, these programs are interchangeable with the LOGON/LOGOFF pair, i.e. TIMEON can be followed by LOGOFF and LOGON can be followed by TIMEOFF. LIMITATIONS...................................................... The notes should not exceed the 65th column of input, i.e. each LOGON + LOGOFF (or TIMEON + TIMEOFF) entry is restricted to a single line. LOGBOOK can be edited by WordStar, but once a heading is added, the altered LOGBOOK file will not function properly with LOGON or LOGOFF. A feature calculating the elapsed time is not currently implemented. NOTES ON ASSEMBLY LANGUAGE CODE................................. UPDATE was originally written in 8080 code, and translated into Z80 code. The others were written in Z80 code and compiled with the Z80 Macro Assembler "Z80MR.COM" from the FOG Library disk -FOG/CPM.017.  were written in Z80 code and compiled with the Z80 Macro Assembler "Z80MR.COM" from thquates table. As far as the creation of LOGBOOK is concerned, these programs are interchangeable with the LOGON/LOGOFF pair, i.e. TIMEON can be followed by LOGOFF and LOGON can be followed by TIMEOFF. LIMITATIONS...................................................... The notes should not exceed the 65th column of input, i.e. each LOGON + LOGOFF (or TIMEON + TIMEOFF) entry is restricted to a single line. LOGBOOK can be edited by WordStar, but once a heading is added, the altered LOGBOOK file will not function properly with LOGON or LOGOFF. A feature calculating the elapsed time is not currently implemented. NOTES ON ASSEMBLY LANGUAGE CODE................................. UPDATE was originally written in 8080 code, and translated into Z80 code. The others were written in Z80 code and compiled with the Z80 Macro Assembler "Z80MR.COM" from th;********************************************************* ; ; UPDATE.AZM ; ; CREATES AND MAINTAINS A TEXT FILE, ; NAMED DA, OR OTHER NAME IF SUPPLIED, ; IN WHICH TO STORE THE CURRENT DATE ; WHICH CAN THEN BE RECALLED IN WORDSTAR ; WITH A FUNCTION KEY = ^KRA:DA ; ; ROBERT E. DANIELS FEBRUARY 1, 1986 ;......................................................... ; ;EQUATES ; LF EQU 0AH ;LINEFEED CR EQU 0DH ;CARRIAGE RETURN ZAP EQU 1AH ;END OF FILE CHARACTER, ;USED AS FILLER = ^Z READS EQU 0AH ;READ CONSOLE BUFFER PRINTS EQU 9H ;PRINT STRING TO CONSOLE CONOUT EQU 2H ;CONSOLE OUTPUT ; MAKEF EQU 16H ;MAKE NEW FILE OPENF EQU 0FH ;OPEN EXISTING FILE DEFILE EQU 13H ;DELETE FILE CLOSEF EQU 10H ;CLOSE FILE ; READR EQU 14H ;READ SEQUENTIAL RECORD WRITER EQU 15H ;WRITE SEQUENTIAL RECORD ; FCB EQU 5CH ;FILE CONTROL BLOCK DMA EQU 80H ;DIRECT MEMORY ACCESS BUFFER ; BDOS EQU 5H ;BDOS ENTRY POINT ;..................................................... ; ORG 100H ; ;SET UP LOCAL STACK LD HL,0 ;CLEAR HL ADD HL,SP ;ADD STACK POINTER TO HL LD (OLDSP),HL ;SAVE IT TO MEMORY LD SP,STKTOP ;SET UP NEW PROGRAM STACK ; ;CHECK FOR COMMAND LINE FILE NAME LD A,(FCB+1) ;GET FIRST CHARACTER CP ' ' ;IF IT'S NOT A SPACE JP NZ,LETSGO ;THEN USE THAT NAME ; ;OTHERWISE MOVE THE DEFAULT FILE NAME INTO THE FCB LD HL,(FILNAM) ;POINT TO FILENAME LD (FCB+1),HL ;STORE TWO DIGIT NAME IN FCB ; ;TRY TO OPEN DATE FILE LETSGO LD C,OPENF LD DE,FCB CALL BDOS INC A ;CHECK TO SEE FILE EXISTS JP Z,FRSTFI ;IF NOT GO TO "FIRST FILE" ; ;FOR EXISTING FILE: DISPLAY CURRENT DATE MESSAGE LD C,PRINTS LD DE,CURRDA CALL BDOS ; ;READ RECORD LD C,READR LD DE,FCB CALL BDOS ; ;AND DISPLAY CURRENTLY STORED DATE LD HL,DMA ;GET STARTING ADDRESS OF DMA LD B,128D ;B IS BYTE-IN-RECORD COUNTER LOOP LD E,(HL) ;PUT FIRST/NEXT CHAR IN REG. E LD A,E ;ALSO PUT IT IN REGISTER A CP ZAP ;IS IT THE EOF FILLER CHAR? JP Z,INPUT ;IF SO, DISPLAY FINISHED CALL PCHAR ;OTHERWISE DISPLAY IT INC HL ;INCREMENT POINTER DEC B ;DECREMENT BYTE COUNTER JP NZ,LOOP ;GO GET NEXT CHARACTER ; ;FOR FIRST FILE: SET SIGNAL TO SKIP DELETE FRSTFI LD A,0 ;0 MEANS FILE DOES NOT YET EXIST PUSH AF ;PUT THIS ON STACK ; ;DISPLAY PROMPT FOR FIRST DATE LD C,PRINTS LD DE,FRSTDA CALL BDOS JP KEYB ;JUMP TO KEYBOARD INPUT ; ;FOR SUBSEQUENT ENTRIES: SET SIGNAL TO DO DELETE INPUT LD A,1 ;1 MEANS FILE ALREADY EXISTS PUSH AF ;PUT THIS ON STACK ; ;DISPLAY PROMPT FOR NEXT DATE LD C,PRINTS LD DE,NEXTDA CALL BDOS ; ;FOR ALL INPUT: READ CHARACTERS INTO BUFFER FROM KEYBOARD ;(STRING BUFFER STARTS 2 BYTES ;BEFORE DMA TO LEAVE ROOM FOR ;MAXIMUM COUNT AND ACTUAL COUNT) KEYB LD A,80D ;SET MAX. NUM. OF CHARACTERS ;IN INPUT TO SCREEN WIDTH LD (DMA-2),A ;PUT THIS AT START OF BUFFER LD C,READS ;CONSOLE BUFFER FUNCTION LD DE,DMA-2 ;LOAD STRING BUFFER ADDRESS  CALL BDOS ;READ STRING INTO BUFFER ; ;CHECK IF BUFFER IS EMPTY - I.E. NO CHANGE TO DATA FILE LD A,(DMA-1) ;GET NUMBER OF CHARACTERS ;IN THE INPUT STRING OR A ;WAS IT 0? I.E. ONLY INPUT WAS CR JP Z,ALLDONE ;IF SO EXIT ; ;FILL THE REST OF THE RECORD WITH "ZAP" CHARACTER LD A,(DMA-1) ;GET NUMBER OF CHARACTERS ;IN THE INPUT STRING LD HL,DMA ;GET STARTING ADDRESS OF DMA LD B,128D ;B IS BYTE-IN-RECORD COUNTER AGAIN INC HL ;GET ADDRESS OF NEXT BYTE DEC B ;DECREMENT BYTE-IN-RECORD COUNTER DEC A ;DECREMENT BYTES-USED COUNTER OR A ;HAVE WE COUNTED THEM ALL? JP Z,FILL ;IF SO GO TO FILL LOOP JP AGAIN ;IF NOT COUNT THE NEXT BYTE USED FILL LD (HL),ZAP ;PUT EOF CHARACTER IN UNUSED BYTE INC HL ;GET ADDRESS OF NEXT BYTE DEC B ;DECREMENT BYTE-IN-RECORD COUNTER JP NZ,FILL ;KEEP FILLING TO END OF RECORD ; ;CHECK THE DELETE/SKIP-DELETE SIGNAL POP AF ;RECALL DELETE SIGNAL FROM STACK OR A ;IF 0 (= FILE DOES NOT YET EXIST) JP Z,NEWF ;SKIP OVER FILE DELETE FUNCTION ; ;DELETE OLD FILE LD C,DEFILE LD DE,FCB CALL BDOS ; ;OPEN NEW FILE NEWF LD C,MAKEF LD DE,FCB CALL BDOS ; ;TEST IF DIRECTORY IS FULL,IF SO ERROR MESSAGE AND CLOSE OUT INC A ;IF ERROR, FFH -> 0 JP NZ,TODISK ;OTHERWISE SKIP TO WRITE TO DISK LD C,PRINTS ;DISPLAY ON SCREEN LD DE,DIRFUL ;DIRECTORY FULL ERROR MESSAGE CALL BDOS JP SHUT ;CLOSE FILE AND EXIT ; ;WRITE RECORD TO DISK TODISK LD HL,7CH ;PUT ADDRESS OF CR BYTE IN FCB LD (HL),0 ;SET IT TO ZERO EACH TIME SO THAT ;SEQUENTIAL WRITE FUNC. DOES NOT ;AUTOMATICALLY ADVANCE TO NEXT ;RECORD BUT OVERWRITES FIRST ;RECORD IN FCB LD C,WRITER LD DE,FCB ;CONTENTS OF FCB TO DISK FILE CALL BDOS ; ;CLOSE THE FILE SHUT LD C,CLOSEF LD DE,FCB CALL BDOS ; ;RESTORE OLD STACK AND RETURN TO CP/M ALLDONE LD HL,(OLDSP) ;GET OLD STACK POINTER FROM MEM LD SP,HL ;MAKE IT CURRENT STACK POINTER RET ;RETURN TO CP/M ; ;SUBROUTINE - DISPLAY CHARACTER ON SCREEN PCHAR PUSH HL PUSH BC LD C,CONOUT CALL BDOS POP BC POP HL RET ; ;MESSAGES FRSTDA DB CR,LF,LF,'enter the date: $' CURRDA DB ' date = $' NEXTDA DB CR,LF,LF,' new date = $' DIRFUL DB CR,LF,'Not enough directory space$' FILNAM DB 'DA$' ;NAME OF DATA FILE TO HOLD DATE ; ;PROGRAM STORAGE OLDSP DS 2 ;MEMORY SPACE FOR OLD STACK POINTER DS 32 ;NEW STACK SPACE STKTOP: ;NEW STACK STARTS HERE END T IT TO ZERO EACH TIME SO THAT ;SEQUENTIAL WRITE FUNC. DOES NOT ;AUTOMATICALLY ADVANCE TO NEXT ;RECORD BUT OVERWRITES FIRST ;RECORD IN FCB LD C,WRITER LD DE,FCB ;CONTENTS OF FCB TO DISK FILE CALL BDOS ; ;CLOSE THE FILE SHUT LD C,CLOSEF LD DE,FCB CALL BDOS ; ;RESTORE OLD STACK AND RETURN TO CP/M ALLDONE LD HL,(OLDSP) ;GET OLD STACK POINTER FROM MEM LD SP,HL ;MAKE IT CURRENT STACK POINTER RET ;RETURN TO CP/M ; ;SUBROUTINE - DISPLAY CHARAC!9"1 y !] \<\!~ > w#!l\!] \<†\Û\շ Ê!^X#:f&2W:f02W:g&2W:g02W>!#=(6 #!l!l!|s\\!b*00U 01U002U@03UP04U5x_ RB )Date -On- ----------------- ---- ($ $ === CANNOT FIND DATE FILE: DA === $DA LOGBOOK ******************************************** ; ; TIMEON.AZM ; ; This program is for keeping a log of use ; of an Osborne 1 computer fitted with ; an OZROM. TIMEON.COM opens a new record for ; the start of each session. For the end of ; the session use the complementary program, ; TIMEOFF.COM. ; ; TIMEON ; a) reads in the current date from the data ; file "DA" which has previously been ; created/updated with UPDATE.COM ; b) reads in the current time in 4 digits ; (HHMM) from the OZROM clock ; c) creates/updates an ASCII file called ; "LOGBOOK" and writes this information, ; i.e. date and time of logging ON the ; computer, to LOGBOOK ; ; ROBERT E. DANIELS MARCH 15, 1986 ; 124 Windsor Circle ; Chapel Hill, NC 27514 ;......................................................... ; ;EQUATES ; LF EQU 0AH ;LINEFEED CR EQU 0DH ;CARRIAGE RETURN ZAP EQU 1AH ;END OF FILE CHARACTER = ^Z ;(USED AS FILLER IN "DA") BLNK EQU 20H ;CHARACTER FOR BLANK SPACE ; READS EQU 0AH ;READ CONSOLE BUFFER PRINTS EQU 9H ;PRINT STRING TO CONSOLE CONOUT EQU 2H ;CONSOLE OUTPUT (ONE CHAR) ; OPENF EQU 0FH ;OPEN EXISTING FILE MAKEF EQU 16H ;START A NEW FILE CLOSEF EQU 10H ;CLOSE FILE ; READR EQU 14H ;READ SEQUENTIAL RECORD WRITER EQU 15H ;WRITE SEQUENTIAL RECORD ; BDOS EQU 5H ;BDOS ENTRY POINT FCB EQU 5CH ;FILE CONTROL BLOCK DMA EQU 80H ;DIRECT MEMORY ACCESS BUFFER ; TIME EQU 0EF66H ;ADDR OF OZROM CLOCK TIME VALUE DEST EQU 1080H ;ADDR TO STORE DATE STRING DEST2 EQU 1094H ;ADDR TO STORE TIME-ON STRING LEN EQU 14H ;LENGTH OF DATE STRING ; ;..................................................... ; ORG 100H ; ;SET UP LOCAL STACK LD HL,0 ;CLEAR HL ADD HL,SP ;ADD STACK POINTER TO HL LD (OLDSP),HL ;SAVE IT TO MEMORY LD SP,STKTOP ;SET UP NEW PROGRAM STACK ; ;PRINT HEADER LD C,PRINTS LD DE,HEADER CALL BDOS ; ;INSERT CR & LF LD C,PRINTS LD DE,NEWLINE CALL BDOS ; ;MOVE THE FILE NAME "DA" INTO THE FCB  LD HL,DAFIL ;POINT TO FILENAME LD DE,FCB+1 ;POINT TO ADDR FOR FN IN FCB LD BC,11 ;NO. OF BYTES TO MOVE LDIR ;MOVE (HL) TO (DE) ;INC HL AND DE ;REPEAT UNTIL BC=0 ; ;TRY TO OPEN DATE FILE LD C,OPENF LD DE,FCB CALL BDOS LD DE,NOFILE ;ERROR MESSAGE INC A ;CHECK TO SEE FILE EXISTS JP Z,ERROR ;IF NOT GO TO "FIRST FILE" ; ;READ RECORD LD C,READR LD DE,FCB CALL BDOS ; ;CONVERT ZAPS IN "DA" TO BLANKS FOR "LOGBOOK" ;OTHERWISE "LOGBOOK" STOPS SHORT LD HL,DMA LD B,20D ;USE FIRST 20 BYTES IN "DA" CONV LD A,(HL) ;GET CHARACTER CP ZAP ;CHECK FOR EOF JR NZ,SKIP ;IF NOT, SKIP OVER NEXT LINE LD A,BLNK ;IF EOF, REPLACE WITH BLANK SKIP LD (HL),A ;PUT IT BACK IN STRING INC HL ;GET NEXT ADDRESS DJNZ CONV ;LOOP UNTIL B = 0 ; ;PUT THE DATE STRING IN HIGH MEMORY LD HL,DMA ;SOURCE ADDRESS LD DE,DEST ;DESTINATION ADDRESS LD BC,LEN ;NUMBER OF BYTES TO MOVE CALL BLKMOV ;BLOCK MOVE SUBROUTINE ; ;CLOSE THE FILE SHUT LD C,CLOSEF  LD DE,FCB CALL BDOS ; ;MOVE THE FILE NAME "LOGBOOK" INTO THE FCB LD HL,LOGFIL ;POINT TO FILENAME LD DE,FCB+1 ;POINT TO ADDR FOR FN IN FCB LD BC,11 ;NO. OF BYTES TO MOVE LDIR ;MOVE (HL) TO (DE) ;INC HL AND DE ;REPEAT UNTIL BC=0 ; ;OPEN LOGBOOK FILE LD C,OPENF LD DE,FCB CALL BDOS INC A ;IF NO FILE A -> 0 JP NZ,LETSGO ;IF LOGBOOK FILE EXISTS ;GO READ IT ; LD C,MAKEF ;IF NO FILE, LD DE,FCB ;START ONE NOW CALL BDOS LD DE,0 ;RECORD COUNTER SET TO 0 PUSH DE ;SAVE IT JP DISP ; LETSGO LD DE,0 ;RECORD COUNTER START AT 0 PUSH DE ;SAVE IT READ2 LD C,READR ;READ FIRST/NEXT RECORD LD DE,FCB CALL BDOS POP DE ;KEEP COUNT OF HOW INC E ;MANY RECORDS READ PUSH DE OR A ;WHEN EOF REACHED, READR FUNCTION JR NZ,DISP ;SETS A TO NON-ZERO. CHECK FOR IT JP READ2 ;OTHERWISE, READ NEXT RECORD ; ;DISPLAY CURRENTLY STORED DATE FROM HIGH MEMORY DISP LD HL,DEST ;GET STARTING ADDRESS OF HIGH MEM LD B,14H ;B IS BYTE-IN-RECORD COUNTER ;THIS PROGRAM ONLY USES FIRST 20 ;BYTES OF DATE STRING IN "DA" LOOP LD E,(HL) ;PUT FIRST/NEXT CHAR IN REG. E CALL PCHAR ;OTHERWISE DISPLAY IT INC HL ;INCREMENT ADDRESS POINTER DJNZ LOOP ;DECREMENT BYTE-IN-RECORD COUNTER ;KEEP LOOPING UNTIL B = 0 ; ;AUTOMATIC TIME ENTRY FROM OZROM CLOCK ; ;HOUR ; - FIRST DIGIT LD A,(TIME) ;GET BYTE REPRESENTING HOUR CALL TRY0 ;GOTO CONVERSION SUBROUTINE LD (DMA),A ;PUT RECODED VALUE IN FIRST ;BYTE OF DMA CALL DISTIME ;DISPLAY IT ; ; - SECOND DIGIT LD A,(TIME) ;GET BYTE REPRESENTING HOUR AND 0FH ;MASK OUT HIGH NIBBLE ADD A,'0' ;ADD 30H TO GET ASCII NUMERAL LD (DMA+1),A ;PUT THIS VALUE IN SECOND BYTE ;OF DMA CALL DISTIME ;DISPLAY IT ; ;MINUTES ; - FIRST DIGIT LD A,(TIME+1) ;GET BYTE REPRESENTING MINUTES CALL TRY0 ;GOTO CONVERSION SUBROUTINE LD (DMA+2),A ;PUT THIS VALUE IN THIRD BYTE ;OF DMA CALL DISTIME ;DISPLAY IT ; ; - SECOND DIGIT LD A,(TIME+1) ;GET BYTE REPRESENTING MINUTES AND 0FH ;MASK OUT HIGH NIBBLE ADD A,'0' ;ADD 30H TO GET ASCII NUMERAL LD (DMA+3),A ;PUT THIS VALUE IN FOURTH BYTE ;OF DMA CALL DISTIME ;DISPLAY IT ; ;FILL THE REST OF THE RECORD WITH "BLANK" CHARACTER LD A,4 ;GET NUMBER OF CHARACTERS ;IN THE AUTOMATIC TIME INPUT ;STRING LD HL,DMA ;GET STARTING ADDRESS OF DMA LD B,128D ;B IS BYTE IN RECORD COUNTER AGAIN INC HL ;GET ADDRESS OF NEXT BYTE DEC B ;DECREMENT BYTE IN RECORD COUNTER DEC A ;DECREMENT BYTES USED COUNTER OR A ;HAVE WE COUNTED THEM ALL? JR Z,FILL ;IF SO GO TO FILL LOOP JP AGAIN ;IF NOT COUNT THE NEXT BYTE USED FILL LD (HL),BLNK ;PUT BLANK CHAR IN UNUSED BYTE INC HL ;GET ADDRESS OF NEXT BYTE DJNZ FILL ;DECREMENT BYTE IN RECORD COUNTER ;KEEP FILLING TO END OF RECORD ; ;MOVE TIME-ON STRING TO END OF DATE STRING LD HL,DMA ;SOURCE ADDRESS LD DE,DEST2 ;DESTINATION ADDRESS LD BC,4 ;NUMBER OF BYTES TO MOVE CALL BLKMOV ;BLOCK MOVE SUBROUTINE ; ;BRING IT BACK TO DMA LD HL,DEST ;SOURCE ADDRESS LD DE,DMA ;DESTINATION ADDRESS LD BC,24 ;NUMBER OF BYTES TO MOVE CALL BLKMOV ;BLOCK MOVE SUBROUTINE ; ;WRITE RECORD TO DISK LD HL,7CH ;ADDR OF "CR BYTE" POP DE ;NO. OF RECORDS READ LD (HL),E ;ENTER THIS LD C,WRITER LD DE,FCB ;WRITE CONTENTS OF FCB CALL BDOS ;TO DISK FILE ; ;CLOSE IT LD C,CLOSEF LD DE,FCB CALL BDOS JP ALLDONE ; ERROR CALL PRINT ; ;RESTORE OLD STACK AND RETURN TO CP/M ALLDONE LD HL,(OLDSP) ;GET OLD STACK POINTER ;FROM MEMORY LD SP,HL ;MAKE IT THE CURRENT SP RET ;RETURN TO CP/M ; ;.................................................... ; ;SUBROUTINE - TAKING BYTE FROM OZROM MEMORY MAP (HOUR OR MINUTES ;OF CURRENT TIME), CONVERT IT FROM BINARY-CODED DECIMAL ;REPRESENTATION TO HEXIDECIMAL REPRESENTATION OF LEFT DIGIT IN A ;TWO DIGIT ASCII 'DECIMAL' DISPLAY, I.E. 45BCD -> 34H = 4 ASCII ; TRY0 CP 10H ;IS VALUE >= 10 ? JR NC,TRY1 LD B,'0' ;IF NOT RECODE AS ASCII '0' (30H) JP CONVRT ; TRY1 CP 20H ;IS VALUE >= 20 ? JR NC,TRY2 LD B,'1' ;IF NOT RECODE AS ASCII '1' (31H) JP CONVRT ; TRY2 CP 30H ;IS VALUE >= 30 ? JR NC,TRY3 LD B,'2' ;IF NOT RECODE AS ASCII '2' (32H) JP CONVRT ; TRY3 CP 40H ;IS VALUE >= 40 ? JR NC,TRY4 LD B,'3' ;IF NOT RECODE AS ASCII '3' (33H) JP CONVRT ; TRY4 CP 50H ;IS VALUE >= 50 ? JR NC,TRY5 LD B,'4' ;IF NOT RECODE AS ASCII '4' (34H) JP CONVRT ; TRY5 LD B,'5' ;OTHERWISE RECODE AS ASCII '5' ; ; = 35H CONVRT LD A,B ;SUBSTITUTE RECODED VALUE FOR RET ;ORIGINAL, AND RETURN ; ;SUBROUTINE - DISPLAY TIME DIGIT ON SCREEN DISTIME LD E,A ;LOAD VALUE IN E FOR BDOS CALL ; ;GO ON TO PCHAR ; ;SUBROUTINE - DISPLAY CHARACTER ON SCREEN PCHAR PUSH HL PUSH BC LD C,CONOUT CALL BDOS POP BC POP HL RET ; ;SUBROUTINE - DISPLAY A STRING ON SCREEN PRINT PUSH HL PUSH BC LD C,PRINTS CALL BDOS POP BC POP HL RET ; ;SUBROUTINE - BLOCK MOVE - This is taken from pp. 199-200, ;Z80 ASSEMBLY LANGUAGE SUBROUTINES, by Lance Leventhal and ;Winthrop Saville, Osborne/McGraw-Hill, 1983 ; BLKMOV EX DE,HL PUSH HL AND A SBC HL,DE AND A SBC HL,BC POP HL EX DE,HL LDIR RET ; ;MESSAGES HEADER DB CR,LF,LF,1BH,29H DB 'Date -On- ',CR,LF DB '----------------- ---- ' DB 1BH,28H,'$' NEWLINE DB CR,LF,'$' NOFILE DB CR,LF,LF,'=== CANNOT FIND DATE FILE: DA ===' DB CR,LF,LF,'$' DAFIL DB 'DA ' ;NAME OF DATA FILE TO HOLD DATE LOGFIL DB 'LOGBOOK ' ;NAME OF DATA FILE TO HOLD TIME ON ; ;PROGRAM STORAGE OLDSP DS 2 ;MEMORY SPACE FOR OLD STACK POINTER DS 32 ;NEW STACK SPACE STKTOP: ;NEW STACK STARTS HERE END  PCHAR PUSH HL PUSH BC LD C,CONOUT CALL BDOS POP BC POP HL RET ; ;SUBROUTINE - DISPLAY A STRING ON SCREEN PRINT PUSH HL PUSH BC LD C,PRINTS CALL BDOS POP BC POP HL RET ; ;SUBROUTINE - BLOCK MOVE - This is taken from p!9"1 l !] \\շ -!_!^K#:f2J:f02J:g2J:g02J!6 # K K!_>f2~ ~:(X:!#=(6 #!6 #6 !6 #6 !`_!_!|s\\*00H 01H002H@03HP04H5x_ RB )Date -On- Off- Notes ----------------- ---- ---- ---------------($ $LOGBOOK ******************************************* ; ; TIMEOFF.AZM ; ; This program is for keping a log of use ; of an Osborne 1 computer fitted with ; an OZROM. TIMEOFF.COM uses as its object ; file LOGBOOK which is created/updated by ; the complementary program TIMEON.COM. ; ; TIMEOFF ; a) reads in the current time in 4 digits ; (HHMM) from the OZROM clock ; b) accepts further notes from keyboard input ; (not to exceed column 65!) ; c) writes this information, i.e, time of ; logging OFF the computer and notes on ; the tasks worked on during the current ; session, to the most recent record in ; LOGBOOK. ; ; ROBERT E. DANIELS MARCH 16, 1986 ; 124 Windsor Circle ; Chapel Hill, NC 27514 ;......................................................... ; ;EQUATES ; LF EQU 0AH ;LINEFEED CR EQU 0DH ;CARRIAGE RETURN ZAP EQU 1AH ;END OF FILE CHARACTER = ^Z ;(USED AS FILLER IN "DA") BLNK EQU 20H ;CHARACTER FOR BLANK SPACE ; READS EQU 0AH ;READ CONSOLE BUFFER PRINTS EQU 9H ;PRINT STRING TO CONSOLE CONOUT EQU 2H ;CONSOLE OUTPUT ; OPENF EQU 0FH ;OPEN EXISTING FILE MAKEF EQU 16H ;START A NEW FILE CLOSEF EQU 10H ;CLOSE FILE ; READR EQU 14H ;READ SEQUENTIAL RECORD WRITER EQU 15H ;WRITE SEQUENTIAL RECORD ; BDOS EQU 5H ;BDOS ENTRY POINT FCB EQU 5CH ;FILE CONTROL BLOCK DMA EQU 80H ;DIRECT MEMORY ACCESS BUFFER ; TIME EQU 0EF66H ;ADDR OF OZROM CLOCK TIME VALUE DEST EQU 1080H ;ADDR TO STORE DATE AND TIME IN STRING DEST2 EQU 109AH ;ADDR TO STORE TIME OFF CLOCK READING DEST3 EQU 10A0H ;ADDR TO STORE NOTES STRING LEN EQU 14H ;LENGTH OF DATE STRING ENDL EQU 00A1H ;ADDR OF END OF ENTRY LINE IN DMA ENDR EQU 00DEH ;ADDR TWO BYTES BEFORE END OF DMA ; ;..................................................... ; ORG 100H ; ;SET UP LOCAL STACK LD HL,0 ;CLEAR HL ADD HL,SP ;ADD STACK POINTER TO HL LD (OLDSP),HL ;SAVE IT TO MEMORY LD SP,STKTOP ;SET UP NEW PROGRAM STACK ; ;PRINT HEADER LD C,PRINTS LD DE,HEADER CALL BDOS ; ;INSERT CR & LF LD C,PRINTS LD DE,NEWLINE CALL BDOS ; ;MOVE THE FILE NAME "LOGBOOK" INTO THE FCB LD HL,LOGFIL ;POINT TO FILENAME LD DE,FCB+1 ;POINT TO ADDR FOR FN IN FCB LD BC,11 ;NO. OF BYTES TO MOVE LDIR ;MOVE (HL) TO (DE) ;INC HL AND DE ;REPEAT UNTIL BC=0 ; ;OPEN LOGBOOK FILE LD C,OPENF LD DE,FCB CALL BDOS ; ; LD DE,0 ;RECORD COUNTER SET TO 0 ; PUSH DE ;SAVE IT ; READ2 LD C,READR LD DE,FCB CALL BDOS POP DE ;KEEP COUNT OF HOW INC E ;MANY RECORDS READ PUSH DE OR A ;WHEN EOF REACHED, READR FUNCTION JR NZ,SHIFT ;SETS A TO NON-ZERO. CHECK FOR IT JP READ2 ; ;PUT THE LOGON STRING IN HIGH MEMORY SHIFT LD HL,DMA ;SOURCE ADDRESS LD DE,DEST ;DESTINATION ADDRESS LD BC,26D ;NUMBER OF BYTES TO MOVE CALL BLKMOV ;BLOCK MOVE SUBROUTINE ; ;DISPLAY CURRENTLY STORED LOGON STRING FROM HIGH MEMORY LD HL,DEST ;GET STARTING ADDRESS OF HIGH MEM LD B,26D ;B IS BYTE-IN-RECORD COUNTER LOOP LD E,(HL) ;PUT FIRST/NEXT CHAR IN REG. E CALL PCHAR ;DISPLAY IT INC HL ;INCREMENT POINTER DJNZ LOOP ;DECREMENT BYTE-IN-RECORD COUNTER ;KEEP LOOPING UNTIL B = 0 ; ;AUTOMATIC TIME ENTRY FROM OZROM CLOCK ; ;HOUR ; - FIRST DIGIT LD A,(TIME) ;GET BYTE REPRESENTING HOUR CALL TRY0 ;GOTO CONVERSION SUBROUTINE LD (DMA),A ;PUT RECODED VALUE IN FIRST ;BYTE OF DMA CALL DISTIME ;DISPLAY IT ; ; - SECOND DIGIT LD A,(TIME) ;GET BYTE REPRESENTING HOUR AND 0FH ;MASK OUT HIGH NIBBLE ADD A,'0' ;ADD 30H TO GET ASCII NUMERAL LD (DMA+1),A ;PUT THIS VALUE IN SECOND BYTE ;OF DMA CALL DISTIME ;DISPLAY IT ; ;MINUTES ; - FIRST DIGIT LD A,(TIME+1) ;GET BYTE REPRESENTING MINUTES CALL TRY0 ;GOTO CONVERSION SUBROUTINE LD (DMA+2),A ;PUT THIS VALUE IN THIRD BYTE ;OF DMA CALL DISTIME ;DISPLAY IT ; ; - SECOND DIGIT LD A,(TIME+1) ;GET BYTE REPRESENTING MINUTES AND 0FH ;MA SK OUT HIGH NIBBLE ADD A,'0' ;ADD 30H TO GET ASCII NUMERAL LD (DMA+3),A ;PUT THIS VALUE IN FOURTH BYTE ;OF DMA CALL DISTIME ;DISPLAY IT ; ;INSERT TWO BLANKS LD BC,2 ;NO. OF BYTES LD HL,DMA+4 ;START AT FIFTH BYTE IN DMA TWOBL LD (HL),BLNK ;ENTER BLANK INC HL ;GET NEXT ADDRESS DJNZ TWOBL ;DO IT AGAIN LD E,BLNK ; CALL PCHAR ;DISPLAY BLANK ON SCREEN LD E,BLNK ; CALL PCHAR ;DISPLAY BLANK ON SCREEN ; ;MOVE TIME-OFF STRING TO END OF LOGON STRING LD HL,DMA ;SOURCE ADDRESS LD DE,DEST2 ;DESTINATION ADDRESS LD BC,6 ;NUMBER OF BYTES TO MOVE CALL BLKMOV ;BLOCK MOVE SUBROUTINE ; ;READ CHARACTERS INTO BUFFER FROM KEYBOARD - FOR "NOTES" ;(STRING BUFFER STARTS 2 BYTES ;BEFORE DMA TO LEAVE ROOM FOR ;MAXIMUM COUNT AND ACTUAL COUNT) LD A,102D ;SET MAX. NUM. OF CHARACTERS ;IN INPUT TO WHAT'S LEFT OF DMA LD (DMA-2),A ;PUT THIS AT START OF BUFFER LD C,READS ;CONSOLE BUFFER FUNCTION LD DE,DMA-2 ;LOAD STRING BUFFER ADDRESS CALL BDOS ;READ STRING INTO BUFFER ; ;CHECK IF BUFFER IS EMPTY - I.E. NO NOTES ADDED LD A,(DMA-1) ;GET NUMBER OF CHARACTERS ;IN THE INPUT STRING OR A ;WAS IT 0? I.E. ONLY INPUT WAS CR JR Z,ALLDONE ;IF SO EXIT ; ;FILL THE REST OF THE RECORD WITH "BLANK" CHARACTER LD A,(DMA-1) ;GET NUMBER OF CHARACTERS ;IN THE INPUT STRING LD HL,DMA ;GET STARTING ADDRESS OF DMA LD B,128D ;B IS BYTE-IN-RECORD COUNTER AGAIN INC HL ;GET ADDRESS OF NEXT BYTE DEC B ;DECREMENT BYTE-IN-RECORD COUNTER DEC A ;DECREMENT BYTES-USED COUNTER OR A ;HAVE WE COUNTED THEM ALL? JR Z,FILL ;IF SO GO TO FILL LOOP JP AGAIN ;IF NOT COUNT THE NEXT BYTE USED FILL LD (HL),BLNK ;PUT BLANK CHAR IN UNUSED BYTE INC HL ;GET ADDRESS OF NEXT BYTE DJNZ FILL ;KEEP FILLING TO END OF RECORD ;I.E. UNTIL EBYTE-IN-RECORD ;COUNTER = 0 ; ;INSERT CR & LF AT END OF NOTES FIELD ; THIS PRODUCES FIRST LINE IN LOGBOOK, 65 COLUMNS WIDE ; FOR DATA STORAGE: DATE, TIME-ON, TIME-OFF, NOTES ; LD HL,ENDL  ;ADDR OF END OF ENTRY LINE IN DMA LD (HL),CR ;INSERT CARRIAGE RETURN INC HL ;GO TO NEXT BYTE LD (HL),LF ;INSERT LINE FEED ; ;INSERT CR & LF AT END OF RECORD ; THIS PRODUCES SECOND LINE IN LOGBOOK, 65 COLUMNS WIDE ; NORMALLY LEFT BLANK, THUS MAKING A DOUBLE-SPACED TEXT ; LD HL,ENDR ;ADDR TWO BYTES BEFORE END OF DMA LD (HL),CR ;INSERT CARRIAGE RETURN INC HL ;GO TO NEXT BYTE LD (HL),LF ;INSERT LINE FEED ; ;MOVE NOTES STRING TO END OF TIME-OFF STRING LD HL,DMA ;SOURCE ADDRESS LD DE,DEST3 ;DESTINATION ADDRESS LD BC,96D ;NUMBER OF BYTES TO MOVE CALL BLKMOV ;BLOCK MOVE SUBROUTINE ; ;BRING IT ALL BACK TO DMA LD HL,DEST ;SOURCE ADDRESS LD DE,DMA ;DESTINATION ADDRESS LD BC,128D ;NUMBER OF BYTES TO MOVE CALL BLKMOV ;BLOCK MOVE SUBROUTINE ; ;WRITE RECORD TO DISK LD HL,7CH ;ADDR OF "CR BYTE" POP DE ;NO. OF RECORDS READ DEC E ;SUBTRACT ONE FROM RECORD COUNTER ;BECAUSE COMPUTER STARTS COUNT ;WITH 0 NOT 1 DEC E ;SUBTRACT ANOTHER TO GET BACK TO  ;RECORD CONTAINING MOST RECENT ;LOGON DATA RATHER THAN STARTING ;NEXT NEW RECORD LD (HL),E ;ENTER THIS LD C,WRITER LD DE,FCB ;WRITE CONTENTS OF FCB CALL BDOS ;TO DISK FILE ; ;CLOSE IT LD C,CLOSEF LD DE,FCB CALL BDOS JP ALLDONE ; ;RESTORE OLD STACK AND RETURN TO CP/M ALLDONE LD HL,(OLDSP) ;GET OLD STACK POINTER ;FROM MEMORY LD SP,HL ;MAKE IT THE CURRENT SP RET ;RETURN TO CP/M ; ;.................................................... ; ;SUBROUTINE - TAKING BYTE FROM OZROM MEMORY MAP (HOUR OR MINUTES ;OF CURRENT TIME), CONVERT IT FROM BINARY-CODED DECIMAL ;REPRESENTATION TO HEXIDECIMAL REPRESENTATION OF LEFT DIGIT IN A ;TWO DIGIT ASCII 'DECIMAL' DISPLAY, I.E. 45BCD -> 34H = 4 ASCII ; TRY0 CP 10H ;IS VALUE >= 10 ? JR NC,TRY1 LD B,'0' ;IF NOT RECODE AS ASCII '0' (30H) JP CONVRT ; TRY1 CP 20H ;IS VALUE >= 20 ? JR NC,TRY2 LD B,'1' ;IF NOT RECODE AS ASCII '1' (31H) JP CONVRT ; TRY2 CP 30H ;IS VALUE >= 30 ? JR NC,TRY3 LD B,'2' ;IF NOT RECODE AS ASCII '2' (32H) JP CONVRT ; TRY3 CP 40H ;IS VALUE >= 40 ? JR NC,TRY4 LD B,'3' ;IF NOT RECODE AS ASCII '3' (33H) JP CONVRT ; TRY4 CP 50H ;IS VALUE >= 50 ? JR NC,TRY5 LD B,'4' ;IF NOT RECODE AS ASCII '4' (34H) JP CONVRT ; TRY5 LD B,'5' ;OTHERWISE RECODE AS ASCII '5' ; ; = 35H CONVRT LD A,B ;SUBSTITUTE RECODED VALUE FOR RET ;ORIGINAL, AND RETURN ; ;SUBROUTINE - DISPLAY TIME DIGIT ON SCREEN DISTIME LD E,A ;LOAD VALUE IN E FOR BDOS CALL ; ;GO ON TO PCHAR ; ;SUBROUTINE - DISPLAY CHARACTER ON SCREEN PCHAR PUSH HL PUSH BC LD C,CONOUT CALL BDOS POP BC POP HL RET ; ;SUBROUTINE - DISPLAY A STRING ON SCREEN PRINT PUSH HL PUSH BC LD C,PRINTS CALL BDOS POP BC POP HL RET ; ;SUBROUTINE - BLOCK MOVE - This is taken from pp. 199-200, ;Z80 ASSEMBLY LANGUAGE SUBROUTINES, by Lance Leventhal and ;Winthrop Saville, Osborne/McGraw-Hill, 1983 ; BLKMOV EX DE,HL PUSH HL AND A SBC HL,DE AND A SBC HL,B C POP HL EX DE,HL LDIR RET ; ;MESSAGES HEADER DB CR,LF,LF,1BH,29H DB 'Date -On- Off- Notes' DB CR,LF DB '----------------- ---- ---- ---------------' DB 1BH,28H,'$' NEWLINE DB CR,LF,'$' LOGFIL DB 'LOGBOOK ' ;NAME OF DATA FILE TO HOLD TIME ON ; ;PROGRAM STORAGE OLDSP DS 2 ;MEMORY SPACE FOR OLD STACK POINTER DS 32 ;NEW STACK SPACE STKTOP: ;NEW STACK STARTS HERE END  ; ;GO ON TO PCHAR ; ;SUBROUTINE - DISPLAY CHARACTER ON SCREEN PCHAR PUSH HL PUSH BC LD C,CONOUT CALL BDOS POP BC POP HL RET ; ;SUBROUTINE - DISPLAY A STRING ON SCREEN PRINT PUSH HL PUSH BC LD C,PRINTS CALL BDOS POP BC POP HL RET ; ;SUBROUTINE - BLOCK MOVE - This is taken from pp. 199-200, ;Z80 ASSEMBLY LANGUAGE SUBROUTINES, by Lance Leventhal and ;Winthrop Saville, Osborne/McGraw-Hill, 1983 ; BLKMOV EX DE,HL PUSH HL AND A SBC HL,DE AND A SBC HL,B!9"1 ) g!] \j<\!~ > w#!\!] \<†\Û\շ Ê!^#>2~ ~:(I:!#=(6 #!!!|s\\* RB )Date -On- ----------------- ---- ($ $ === CANNOT FIND DATE FILE: DA === $DA LOGBOOK ************************************************* ; ; LOGON.AZM ; ; creates/updates a file called LOGBOOK ; by reading in the date from DA and ; accepting a 4 digit time (HHMM) indicating ; when I have logged on the computer ; ; ROBERT E. DANIELS MARCH 9, 1986 ;......................................................... ; ;EQUATES ; LF EQU 0AH ;LINEFEED CR EQU 0DH ;CARRIAGE RETURN ZAP EQU 1AH ;END OF FILE CHARACTER, ;USED AS FILLER = ^Z IN "DA" BLNK EQU 20H ;CHARACTER FOR BLANK SPACE READS EQU 0AH ;READ CONSOLE BUFFER PRINTS EQU 9H ;PRINT STRING TO CONSOLE CONOUT EQU 2H ;CONSOLE OUTPUT ; DEST EQU 1080H ;ADDR TO STORE DATE STRING DEST2 EQU 1094H ;ADDR TO STORE TIME IN STRING LEN EQU 14H ;LENGTH OF DATE STRING ; DELETF EQU 13H ;DELETE FILE OPENF EQU 0FH ;OPEN EXISTING FILE MAKEF EQU 16H ;START A NEW FILE CLOSEF EQU 10H ;CLOSE FILE ; READR EQU 14H ;READ SEQUENTIAL RECORD WRITER EQU 15H ;WRITE SEQUENTIAL RECORD ; FCB EQU 5CH ;FILE CONTROL BLOCK DMA EQU 80H ;DIRECT MEMORY ACCESS BUFFER ; BDOS EQU 5H ;BDOS ENTRY POINT ;..................................................... ; ORG 100H ; ;SET UP LOCAL STACK LD HL,0 ;CLEAR HL ADD HL,SP ;ADD STACK POINTER TO HL LD (OLDSP),HL ;SAVE IT TO MEMORY LD SP,STKTOP ;SET UP NEW PROGRAM STACK ; ;PRINT HEADER LD C,PRINTS LD DE,HEADER CALL BDOS ; ;INSERT CR & LF LD C,PRINTS LD DE,NEWLINE CALL BDOS ; ;MOVE THE FILE NAME "DA" INTO THE FCB LD HL,DAFIL ;POINT TO FILENAME LD DE,FCB+1 ;POINT TO ADDR FOR FN IN FCB LD BC,11 ;NO. OF BYTES TO MOVE LDIR ; ;TRY TO OPEN DATE FILE LD C,OPENF LD DE,FCB CALL BDOS LD DE,NOFILE ;ERROR MESSAGE INC A ;CHECK TO SEE FILE EXISTS JP Z,ERROR ;IF NOT GO TO "FIRST FILE" ; ;READ RECORD LD C,READR LD DE,FCB CALL BDOS ; ;CONVERT ZAPS IN "DA" TO BLANKS FOR "LOGBOOK" ;OTHERWISE "LOGBOOK" STOPS SHORT LD HL,DMA LD B,20D ;USE FIRST 20 BYTES IN "DA" CONV LD A,(HL) ;GET CHARACTER CP ZAP ;CHECK FOR EOF JR NZ,SKIP ;IF NOT, SKIP OVER NEXT LINE LD A,BLNK ;IF EOF, REPLACE WITH BLANK SKIP LD (HL),A ;PUT IT BACK IN STRING INC HL ;GET NEXT ADDRESS DJNZ CONV ;LOOP UNTIL B = 0 ; ;PUT THE DATE STRING IN HIGH MEMORY LD HL,DMA ;SOURCE ADDRESS LD DE,DEST ;DESTINATION ADDRESS LD BC,LEN ;NUMBER OF BYTES TO MOVE CALL BLKMOV ; ;CLOSE THE FILE SHUT LD C,CLOSEF LD DE,FCB CALL BDOS ; ;MOVE THE FILE NAME "LOGBOOK" INTO THE FCB LD HL,LOGFIL ;POINT TO FILENAME LD DE,FCB+1 ;POINT TO ADDR FOR FN IN FCB LD BC,11 LDIR ; ;OPEN LOGBOOK FILE LD C,OPENF LD DE,FCB CALL BDOS INC A ;IF NO FILE A -> 0 JP NZ,LETSGO ; LD C,MAKEF ;IF NO FILE, LD DE,FCB ;START ONE NOW CALL BDOS LD DE,0 ;RECORD COUNTER SET TO 0 PUSH DE ;SAVE IT JP DISP ; LETSGO LD DE,0 ;RECORD COUNTER START AT 0 PUSH DE ;SAVE IT READ2 LD C,READR LD DE,FCB CALL BDOS POP DE ;KEEP COUNT OF HOW INC E ;MANY RECORDS READ PUSH DE OR A ;WHEN EOF REACHE D, READR FUNCTION JR NZ,DISP ;SETS A TO NON-ZERO. CHECK FOR IT JP READ2 ; ;DISPLAY CURRENTLY STORED DATE FROM HIGH MEMORY DISP LD HL,DEST ;GET STARTING ADDRESS OF HIGH MEM LD B,14H ;B IS BYTE IN RECORD COUNTER LOOP LD E,(HL) ;PUT FIRST/NEXT CHAR IN REG. E CALL PCHAR ;OTHERWISE DISPLAY IT INC HL ;INCREMENT POINTER DJNZ LOOP ;DECREMENT BYTE COUNTER ; ;READ CHARACTERS INTO BUFFER FROM KEYBOARD ;(STRING BUFFER STARTS 2 BYTES ;BEFORE DMA TO LEAVE ROOM FOR ;MAXIMUM COUNT AND ACTUAL COUNT) SHOW LD A,4H ;SET MAX. NUM. OF CHARACTERS ;IN INPUT TO SCREEN WIDTH LD (DMA-2),A ;PUT THIS AT START OF BUFFER LD C,READS ;CONSOLE BUFFER FUNCTION LD DE,DMA-2 ;LOAD STRING BUFFER ADDRESS CALL BDOS ;READ STRING INTO BUFFER ; ;CHECK IF BUFFER IS EMPTY - I.E. NO CHANGE TO DATA FILE LD A,(DMA-1) ;GET NUMBER OF CHARACTERS ;IN THE INPUT STRING OR A ;WAS IT 0? I.E. ONLY INPUT WAS CR JR Z,ALLDONE ;IF SO EXIT ; ;FILL THE REST OF THE RECORD WITH "BLANK" CHARACTER LD A,(DMA-1) ;GET NUMBER OF CHARACTERS ;IN THE INPUT STRING LD HL,DMA ;GET STARTING ADDRESS OF DMA LD B,128D ;B IS BYTE IN RECORD COUNTER AGAIN INC HL ;GET ADDRESS OF NEXT BYTE DEC B ;DECREMENT BYTE IN RECORD COUNTER DEC A ;DECREMENT BYTES USED COUNTER OR A ;HAVE WE COUNTED THEM ALL? JR Z,FILL ;IF SO GO TO FILL LOOP JP AGAIN ;IF NOT COUNT THE NEXT BYTE USED FILL LD (HL),BLNK ;PUT BLANK CHAR IN UNUSED BYTE INC HL ;GET ADDRESS OF NEXT BYTE DJNZ FILL ;DECREMENT BYTE IN RECORD COUNTER ;KEEP FILLING TO END OF RECORD ; ;MOVE STRING TO END OF DATE STRING LD HL,DMA ;SOURCE ADDRESS LD DE,DEST2 ;DESTINATION ADDRESS LD BC,4 ;NUMBER OF BYTES TO MOVE CALL BLKMOV ; ;BRING IT BACK TO DMA LD HL,DEST ;SOURCE ADDRESS LD DE,DMA ;DESTINATION ADDRESS LD BC,24 ;NUMBER OF BYTES TO MOVE CALL BLKMOV ; ;WRITE RECORD TO DISK LD HL,7CH ;ADDR OF "CR BYTE" POP DE ;NO. OF RECORDS READ LD (HL),E ;ENTER THIS LD C,WRITER LD DE,FCB ;WRITE CONTENTS OF FCB CALL BDOS ;TO DISK FILE ; ;CLOSE IT LD C,CLOSEF LD DE,FCB CALL BDOS JP ALLDONE ; ERROR CALL PRINT ; ;RESTORE OLD STACK AND RETURN TO CP/M ALLDONE LD HL,(OLDSP) ;GET OLD STACK POINTER ;FROM MEMORY LD SP,HL ;MAKE IT THE CURRENT SP RET ;RETURN TO CP/M ; ;SUBROUTINE - DISPLAY CHARACTER ON SCREEN PCHAR PUSH HL PUSH BC LD C,CONOUT CALL BDOS POP BC POP HL RET ; ;SUBROUTINE - DISPLAY A STRING ON SCREEN PRINT PUSH HL PUSH BC LD C,PRINTS CALL BDOS POP BC POP HL RET ; ;SUBROUTINE - BLOCK MOVE - PP 199-200, Z80 A.L. SUBROUTINES BLKMOV EX DE,HL PUSH HL AND A SBC HL,DE AND A SBC HL,BC POP HL EX DE,HL LDIR RET ; ;MESSAGES HEADER DB CR,LF,LF,1BH,29H DB 'Date -On- ',CR,LF DB '----------------- ---- ' DB 1BH,28H,'$' NEWLINE DB CR,LF,'$' NOFILE DB CR,LF,LF,'=== CANNOT FIND DATE FILE: DA ===' DB CR,LF,LF,'$' DAFIL DB 'DA ' ;NAME OF DATA FILE TO HOLD DATE LOGFIL DB 'LOGBOOK ' ;NAME OF DATA FILE TO HOLD TIME ON ; ;PROGRAM STORAGE OLDSP DS 2 ;MEMORY SPACE FOR OLD STACK POINTER DS 32 ;NEW STACK SPACE STKTOP: ;NEW STACK STARTS HERE END  SP,HL ;MAKE IT THE CURRENT SP RET ;RETURN TO CP/M ; ;SUBROUTINE - DISPLAY CHARACTER ON SCREEN PCHAR PUSH HL PUSH BC LD C,CONOUT CALL BDOS POP BC POP HL RET ; ;SUBROUTINE - DISPLAY A STRING ON SCREEN PRINT PUSH HL PUSH BC LD C,PRINTS CALL BDOS POP BC POP HL RET ; ;SUBROUTINE - BLOCK MOVE - PP 199-200, Z80 A.L. SUBROUTINES BLKMOV EX DE,HL PUSH HL AND A SBC HL,DE AND A SBC HL,BC POP HL EX DE,HL LDIR RET ; ;MESSAGES HEADER DB CR,LF,LF,1BH,29H DB 'Date -On- ',CR,LF DB '----------------- ---- ' DB 1BH,28H,'$' NEWLINE DB CR,LF,'$' NOFILE DB CR,LF,LF,'=== CANNOT FIND DATE FILE: DA ===' DB CR,LF,LF,'$' DAFIL DB 'DA ' ;NAME OF DATA FILE TO!9"S1u  E!H] \\շ -!!^#>l2~ ~:(X:!#=(q6 #!6 #6 !6 #6 !f!!|s\\*S RB )Date -On- Time Notes ----------------- ---- ---- ---------------($ $LOGBOOK  ************************************************* ; ; LOGOFF.AZM ; ; creates/updates a file called LOGBOOK ; by accepting a 4 digit time (HHMM) ; indicating when I have logged OFF the ; computer, CALCULATING THE ELAPSED TIME, ; and adding notes to LOGBOOK ; ; ROBERT E. DANIELS MARCH 10, 1986 ;......................................................... ; ;EQUATES ; LF EQU 0AH ;LINEFEED CR EQU 0DH ;CARRIAGE RETURN ZAP EQU 1AH ;END OF FILE CHARACTER, ;USED AS FILLER = ^Z IN "DA" BLNK EQU 20H ;CHARACTER FOR BLANK SPACE READS EQU 0AH ;READ CONSOLE BUFFER PRINTS EQU 9H ;PRINT STRING TO CONSOLE CONOUT EQU 2H ;CONSOLE OUTPUT ; DEST EQU 1080H ;ADDR TO STORE DATE STRING DEST2 EQU 109AH ;ADDR TO STORE TIME IN STRING LEN EQU 14H ;LENGTH OF DATE STRING ENDL EQU 00A7H ENDR EQU 00E4H ; DELETF EQU 13H ;DELETE FILE OPENF EQU 0FH ;OPEN EXISTING FILE MAKEF EQU 16H ;START A NEW FILE CLOSEF EQU 10H ;CLOSE FILE ; READR EQU 14H ;READ SEQUENTIAL RECORD WRITER EQU 15H ;WRITE SEQUENTIAL RECORD ; FCB EQU 5CH ;FILE CONTROL BLOCK DMA EQU 80H ;DIRECT MEMORY ACCESS BUFFER ; BDOS EQU 5H ;BDOS ENTRY POINT ;..................................................... ; ORG 100H ; ;SET UP LOCAL STACK LD HL,0 ;CLEAR HL ADD HL,SP ;ADD STACK POINTER TO HL LD (OLDSP),HL ;SAVE IT TO MEMORY LD SP,STKTOP ;SET UP NEW PROGRAM STACK ; ;PRINT HEADER LD C,PRINTS LD DE,HEADER CALL BDOS ; ;INSERT CR & LF LD C,PRINTS LD DE,NEWLINE CALL BDOS ; ;MOVE THE FILE NAME "LOGBOOK" INTO THE FCB LD HL,LOGFIL ;POINT TO FILENAME LD DE,FCB+1 ;POINT TO ADDR FOR FN IN FCB LD BC,11 LDIR ; ;OPEN LOGBOOK FILE LD C,OPENF LD DE,FCB CALL BDOS ; ; LD DE,0 ;RECORD COUNTER SET TO 0 ; PUSH DE ;SAVE IT ; READ2 LD C,READR LD DE,FCB CALL BDOS POP DE ;KEEP COUNT OF HOW INC E ;MANY RECORDS READ PUSH DE OR A ;WHEN EOF REACHED, READR FUNCTION JR NZ,SHIFT ;SETS A TO NON-ZERO. CHECK FOR IT JP READ2 ; ;PUT THE LOGON STRING IN HIGH MEMORY SHIFT LD HL,DMA ;SOURCE ADDRESS LD DE,DEST ;DESTINATION ADDRESS LD BC,26D ;NUMBER OF BYTES TO MOVE CALL BLKMOV ; ;DISPLAY CURRENTLY STORED LOGON STRING FROM HIGH MEMORY LD HL,DEST ;GET STARTING ADDRESS OF HIGH MEM LD B,26D ;B IS BYTE IN RECORD COUNTER LOOP LD E,(HL) ;PUT FIRST/NEXT CHAR IN REG. E CALL PCHAR ;OTHERWISE DISPLAY IT INC HL ;INCREMENT POINTER DJNZ LOOP ;DECREMENT BYTE COUNTER ; ;READ CHARACTERS INTO BUFFER FROM KEYBOARD ;(STRING BUFFER STARTS 2 BYTES ;BEFORE DMA TO LEAVE ROOM FOR ;MAXIMUM COUNT AND ACTUAL COUNT) LD A,108D ;SET MAX. NUM. OF CHARACTERS ;IN INPUT TO SCREEN WIDTH LD (DMA-2),A ;PUT THIS AT START OF BUFFER LD C,READS ;CONSOLE BUFFER FUNCTION LD DE,DMA-2 ;LOAD STRING BUFFER ADDRESS CALL BDOS ;READ STRING INTO BUFFER ; ;CHECK IF BUFFER IS EMPTY - I.E. NO CHANGE TO DATA FILE LD A,(DMA-1) ;GET NUMBER OF CHARACTERS ;IN THE INPUT STRING OR A ;WAS IT 0? I.E. ONLY INPUT WAS CR JR Z,ALLDONE ;IF SO EXIT ; ;FILL THE REST OF THE RECORD WITH "BLANK" CHARACTER LD A,(DMA-1) ;GET NUMBER OF CHARACTERS ;IN THE INPUT STRING LD HL,DMA ;GET STARTING ADDRESS OF DMA LD B,128D ;B IS BYTE IN RECORD COUNTER AGAIN INC HL ;GET ADDRESS OF NEXT BYTE DEC B ;DECREMENT BYTE IN RECORD COUNTER DEC A ;DECREMENT BYTES USED COUNTER OR A ;HAVE WE COUNTED THEM ALL? JR Z,FILL ;IF SO GO TO FILL LOOP JP AGAIN ;IF NOT COUNT THE NEXT BYTE USED FILL LD (HL),BLNK ;PUT BLANK CHAR IN UNUSED BYTE INC HL ;GET ADDRESS OF NEXT BYTE DJNZ FILL ;DECREMENT BYTE IN RECORD COUNTER ;KEEP FILLING TO END OF RECORD ; ;INSERT CR & LF AT END OF NOTES FIELD LD HL,ENDL LD (HL),CR INC HL LD (HL),LF ; ;INSERT CR & LF AT END OF RECORD LD HL,ENDR LD (HL),CR INC HL LD (HL),LF ; ;MOVE STRING TO END OF DATE STRING LD HL,DMA ;SOURCE ADDRESS LD DE,DEST2 ;DESTINATION ADDRESS LD BC,102D ;NUMBER OF BYTES TO MOVE CALL BLKMOV ; ;BRING IT BACK TO DMA LD HL,DEST ;SOURCE ADDRESS LD DE,DMA ;DESTINATION ADDRESS LD BC,128D ;NUMBER OF BYTES TO MOVE CALL BLKMOV ; ;WRITE RECORD TO DISK LD HL,7CH ;ADDR OF "CR BYTE" POP DE ;NO. OF RECORDS READ DEC E ;SUBTRACT ONE FROM RECORD COUNTER ;BECAUSE COMPUTER STARTS COUNT ;WITH 0 NOT 1 DEC E ;SUBTRACT ANOTHER TO GET BACK TO ;RECORD CONTAINING MOST RECENT ;LOGON DATA RATHER THAN STARTING ;NEXT NEW RECORD LD (HL),E ;ENTER THIS LD C,WRITER LD DE,FCB ;WRITE CONTENTS OF FCB CALL BDOS ;TO DISK FILE ; ;CLOSE IT LD C,CLOSEF LD DE,FCB CALL BDOS JP ALLDONE ; ;RESTORE OLD STACK AND RETURN TO CP/M ALLDONE LD HL,(OLDSP) ;GET OLD STACK POINTER ;FROM MEMORY LD SP,HL ;MAKE IT THE CURRENT SP RET ;RETURN TO CP/M ; ;SUBROUTINE - DISPLAY CHARACTER ON SCREEN PCHAR PUSH HL PUSH BC LD C,CONOUT CALL BDOS POP BC POP HL RET ; ;SUBROUTINE - DISPLAY A STRING ON SCREEN PRINT PUSH HL PUSH BC LD C,PRI NTS CALL BDOS POP BC POP HL RET ; ;SUBROUTINE - BLOCK MOVE - PP 199-200, Z80 A.L. SUBROUTINES BLKMOV EX DE,HL PUSH HL AND A SBC HL,DE AND A SBC HL,BC POP HL EX DE,HL LDIR RET ; ;MESSAGES HEADER DB CR,LF,LF,1BH,29H DB 'Date -On- Time Notes' DB CR,LF DB '----------------- ---- ---- ---------------' DB 1BH,28H,'$' NEWLINE DB CR,LF,'$' LOGFIL DB 'LOGBOOK ' ;NAME OF DATA FILE TO HOLD TIME ON ; ;PROGRAM STORAGE OLDSP DS 2 ;MEMORY SPACE FOR OLD STACK POINTER DS 32 ;NEW STACK SPACE STKTOP: ;NEW STACK STARTS HERE END RE OLD STACK AND RETURN TO CP/M ALLDONE LD HL,(OLDSP) ;GET OLD STACK POINTER ;FROM MEMORY LD SP,HL ;MAKE IT THE CURRENT SP RET ;RETURN TO CP/M ; ;SUBROUTINE - DISPLAY CHARACTER ON SCREEN PCHAR PUSH HL PUSH BC LD C,CONOUT CALL BDOS POP BC POP HL RET ; ;SUBROUTINE - DISPLAY A STRING ON SCREEN PRINT PUSH HL PUSH BC LD C,PRI*K͞+&'+FÎr^#V#*~#fo^#*~#fo^#V#*n^#*n^#V# ~#fo^#& ~#fo!+!#!+!#!+!+}|z{|}|z7||7zZZ)|/g}/o#|͉k|/g}/o#ɯ2qZZk:q|/g}/o#|/g}/o#:q<2qqDM!xxGyO҃)v|͔`i|)Öxڷz/W{/_ѯzW{_=yOxGæ2qZZ͉M|}ȯ|g}o)|/g}/o#z/W{/_!9~#fo! ! ! ! ! ! !9~#A"s!`*"!"!Y">2>2>22!"!"!@"!" ʞ!F#x±~#±!b2r~# "2r+}|~#G:rx"2r+w# +6#!6#2w2x*s!>r<o&F=-` r'~h6!+`W?_!~7z?` :>ª@w#.¶66*>?w#> w#.7:77!a{   `OE!y6$ -7rBo&))T])))!yg!>3͹(>3>@2:;u *1;";.04:/;2/;";|¶!}§!=/04ʽ!ª!=004>G>)3!#'͇&)*͹( 1!&,2#%"d/04b(ͨ&&)*͹(}(~7#^#V#/" 1)))S~+2G~`24;29;#~23;~?>o"=2-;#^#V#^#V#"5;^#V"7;:9;ʙ"* ;!:4;@ʪ""7;*K;#w"K;*K;~""/+25:+"K;*K;+"K;!>"K;6!/>"M;*K;~*3;*M;s#r#*5;s#r#*7;s#r#*/;s#r#*1;s#r#:9;w#"M;{#*>;*M;s#r#*@;s#r#*B;s#r#*:;s#r#*<;s#r#:D;w#"M;{#|?†ü$É<`ñ!͡*w#w*'6*(6!!ͤ*6#6*6*#s*s#r*s*%6k%&k%}Uk%}rk%&!ͧ*&6{*&6*$6k$&2k&}ʦ!-ͪk%&2?k$ѯg*k&s*$4Ä*%40k'&#*##sk(*###s*%6k%\#ҙ k%&*ksk(&k'k%ѯgWͧk(&2?k'ѯgk%ѯg*6!#ͪ*%4 k'k%ѯgW*sk(*s*%6k%&Ҍ k%&!ͧk%&2?*6k%} k%}% !+ͪ- !|ͪk%&!1ͧk%&#2?+*6k%}n k%}y !+ͪÁ !|ͪ*%4 !!ͧ! é Snake 1.0!ͤ!!ͧ! Length: !ͤ!!"ͧ! Score: !ͤ!!ͧ!  by Lewis Bean!ͤ!!ͧM!B V Highest Score: %05d!ͤ*%6k%&ҭ k%&*k%&*ss*%4j *%6k%& k%&*n} k%&*5n} *#6*%4ö k#}š k&) !3 !n*s#rMnҚ !ͭ|] Ú Ͱ*!s#rM!|‰ *#6Ú *^#Vr+s? !ͭ|! !ͭ>8» > >2 > >4 > >6 > > > ! *6! *6! *6! *6! Çk#}k&* 6k }F* 6Ͱ+*'sk'&#*'sͰ*(sk(&#*(sk'*%sk%k'&Ck(*$sk$k(&##8* nk$&2?k%ѯg*nѯgW|g}os*$4 *%4ó E *%6k%&҄k%&*n}yÄ*%4Ok%&*k'sk%&*k(sk%&*Ͱ#?sͰ #*!s#rk'*%sk%k'&ҋk(*$sk$k(&##Ҁk$&2?k%ѯg*M! ?s*$4-*%4k(&k'&ͧ!ì=====!ͤk(&#k'&ͧM!d?!=%3d=!ͤ*4k#}k}*$6*%6k%&k%&*n}ʵk%&*n}µk%&*n*(sk%&*n*'sk%&k(&k'&ͳ*%4!*#6w*'sw*(sk&Ͷk(&2?k'ѯg*n*%sk%}k(&k'&ͧ!.ͪk%}R/\Ҁ*~#fok%& ?s#r*~#fok%& ?s#r!!)ͧM!ÿ%05d!ͤk(&2?k'ѯg*nk%}*(5*(4k(&2?k'ѯg*nk%}D*'5 *'4*%6k%&үk%&*nk'}¤k%&*nk(}¤ï*%4Uk%&k(&k'&ͳ*&4n& |!͹!!ͧ\#! %3d!ͤ,!͹!!2ͧí MMRM*s#r*w#wM!n?҄*^#Vr+s]Ï!9DM!͌!=͌! ng ͌! ng ͌<!9DM! n&!É$!9DM! n&*! n&*ss! n&! n&!>D !! n&#! n&!jp !! n! s! n! n&! n`is`in! n&##`in&2?! nѯg*6`i4è! 4Å*5!9!9DM! n}#.9DO*(5O*(4O*'5O*'4Ok(}f*(6k(&*(6k'}–*'61ïk'&2گ*'6ÈÉ!9DM͐+|r\**ʹw*'sw*(sk(&k'&ͷ! ͺk(&2?k'ѯg*6w&ͽk'*##sk(*###s\͐*s#r\*ksw*'sw*(sk&ͽk(&k'&ͷ!#ͺk(&2?k'ѯg*6k'*sk(*s-[á!y9DM! `i'͐`i*R!9j õG!i9DM! ^#Vr+s~#fo! s#r͐! s#r! ^#Vr+sn`is{ʒ`in}%|! ! s#r! 6#6! s! s͐n}-! ^#Vr+s! 4͐n&a}! d!! s#r! ^#Vr+sn`is{.]! d! s#r! 4! ^#Vr+sn`is`in&g}DʉUXOCSNf͐~#fo|! ^#Vr+s6-͐͐~#fos#r! ^#Vr+s! 6 ! 6! 6! ~#fo! n&! ^#Vr+s~#fo! ^ѯgs#r! ^#Vr+s! ^#Vr+s~#fos! ^#Vr+s! n}a! 6#6! ^#Vr+s~#fo! s#r͐n}͐|! ^#Vr+s! ^#Vr+sns! ^#Vr+s! ^#Vr+s|͐6! ! s#r! n} ! ^#Vr+s! ! ^#Vr+s6 ͐! ^#Vr+sns{2! ^#Vr+s ! n}c! ^#Vr+s!c! ^#Vr+s6 <y! ^#Vr+s`insÏ! ^#Vr+s`insÙ͐6!9ç!9DM! ^#Vr+sn`is{`in} ͐! ͤ͐`in&ͤ#|!ï!!9 !9DM͐͐ a͐^#Vr+s͐ N͐0V͐7s!&ì͐ ͐͐ ͉͐`is͐ ͐͐ )͐`in&#&ì!9!9DM! n&0ͯ! n&9ͯõ!9DM`iw#w͐~#fon&}7͐ ?͐^#Vr+snѯg`is#r͐>!9Mä!9DM! n&J|t! n&y! n&Ë"!9DM͐+|«! n&͂͐++|! n&!͐ͅ+++|! n&!ͅ! ~#fo##^#Vr+sz!! ~#fo^#Vr+s! ns&!! ~#fo! ~#fo~#fo͈S!! ~#fo##6#6! ~#fo! ~#fos#r! ~#fo^#Vr+s! ns&!9DM! n&aͯ! n&zͯ |"" ! ###""  Wait a few seconds, and type a CR: $7*+++:G_*DM![o&*>Hnn7*|g}o"zg{o"|g7*|DM**ڷ><~# x« ><~+ x|}    _ 7:O*o`7:)~:,"s!"u*|*uʈ*~#_"*s*uˆ#"u*+"Ln&}7͐ ?͐^#Vr+snѯg`is#r͐>!9Mä!9DM! n&J|t! n&y! n&Ë"!9DM͐+|«! n&͂͐++|! n&!͐ͅ+++|! n&!ͅ! ~#fo##^#Vr+sz!! OSNAKE.DOC OSNAKE is a graphic assembly program for the Osborne 1 computer, which was put in the public domain as SNAKE on Capital Osborne Users Group disk OUG.021. It was written by Lewis Bean, who wants this game to get the widest distribution possible. However, he has not permitted the release of the source code. The object of the game is to have the snake eat as many points as possible without touching the border or "snaking back" on itself! That ends the game and a baby snake starts you immediately on a new one. The score of each game is displayed in the upper right corner - the highest score for a session is maintained in the lower right hand corner of the border. To control the movement of the snake, use the 2,4,6 and 8 keys as arrow keys. The ESC key will get you back to CP/M. Have fun! Gerhard Barth December 1983v4Copyright (C) 1983 BORLAND Inc Osborne 1= ()TQRP<~7#~= o&ͦoͦc|ͣ}!!" ~#(}:8= +ͥ*!v-!pͥ*|!!:(=2!-: <2!~!!Y:jO:l:kO:m!ͥ*n! !i45(!+/ 0y0( d!9-!I-[[o&  :(y ͠|( r*"x2y( >28!"9!!>2 0&+!0 [ (!ePWA8Q0G: x@!\w# (   L). )!h6# (*(.(!8}(*(Ww#>?> w#a{ |e}nƐ'@'ý7||}>"C ""*B"[R*"^#V#^#V#N#FO/o&9O/o&9!9(> (G!9 w#EMw}8"RB0 >RRR!+k = R!+k = !+k = !+k = !#k = !+k = T]KB!z> S>))0 = |  DMgo>jB0 7?= H<͡z5)<z {0Gɯgo|| }||/g}/o#}o&K[xAJSJDM!b"!6J"DM'oodo o} $yWj _}8(8J`9{T]=o`9y $͙ >" 8# }>(́ x }} ˸T}ٕ(0D= ,= (  0% , 7 R ?(88 x  - 8˸x   ͠ ,-xG} }م 9 .>#n0  = - nx  ,-(-˸G,- }ٕ? 9.>R 88 ?= u+-(> 08  8R ?x  , 78ƀ8ƀ8ox٨!دoGOW_gɷɷ|لg{ً_zيWyىOxوG|ٔg{ٛ_zٚWyٙOx٘Gxٸyٹzٺ{ٻ|ټx٨u xx( ?}ٽR }ց <( 7 = |٤g{٣_z٢Wy١Ox٠G 8͉ }x>"8}ƀ/ƀó ͙ - }0- ,}l˸k 8 ́ # x(͙ -k 8 -k 8, }l8;*!# ! >8# # 8---͙ ,,,-xGg?+2n*8t z~,->"x"$}.́  ,͙ ́ ! >,.-͙ o&0%͔,# ͙ }g }؉}颋.:}8c~I$I~L*.ٷx˸́ }0G,\<}͔,-(- ! >0 $# o8 Á >"m.`1pF,t6|!wS<.z}[|%FXc~ur1}ٯx(<˸k 8́ !~Jk 0ͺO!Z>k 8 =  ͙ # ͙ ́ ͺ͙ 0 - OT0 j oD,:j !I}袋.}8c~I$I~L!>8# # ͙ # = Ù nf^VNF!DLT\I!!53!r1!!> x #-= o˸x(-͙ }(x>8( , `i!>"| | >)=|(DMbo˸y88yx(0 8> x(>-q{(ay(oe z(>.q (o =e{>Eq>+|(|Dg>-q|/ 0:p# ~# +>0w#,-  60# ˸}րogM͇| .( = ~> x0w#xG% % ZJDM% = _~65(+~hìx-Sx9?+{Η@}|  gZJDM0 ,7}o˸ #yO!@9i&  #w#/w#w#!9! E9!!9~(+FM!"9!(#>2*u"|>":( E *6#w*6#6 !\$!u[ (W( #:~CONTRMKBDLSTAUXUSR>2ͭ*#~ u*:> >w###6Õ  #6++p>2Su:*6###ww#w$w#w: ͳ##N#F*B>w#w#[s#rò>2u*6 #-Nw#Fwq#p#6#w#w#w͞* :( Q: *^ F* < >26"~^*-w#ww#Ͳ^"~ <@*u!\  >2*|>! * \$\<(!: [1Á\!(f"́> 2:!"F( #~#6$>!"N>!~8>O6*"w (=(&("( :( 8y(~#ͽ7+ (6*#~́*#~ *~(h#"b=  8ͽ ̶J= B== ͯ}8= ͵}/l !*###~-_~(46*>2>*##w:>*##~*#~(E͋ ( ( ( ͕!] ( ( ((w#(͕́̕6!]~-#8~>7́ Õ͕>O*{͍̈́s #r*{/͍ d͋ ͕ (( #w(͕́̕q*#~ʶ (͕́ ͕ Õ*##~6[O*#~(08ʦ=ʦ==ʩ=ʬò+###~-_q46`>*:4^q}Q*|(|( 6-#Sy[R8 (G> QC~Q#*ͳyC!' !+TRUEFALSEy!9^#~#(G~Q#> Q> Q "F!(#R0ͳ*4#4>R *4 #4(Ͳ>>2*V(/˖:(#~+ x y!t( =( X:(R*:(###~-_-K< =>:("^"*^˞*V˖0 SѷR8A* N#F#s#r 0})jS\*###w* N#FB ^r+s>!T]>)j)0 0= R!#*^#V#N#F#^#V>">!2DM"~ʲx(L* :O(o:" C}=( ?*-N#Fp+qq#p! * F+N+++V+^Bq#p>>>SѷR* s#r$ s#r*"[R0s#r>"[^#VS!9[R8[R>O"w2x2!"" ͵*>2"!"""!\u*: ͭ!~6go(\R*s#r_2x( s x(T]DMR0 -a%Ù}Wo*!~6o&͠|ͣ}^C User break1: I/O Run-time error e, PC=[R"` Program aborted*1!`!";nͅÀ:""!*s#r!*s#r!! z"!!)))))))!*͇!R+n&!E*^#V!*s#r*#ÿ!!z}"!!)))))))!*͇+n&!Et*^#V!*s#r*#(!!͔!}2*!r*!7}oE!}2!4"!}2%*!r*!7}oE!}2!"!}2%*!r*!r}oE%!}2*&!!)))))))!+! s!!)))))))!+!s!!)))))))!+!s!!)))))))!+!s!!)))))))!+!s!!)))))))!+!s!!)))))))!+!s!!)))))))!+!s!!)))))))!+!s!!)))))))!+!s!!)))))))!+!s!!)))))))!+!s6!2"! "*&Eu#!!@(Translated into Pascal by Charles Hansen!!@#from the program by Peter H. Kelley!! @)in The Portable Companion(April/May,1983)!! @Do you want directions(Y/N): !͚*&!YEu#6!!@$Ducks will fly back and forth across!!@&the screen at random heights. You can!!@*fire at the ducks by pressing number keys.!! @'1 fires almost horizontally to the left!! @'and 5 fires vertically. 9 fires almost!!@*horizontally to the right. Greater angles!!@score more points.!!@Press RETURN to continue.!͚6!! @ Enter a number to set DUCK speed! ! @1 is slow - 5 is fast! !@***** Speed: !ͬ*&!!.!}oEM$!*!*&͇R"S$!"6!!+!! zʯ$"!!)))))))!*͇!R+!s*#n$!! z$"!!)))))))!*͇!R+! s*#ú$!!z>%"!!)))))))!*͇+!s*#%!!zʁ%"!!)))))))!*͇+! s*#I%!!4zʼ%"!!)))))))*+!s*#Ì%!}2!}2!d"!"!"!}2!}2!}2!"!!)))))))!+! s!!)))))))!+!s!!)))))))!+!s!!)))))))!+!s!!)))))))!+! s!!)))))))!+! s!!)))))))!+! s!!)))))))!+! s!!)))))))!+! s!!)))))))!+!s*!!)))))))!+! s!!)))))))!+!s!!)))))))!+!s!!)))))))!+!s!!)))))))!+! s!!)))))))!+! s*!!)))))))!+! s!!)))))))!+!s!!)))))))!+!s!!)))))))!+!s!!)))))))!+! s!!)))))))!+! s!!)))))))!+! s!!)))))))!+! s*!!)))))))!+! s!!)))))))!+!s!!)))))))!+!s!!)))))))!+!s!!)))))))!+!s!!)))))))!+! s!!)))))))!+! s!!)))))))!+! s!!)))))))!+! s*!!)))))))!+! s!!)))))))!+!s!!)))))))!+!s!!)))))))! +!s!!)))))))!+! s!!)))))))!+! s!!)))))))!+! s*!!)))))))!+!s!!)))))))!+!s!!)))))))!+!s!!)))))))!!+!s!!)))))))!+!s!!)))))))!+!s!!)))))))!+! s!!)))))))!+! s!!)))))))!+! s!!)))))))!+! s!!)))))))!+! s!!)))))))! +! s*!!)))))))!+!s!!)))))))!+!s!!)))))))!+!s!!)))))))!+!s!!)))))))! +!s!!)))))))!"+!s!!)))))))!+! s!!)))))))!+! s!!)))))))!+! s!!)))))))!!+! s!!)))))))!+! s!!)))))))!+! s*!!)))))))!+!s!!)))))))!+!s!!)))))))!+!s!!)))))))!+!s!!)))))))!!+!s!!)))))))!#+! s!!)))))))!+! s!!)))))))!+! s!!)))))))!+! s!!)))))))!+! s!!)))))))! +! s!!)))))))!"+! s*!!)))))))!+! s!!)))))))!+!s!!)))))))!+!s!!)))))))!+!s!!)))))))!"+!s!!)))))))!$+!s!!)))))))!+! s!!)))))))!+! s!!)))))))!+! s!!)))))))!+! s!!)))))))!!+! s!!)))))))!#+! s*!!)))))))!+! s!!)))))))! +!s!!)))))))!+! s!!)))))))!+!s!!)))))))!+! s!!)))))))!"+! s!!)))))))!#+!s!!)))))))!$+! s!!)))))))!%+!s*!!)))))))! +! s!!)))))))! +!s!!)))))))!+! s!!)))))))!+!s!!)))))))!#+! s!!)))))))!#+!s!!)))))))!%+! s!!)))))))!&+!s*!!)))))))! +!s!!)))))))! +! s!!)))))))!&+! s!!)))))))!'+! s*!!)))))))! +!s!!)))))))! +! s!!)))))))!'+! s!!)))))))!'+! s}2}2*&!}2!}2*!*&)))))))*&+! s*&!}2!*&)))))))*&+! s*&!Eg4*&!E>4%!}2!}2!}2g4!*&)))))))*&+! s!}2*&Eʦ3}2!}2!}2*&*&Eʯ4*&!}2ÿ4!}2*&}2*&!JE6*!R"!!! ͱ*!͵@ SHOTS REMAINING !*&͇!R"!"!"*!*)))))))*+! s*!R"!*!*R͇! ͡"*!^*!^}o*!5r}oE5!*)))))))*+!*s5!}2**E6**E6**&!R ! ͇! "!#!@ SCORE: *!͵! ͱ!}2!*)))))))*+! s!}2*&Eʝ6!4"ã6!"!ͱ*&}o}2!"*&*&}oE:5*&*!r}oE6**͂3!"|*!*)))))))*+! s*&*!47}o*&}o*!J}o}oEʄ7+!}2!"*&}o}278*&Eʻ7*!"!*)))))))*+!s7*!R"!*)))))))*+! s͠E78!o&!0R"|*|!! .*!^}oE78*|r4!}2w**!Eʫ8*!Er8%!}2è8!"*&Eʎ8!4"Ô8!"*&}o}2!}2wî86*&*w&}oE?8!p!n͔!! *!^Eʴ9@YOU HAD *p*n!͵@ TREES REMAINING WORTH *p*n!͇!͵@ POINTS!!@***** YOUR TOTAL SCORE WAS *!*p*n͇!͵@ *****!!9@/***** SCORE ZERO - YOU BOMBED OUT !!! *****O!!!}2! 6!! @ *** PLAY ANOTHER GAME ??(Y/N): !r͚*r&!Y*r&!y}oEx:!}2:!}2*&}2!}2!}2͔ *!^*&}o}oE;!}2*!7E:~E:!":88;*&}oE;6:Ý:8*&Eʚ:*&}26r^*&}o}oEʗk!}2*!7ERl~ERl!":88:*&}oEʗk6:78*&Eʻ7*!"!*)))))))*+!s7*!R"!*)))))))*+! s͠E78!o&!0R"|*|!! .*!^}oE78*|r4!}2w**!Eʫ8*!Er8%!}2è8!"*&Eʎ8!4"Ô8!"*&}o}2!}2wî86*&*w&}oE?8!p!n͔!! *!^Eʴ9@YOU HAD *p*n PROGRAM DUCK; CONST MAX_SHOTS = 4; (* MAXIMUM SHOTS IN ONE DIRECTION *) VAR SCREEN : ARRAY[0..31,1..128] OF CHAR ABSOLUTE $0F000; ALL_DONE : BOOLEAN; (* ALL DONE PLAYING *) B_COUNT : INTEGER; (* REMAINING SHOTS *) CONCHAR : CHAR; (* Y OR N FOR DIRECTIONS *) CUR_DIR : BYTE; (* CURRENT DIRECTION *) DUCK_COL : INTEGER; (* CURRENT DUCK COLUMN *) DUCK_ROW : INTEGER; (* CURRENT DUCK ROW *) DIR_CTR : BYTE; (* NUMBER OF SHOTS IN CURRENT DIRECTION *) DUCK_DONE : BOOLEAN; (* DONE WITH CURRENT DUCK *) FWD : BOOLEAN; (* DUCK MOVING FORWARD *) FIRST : BOOLEAN; (* FIRST GAME *) GAME_END : BOOLEAN; (* END OF GAME *) OLD_WIDTH : BYTE; (* 0=52,3=80,1=104 *) POINTS : INTEGER; (* CURRENT SCORE *) I : INTEGER; (* LOOP INDEX *) TIME1 : INTEGER; (* FOR EXPLOSION *) TIME2 : INTEGER; (* FOR DUCKS *) TIME3 : INTEGER; (* FOR BOMBS AND BULLETS *) WIDTH : BYTE ABSOLUTE $E1A5; PROCEDURE TREECOUNT(VAR TREECOUNT_L,TREECOUNT_R : INTEGER); VAR I : INTEGER; BEGIN (* TREECOUNT *) TREECOUNT_L := 0; TREECOUNT_R := 0; (* COUNT TREES ON LEFT *) FOR I := 1 TO 11 DO IF SCREEN[21,2*I-1] = CHAR(0) THEN TREECOUNT_L := TREECOUNT_L + 1; (* COUNT TREES ON RIGHT *) FOR I := 15 TO 26 DO IF SCREEN[21,2*I] = CHAR(0) THEN TREECOUNT_R := TREECOUNT_R + 1; END; (* TREECOUNT *) FUNCTION TREES : BOOLEAN; VAR COUNT_L : INTEGER; COUNT_R : INTEGER; BEGIN (* TREES *) TREECOUNT(COUNT_L,COUNT_R); TREES := TRUE; (* IF TREECOUNT LOW SET DIRECTION OF DIVEBOMBER *) IF (COUNT_R < 6) AND (COUNT_L >=6) THEN BEGIN FWD := FALSE; DUCK_COL := 52; TREES := FALSE END ELSE IF (COUNT_L < 6) AND (COUNT_R >= 6) THEN BEGIN FWD := TRUE; DUCK_COL := 1; TREES := FALSE END ELSE IF (COUNT_L < 6) AND (COUNT_R < 6) THEN TREES := FALSE END; (* TREES *) PROCEDURE BLIND; BEGIN (* BLIND *) SCREEN[20,24] := CHAR(10); SCREEN[20,25] := CHAR(150); SCREEN[20,26] := CHAR(150); SCREEN[20,27] := CHAR(8); SCREEN[21,25] := CHAR(128); SCREEN[21,26] := CHAR(128); SCREEN[22,25] := CHAR(150); SCREEN[22,26] := CHAR(150); SCREEN[21,24] := CHAR(128); SCREEN[21,27] := CHAR(128); SCREEN[22,24] := CHAR(150); SCREEN[22,27] := CHAR(150); END; (* BLIND *) PROCEDURE INIT; VAR SPEED : BYTE; (* FOR DUCK SPEED *) BEGIN CLRSCR; TIME1 := 50; TIME3 := 10; IF FIRST THEN BEGIN GOTOXY(6,6); WRITE('Translated into Pascal by Charles Hansen'); GOTOXY(6,8); WRITE('from the program by Peter H. Kelley'); GOTOXY(6,10); WRITE('in The Portable Companion(April/May,1983)'); GOTOXY(6,12); WRITE('Do you want directions(Y/N): '); READ(CONCHAR); IF UPCASE(CONCHAR)='Y' THEN BEGIN CLRSCR; GOTOXY(1,4); WRITE('Ducks will fly back and forth across'); GOTOXY(1,6); WRITE('the screen at random heights. You can'); GOTOXY(1,8); WRITE('fire at the ducks by pressing number keys.'); GOTOXY(1,10); WRITE('1 fires almost horizontally to the left'); GOTOXY(1,12); WRITE('and 5 fires vertically. 9 fires almost'); GOTOXY(1,14); WRITE('horizontally to the right. Greater angles'); GOTOXY(1,16); WRITE('score more points.'); GOTOXY(1,19); WRITE('Press RETURN to continue.'); READ(CONCHAR) END END; (* IF FIRST GAME *) CLRSCR; GOTOXY(5,10); WRITE('Enter a number to set DUCK speed'); GOTOXY(9,12); WRITE('1 is slow - 5 is fast'); GOTOXY(11,14); WRITE('***** Speed: '); {$I-} READLN(SPEED); {$I+} IF (SPEED IN [1..5]) AND (IORESULT=0) THEN TIME2 := 42 - 6*SPEED ELSE TIME2 := 30; CLRSCR; (* CLEAR SCREEN *) GOTOXY(1,25); (* MOVE CURSOR OFF SCREEN *) BLIND; (* BUILD TREES *) FOR I := 1 TO 11 DO SCREEN[21,2*I-1] := CHAR(0); FOR I := 1 TO 11 DO SCREEN[22,2*I-1] := CHAR(11); FOR I := 15 TO 26 DO SCREEN[21,2*I] := CHAR(0); FOR I := 15 TO 26 DO SCREEN[22,2*I] := CHAR(11); FOR I := 1 TO 52 DO SCREEN[23,I] := CHAR(150); CUR_DIR := 5; DIR_CTR := 0; B_COUNT := 100; DUCK_COL := 1; POINTS := 0; DUCK_DONE := FALSE; FWD := TRUE; GAME_END := FALSE; DUCK_ROW := RANDOM(19) END; PROCEDURE EXPLOSION; BEGIN SCREEN[20,24] := CHAR(10); SCREEN[21,25] := CHAR(150); SCREEN[21,26] := CHAR(150); SCREEN[20,27] := CHAR(8); SCREEN[23,25] := CHAR(32); SCREEN[23,26] := CHAR(32); SCREEN[22,24] := CHAR(32); SCREEN[22,27] := CHAR(32); SCREEN[23,27] := CHAR(10); SCREEN[23,24] := CHAR(8); DELAY(TIME1); SCREEN[19,23] := CHAR(10); SCREEN[20,24] := CHAR(150); SCREEN[20,27] := CHAR(150); SCREEN[19,28] := CHAR(8); SCREEN[22,25] := CHAR(32); SCREEN[22,26] := CHAR(32); DELAY(TIME1); SCREEN[18,22] := CHAR(10); SCREEN[19,23] := CHAR(150); SCREEN[19,28] := CHAR(150); SCREEN[18,29] := CHAR(8); SCREEN[21,25] := CHAR(32); SCREEN[21,26] := CHAR(32); SCREEN[21,24] := CHAR(32); SCREEN[21,27] := CHAR(32); DELAY(TIME1); SCREEN[16,20] := CHAR(10); SCREEN[18,22] := CHAR(150); SCREEN[16,30] := CHAR(8); SCREEN[18,28] := CHAR(150); SCREEN[19,27] := CHAR(150); SCREEN[20,24] := CHAR(32); SCREEN[20,27] := CHAR(32); SCREEN[19,28] := CHAR(32); SCREEN[18,29] := CHAR(32); DELAY(TIME1); SCREEN[14,18] := CHAR(10); SCREEN[16,20] := CHAR(150); SCREEN[16,30] := CHAR(150); SCREEN[14,32] := CHAR(8); SCREEN[19,23] := CHAR(32); SCREEN[19,27] := CHAR(32); SCREEN[20,25] := CHAR(32); DELAY(TIME1); SCREEN[15,17] := CHAR(21); SCREEN[17,19] := CHAR(150); SCREEN[19,21] := CHAR(150); SCREEN[15,33] := CHAR(25); SCREEN[17,31] := CHAR(150); SCREEN[19,29] := CHAR(150); SCREEN[14,18] := CHAR(32); SCREEN[16,20] := CHAR(32); SCREEN[18,22] := CHAR(32); SCREEN[18,28] := CHAR(32); SCREEN[16,30] := CHAR(32); SCREEN[14,32] := CHAR(32); DELAY(TIME1); SCREEN[16,16] := CHAR(25); SCREEN[18,18] := CHAR(150); SCREEN[20,20] := CHAR(150); SCREEN[20,30] := CHAR(150); SCREEN[18,32] := CHAR(150); SCREEN[16,34] := CHAR(21); SCREEN[15,17] := CHAR(32); SCREEN[17,19] := CHAR(32); SCREEN[19,21] := CHAR(32); SCREEN[15,33] := CHAR(32); SCREEN[17,31] := CHAR(32); SCREEN[19,29] := CHAR(32); DELAY(TIME1); SCREEN[17,15] := CHAR(8); SCREEN[19,17] := CHAR(150); SCREEN[21,19] := CHAR(150); SCREEN[21,31] := CHAR(150); SCREEN[19,33] := CHAR(150); SCREEN[17,35] := CHAR(10); SCREEN[16,16] := CHAR(32); SCREEN[18,18] := CHAR(32); SCREEN[20,20] := CHAR(32); SCREEN[20,30] := CHAR(32); SCREEN[18,32] := CHAR(32); SCREEN[16,34] := CHAR(32); DELAY(TIME1); SCREEN[18,14] := CHAR(10); SCREEN[22,18] := CHAR(150); SCREEN[20,16] := CHAR(150); SCREEN[22,31] := CHAR(150); SCREEN[20,34] := CHAR(150); SCREEN[18,36] := CHAR(8); SCREEN[17,15] := CHAR(32); SCREEN[19,17] := CHAR(32); SCREEN[21,19] := CHAR(32); SCREEN[21,31] := CHAR(32); SCREEN[19,33] := CHAR(32); SCREEN[17,35] := CHAR(32); DELAY(TIME1); SCREEN[18,14] := CHAR(32); SCREEN[19,13] := CHAR(21); SCREEN[20,16] := CHAR(32); SCREEN[21,15] := CHAR(150); SCREEN[22,18] := CHAR(32); SCREEN[20,34] := CHAR(32); SCREEN[21,35] := CHAR(150); SCREEN[18,36] := CHAR(32); SCREEN[19,37] := CHAR(25); DELAY(TIME1); SCREEN[19,13] := CHAR(32); SCREEN[20,12] := CHAR(25); SCREEN[21,15] := CHAR(32); SCREEN[22,14] := CHAR(150); SCREEN[21,35] := CHAR(32); SCREEN[22,35] := CHAR(150); SCREEN[19,37] := CHAR(32); SCREEN[20,38] := CHAR(21); DELAY(TIME1); SCREEN[21,12] := CHAR(8); SCREEN[20,12] := CHAR(32); SCREEN[20,38] := CHAR(32); SCREEN[21,39] := CHAR(10); DELAY(TIME1); SCREEN[22,12] := CHAR(8); SCREEN[21,12] := CHAR(32); SCREEN[22,39] := CHAR(10); SCREEN[21,39] := CHAR(32); END; (* EXPLOSION *) PROCEDURE BOMB(B_ROW, B_COL : BYTE); VAR BDONE : BOOLEAN; (* DONE WITH THIS BOMB *) BEGIN (* BOMB *) B_ROW := B_ROW + 1; BDONE := FALSE; REPEAT (* UNTIL BOMB HITS *) DELAY(TIME3); SCREEN[B_ROW,B_COL] := CHAR(32); B_ROW := B_ROW + 1; SCREEN[B_ROW,B_COL] := CHAR(13); IF B_ROW = 22 THEN (* BOMB HIT *) IF B_COL = 26 THEN (* AMMO HIT *) BEGIN EXPLOSION; GAME_END := TRUE; DUCK_DONE := TRUE; BDONE := TRUE; END (* AMMO HIT *) ELSE (* TREE HIT *) BEGIN SCREEN[B_ROW,B_COL] := CHAR(32); BDONE := TRUE; END; (* TREE HIT *) UNTIL BDONE; END; (* BOMB *) PROCEDURE FIRE(DIR : BYTE); VAR BLT_COL : INTEGER; (* BULLET COLUMN *) BLT_ROW : INTEGER; (* BULLET COLUMN *) FACTOR : INTEGER; (* ADJUSTMENT FACTOR FOR COLUMN DIRECTION *) HIT : BOOLEAN; (* DUCK WAS HIT WHEN TRUE *) MISS : BOOLEAN; (* BECOMES TRUE IN TOP ROW *) BEGIN (* FIRE *) HIT := FALSE; MISS := FALSE; IF DIR = CUR_DIR THEN (* COUNT REPEAT SHOT *) DIR_CTR := DIR_CTR + 1 ELSE BEGIN (* NEW DIRECTION *) DIR_CTR := 1; CUR_DIR := DIR END; IF DIR_CTR <= MAX_SHOTS THEN BEGIN B_COUNT := B_COUNT - 1; GOTOXY(1,24); WRITE(' ',B_COUNT,' SHOTS REMAINING '); FACTOR := 6 * DIR - 30; BLT_ROW := 19; BLT_COL := 26; REPEAT (* UNTIL HIT OR MISS *) (* MOVE BULLET *) DELAY(TIME3); SCREEN[BLT_ROW,BLT_COL] := CHAR(32); BLT_ROW := BLT_ROW - 1; BLT_COL := 26 + FACTOR*(19-BLT_ROW) DIV 10; IF (BLT_ROW > -1) AND (BLT_COL > 0) AND (BLT_COL < 53) THEN SCREEN[BLT_ROW,BLT_COL] := '*' ELSE MISS := TRUE; (* CHECK FOR HIT *) IF BLT_ROW = DUCK_ROW THEN BEGIN IF BLT_COL = DUCK_COL THEN BEGIN  (* COUNT HIT - GET NEW DUCK *) POINTS := POINTS + ABS(DIR - 5)*10 + 10; GOTOXY(35,24); WRITE(' SCORE: ',POINTS,' '); HIT := TRUE; SCREEN[BLT_ROW,BLT_COL] := CHAR(32); DUCK_DONE := TRUE; IF FWD THEN DUCK_COL := 52 ELSE DUCK_COL := 1; WRITE(CHAR(7)); FWD := NOT FWD; DUCK_ROW := RANDOM(22) END (* IF BLT_COL *) END (* IF BLT_ROW *) UNTIL (HIT OR MISS); IF (MISS) AND (DUCK_ROW < 20) THEN BOMB(DUCK_ROW,DUCK_COL); END; (* IF DIR_CTR *) END; (* FIRE *) PROCEDURE MOVEDUCK; VAR DIR : INTEGER; (* DIRECTION FOR PROCEDURE FIRE *) BEGIN (* MOVEDUCK *) DIR := 0; DELAY(TIME2); SCREEN[DUCK_ROW,DUCK_COL] := CHAR(32); IF ((FWD) AND (DUCK_COL >= 52)) OR ((NOT FWD) AND (DUCK_COL <= 1)) THEN BEGIN (* NEW DUCK *) BLIND; DUCK_DONE := TRUE; DUCK_ROW := RANDOM(22); FWD := NOT FWD END ELSE BEGIN (* MOVE THE DUCK *) IF FWD THEN BEGIN DUCK_COL := DUCK_COL + 1; SCREEN[DUCK_ROW,DUCK_COL] := CHAR(8) END ELSE BEGIN DUCK_COL := DUCK_COL - 1; SCREEN[DUCK_ROW,DUCK_COL] := CHAR(10) END; IF KEYPRESSED THEN BEGIN DIR := BIOS(2) - INTEGER('0'); IF (DIR IN [1..9]) AND (B_COUNT > 0) THEN FIRE(DIR) END END(* ELSE - MOVEDUCK *) END; (* PROCEDURE MOVEDUCK *) PROCEDURE DBOMBER; VAR DB_DONE : BOOLEAN; (* DONE WITH DIVE BOMBER *) BEGIN (* DBOMBER *) DB_DONE := FALSE; REPEAT (* UNTIL END OF GAME OR END OF DIVEBOMBER *) DELAY(TIME2); IF DUCK_COL = 26 THEN BEGIN IF DUCK_ROW = 21 THEN BEGIN EXPLOSION; GAME_END := TRUE END (* IF DUCK_ROW *) ELSE BEGIN DUCK_ROW := RANDOM (21); IF FWD THEN DUCK_COL := 52 ELSE DUCK_COL := 1; FWD := NOT FWD; DB_DONE := TRUE END (* ELSE *) END (* IF DUCK_COL *) ELSE MOVEDUCK UNTIL GAME_END OR DB_DONE; END; (* DBOMBER *) PROCEDURE FINISH; VAR ACHAR : CHAR; COUNT_L : INTEGER; COUNT_R : INTEGER; BEGIN TREECOUNT(COUNT_L,COUNT_R); GOTOXY(3,12); IF POINTS > 0 THEN BEGIN WRITE('YOU HAD ',COUNT_L+COUNT_R,' TREES REMAINING WORTH '); WRITE((COUNT_L+COUNT_R)*5,' POINTS'); GOTOXY(4,14); WRITE('***** YOUR TOTAL SCORE WAS ',POINTS+5*(COUNT_L+COUNT_R),' *****'); GOTOXY(1,25) END (* IF POINTS *) ELSE BEGIN WRITELN('***** SCORE ZERO - YOU BOMBED OUT !!! *****'); GOTOXY(1,25) END; FIRST := FALSE; DELAY(3000); CLRSCR; GOTOXY(2,12); WRITE(' *** PLAY ANOTHER GAME ??(Y/N): '); READ(ACHAR); IF (ACHAR = 'Y') OR (ACHAR = 'y') THEN ALL_DONE := FALSE ELSE ALL_DONE := TRUE END; (* FINISH *) BEGIN (*DUCK*) (* CHANGE TO 52 COLUMNS - SAVING OLD WIDTH *) OLD_WIDTH := WIDTH; WIDTH := 0; INLINE ($CD/$E4E5); (* CALL BIOS AT THIS ADDRESS *) FIRST := TRUE; REPEAT INIT; WHILE (B_COUNT > 0) AND (NOT GAME_END) DO BEGIN DUCK_DONE := FALSE; (* IF DIVEBOMBER *) IF (DUCK_ROW >= 20) THEN BEGIN IF TREES THEN (* TREES OK *) DUCK_ROW := RANDOM(22) ELSE (* LOW ON TREES *) DBOMBER END (* IF DUCK_ROW *) ELSE (* NOT DIVE BOMBER *) WHILE NOT DUCK_DONE DO MOVEDUCK END;(* WHILE *) FINISH; UNTIL ALL_DONE; (* CHANGE TO OLD WIDTH *) WIDTH := OLD_WIDTH; INLINE ($CD/$E4E5); (* CALL BIOS AT THIS ADDRESS *) CLRSCR; END.OUT !!! *****'); GOTOXY(1,25) END; FIRST := FALSE; DELAY(3000); CLRSCR; GOTOXY(2,12); WRITE(' *** PLAY ANOTHER GAME ??(Y/N): '); READ(ACHAR); IF (ACHAR = 'Y') OR (ACHAR = 'y') THEN ALL_DONE := FALSE ELSE ALL_DONE := TRUE END; (* FINISH *) BEGIN (*DUCK*) (* CHANGE TO 52 COLUMNS - SAVING OLD WIDTH *) OLD_WIDTH := WIDTH; WIDTH := 0; INLINE ($CD/*K͞+5'+FÎr ͖ 8{ Ăw#w#w^#V#*~#fo^#*~#fo^#V#*n^#*n^#V# ~#fo^#& ~#fo!+!#!+!#!+!+}|z{|}|z7||7zZZ)|/g}/o#|͉k|/g}/o#ɯ2qZZk:q|/g}/o#|/g}/o#:q<2qqDM!xxGyO҃)v|͔`i|)Öxڷz/W{/_ѯzW{_=yOxGæ2qZZ͉M|}ȯ|g}o)|/g}/o#z/W{/_!9~#fo! ! ! ! ! ! !9~#A"s!`*"!"!Y">2>2>22!"!"!@"!" ʞ!F#x±~#±!b2r~# "2r+}|~#G:rx"2r+w# +6#!6#2w2x*s!>r<o&F=-` r'~h6!+`W?_!~7z?` :>ª@w#G.¶ww#?*>?w#> w#.7:77!a{   `OE!y6$ -7rBo&))T])))!y|g}os! ~#fos#r!*&#kG*&! s#r! n*ѯgW+! s! ~5o}F͐n&|g}o|͐n&|g}os! n! nѯgWsF͐n&|g}os! ~#fos#r*&kG*&+! s#r*&+! nѯg`is`i~5o}͐n&|g}o|͐n&|g}os! n`inѯgWs! ^#Vr+sn&|g}os}*&kG*&#! s#r! n*ѯgW+`is`i~5o}ʆ͐n&|g}o|f͐n&|g}os! n`inѯgWsÆ! ^#Vr+sn&|g}os*&+kG!9DM! ! s#r͐|K! ^#Vr+s͐~#fon}-͐~#fo#n}S͐~#fo##n}!̀4͐~#fon#|8͐~#fo!& !͐~#foQs 3! 6|ž;!* |қ! ~4o&@|g}o|ʘ!!"ÛͶ!WͶ!}2*} !!X!! !7 f! ,|͍!!N 3 ͟"Q!9(C) 1982, Dan SundayCan't find "%s" File to save game in: Try using a new diskette in drive B:!9DM!["!![!u!>2>2!""!"" {2{2 {2{2{2&"!"{25{23{24{22{21{20{2>{2<{2;{2:{29{27{2={26{2?{2F{2E{2D{2C{2B{2A{2@>2>2! "! "! "!3 "!O "!k "! ">2>2>2>2͍͝! ! !ͫͲ! !!ͫ! !!ͫ! !!ͫ!9 !!ͫ!` !! ͫ! !! ͫ! !! ͫ! !! ͫ! !!ͫ۲! !!ͫ!! !ͫ! ! !ͫ>2!?!!ͫ*}» |¦ ;Ø !U! !Ð ͍!K!! m"ͥ!9?BKJHSWZLGECRONMFTVAYQIXUPD?000010031001100Z2110000040?123456789:;<=>?@ADMZakpz~~?1223334345547666367489==???89;=ADGJLMaAPQRSEVWAKafm~z?23457897=8J9AKCMOPD7QazZ~~BCDEFGHIJKLMANPOLFPKHQRSPWT!! USER SUPPORTED SOFTWARE !!Please give free copies of this programto your friends. This program may notbe sold for profit without permission ofthe author. If you use and enjoy thisprogram, please send a donation to theprogramming efforts of:Dan Sunday7272 Candleshine CourtColumbia, MD 21045What name will you use in this adventure ?Copyright (C) 1982, Dan Sunday.All Rights Reserved Worldwide.Type Name: You are entering the lost city !!!!x9DM!͐`is#rz–!#͐! s#r!! ͐++|ʿ! 6! ! s#r! ~5o}͐͐! ^#Vr+s! ^#Vr+snsâ͐͡!#!9!9DM͐ n}D!͐ ͤ`is#r͐! s#r͐͐ Ҿ!͐͐̿+|ʩ!3͐͐͡ !! ~#fos#r_͐͡!!9Diskette Full!9DM!"0`i6`in&|`in&)))))06`i4!!!!!!!!!͡!9!! !!!(!/!;!F!͡!9!O!W!b!l!v!}!!!͡!9!!!!!!!!!͡!9!!!!&!,!1!8!<!͡!9!D!U!`!k!v!!!!͡!9!!8Gtrap detection!NXdexterity!_esleep!lvpolymorph!}Èdrain life!×healing!çstriking! ͡!9!beacon!beacon!lantern!lantern!flashlight!torch!flare!")candle! ͡!9!>Kregeneration!R^aggravation!essee invisible!zÉslow digestion!Ûprotection!êstealth!ÿteleportation!power! ͡!9!eternal light!genocide monster!sustain power!#2trap detection!9Kprevent confusion!Rarepel monsters!hwpreserve skill!~Ïeternal darkness! ͡!9`i6`in&|! 6! n&|`in&)))))2! n&))w#w! 4ö`i4â!purple! black!white! 'orange!.4green!;?red!FKblue!RYyellow!ͧ!9!nvancient!}Äsealed!Ôcrumpled!äofficial!ópapyrus!egyptian!manilla!dead sea!ͧ!9!glass! copper!teak!'mahogeny!.5bronze!<Bmaple!IOsteel!VZoak! ͧ!9!owdiamond!~Æemerald!Ösapphire!æplatinum!òjade!þgold!silver!turquoise! ͧ!9!crescent!star shaped!diamond!$.snowflake!5:oval!AGround!N[heart shaped!bnpear shaped! ͧ!9!9 \$+"%&}^|*=!@a monster pita nerve gas trapa space warpa hammer trapa poison needle trapa chutea tax trapquicksanda steaka pizzaa hamburgera sandwicha tacoa milkshakean eggrollan appleamnesiagain skillconfusionquicknesspoisonrestore powergain powerhealingremove cursemapstrengthen weaponstrengthen armorteleportationmagic detectiongold detectionidentityplate mailtungstenmagnesiumsteelironbronzetinleathertwo-handed swordlong swordbattle axewar hammershort swordmacehand axeclubenchantment!9DM! n&)))))2##͐s#r! n&)))))2##͐s#r! n&)))))2##͐ s#r! n&)))))2 ##͐ s#r! n&)))))2##͐s#r! n&)))))2##͐s#r! n&)))))2##͐s#r! n&)))))2##͐s#r!9DM`i6! 6! 6! 6! 6! 6! 6! 6! 6! ~5o}n;! s! n&|g}o! s! n&|g}o! s! n&`in! s! n&`i! n&`ins! n&`i! ns! n&)))))2`in&))͐s#r! n&)))))2! n&))͐s#r! n&)))))2! n&))͐s#r! n&)))))2! n&))͐s#r! n&)))))2! n&))͐s#r! n&)))))2! n&))͐s#r! n&)))))2! n&))͐s#r! n&)))))2! n&))͐ s#r! 9!9DM0`is#r! 6@! ~5o}͐͐#͐###sss`i^#V!r+sû! s#r! 6! ~5o} ! ^#Vr+s6>2!Z>2,>2>28;|g}o! s! n}29>2:! n&##}2;! n&##}2>2*>2>2<;|g}o! s! n}2=>2>! n&##}2?>2+>2)>2> 2@>2A>2B{2{2C>2 >2{2/{2.{2-!9!"͝!!!ͫ!! !ͫ!#!!ͫ!)! !ͫ!0!(!ͫ!6!.!ͫͲ!=!!ͫ*|ک!"! !*UMI*&|>d2! !*&!0!R۲!D!!m"Ͷ!GOLDARMORPOWERENERGYSKILLWISDOMLevel *|n*#"*"N*|*|ڈ!'"! !*!!R!0!*!!R! !*!!R*&|>d2! !*&! !R*&|)>d2! !*&!!R*&|]>2! !*&!!R!/!"!t*&|ڠ>2! !*&!#!R!9DM*|!}"! 6  ! 6*`is#r͐| ! 4`i~#fos#r! !*!(!R! n*}I {!! n&# ?;|g}o! s#r! n*ѯgW !!3*͐ҩ ͐}2 *;|g}o}2**&}2&!!!3*͐!͐}2&!*;|g}o}2! n}2*&|B!>d2! !*&!0!R**ѯgWx!*}2I!9You are wiser than before.Your wisdom decreases.*7|!!"!""* |!!"!""*|!!"!""!!"FAINTINGSTARVING HUNGRY !9DM͐|?"͐`is#rH"!d"`is#r͐!!ͭ!9 !9DM͐! n&! n&ͫ!!!9DM!3! s! s! s`is*&'}2*}7-#8:# :#9A#4N#N#6W# W#1`#2o# o#3x#5ʇ#\ʐ#/ʐ#%7%=%`i6! 6C%`i6C%`i6! 6C%! 6C%! 6C%! 6! 6C%! 6C%! 6! 6C%e)͘*Ø(*&3k*&n! s! n&@|g}o|#! n&?|g}o))0n}#!(3Ø(*}\$*| $!(3Ø(*#"?$*}4$*+"|1$!̀4?$!(3Ø(**S$*"͍*}\¥$!(!! ͫ! )!!ͫ!)!!ͫ!!$! )!! ͫ!.)!! ͫ!1)!!ͫ!!3>2{20{22{21Ø(!@)!!ͫY|,%!̀4!3Ø(Ø(p-Ø(*3}ʴ%;|g}o`is;|g}o! s;|g}o! s;|g}o! s`in! n}´%! n! n}´%C%*! nѯgW`inѯg3k*! nѯgW! nѯg! s#r͐n&@|g}o|'&͐n&|g}o|]'`in}s&*&+3k*&n! s!@|g}o|s&! n&|g}o|]'! n}&*&#3k*&n! s!@|g}o|&! n&|g}o|]'! n}'*&3k*&+n! s!@|g}o|'! n&|g}o|]'! n}n'*&3k*&#n! s!@|g}o|n'! n&|g}o|n'*3}k'C%n'Ø(e)||'͘*Ø(͐n&@|g}o|'͐n& |g}o|'͐n&|g}o*}2͘*Ø(*0}'!T)3Ø(*! n`inѯgW}2*! n! nѯgW}2͐n&@|g}o|r(͐n& |g}o|r(͐n&|g}o|r(͐6!c)*&*&m"!"͐n&@|g}o|ʒ(͘a͘*Ø(!9There are no stairs hereYou can't go down any furtherYou can't go upstairs without the ARKYou are goingdownthe stairs....You are goingupthe stairs....Really QUIT (Y/N) ?You can't move *3}r)!35*4}~)!45*6}ʊ)!65*5}ʴ)!55*5&|ڱ)!Z*3!)*8|);|g}o|);|g}o}25*1}*!15!d*3*}2!*2}%*!25!*3*}2!*7}S*!85n}S*f;|g}o}28!!You faintYou are stuck in quicksandYou are stuck in the Gel!9DM*}ʯ*!5 +z| +*|ͩ**6*!}2*;|g}o}2*.7| +*&}2*.#".*>})+*})+!5H+*}2**ѯgWH+!4I*-}ʹ+*-&))0#n}¹+*-&))0###n}ʉ+*-&))0###5ù+! -3>2B!"*-&))0#6>2@!"*+}2,*.|g}o|2,!5n}2,>2* &|,!#-3!"! 5*&++}2!"*+&))0###* ʯg+s*4&|g}o|U,2r|U,!"*5}¤,*|m,!̀4*;}ʆ,*.|g}o|ʍ,*+"*>}ʤ,*|ʤ,*+"*8|,!<-3>25*+",* |,!P-3*+",*|,!a-3,-!!9Your amulet turns blackYour lamp becomes dimmerYou are FAINTING !!You are STARVINGYou are HUNGRY!9DM*}?-a-c-d-e-l-n.p .r,.t8.u>.wJ.zP.\.͐.w.!3w.8=! sg.XT! sg.VS! sg.!!!)]!H!4w.?Hw.h! sg.W! sg.Dw.͘>! sg.i?w.I! sg.!.3w.! n}w.e)͘*!9Invalid Command!9DM!/! s#r! 0! s#r! 0! s#r!0! s#r!J0! s#r!s0! s#r!0! s#r!0! s#r!0! s#r!1! s#r!"1! s#r!H1! s#r!l1! s#r!1! s#r!1! s#r!1! s#r!2!! s#r!&2!# s#r!K2!% s#r!o2!' s#r!2!) s#r!2!+ s#r!2!- s#r`i6`in&|/`in&)! ~#fo!K`in&ͭ`i4Ù/!H!4!/9 COMMAND AND SYMBOL SUMMARYA = Again (message)C = Carry Lamp \ = Go downstairsD = Drink / = Go upstairsE = Eat ^Q = Quit the gameL = List Pack ^S = Save the gameN = Name ^R = Refresh screenP = Put downR = Read SYMBOLST = Take off \ stairsU = Use Weapon $ goldW = Wear + trapZ = Zap Wand " food % potion NUMERIC KEYPAD & scroll(move in direction) ^ weapon } armor 7 8 9 * lamp \ | / | wand 4 - 5 - 6 = ring / | \ ! amulet 1 2 3 @ the ARK!9DM͐|ʕ33͐!!ͫX!!͐͋#}2`i6#6*`i^#Vr+szb3P3! s#r! ^#Vr+s! ^#Vr+sns{ʒ3l3ê3!!X>2!!!9!9DM*}4! 4!(!ͭ`is`in} 4`in} 4`in}03!9-> MORE....!C4Z4!!|>4/4WaPress RETURN when done!9DM۲͐!T!ͫX!9DM͍! n}«4!""! 6I5ñ4! 6! n}¿4 ;͍۲!::`is#r! n}4!d:`is#r 5! n}4!:`is#r 5! n&͝!h>!eͽP`is#r͐#|h=!A>͐n! s! n&))0n! s*+}ʼ=*+&))0###*&|g}o* ѯg+s! n}2+*+&))0###n}2!"*&|g}o#}2 * &)+}2!"! n&))0##n&|g}os! n&!>͚j3!A>!9Carry what ? (ESC to Cancel) You have no lamps to carryYou're now carrying !9DM!?!!?͐n! s! n&))0n! s! n}2*! n&!W?͚j3!?!9Use which weapon ? (ESC to Cancel)You have no weapons to useYou're now using !9DM!}C!C!gͽP`is#r͐#|™?!tCe)͘*͐n! s! n&))0n! s! n&))0#n! s! n}6@*,}?!C3!tC! n}2,*,&))0###n}2! n&))0##n&|g}os! n} gA*.}_@*/}_@!C3!tC*.}s@! n}2.|@! n}2/! n}ʭ@ʿ@@@@@A`AgA*&###}2gA!74;|g}o}28gA!94gA!:4gA!;4gA!<4*<}A!"gA!=4! 6!7 s#r! ~5o}]A!~#fo͐7n&n}FIA͐76!7 ^#V!r+sAgA!>4gA! n} XC*-}ʈA!D3!tC! n}2-! n}AAAAABB@CXC!">2@!"XC>2AXC>2BXC>2C>23XC>2D!"XC>2EXC!*D3!DD3Y}2F*Fɯg|JB*F&|JBMBB!3*F&mo!sD! ȸ! 3! 6!7 s#r!6 6! ~5o}C*F!~#fo͐7n&n}B͐76͐7##n&3k͐7###n&͐7ns!6 6!7 ^#V!r+sÎB!6 n}C!"!D3>2-͐Cj! n&))06!tC!">2?!"XC! n&!D͚j3!tC!99Wear what ? (ESC to Cancel) You have nothing to wearSorry! You're already wearing ArmorSorry! You're already wearing two RingsSorry! You're already wearing an AmuletThis is a genocide amuletWhich monster (A-Z) do you want to genocide ? The %s no longer exists!The genocide amulet disappears in a puff of smoke!You're now wearing !9DM!G!G!hͽP`is#r͐#|E!âGe)͘*͐n! s! n&))0n! s! n&))0#n! s! n&))0##n&|g}o|oE!G3!âG! 6! n}¸E*,! n}¸E{2{2,! n&!H͚j3!âG! n} ¡F*.! n}E>2.E*/! n}E>2/EcG! 6! n}+F[FgFnFuF|FʓFʚFáF*}XF*&|IF>2UF*&+++}2áF!75>28áF!95áF!:5áF!;5áF!<5*<}F!"áF!=5áF!>5áF! n} cG*-! n}F>2-FcG! 6! n}FGG%G-G=GEGKGcG!">2@!"cG>2AcG>2BcG>2CcG>2D!"cG>2EcG!âG!">2?!"cG! n}†G! n&!H͚j3ÜG! n&!1H͚j3!âG!9Takeoff what ? (ESC to Cancel)You aren't wearing anythingThat's CURSED !! You can't take it off.You took off You aren't wearing You took off !9DM!kI!I!iͽP`is#r͐#|oH!bI͐n! s! n&))0n! s! n&))0#n! s! n} H! n! sH! n} H! ng! sH!I3! n&)))))0! s#r!I!!ͫ!A! ͐͐n}TI! n&)))))2! n&))͐s#r!3!bI!9Name what ? (ESC to Cancel) You don't have anything to nameSorry! You can't name that!Call it: !9DM!O!O! ͽP`is#r͐#|I!äO͐n! s! n&))0n! s! n&))0#n! s! n&))0###! s#r͐ n}jJ!O3!äOoJ͐ 5! 6! n}ʦJfKʢKL N O6OGOiO*&+! s! n*&#cK*&+! s! n*&#[K! n&3k! n&! s#r͐n&@|g}o|5K͐n& |g}o|8KSK͐n&|g}o! 6! 4J! 4òJiO!4*;|g}o}2*}2I>23! 6!P3iO!P3*&+! s! n*&#ڷL*&+! s! n*&#گL! n&3k! n&! s#r͐n&@|g}o|9L͐n& |g}o|25!LAMP -------->ARMOR ------->RIGHT HAND -->LEFT HAND --->AMULET ------> %c.%sUSINGPACK LIST!9DM!!`i6`i~5o}ʏa!H`in&Xpa!9!9DM*&3k*&! s#r͐n&?|g}o`is`in&))0n! s! n}db*`in&))0###n&))))"*|7b*|-b*#"*"M͐6`in&!c͚j3`in&))06éc! n}®b`in&!c͚j3͐n&|g}os`in&))0#n&céc! n}b`in&!c͚j3éc*)&|b!c3éc*)! s! n! n&n&))0nѯgWKc! n&|Kc! n&#! n&ns! 5b! n&|ec`in}2xc! n&#`ins! n} ‹c{>2!)4͐6`in&!c͚j3!9You found You fell into You found Sorry, your pack is fullYou found !9DM͐>d>jd>d>ʁd>+d>d>7d>e>Cd>4e>Od>he>[d>ne>gd>ʳe.f;|g}o}21.f*|ʚd*+"*'"**"*|d*#"*"!7f3M.f*#"͍!Wf! !ͫ!33.f*E}e!yf3.f*}"e.f!5!f3.f*&}2*}2!f3I*}ee!̀4.ff.f*A}ʁe!f3.f*|ʐe*+"**"!f3.f!!͕! s`i6`in! nѯgW#f*! s*! s! ! g|f̚! n&! n&v`i4e!".f!9The IRS takes some of your goldYou are falling down a chute.....but nothing happensThe poison makes you weakerYour energy is drainedbut nothing happensBrain damage makes you less skillful!"0{22{21{20!"!9DM͐n! s͐ n! s`i6`in&|g͐! n&##! n&+͕s͐ ! n&##! n&+͕s͐n! n}²g͐ n! n}²gg͐n&3k͐ n&n}g!g`i4?g͐! ns͐ ! ns!g!9!9DM*&3k*&! s#r͐n}Gh!i3!i!>i!^i!)ͽP! s#r͐#|qh!i͐n! s! n*,}ʼh! n*-}ʼh! n*.}ʼh! n*/}h!i3!i! n&!i͚j3! n&͹i͐! ng@|g}os͐Cj!i!9Sorry, something's there already.Put down what ? (ESC to Cancel)You don't have anything in you pack!Sorry! You have to take that off firstYou put down !9DM! n&))0n} i 2+!"{2{2 !"Aj>2!9DM! n`is`in*)ѯgW҃j`in&`in&#ns`i4Tj!)~5o&6!9!9DM!n! s#r͐))0n! s͐))0#n! s͐))0###n! s#6! n} k! ~#fo|g}os#r3k! n} 3k! ~#fo! n&#s#r͐ |Rk`i6-͐ ! s#rVk`i6+!:n! s#r! n&)))))2! n&))~#fo! s#r! 6͐|k! n&)))))2! n&))##~#fo! s#r! 6!=n! s#r! n}l6lglglʈlʖlʤlʺl l l 5m gm umÎm!>n! s#r!In! s#rÙm͐))0###n&))))͐!Jn͐ȸ͐m͐͐!_n͐ȸ͐m!dn! s#rÙm!kn! s#rÙm!rn! s#r!xn! s#r͐))0##n&|g}o|lmlÙmm! n}'m͐! s#r!~n! s#r͐))0##n&|g}o|$mm2m!n! s#rÙm! n}Ym͐! s#r!n! s#rdm!n! s#rÙm!n! s#rÙm!n! s#r!n! s#rÙm!n! s#r͐͐͐͐!n͐ȸ͐m͐͐͐ `in&͐͐!n͐ȸ!9͐m!9 a the stairs%s%d pieces of GOLD!%s%spotionscrollsome armorwand ofwandring ofringamuletthe ARKBUG%s%s%s %s%s%s%c%d %s %s!9DM!4o! s#r!~#fo! n&kn&n&mo`is#r͐ ͐͐!fo͐ȸ͐+o!9 %s%s%s!9DM! n}ApB pCpD$pE0pF20*&)! s!~#fo! n&n&! s! n! nѯgWͩz! n&z! n! s! n&! n&͍! s*&|ͯ{!{*ȯg! s! n! nѯgWͩ6{! n&;{! n! s! n}Dm{! n;|g}osÆ{*:}ʆ{! n&s! n}º{!͐ n&|g}o!n3!*#! s!~#fo! n&n&! s! n! nѯgWͩ|! n& |! n! s! n! nѯgWͩ1|! n&6|! n! s!͐ n&|g}o!n3! n}Rʺ|*! nѯgWڥ|>2I3!~#fo! n&n&̀4ú|*! nѯgW}2I! n}A|G:}Lu}Rʑ~T~UʺWI*A}|*||I;|g}o|}I*+"**"!3I*2}E}I;|g}o|Y}I!!͕}22!3I;|g}o|ʉ}I*)&#!͕! s! n&n! s! n**} ~! n*+} ~! n*,} ~! n*-} ~! n*.} ~! n*/}~I! n&!6͚j3! n&͹i! n&Cj! n&))06!A3͐!##n&3k͐!###n&͐!ns͐!6!"I*,}ʧ~*&|Ҫ~I*,&))0#n}¿~I*:}~!S3I*,&))0###5!5!k3I*| ;|g}o|I!!2͕! s! n*ͩG! n&P*! s*! nѯg"!~3M!3͐!##n&3k͐!###n&͐!ns͐!6!"I*C}*3};|g}o|I*3!!͕}23!3I;|g}o|!*&|$I*E}7!3I!5!с3I!! n}F`!͐ n! s͐ ͐!ns͐!##! ns͐!###! ns! n&3k! n&! s#r͐!͐ ns͐ ! ns!!9 missedThe hit youThe You feel less skillfulYou are covered with GelHe steals and disappears...Your armor is protectedYour armor weakensHe takes some goldand disappears...His gaze confuses youThe sting has no effectThe sting weakens you!9DM͐k`is#r͐n! s!~#fo! n&n! s!~#fo! n&n&! s! n! s#6**ѯgW! s#r**&))0###n! s**}ʛ! ~#fo! nѯgs#r͐ ͐ ͍! s#r**}߂͐|ͩт͐Ԃ!! s#r͐|͐! nѯgͩ͐ ! n&! s#r͐n}J! n}F7͐6! n}MJ!"! n}FZ>20͐|~!͐!n3͐*ѯgͩҙ͐Þ*&! s#r͐#n͐ă͐#6ڃ͐#n͐s!͐!n3͐#!9You missed the You hit the !9DM͐ k`is#r͐n! s!~#fo! n&n! s͐#n}s͐##n! s͐###n! s! n&3k! n&͐ns! n}F>203>2!|͐ !}n3! s{@A! n}TQ7LKÚ! n&ͳ! n&))0###!@!͕sÝ;|g}o|KA! n&)! n&))0n! s! n}K! n}K! n}K! n} KÝA! 6! ~5o}A͐##n! s͐###n! s! n}! ! g|ã! n*} ! n*} ã! n&3k! n&! ng@|g}osAã!"*!~#fo! n&n&"͐6! 9You killed the !9DM! n! nѯgW####`is!`inѯg! s! n! n&#!*! n! nѯgWs! n&|ͩ! n&#!! s! n&*!9͌ͤs?+0*&|g*ȯg }2l>2*}2!".|ʇy!9DM{2{2{2{2{2{2{2*} և*;|g}o|և!5`i6#6! s#r`i^#Vr+szʛ*|ډ͐n&@|g}o|2͐n&?|g}o))06É͐n& |g}o|ʉ͐n&|g}okn! s{ʉ! n&?|g}o))06! ^#Vr+s6!9!9DM`i6`in&|j! 6! n&|d`in}`in}! n}! n}2`in&3k! n&6\! n&|g}o|A`in&|g}o|\`in&3k! n&6! 4Ĉ`i4ð!9!9DM>2!!!4;|g}o;|g}o###ͺ*}M;*ѯg}2*&)! s#r͐ n`is͐ #n! s!5͐ *&)ns͐ #*&)#ns! n&`in&! n&`in&ͺø*|\ñ*))! s! ~5o}ʱ; ! s;! s! n&! n&m! 9!9DM! n&k! n&`is#r͐n&|g}os! n&|)!͐#! n&#! n&‹! n}X!͐! n&! n&+‹! n}ʄ!͐+! n&+! n&‹! n&|ҹ!͐! n&! n&#‹!9!9DM͐n}*&)! ns*&)#! ns!4͐n! nѯgW|g}os!9DM;|g}o|>9>>t>*>ʯ>6>(`in&|g}o|t! n&3k! n&#! ns(`in&|g}o|ʯ! n&3k! n&+! ns(`in&|g}o|! n&+3k! n&! ns(`in&|g}o|%! n&#3k! n&! ns(9! 5n}6B!9!9DM`i6`in&|Ү! 6! n&|Ҟ;! s! n&|g}o! n&|g}o|©Ì! n&|g}o! s! ng!͕|g}o! s! n`inѯgW|g}o! s! n&|g}o! s! ng!͕|g}o! s! n! nѯgW|g}o! s! n&! n&! n&! n&N! n&s_`in&sK! `i@`in&3k! n&6@>20;|g}o|* |W! s! n&|W! `i@`in&3k! n&! ng@|g}os! n&Z**hE*|ސ*}ސ! s! n&|ސ! `i@`in&3k! n&! ng@|g}os! n&))06 ;|g}o##! s! 6! n! nѯgWp! s{@"!E! `i@`in&3k! n&! ng@|g}os! n&ͳ! 4*|ғ;|g}o##! sǑ*|ҵ;|g}o#! sǑ;|g}o! s! 6! n! nѯgWE! s{@!E! `i@`in&3k! n&! ng@|g}os! n&)! 4͑! 9!9DM! n! nѯgW! s! n! nѯgW! s! n! s! n! nѯgW!! n! nѯgW! n&3k! n&4! 4Í;|g}o|!!! n&! n&! n&! n&*!͕*###l!! n&! n&! n&! n&*)!͕*ҵ!! n&! n&! n&! n&*))!͕*!! n&! n&! n&! n&!9!9DM**.! n}.! ! s{@C! ! n&! n&͕! s! n&! n&͕`is! n&3k`in&n}ʜ! ! n&3k`in&! ng@|g}os! n}ܔ! n&ͳ! n&! n&)! !9!9DM`i6`in&|I`in&))0n}CI`i4!`in&Q!9!9DM͐))06͐))0#;|g}os`is͐))0###`in&))))ds!9!9DM͐))06͐))0#6͐))0###*!͕s!9DM͐))06͐))0#;|g}os!9DM*+! s;|g}o|`! n&c! ! s! n&|! 6 !! n&! s! 6! n}Ζ ( F dÂ*&|!4! 6Â*&|!4! 6Â*&|!4%! 6Â*&|=!4C! 6Â*&|[!4a! 6Â*&|y!4! 6Â! n&|ɗ! n}ɗ*&|Ҹ*&|! 6ɗ!4!4! n}!|g}o|! 6! 6͐ ))0! ns!|g}o`is`in&|6`i6z`in&|K`i6z`in&|m`in&++`isz`in&s! n} ¯`in}¯*F}ʪ!!͕`isï>2F͐ ))0#`ins! n} ٘ 1 Pi`in&))))d|g}o! s`in&|! n&|g}os.! n&|g}osÄ`ing !͕! sÄ;|g}o! sÄ`in&`in&͕! s͐ ))0###! ns! 6! n}ʸ Й ! n`in}͙! 6 ;|g}o|"`in}`in}! 6 `in} ! 6͐ ))0##! ns!9!9DM`i6! s#r`i~5o}e͐6! ^#V!r+sA;|g}o`is`i~5o}ʯ! ! @̚! n&! n&vy;|g}o)}2!9!9DM*|*++++`is#r`i6#6͐| `i6#6*####! s#r͐|0! 6#6͕͐͐! s!~#fo! n&n*F}dn! n&q0!9!9DM`i6`i~5o}–!m! ! @! n*ѯgWͩϛ! n*ѯgW*! nѯgW! s! n*ѯgWͩ! n*ѯgW!*! nѯgW! s! n* ѯgWM! n*ѯgW҆̚! n&! n&v!m!9!9DM! 6#6! ^#Vr+szʲ͐kn}¯òÇ͐|!!~#fo͐n! s͐k`is#r͐͐s͐#!~#fo͐n&*s͐##! ns͐###! ns*=}_! n}F_͐6À͐!~#fo͐n&s͐n}§͐;|g}os͐! n&3k! n&ns! n&3k! n&͐ |g}os! n}FPMʽ;|g}o|'͐n}8! s{@J! n&)! n}Pp! n&))06 ! n}Fž! n&))0n} ž! n&))06͐! ng@|g}os͐!0~#fo! !͕ns!!9!9DM͋! 6! n&|! 6! n&| ! n&3k! n&n`is!|g}o|! n&! n&`in&@|g}o|ʮ!0~#fo`in&?|g}o))0n&n&͙`in& |g}o|!~#fo`in&|g}okn&n&͙`in&|g}o|۲!͙`in&@|g}o|+`in& |g}o|Ѡ`in&|g}okn! s! n&@|g}o|Π! n&|g}o|Π! n&! n&!0~#fo! n&?|g}o))0n&n&͙`in&|g}o|! n&! n&۲! ͙! 4! 4ʹ!!!9!!@!9DM͐!!͕s͐!1!͕s͐n&3k͐n&n}H!9DM;͐͐͐!9DM*|g}o|`i6#6@`iw#w*͐*|g}o@|g}o|g}o"*!9!9DM*?}A! 6! 6j*@}X! s! sj* ! s*! s*! nѯgW+! s*! nѯgW#! s*! nѯgW+! s*! nѯgW#! s! n&|! n&|! 6! n&|! 6! n&|! 6! n&|,! 62! n! s! n! s! n**ѯgWs! n**ѯgWs! n**ѯgWs! n**ѯgWs! n! nѯgW#! s! n! nѯgW#! s! n! s! n! s! n! s! n! s! n&kG! n&! s#r! n&3k! n&! s#r! n! s! n! s! ~5o}ݥ͐! s#r͐ ! s#r! n`is`i~5o}ʶ͐͐n&|g}os͐n&@|g}o|H͐n&|g}os͐n&?|g}o))0n! s! n}&͐n&|g}os! n}E͐n&|g}osÝ͐n& |g}o|t͐n&|g}osÝ͐n&|g}o|ʝ͐n&|g}os! ^#Vr+s! ^#Vr+sß! ~#fos#r! ~#fo3s#rr*&kG*&n&|g}os*&+kG*&! s#r*&+! nѯg! s! ~5o}ʲ͐n&|g}o|ʉ͐n&|g}os! n! nѯgWsò͐n&|g}os! ~#fos#r=*&#kG*&! s#r! n*ѯgW+! s! ~5o}b͐n&|g}o|9͐n&|g}os! n! nѯgWsb͐n&|g}os! ~#fos#r*&kG*&+! s#r*&+! nѯg`is`i~5o}͐n&|g}o|͐n&|g}os! n`inѯgWs! ^#Vr+sn&|g}osÙ*&kG*&#! s#r! n*ѯgW+`is`i~5o}ʢ͐n&|g}o|ʂ͐n&|g}os! n`inѯgWsâ! ^#Vr+sn&|g}os7*&+kG*&+! s#r*&+! nѯg! s*&+! nѯg! s! ~5o}͐! s#r! n`is`i~5o}ʷ͐n&|g}o|f͐#n&|g}o|c͐n&|g}osé͐n&|g}o|ʩ͐#n&|g}o|ʩ͐n&|g}os! ^#Vr+s! ~#fos#r*&+kG*&#! s#r*&+! nѯg! s! n*ѯgW+! s! ~5o}͐! s#r! n`is`i~5o}͐n&|g}o|ʏ͐+n&|g}o|ʌ͐n&|g}osҪ͐n&|g}o|Ҫ͐+n&|g}o|Ҫ͐n&|g}os! ^#Vr+s?! ~#fos#r*&#kG*&+! s#r! n*ѯgW+! s*&+! nѯg! s! ~5o}͐! s#r! n`is`i~5o} ͐n&|g}o|ʸ͐#n&|g}o|ʵ͐n&|g}os͐n&|g}o|͐#n&|g}o|͐n&|g}os! ^#Vr+sh! ~#fos#rG*&#kG*&#! s#r! n*ѯgW+! s! n*ѯgW+! s! ~5o}F͐! s#r! n`is`i~5o}1͐n&|g}o|͐+n&|g}o|ݬ͐n&|g}os#͐n&|g}o|#͐+n&|g}o|#͐n&|g}os! ^#Vr+sÐ! ~#fos#ro! n&kG! n&! s#r! n&3k! n&! s#r! n! s! n! s! ~5o}N͐! s#r͐ ! s#r! n`is`i~5o}!͐n! s͐n&|g}o|k͐n& |g}o|k! n&|g}okn! s! n&|g}o|k͐! n&|g}os! n! s͐n&|g}o|)͐n&@|g}o|Į͐!0~#fo! n&?|g}o))0n&ns&͐n& |g}o| ͐!~#fo! n&|g}okn&ns&͐n&|g}os͐6! n}<͐6 ͐n&|g}o|͐n&|g}o|z͐n&|g}os͐n&@|g}o|͐n&|g}o|ʬ*D}ۯ͐!0~#fo! n&?|g}o))0n&ns͐6͐n& |g}o|͐!~#fo! n&|g}okn&ns͐n}I®*<}«! n&|g}okn! s! n&@|g}o|ʥ͐!0~#fo! n&?|g}o))0n&nsë͐6͐n}M͐! n&|g}okns͐n&|͐6M͐6͐6 ! ^#Vr+s! ^#Vr+sϭ͐6! ~#fos#r! ~#fo3s#râ! n}q*&kG*&6 ! n&kG! n&! s#r! 6! n! nѯgW͐ ! n&! n! nѯgWͭ! ~#fos#r! 4Ú!9!Q!Q!9DM!!Q!=!Q͐ !Q͐ !Q!c·T!9DM͐·!U͐͐!!Q!·l!9DM͐͐͐·!ز·m!·)!·(!9DM`iw#w͐͝s{ =! n}U8͐͐n&Ys͐n}u͐|c`i^#Vr+s! ^#Vr+sC͐6Ͳ!L:͐n}­͐|ڪ`i^#Vr+s! ^#Vr+sͲ͝:͐n}Ͳ͐|޳`i^#Vr+s! ^#Vr+sû͝:͐͐+:͐ng|:͐n&|:͐n&!Q`i^#Vr+s! ^#Vr+s͐6Ͳ!L!9!9DM`iw#w͐|ʨ`i^#Vr+s! ͐ 0s! ~#fo s#rc͐͐͐͐! s#r͐|! ^#Vr+s! ^#Vr+sz! n&!Q͐|<`i^#Vr+sz9͐! n&!QI!0!Q!9!9DM! w#w͐͐`is#r͐|ĵ! ^#Vr+s! ͐ 0s! ~#fo s#r}͐͐%͐͐! s#r͐|! ^#Vr+s! ^#Vr+sz%`i^#Vr+s! ns͐|^! ^#Vr+sz[`i^#Vr+s͐! ns.k`i^#Vr+s60!9!9DM͐͐`is#r͐! ns!9!9DM͐͐`is#r͐ n}`i^#Vr+s! ^#Vr+snsж!9!9DM!!Q!S!Q͐ !Q͐ !Q!9DM͐͐! n&͐ ͐U!!Q!·g!9DM! n&!Q!·G!9DM͐n}! ^#Vr+sn&!Qʷ!· !y9DM! `i`iA!9!9DM! n&m|N! n& S! n&!9DM! n&͜|ʀ! n&Å! n&!9DM`iw#w! ^#Vr+sn}ʸ`i^#Vr+sÙ͐ÿ!9!9DM! ͐!h9DM! ^#Vr+s~#fo! s#r͐! s#r! ^#Vr+sn`is{2`in}%! ! s#r! 6#6! s! s! s͐n}-q! ^#Vr+s! 4͐n}0! 4͐n&o}ʞ! ͞á!! s#r! ^#Vr+sn`is{.! ͞! s#r! 4! ^#Vr+sn`is`in&Y}DUQXZOcCʩSں͐~#fo|Q! ^#Vr+s6-͐͐~#fos#r! ^#Vr+s! 6 i! 6i! 6! ~#fo! n&! ^#Vr+s~#fo! ˼ѯgs#rR! ^#Vr+s! ^#Vr+s~#fos! ^#Vr+sR! n}! 6#6! ^#Vr+s~#fo! s#r͐n}R͐|R! ^#Vr+s! ^#Vr+sns! ^#Vr+s! ^#Vr+s͐6! ! s#r! n}©! ^#Vr+s!ҩ! ^#Vr+s! n}ʠ!0ã! sn͐! ^#Vr+sns{һ! ^#Vr+sé! n}! ^#Vr+s!! ^#Vr+s6 ܻ! ^#Vr+s`ins/! ^#Vr+s`ins͐6!9!9DM͐n}k! ^#Vr+sn&uI!9DM! n&Aͯژ! n&Zͯ!9DM! n&aͯǼ! n&zͯ!9DM͐͐ ͐^#Vr+s͐ ͐0͐7s!&f͐ ͐͐ ͉͐˼`is͐ ͐͐ )͐˼`in&#&f!9!9DM! n&0ͯښ! n&9ͯ!9DM`iw#w͐~#fon&o}͐ ?͐^#Vr+snѯg`is#rì͐!9**  !\&!7*|;*"۾*"ݾ*"߾|e*A!Z ##L"۾"ݾ"߾:۾2۾!6#r!Ծ ~W!~w# ‹zҬ!۾w# ¢„ |!۾ᾯ?/w#¿+~g:߾oŇ7,2q*&:q):#=#=r:qo&7:)~:,"s!"u*|ʁ**s†! ~6*u*+"*"*u#"uM#7*\!*7:)~:,"s!"u*|*u2*~# "*s*u2#"u*+"7**:OzLq#D7*+++:G_*DM!po&  ‰ > _ ™l!9DM͐͐͐·!ز·m!·)!·(!9DM`.OP  JOURNEY  a video fantasy  (Version 1.2) Daniel M. Sunday 7272 Candleshine Court Columbia, MD 21045 USA  .PA  COPYRIGH NOTICE  Copyrigh (C 198 b Dania M Sunday Al right reserve worldwide N par o thi publicatio ma b reproduced store i retrieva system o transmitted i an for o b an means electronic mechanical photocopying recording o otherwise withou th prio writte permissio o Danie M Sunday 727 Candleshin CT. Columbia M 2104 USA. Thi documen i bein distribute a par o "Use Supporte Software distribution A such permissio i give t cop an distribute i providin tha thi i no don fo profit Further permissio i explicitl no grante t modif thi documen i an way fo profi o otherwise.  DISCLAIMER  Danie M Sunda make n representation o warrantie wit respec t th content hereo an specificall disclaim an implie䠠 warrantie o merchantabilit o fitnes fo an particula purpose Further Danie M Sunda reserve th righ t revis thi publicatio an t mak change fro tim t tim i th conten hereo withou obligatio t notif an perso o organizatio o suc revisio o changes. CP/M is a Trademark of Digital Research of Pacific Grove, CA. .PA  CONTENTS  TOPICS Page  Overview .................................. 1 Objective ................................. 2 Starting the Game ......................... 2 The Status Line ........................... 2 Moving Around ............................. 3 Messages .................................. 4 The Pack .................................. 4 Items ..................................... 5 Monsters .................................. 7 Fighting Monsters ......................... 7 Saving Games .............................. 8 The Scoreboard ............................ 8  APPENDICES  1. Journey Symbols .................. 9 2. Journey Commands ................. 10 3. Journey Items .................... 11 4. Journey Monsters ................. 13  .PA .HE Journey (Version 1.2) .PN 1  OVERVIEW  JOURNEY i ful scree vide fantas game I JOURNE yo ar travelin throug los cit burie beneat th earth Eac leve o th cit i mappe ou o th vide scree a yo explor it Whil playing you curren statu i displaye o th to tw line o th screen Message appea o th botto lin o th screen Th res o th scree i use t displa th MAP o th leve yo ar o an you positio i th map Thi ma show th layou o th part o th cit tha yo hav explored However unles som specia magi ha bee invoked yo ca onl se thing (magi item an monsters i you immediat vicinity Ho fa yo ca se i determine b th strengt o you LAMP You lam wil gro dimme wit tim (measure b th numbe o move yo make) Don' worr though yo wil fin othe lamp a deepe level o th city. Whil movin around yo wil discove GOLD an man type o MAGI ITEMS B carefu though ther ar als TRAPS yo ma fal into Th amoun o gol yo fin i you score Magi item yo fin ca b carrie i you PACK The ca the b use a an tim yo nee them Thi includes scrolls potions weapons armor lanterns wands ring an amulets Thes item giv yo differen power o d somethin specia fo you Th comman se o th gam let yo rea th scrolls drin th potions etc. Yo wil als encounte MONSTERS tha yo wil hav t figh an defea t continu o you way Ther ar man kind o monster wit differen abilitie an specia attacks Th outcom o an battl wit on o mor monster i determine b you curren power wisdom skill armo an weapon Also som o th magi item ca hel yo i combat I yo defea monster you skil increase an yo ca continu o you way Bu i monste defeat an kill you th gam ends. Afte yo hav completel explore leve an foun th STAIRS yo ca g dow t th nex leve o th city A yo trave t deepe level th monster becom mor ferociou an harde t conquer However th magi tha yo wil fin als become mor powerfu an yo wil hav greate skil an wisdom Somewher dee i th cit i th ARK I yo ca fin th ARK i wil giv yo th powe t trave u th stair a wel a down an t escap fro th underworl wit you treasures. .PA  OBJECTIVE  Th mai objectiv o JOURNEY i t fin th ARK an escap fro th underworld I yo ca d thi yo ar TOTA̠ WINNER Th secondar objectiv i t collec a muc gol a possible Th amoun o gol yo fin i you scor i th game Th longe yo ca survive th mor gol yo wil find.  STARTIN TH GAME  Th gam i starte b executin th progra JOURNEY.COM So wit th JOURNEY diskett o driv A i respons t th CP/  promp "A> typ "JOURNEY an the pres RETURN Th diskett wil whir fo whil an the yo wil b presente wit th initia scree welcomin yo t th game A thi point yo ar aske t identif yoursel b typin i you name Afte doin thi an pressin RETURN th firs leve o th cit wil b generate an JOURNEY wil begin. Th firs gam scree tha yo wil se show th oute wall o th leve o th cit tha yo hav jus entered Abov thi ar displaye tw line o informatio abou you curren status You positio i th ma an th are li u b you lanter ar als shown Yo ar no read t star explorin thi level Yo ca ge lis o th initia content o you pack Thi i don b typin 'L fo "List" Doin thi wil eras th scree an the displa wha yo hav i you pack Afte readin thi list pressin RETUR wil retur yo t th game. summar o th JOURNEY comman se i als available Thi ca b gotte b typin th '? key Th ma wil the b replace b hel summary Afte examinin thi information pressin RETUR wil retur yo t th game.  THE STATUS LINE  Durin th game th STATU LINE a th to o th scree give informatio abou th followin items Gold Armor Power Level Energy Skil an Wisdom A th beginnin o th gam i looks like this.  GOLD ARMOR POWER Level 1 ENERGY SKILL WISDOM 0 4 11 11/ 11 0 0  A th gam progresses th value displaye wil chang t reflec you curren status Not carefull th value displaye fo ENERGY Th firs numbe i you curren energy Whe you ENERG drop t yo ar DEAD Th secon numbe i th maximu energ yo ca hav fo you presen leve o wisdom Thi maximu wil increas a you skil  an wisdo increase You curren energ wil naturall increas t th maximu a yo mov around I wil decreas wheneve monste hit you Th amoun i decrease depend o bot th strengt o th monste yo ar fightin a wel a th armo yo ar wearing. .CP 8  MOVING AROUND  Yo ca mov aroun i th ma b usin eithe th arro key o th numeri keypa a directiona movemen keypad Th arro keys whe pressed wil mov yo i th selecte direction up down lef o right Usin th numeri keypa wil additionall allo yo t mov diagonall o t jus wait Th cente ke o th keypa i th numbe '5' Whe presse yo mak mov i th gam bu you positio doe no change Thi i calle WAITING an i occasionall useful Pressin an othe ke o th numeri keypa wil mov yo i th directio o tha ke relativ t th centra '5 key So pressin '7 wil mov yo u an t th left Th movemen keypa look a follows.  UP L 7 8 9 R E \ | / I F 4 - 5 - 6 G T / | \ H 1 2 3 T DOWN 5 = Wait  A yo mov around you LAMP wil ligh u th are o th ma tha yo ca see Ligh wil no g throug wall o aroun corners Wall tha ar li u wil b displaye a hal intensit blocks Onc wal ha bee li up i wil remai lit Thi create MAP o wher yo hav been. Som wall ar actuall SECRE DOORS secre doo look exactl lik wal unti yo pus o it Yo d thi b movin int th wall I i i secre door th wal wil ope up Sometime yo wil se wall completel surroundin regio o th map Ther i alway secre doo tha wil le yo ge through I suc case yo hav t g aroun an pus agains wall unti yo fin th door. Whil movin around yo wil sometime fal int TRAP Fo example yo ma ge caugh i quicksan o fal int chut droppin yo dow t th nex level Trap canno b see befor yo mov int the (unles som specia magi i bein used) Afte fallin int tra however i wil b displaye i th ma a '+ sign. Afte leve ha bee completel explored yo ca g dow t th nex leve b movin o to o th STAIRS an pressin th '\ character Th stair ar represente i th ma b th '\ symbol Ther i on an onl on stairwa o eac level I yo d no se '\ displaye i th map yo hav no ye foun th stairs The ar probabl dow som passagewa o aroun som corne wher yo hav no ye looked. I yo hav foun an no posses th ARK yo ca als g u th stairs Yo d thi b typin '/ whil standin o to o th stairs. .CP 8  MESSAGES  Th las lin o th scree i reserve fo messages Ther ar man event i th gam tha requir messag explainin wha happened Fo example whe yo mov int trap messag wil tel yo whic tra i wa an wha happene t you Sometimes singl mov wil caus severa event t happe an severa message t b given Afte eac messag i given th promp "- More.... ma appea a th fa righ o th messag line Thi mean tha ther ar mor message waitin t b read Afte readin th curren message th nex messag ca b gotte b pressin eithe th SPACE bar th RETURN ke o th numeri ke '0' Th '0 ke i convenientl locate fo us wit th numeri movemen keypad W fin i comfortabl t us th thum fo pressin th '0 whil usin th index middl an rin finger t operat th movemen keypad. Th las messag displaye remain o th scree unti yo mak you nex move The i i erased Th mos recentl give messag ca b redisplaye b typin 'A fo "Again". .CP 7  TH PACK  Yo hav pac fo carryin item tha yo find A an tim th content o th pac ca b examine b typin a 'L fo "List" Th PACˠ LIST wil indicat item tha yo ar currentl using Tha is i wil sho whic ARMOR yo ar wearing whic WEAPON yo ar using whic LAMP yo ar carryin an whic RINGS an AMULET yo ar wearing Thi i show b th entr unde th "USING colum pointin t th item A th star o th gam th PAC LIST wil loo a follows. .CP 8  USING PACK LIST  A. a hamburger ARMOR ------------>! B. some +1 iron armor WEAPON -----------> C. a +1 mace LAMP -------------> D. a +2 lantern  Afte readin th pac list pressin th RETUR ke return yo t th game. Thing ar pu int you pac whe the ar found A ite i foun whe yo mov int it positio i th map I sense yo "capture th ite an i i pu int you pack. You pac i limite i siz an ca carr 2 thing a most Afte thi limi i reached yo wil no b abl t pic u anythin els tha yo find Roo ca b mad i th pac b eithe usin u a ite o b puttin dow a item Item i th pac ca b pu dow b typin 'P an the selectin th desire ite fro th lis tha appear o th screen Afte selectin a item yo ar returne t th game. .CP 7  ITEMS  Item ar show i th ma b symbo occupyin position Th item whic ar use i th gam an thei correspondin symbol ar give i th followin table. .C 17  SYMBO ITEM  Gold Stairs + Trap " Food % Magic Potion & Magic Scroll } Armor ^ Weapon | Magic Wand * Lamp = Magic Ring ! Magic Amulet @ the ARK  Excep fo th stair an gol an traps al othe item ar picke u an pu i you pac whe yo mov o to o them Gol i picke u an increase you gol scor bu doe no tak u roo i th pack Thing i you pac ca b use a an time Usin a ite i th pac take on move T us a item yo pres singl comman ke fo wha yo wan t do Th comman se i a follows. .C 15  KEY COMMAND  C Carry a lantern D Drink a magic potion E Eat food L List contents of pack N Name a ring or amulet P Put down an item R Read a magic scroll T Take off armor, a ring or an amulet U Use a weapon W Wear armor, a ring or an amulet Z Zap a magic wand  Wheneve on o thes command i give b pressin th key lis o item tha ca b selecte fo th comman i displaye o th screen Fo example afte givin th 'R (Read comman al scroll i you pac wil b listed Yo ca the choos th ite tha yo wan t us fro thi list I yo decid tha yo don' wan t d anythin afte all th comman ca b cancelle b pressin th ESC o th RETURN key I thi i done n mov i mad i th game. .CP 3 Yo d no alway kno wha ite wil d whe yo firs pic i up I particular yo wil no kno th strengt o armo o weapon tha yo find Also yo wil no kno wha th potions scrolls wands ring o amulet tha yo fin ar goo for Thi mus b discovere b usin them Onc yo hav identifie an particula typ o item an othe item o tha typ wil alway b identified Ther i als som magi tha wil le yo identif items Asid fro usin specia magic th rule fo identifyin items are: (1 Potion an Scroll ar identifie whe yo us them. (2 Armo strengt i identifie whe yo wea it. (3 Weapo strengt ca onl b know throug magic. (4 Wand ar identifie i the hav n effec whe used. (5 Ring an Amulet ca onl b know throug magic. Ofte yo wil b abl t gues wha rin o amule doe whe yo wea it I so yo ca giv nam t th rin o amule s a t remin yo o it effect Thi i don wit th 'N (Name) command. Som item hav value associate wit them Thi valu indicate th strengt o th item Fo example + iro armo i unit stronge tha + iro armor Thi als applie t weapon an lamps + lam i burne ou an ca b pu down Th valu o wan give th numbe o charge lef o it Eac tim wan i zapped on charg i use up wan wit charge i use u an ca b pu down. .C 8  MONSTERS  Whil yo ar searchin throug th los city yo wil encounte man kind o monster roamin around Monster ar displaye i th ma b th letter o th alphabet on lette fo" eac monste type Fo example a 'H i a Hobgoblin Monster wil chas yo an tr t attac an kil you Yo mus eithe evad an escap fro them o els fac the i combat figh an defea them I yo ca mak i t th stairs yo ca g dow t th nex leve an n monster wil follo you Sometime yo ca ru aroun corne o dow passagewa an th monster wil los trac o you Othe time yo wil hav som specia magi ite tha wil hel yo t escape Mos o th time however yo wil hav t stan you groun an fight. Som monster ar aslee an wil no chas yo unles yo wak the up Som wil wak u i yo ge to nea them Other wil no wak u unles yo hi them Dependin o you circumstances yo ma o ma no wan t figh sleepin monster Som sleepin monster ar guardin treasures an defeatin the wil wi magi ite o som gol fo you. fe monster wil attac yo i specia ways Fo example WAS ma stin yo an thi wil caus you powe t decrease Par o th gam i t discove whic monster d what Also som magi wil onl wor agains certai monsters Again learnin wha magi item d an whe i i bes t us the i par o th game. .C 8  FIGHTIN MONSTERS  Yo figh monster b hittin the wit th weapo yo ar using Yo d thi b movin directl a th monste whe h i immediatel besid you Thi i th sam a takin blo i tha direction So i 'D (Dragon i immediatel t you left an yo mov lef (pres '4') the yo wil tak swin a th Dragon Yo ma hi hi o yo ma miss Afte yo tak swin a monster i i the hi tur t tak swin a you Th progres o th battl i give b message a th botto o th screen Th outcom o th battl i determine b th  relativ strength o yo an th monster Yo ar protecte b you armor You abilit t wi depend o you power skill wisdo an th weapo yo ar using. Yo los ENERGY eac tim monste hit you Th amoun o energ yo hav lef i displaye a th to o th screen Whe you energ drop t 0 yo ar dead I combat watc you energ carefully. Man magi item ca hel yo i combat Knowin wha you availabl magi i an ho t us i wil ofte determin th outcom o battle. .CP 7  SAVING GAMES  I yo ar playin JOURNEY an wan t sto an continu som othe time you gam ca b save i file Yo ca the resum th save gam wheneve yo wish. T sav a ongoin game typ th comman '^S' Tha is hol th CTRL (Control ke dow an simultaneousl typ th 'S' Th progra wil no as yo (o th messag line fo th nam o fil t sav th gam in Typ i fil nam an pres RETURN You gam wil b save i tha file. T resum gam tha ha bee saved us th followin procedure Afte th CP/ promp "A>" typ "JOURNEY" the typ SPACE the typ th nam o th file th gam wa save i an the pres th RETURN key Tha is typ "JOURNE FILENAME an pres RETURN Th diskett wil whir fo whil an the yo wil fin yoursel bac i th exac situatio yo wer whe yo save th game. .CP 7  THE SCOREBOARD  Th TOР 10 score ar recorde o th scoreboard You SCORE i th amoun o gol tha yo hav found Th scoreboar i show a th en o ever game I include informatio abou wh th playe was ho h wa killed wha leve h go dow t an ho wis h was I yo jus wan t se th scoreboar withou playin th game yo ca typ "JOURNE -S an pres RETURN i respons t th CP/ promp ">". Th scoreboar i store i th fil "JOURNEY.SSS" I thi fil i removed th curren scoreboar wil b lost Yo ma wan t d thi t star competition wit clea scoreboard .PA  APPENDIX 1  JOURNEY SYMBOLS  SYMBOL MEANING  $ Gold \ Stairs + Trap " Food % Magic Potion & Magic Scroll } Armor  Weapon | Magic Wand * Lamp = Magic Ring ! Magic Amulet @ the ARK .PA  A#PPENDIX 2  JOURNEY COMMANDS  KEY COMMAND EFFECT   Hel Displaycommansummary. A Again Redisplays the last message given. C Carry Carry a new lantern. D Drink Drink a magic potion. E Eat Eat some food. L List List the contents of the pack. N Name Name a magic ring or amulet. P Put Down Put down an item. R Read Read a magic scroll.  Tak Of Tak of armora rino a amulet. U Use Use a new weapon. W Wear Wear armor, a ring or an amulet. Z Zap Zap a magic wand. \ Down Go down the stairs. / Up Go up the stairs. ^Q Quit  Quit the game. ^R Refresh Refresh the screen display. ^S Save Game Save the game in a file. .PA  APPENDIX 3  JOURNEY ITEMS  TYPE KINDS  Trap quicksand tax trap chute poison needle trap hammer trap space warp nerve gas trap monster pit Food apple (least filling) eggroll milkshake taco sandwich hamburger pizza steak (most filling) Potion healing gain power restore power poison quickness confusion  gain skill amnesia Scroll identification gold detection magic detection teleportation strengthen armor strengthen weapon map remove curse .CP 9 Armor leather 1 (weakest) tin 2 bronze 3 iron 4 steel 5 magnesium 6 tungsten 7 plate mail 8 (strongest) .CP 9 Weapon club (weakest) hand axe mace short sword war hammer battle axe long sword two-handed sword (strongest) .CP 9 Wand striking healing drain life polymorph sleep dexterity trap detection enchantment .CP 9 Lamp candle (weakest) flare torch flashlight lantern beacon (strongest) .CP 9 Ring power teleportation stealth protection slow digestion see invisible aggravation regeneration .CP 9 Amulet eternal light eternal darkness preserve skill repel monsters prevent confusion detect traps sustain power genocide monster .PA  APPENDIX 4  JOURNEY MONSTERS  SYMBOL NAME  A Anhkheg B Bat C Centaur D Dragon E Elephant F Violet Fungus G Gelatinous Cube H Hobgoblin I Invisible Stalker J Jackal K Kobold L Leprechaun M Mimic N Nomad O Ogre P Purple Worm Q Quasit R Rust Monster S Snake T Thief U Umber Hulk $ V Vampire W Wasp X Xorn Y Yeti Z Zombie  D Dragon E Elephant F Violet Fungus G Gelatinous Cube H Hobgoblin I Invisible Stalker J Jackal K Kobold L Leprechaun M Mimic N Nomad O Ogre P Purple Worm Q Quasit R Rust Monster S Snake T Thief U Umber Hulk JOURNEY TO THE LOST CITY is supplied on a single density diskette for the OSBORNE 1. The program on the diskette is named "JOURNEY.COM". The user's manual for the game is in the file "JOURNEY.DOC" which is a Wordstar document file. The game itself has some built-in help which is given when a '?' is typed in play mode. Note that JOURNEY TO THE LOST CITY will only operate properly on an OSBORNE 1 with 52 columns, and auto-scroll turned OFF. This is "User Supported Software". Donations to support the author's programming efforts would be appreciated, but are not necessary. The author is: Daniel M. Sunday 7272 Candleshine Court Columbia, MD 21045 ELRIC OF ULM0ý:ҷ=!Ҿý^T!~ ?#ˆK{`O> K{͘A͒͢>:͒͢ > > ͒x ͢Æ͂#~Y‚#"T<ÆALL (Y/N)?^ LOGON COM$LOGON AZM2%&'()*+LOGOFF COM,LOGOFF AZM--./012OSNAKE COM>3456789:OSNAKE DOC;TDUCK COMu<=>?@ABCDEFGHIJTDUCK PASmKLMNOPQRSTUVWXJOURNEY COMYZ[\]^_`abcdefghJOURNEY COMijklmnopqrstuvwxJOURNEY COMyz{|}~JOURNEY COMJOURNEY DOCJOURNEY DOCbJOURNEY INSJOURNEY $$$ This is the release date of the disk. UPDATE DOC UPDATE AZM TIMEON COM TIMEON AZM #TIMEOFF COM TIMEOFF AZM &LOGON COM $LOGON AZM %LOGOFF COM ,LOGOFF AZM -OSNAKE COM 3OSNAKE DOC ;TDUCK COM <:TDUCK PAS K6LOGOFF .COM A6 5C 384 3 LOGOFF .AZM FE 8B 5760 45 OSNAKE .COM E4 F3 7936 62 OSNAKE .DOC 27 8D 1024 8 TDUCK .COM D8 46 14976 117 TDUCK .PAS E9 4C 13952 109 JOURNEY .COM ED 3D 49152 384 JOURNEY .DOC FB 6E 28928 226 JOURNEY .INS CC DC 768 6 JOURNEY .SSS C1 8E 256 2  Fog Library Disk FOG-CPM.141 Copyright (1986) by Fog International Computer Users Group to the extent not copyrighted by the original author for the exclusive use and enjoyment of its members. Any reproduction or distribution for profit or personal gain is strictly forbidden. For information, contact FOG, P. O. Box 3474, Daly City, CA. 94015-0474. as part of the description of a file indicates that the program is distributed on a "try first, pay if you like it" basis. If you find the program(s) meet your need, please refer to the author's documentation for information on becoming a registered user. Only by registering and paying for the programs you like and use will the authors of such programs continue development. Often, more complete documentation, additional modules, and new releases are available only to registered users. Osborne 1 Programs. Filename Description -09-00 .86 This is the release date of the disk. -CPM141 .DOC Th%is is the description of the disk contents. UPDATE .COM 96A5 1K [UPDATE 1 of 11] These programs form a system for keeping track of Computer usage (inspired by the IRS). Documentation and Assembler Source code (crunched) is included. UPDATE .DOC 678F 5K [UPDATE 2 of 11] UPDATE .AZM EA4B 6K [UPDATE 3 of 11] TIMEON .COM EA14 1K [UPDATE 4 of 11] TIMEON .AZM 38DE 9K [UPDATE 5 of 11] TIMEOFF .COM 7F57 1K [UPDATE 6 of 11] TIMEOFF .AZM 8EEB 10K [UPDATE 7 of 11] LOGON .COM 521E 1K [UPDATE 8 of 11] LOGON .AZM ACEC 7K [UPDATE 9 of 11] LOGOFF .COM A65C 1K [UPDATE 10 of 11] LOGOFF .AZM FE8B 6K [UPDATE 11 of 11] OSNAKE .COM E4F3 8K [OSNAKE 1 of 2] Graphics Program, eat points, not snakes. OSNAKE .DOC 278D 1K [OSNAKE 2 of 2] TDUCK .COM D846 15K  [TDUCK 1 of 2] Duck Shooting Graphics game (from Portable Companion). Pascal source code is included. TDUCK .PAS E94C 14K [TDUCK 2 of 2] JOURNEY .COM ED3D 48K [JOURNEY 1 of 4] A full screen graphic "adventure" game with D&D type characters for display. JOURNEY .DOC FB6E 29K [JOURNEY 2 of 4] JOURNEY .INS CCDC 1K [JOURNEY 3 of 4] JOURNEY .SSS C18E 1K [JOURNEY 4 of 4]  is the description of the disk contents. UPDATE .COM 96A5 1K [UPDATE 1 of 11] These programs form a system for keeping track of Computer usage (inspired by the IRS). Documentation and Assembler Source code (crunched) is included. UPDATE .DOC 678F 5K [UPDATE 2 of 11] UPDATE .AZM EA4B 6K [UPDATE 3 of 11] TIMEON .COM EA14 1K [UPDATE 4 of 11] TIMEON .AZM 38DE 9K [UPDATE 5 of 11] TIM&'