LnSOS BOOT 1.1 SOS.KERNEL SOS KRNLI/O ERRORFILE 'SOS.KERNEL' NOT FOUND%INVALID KERNEL FILE: xةw,@  ȱlmi8#)!)O^Ű 6( +UDEBUG.CODE 6) UDEBUG.EXEC*6)a)+UDEBUG.TEXT,6) ,USINCOS.CODE 6, ,USINCOS.TEXT06*! -READ.ME.FIRST )III.PCL.15u' /EMUL.ROM.0.TEXT<6&//EMUL.ROM.1.TEXT'86&l+/EMUL.ROM.2.TEXTD+T6'' /EMUL.ROM.3.TEXToA6(l+SAVAGE.CODE6("+SAVAGE.TEXT >dLԡm#i㰼m#iЕOLԡȱfg hi !dLԡ憦  Ljmkm l y`2 Lԡ8(Je稽)ʈ@L  !"#$% [] [] ; [] The RESET button on the Apple /// in Emulation mode does not [] ; [] operate the same as the Apple ][ RESET button in that it [] ; [] generates a Non-Maskable Interrupen altered. The NMI vector [] ; [] in the Emulator is the same as the Reset vector. Cassete input [] ; [] and output have been removed and are inoperable (nobody in their [] ; [] right mind currently uses a tape-based micro-computer !). [] ;; [] [] ; [] The subroutines in the Apple ]['s monitor ROM that handle Non- [] ; [] Maskable Interrupts (NMIs), annunciators, cassette input and [] ; [] output, and paddle input have betype of Apple ][ with a [] ; [] communications card. [] ; [] [] ; [] EMULATION FIRMWARE AND HARDWARE NOTES: [] [] Apple /// acts like a 48K Apple ][ Plus with AppleSoft ][ BASIC, [] ; [] a 16-sector Disk ][ controller card, and a Serial card. You can [] ; [] also change the diskette so that the Apple /// emulates an Apple [] ; [] ][ with Integer BASIC, or either the Apple /// are available to [] ; [] you: you can only use Apple ][ features. [] ; [] [] ; [] When you use the Emulation diskette for the first time, your [] ;; [] diskette called the "Apple ][ Emulation" diskette lets you run [] ; [] programs written for the Apple ][ Plus (or Apple ][) on your [] ; [] Apple /// computer. While you are using the Emulation diskette, [] ; [] none of the advanced features of [] ; [] The Apple /// has a feature, called Apple ][ Emulation, that [] ; [] allows it to run most Apple ][ software. It does this by [] ; [] imitating, or emulating, the behavior of the Apple ][. A [] ; [] the Apple /// 1.1 Assembler [] ; [] [] ; [] APPLE ][ EMULATION INTRODUCTION: [] ; [] ation Monitor ROM Listing [] ; [] -------------------------------------------------- [] ; [] [] ; [] Disassembled by David T. Craig in 1987 for [] ; [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][] ; [] [] ; [] -------------------------------------------------- [] ; [] Apple /// Apple ][ Emult, not a true reset. Holding [] ; [] down CONTROL while pressing RESET causes the Apple /// to [] ; [] attempt to boot an Apple /// diskette. [] ; [] [] ; [] Various firmware changes exist in the ROM due to several suttle [] ; [] hardware differences between the Apple /// and ][. Specifically, [] ; [] the I/O memory region of the Apple ///, $C000-$C0FF, has several [] ; [] extra functions not present in t .EQU 0CE ; "N" ASCII_BACKSLASH .EQU 0DC ; "\" ; Zero-page locations LOC0 .EQU 000 ; vector for autostart from disk LOC1 .EQU 001 WND_LEFT .EQU 020 I_ASTERISK .EQU 0AA ; "*" (Monitor prompt) ASCII_MINUS .EQU 0AD ; "-" ASCII_EQUAL .EQU 0BD ; "=" ASCII_I .EQU 0C9 ; "I" ASCII_L .EQU 0CC ; "L" ASCII_N CTRL_S .EQU 093 ; Control-S CTRL_U .EQU 095 ; Control-U CTRL_X .EQU 098 ; Control-X ASCII_ESC .EQU 09B ; Escape ASCII_BLANK .EQU 0A0 ; " " ASCI .EQU 083 ; Control-C CTRL_G .EQU 087 ; Control-G CTRL_H .EQU 088 ; Control-H CTRL_J .EQU 08A ; Control-J CTRL_M .EQU 08D ; Control-M ple ][ Monitors Peeled [1981, D2L0013 ] ; ; ********************************************************************** ; * EXTERNAL EQUATES ; ********************************************************************** ; ASCII constants (high bit set) CTRL_C (1) All official Monitor entry points are marked [MONITOR ENTRY] ; (2) All Apple ///-specific code is marked [Apple ///] ; REFERENCES: ; ; (1) Apple /// Owner's Guide [1981, A3L0001 ] ; (2) Apple ][ Reference Manual [1981, A2L0001A] ; (3) Ap; * Apple ///'s RAM. * ; * * ; ********************************************************************** ; SPECIAL SOURCE CODE NOTES: ; ; * ; * Note (*): The Apple /// runs Apple ][ software using * ; * the "Apple ][ Emulation" diskette which installs * ; * a modified version of the Apple ][ ROM into the * * | Apple //c | $06 | $00 | N/A | * ; * | Apple /// (*) | $EA | N/A | $8A | * ; * +------------------+-------+-------+-------+ * ; * -+-------+-------+ * ; * | Apple ][ | $38 | N/A | N/A | * ; * | Apple ][ Plus | $EA | N/A | N/A | * ; * | Apple //e | $06 | $EA | N/A | * ;; * * ; * +------------------+-------+-------+-------+ * ; * | Machine | $FBB3 | $FBC0 | $FB1E | * ; * +------------------+------pple ][ series computers is * ; * based upon the existance of different values in various ROM * ; * addresses. The machine type, the addresses, and their values * ; * are as follows: * ; * * ; * SOME NOTES CONCERNING APPLE ][ MACHINE IDENTIFICATION * ; * * ; * Identification thru software of Ahe Apple ][ or ][ Plus. [] ; [] [] ; [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][] ; ********************************************************************** ; left edge of text window WND_WIDTH .EQU 021 ; width of text window WND_TOP .EQU 022 ; top of text window WND_BOTTOM .EQU 023 ; bottom of text window CH .EQU 024 ; cursor horizontal position CV .EQU 025 ; cursor vertical position GBASL .EQU 026 ; lores graphics base address GBASH .EQU 027 BASL ; switch in graphics TXT_SET .EQU 0C051 ; switch in text MIX_SET .EQU 0C053 ; set mixed-mode (4 text lines) LOWSCR .EQU 0C054 ; switch in text page 1 LORES .EQU 0C056 .EQU 0C000 ; " " " " KBD_STRB .EQU 0C010 ; Keyboard reset ; (audio output)  SPKR .EQU 0C030 ; Speaker click toggler ; (video I/O)  TXT_CLR .EQU 0C050 LINE1 .EQU 0400 ; base address of screen RAM M_SLOT .EQU 07F8 ; slot owner of $C8 space ; Memory-mapped I/O locations ; (keyboard I/O) IOADR .EQU 0C000 ; Keyboard "A" bus data KBD e) SOFTEV .EQU 03F2 ; warm start vector PWREDUP .EQU 03F4 ; cold start check byte USRADR .EQU 03F8 ; BASIC USR() function vector ; Video screen locations ion STACK_TOP .EQU 01FF ; top address of 6502 stack ; Input buffer location IN .EQU 0200 ; character input buffer start ; Page 3 vectors BRKV .EQU 03F0 ; BRK RAM vector (modifiabl .EQU 047 ; Y " STATUS .EQU 048 ; P " S_PNT .EQU 049 ; SP " RNDL .EQU 04E ; random number counter RNDH .EQU 04F ; Stack informatA4H .EQU 043 A5L .EQU 044 ; temp index A5H .EQU 045 ACC .EQU 045 ; A register after BRK XREG .EQU 046 ; X " YREG 3E ; temp index A2H .EQU 03F A3L .EQU 040 ; temp index A3H .EQU 041 A4L .EQU 042 ; temp index EQU 039 PCL .EQU 03A ; temp for program counter (PC) PCH .EQU 03B A1L .EQU 03C ; temp index A1H .EQU 03D A2L .EQU 0 command YSAV1 .EQU 035 ; temp for Y register CSWL .EQU 036 ; character output hook CSWH .EQU 037 KSWL .EQU 038 ; character input hook KSWH .MODE .EQU 031 ; Monitor mode INVFLG .EQU 032 ; text character mode (inv/norm) PROMPT .EQU 033 ; Monitor prompt character YSAV .EQU 034 ; position in Monitor lores graphic color mask FORMAT .EQU 02E ; temp for opcode decode LENGTH .EQU 02F ; temp for opcode decode COLOR .EQU 030 ; lores graphic color s graphics LMNEM .EQU 02C ; temp for mnemonic decoding V2 .EQU 02D ; temp for lores graphics RMNEM .EQU 02D ; temp for mnemonic decoding MASK .EQU 02E ; .EQU 028 ; text base address BASH .EQU 029 BAS2L .EQU 02A ; temp base for scrolling BAS2H .EQU 02B H2 .EQU 02C ; temp for lore ; lores graphics ; (annunciator I/O)   SET_AN0 .EQU 0C058 ; set annunciator 0 CLR_AN0 .EQU 0C059 ; clear " 0 SET_AN1 .EQU 0C05A ; set " 1 CLR_AN1 .EQU 0C05B ; clear " 1 SET_AN2 .EQU 0C05C ; set " 2 SET_AN3 .EQU 0C05E ; set " 3 CLR_AN2 .EQU 0C05D ; clear " 2 CLR_AN3 &()*+,-./0123456789:;<=>?@ABO^ð ; That's all, Folks ... ; [] F I N I S [] ; [] [] ; [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][] .END 1.TEXT .INCLUDE .D3/EMUL.ROM.2.TEXT .INCLUDE .D3/EMUL.ROM.3.TEXT ; [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][] ; [] [] Apple_3_Emulation_Monitor_ROM .ORG 0F800 ; Monitor code origin ; The include files which when assembled in full generate a code file ; which contains the raw object code for the ROM.  .INCLUDE .D3/EMUL.ROM.*********************************** ; The Apple ][ Emulation Monitor ROM lives in the world from address ; $F800 to address $FFFF. Therefore, this code must be declared as ; being of an absolute nature. .ABSOLUTE .PROC ; * * ; * M O N I T O R R O U T I N E S * ; * * ; ***********************************leSoft or Integer) entry points BASIC .EQU 0E000 ; Cold language start BASIC2 .EQU 0E003 ; Warm language start ; ********************************************************************** disk motor drive A3_CLRQ6 .EQU 0C0EC ; Clear Q6 A3_CLRQ7_PROT .EQU 0C0EE ; Clear Q7 protect ; ( expansion ROM I/O - C8XX )  A3_EXPROM .EQU 0CFFF ; Disable expansion ROM I/O ; BASIC language (App .EQU 0C05F ; clear " 3 ; Special Apple /// I/O locations ; ( joystick I/O )  A3_ADTO .EQU 0C066 ; A/D ramp stop (PDLOT) ; ( disk drive I/O )  A3_MOTOR_OFF .EQU 0C0E8 ; Disable ADC #7F GBCALC STA GBASL ASL A ASL A ORA GBASL STA GBASL RTS ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ents to the operation of GBASCALC. GBASCALC PHA LSR A AND #3 ORA #4 STA GBASH PLA AND #18 BCC GBCALC utine : GBASCALC (Graphic BASe address CALCulator) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Set GBASL,H from (A) (with A = line / 2) ; NOTE : Refer to routine BASCALC for information concerning ; improvem LDY #GBASH CLRSC3 LDA #0 STA COLOR JSR VLINE DEY BPL CLRSC3 RTS ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Ro; + Routine : CLRTOP (CLeaR TOP) F836 [MONITOR ENTRY] ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Clear graphics area (40 lines) CLRTOP LDY #GBASH CLRSC2 STY V2 +++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Clear the screen (48 lines) CLRSCR LDY #2F BNE CLRSC2 ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ LA CMP V2 BCC VLINEZ RTS1 RTS ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : CLRSCR (CLeaR SCReen) F832 [MONITOR ENTRY] ; +++++++++++++++++++++++++++ertical LINE) F828 [MONITOR ENTRY] ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Draw a vertical line at column (Y) from (A) to (V2) VLINE PHA JSR PLOT PHLINE1 CPY H2 BCS RTS1 INY JSR PLOT1 BCC HLINE1 VLINEZ ADC #1 ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : VLINE (VHLINE (Horizontal LINE) F819 [MONITOR ENTRY] ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Draw horizontal lores line at row (A) from column (Y) to (H2) HLINE JSR PLOT LDA (GBASL),Y EOR COLOR AND MASK EOR (GBASL),Y STA (GBASL),Y RTS ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : ixel at screen row (A) column (Y) PLOT LSR A PHP JSR GBASCALC PLP LDA #0F BCC RTMASK ADC #0E0 RTMASK STA MASK PLOT1  ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : PLOT (PLOT pixel) F800 [MONITOR ENTRY] ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Plot a lores graphic p++ ; + Routine : SETNXTCOL (SET NeXT COLor) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Increment current graphic color by 3 SETNXTCOL LDA COLOR CLC ADC #3 ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : SETCOL (SET COLor) F864 [MONITOR ENTRY] ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Set current graphic color, COLOR, to ROL LMNEM ROL A DEY BNE PRMN2 ADC #0BF JSR COUT DEX BNE NXTCOL JSR PRBLNK PLA TAY LDA MNEML,Y STA LMNEM LDA MNEMR,Y STA RMNEM NXTCOL LDA #0 LDY #5 PRMN2 ASL RMNEM JSR PRBYTE LDX #1 PRNTBL JSR PRBL2 CPY LENGTH INY BCC PRNTOP LDX #3 CPY #4 BCC PRNTBL +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Disassemble one 6502 instruction at (PCL,H) and ; print the line thru routine COUT INSTDSP JSR INSDS1 PHA PRNTOP LDA (PCL),Y RTS ; Filler bytes so that routine entry points remain valid .BYTE 0FF,0FF,0FF ; (F8CD) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : INSTDSP (INSTruction DiSPlay) ; +++++++MNNDX1 LSR A BCC MNNDX3 LSR A MNNDX2 LSR A ORA #20 DEY BNE MNNDX2 INY MNNDX3 DEY BNE MNNDX1 STA FORMAT AND #3 STA LENGTH TYA AND #8F TAX TYA LDY #3 CPX #8A BEQ MNNDX3 AND #87 IEVEN LSR A TAX LDA FMT1,X JSR SCRN2 BNE GETFMT ERR LDY #80 LDA #0 GETFMT TAX LDA FMT2,X JSR PRBLNK INSDS2 LDA (PCL,X) TAY LSR A BCC IEVEN ROR A BCS ERR CMP #0A2 BEQ ERR ++++++++++++++++ ; Purpose: Setup the FORMAT and LENGTH for a 6502 instruction at ; location (PCL,H), and print the contents of PCL,H INSDS1 LDX PCL LDY PCH JSR PRYX2 LSR A LSR A RTMSKZ AND #0F RTS ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : INSDS1 (INStruction DiSplay 1) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++t at coordinate [(A),(Y)] SCRN LSR A PHP JSR GBASCALC LDA (GBASL),Y PLP SCRN2 BCC RTMSKZ LSR A LSR A ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : SCRN (SCReeN) F871 [MONITOR ENTRY] ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Load to (A) color of poin(A) SETCOL AND #0F STA COLOR ASL A ASL A ASL A ASL A ORA COLOR STA COLOR RTS LDY LENGTH LDX #6 PRADR1 CPX #3 BEQ PRADR5 PRADR2 ASL FORMAT BCC PRADR3 LDA CHAR1-1,X JSR COUT LDA CHAR2-1,X BEQ PRADR3 JSR COUT PRADR3 DEX BNE PRADR1 RTS PRADR4 DEY BMI PRADR2 JSR PRBYTE PRADR5 LDA FORMAT CM .BYTE 09D,08B,01D,0A1 .BYTE 000,029,019,0AE .BYTE 069,0A8,019,023 .BYTE 024,053,01B,023 .BYTE 024,053,019,0A1 .BYTE 000,01A,05B,05B .BYTE 0A5,06 000 .BYTE 0D8 .BYTE 0A4 .BYTE 0A4 .BYTE 000 MNEML .BYTE 01C,08A,01C,023 ; (F9C0) .BYTE 05D,08B,01B,0A1 .BYTE 09D,08A,01D,023 1 .BYTE 0AC ; (F9B4) .BYTE 0A9 .BYTE 0AC .BYTE 0A3 .BYTE 0A8 .BYTE 0A4 CHAR2 .BYTE 0D9 ; (F9BA) .BYTE .BYTE 000 .BYTE 000 .BYTE 059 .BYTE 04D .BYTE 091 .BYTE 092 .BYTE 086 .BYTE 04A .BYTE 085 .BYTE 09D CHAR .BYTE 001,022,044,033 .BYTE 00D,080,004,090 .BYTE 026,031,087,09A FMT2 .BYTE 000 ; (F9A6) .BYTE 021 .BYTE 081 .BYTE 082 .BYTE 000,022,044,033 .BYTE 00D,0C8,044,000 .BYTE 011,022,044,033 .BYTE 00D,0C8,044,0A9 .BYTE 001,022,044,033 .BYTE 00D,080,004,090 .BYTE 00D,080,004,090 .BYTE 003,022,054,033 .BYTE 00D,080,004,090 .BYTE 004,020,054,033 .BYTE 00D,080,004,090 .BYTE 004,020,054,03B .BYTE 00D,080,004,090 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Table: FMT1 (Used in instruction disassemblies) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ FMT1 .BYTE 004,020,054,030 ; (F962) PCADJ SEC PCADJ2 LDA LENGTH PCADJ3 LDY PCH TAX BPL PCADJ4 DEY PCADJ4 ADC PCL BCC RTS2 INY RTS2 RTS ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : PCADJ (PC ADJust) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Compute (PCL,H) + LENGTH and leave the result in A,Y Y] ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Print (X) blanks thru COUT PRBL2 LDA #ASCII_BLANK PRBL3 JSR COUT DEX BNE PRBL2 RTS ; ++ers PRNTAX JSR PRBYTE PRNTX TXA JMP PRBYTE PRBLNK LDX #3 ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : PRBL2 (PRint BLanks 2) F94A [MONITOR ENTR; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : PRNTAX (PRiNT A X) F941 [MONITOR ENTRY] ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Print hex of A & X registP #0E8 LDA (PCL),Y BCC PRADR4 RELADR JSR PCADJ3 TAX INX BNE PRNTYX INY PRNTYX TYA 9,024,024 .BYTE 0AE,0AE,0A8,0AD .BYTE 029,000,07C,000 .BYTE 015,09C,06D,09C .BYTE 0A5,069,029,053 .BYTE 084,013,034,011 .BYTE 0A5,069,023,0A0 MNEMR .BYTE 0D8,062,05A,048 ; (FA00) .BYTE 026,062,094,088 .BYTE 054,044,0C8,054 .BYTE 068,044,0E8,094 .BYTE 000,0B4,008,084 .BYTE 074,0B4,028,06E .BYTE 074,0F4+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : BREAK (BREAK interrupt) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Handle the BRK interrupt BREAK PLP ; restore control accordingly IRQ STA A5H PLA PHA ASL A ASL A ASL A BMI BREAK JMP IRQLOC ; ---> $FF10 ; +++++ ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : IRQ (Interrupt ReQuest) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Determine whether interrupt was IRQ or BRK, and transfer ; CEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmO^ .BYTE 072,072,088,0C8 .BYTE 0C4,0CA,026,048 .BYTE 044,044,0A2,0C8 ; End of EMUL.ROM.1.TEXT ,0CC,04A .BYTE 072,0F2,0A4,08A .BYTE 000,0AA,0A2,0A2 .BYTE 074,074,074,072 .BYTE 044,068,0B2,032 .BYTE 0B2,000,022,000 .BYTE 01A,01A,026,026 P-register JSR SAV1 ; save registers X,Y,P,S PLA ; move interrupt location from STA PCL ; stack to PCL,H PLA STA PCH JMP @BRKV ; branch to user BRK location ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : OLDBRK (OLD BReaK interrupt) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; P ; test for controller card signature DEC LOC1 ; point at next lower slot LDA LOC1 ; test for scanning complete CMP #0C0 ; at slot # 0 ? ; controller card  LDA #0C8 ; start at non-existant slot 8 STX LOC0 ; setup lo address to 0 STA LOC1 ; setup hi address to slot # (Cn) S_LOOP LDY #7SETPG3 LDX #5 ; setup page 3 interrupt vectors SETPLP LDA PWRCON-1,X STA BRKV-1,X DEX BNE SETPLP ; scan the machine slots from slot 7 downward looking for a disk + ; Purpose: Cold start system by looking for disk controller card ; in one of the ]['s slots. If disk card not found, then ; boot the ROM BASIC. PWRUP JSR APPLEII ; say hi JMP BASIC ; boot BASIC NOFIX JMP @SOFTEV ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : PWRUP (PoWeR UP) ; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ BNE PWRUP ; do Cold boot ... LDA SOFTEV BNE NOFIX LDA #0E0 CMP SOFTEV+1 BNE NOFIX FIXSEV LDY #3 STY SOFTEV NEWMON CLD ; work only in hex JSR BELL ; tell user I'm alive LDA SOFTEV+1 ; test for Cold boot EOR #0A5 CMP PWREDUP ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : NEWMON (NEW MONitor) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Perform a Cold or Warm boot of the system a known state INITAN NOP ; non-existent for /// NOP NOP LDA A3_EXPROM ; [Apple /// and //] BIT KBD_STRB ; clear keyboard input ; ++++++++ ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : INITAN (INITialize ANnuciators) FA6F [MONITOR ENTRY] ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Initialize hardware to JSR SETNORM ; normal video I/O JSR INIT ; normal video screen JSR SETVID ; setup video output vector JSR SETKBD ; setup video input vector CLD ; work with hex only LDA A3_CLRQ7_PROT ; [Apple ///] LDA A3_CLRQ6 ; [Apple ///] LDA A3_MOTOR_OFF ; [Apple ///] +++++++++++++++++++++++++++ ; + Routine : RESET (RESET) FA62 [MONITOR ENTRY] ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Reset system (usually from power-up or RESET key press) RESET urpose: Default BRK interrupt handler OLDBRK JSR INSDS1 ; display current PC & instruction JSR RGDSP1 ; display registers JMP MON ; enter the Monitor ; +++++++++++++++++++++++++++++++++++++++++++ BEQ FIXSEV ; yes, so boot ROM language STA M_SLOT ; save current slot address NXTBYT LDA (LOC0),Y ; test for card signature CMP DISKID-1,Y ; signature byte found ? BNE S_LOOP ; no, try next slot DEY ; yes, test next signature byte DEY BPL NXTBYT #40. STA WND_WIDTH LDA #24. STA WND_BOTTOM LDA #23. TABV STA CV JMP VTAB ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++res graphic video mode SETGR LDA TXT_CLR LDA MIX_SET JSR CLRTOP LDA #14 SETWND STA WND_TOP LDA #0. STA WND_LEFT LDA LDA #0 BEQ SETWND ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : SETGR (SET GRaphics) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Set lo; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : SETTXT (SET TeXT) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Set text video mode SETTXT LDA TXT_SET Purpose: Initialize system and Monitor INIT LDA #0 STA STATUS ; Monitor status LDA LORES ; clear hires graphics LDA LOWSCR ; set primary display screen LDA SET_AN1 JMP HEADR ; ??? ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : INIT (INITialize) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; NOTE: Address $FB1E contains an Identification Byte ($8A). ; Modified heavily for Apple ///. PREAD TXA PHA EOR #1 TAX LDA CLR_AN0 LDA SET_AN3 +++++++++++++++++++++++++++++++++++++++ ; + Routine : PREAD (Paddle READ) FB1E [MONITOR ENTRY] ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Read paddle (X) into (Y) .ASCII "APPLE ][" TITLELEN .EQU *-TITLE XLTBL .BYTE 0C4,0C2,0C1,0FF .BYTE 0C3,0FF,0FF,0FF RTBL .BYTE 0C1,0D8,0D9,0D0 ; A X Y P .BYTE 0D3 ; S ; +++++++++++++++++++++++++++++++,X JSR PRBYTE INX BMI RDSP1 RTS PWRCON .WORD OLDBRK .BYTE 000,0E0,045 DISKID .BYTE 020,0FF,000,0FF .BYTE 003,0FF,03C TITLE LDX #0FB RDSP1 LDA #0A0 JSR COUT LDA RTBL-251.,X ; get register name JSR COUT LDA #0BD JSR COUT LDA ACC+5+++++++++++++ ; Purpose: Display 6502 registers thru COUT after a carriage return REGDSP JSR CROUT ; do a CR RGDSP1 LDA #45 STA A3L LDA #0 STA A3H disk card NOP ; fillers NOP ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : REGDSP (REGister DiSPlay) ; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; test until all bytes processed ; disk controller card found in a physical slot since all disk signature ; bytes were found, so boot the Disk Operating System (DOS/ProDOS) from ; the found slot  JMP @LOC0 ; boot from ; + Routine : APPLEII (APPLE II) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Display machine name during system boot APPLEII JSR HOME LDY #TITLELEN ; #8 STITLE LDA TITLE-1,Y STA LINE1+14.,Y DEY BNE STITLE RTS ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : SETPWRC (SET PoWeR up Check) STA BASH ; from row table ; INY ; LDA (SCRN_ROW_TABLE),Y ; get LSB of row address ; STA BASL ; from row table ; RTS lters both the A and Y registers and ; occupies more memory than BASCALC. ; ; FAST_BASCALC ASL A ; setup word index ; TAY ; LDA (SCRN_ROW_TABLE),Y ; get MSB of row address ; ASL A ORA BASL STA BASL RTS ; NOTE : Screen output speed can dramatically be improved by ; using the following routine in place of BASCALC: ; ; WARNING : This routine a AND #3 ORA #4 STA BASH PLA AND #18 BCC BASCLC2 ADC #7F BASCLC2 STA BASL ASL A + Routine : BASCALC (BASe address CALCulator) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Set BASL,H to memory address for left character of line ; in (A) BASCALC PHA LSR A NOP NOP NOP NOP NOP NOP NOP NOP NOP ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; BEQ ESCOLD BNE ESCNOW ; NOTE: Address $FBB3 contains an Identification Byte ($EA) F8VERSION NOP ; filler NOP NOP NOP NOP DA XLTBL-ASCII_I,Y JSR ESCOLD JSR RDKEY ESCNEW CMP #ASCII_N BCS ESCOLD CMP #ASCII_I BCC ESCOLD CMP #ASCII_L ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : ESCNOW (ESCape NOW) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Handle Escape key press ESCNOW TAY L++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : ESCOLD (ESCape OLD) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Old Escape key handler ESCOLD SEC JMP ESC1 KBDWAIT LDY KBD ; wait for the user BPL KBDWAIT ; to press a key CPY #CTRL_C BEQ NOWAIT BIT KBD_STRB NOWAIT JMP VIDOUT ; ++++++++#CTRL_M BNE NOWAIT LDY KBD BPL NOWAIT CPY #CTRL_S BNE NOWAIT BIT KBD_STRB ; Control-S pressed so ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : VIDWAIT (VIDeo WAIT) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Test for operator keyboard pause request VIDWAIT CMP FB6F [MONITOR ENTRY] ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Set power-up check byte SETPWRC LDA SOFTEV+1 EOR #0A5 STA PWREDUP RTS ; ; return to caller ; ; Screen row addresses for screen page 1 (Addresses $400-$7FF) ; ; SCRN_ROW_TABLE .WORD 400,480,500,580 ; rows 0 - 3 ; .WORD 600,680,700,780 ; rows 4 - 7 ; .WORD 428,4A8,528,5A8 ; rows 8 - 11 ; .WORD 628,6A8,728,7A8 ; rows 12 - 15 ; .WORD 450,4D0,550,5D0 ; rows 16 - 19 ; .WORD 650,6D0,750,7D0 ; rows 20 - 23 ; +++++++++ BNE RTS4 ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : CLREOP (CLeaR End Of Page) FC42 [MONITOR ENTRY] ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Clear BEQ HOME ADC #0FD BCC ADVANCE BEQ BS ADC #0FD BCC LF BEQ UP ADC #0FD BCC CLREOL ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : ESC1 (ESCape 1) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Handle screen/cursor manipulation ESC1 EOR #0C0 Purpose: Alter BASL to point to BASL,H + WND_LEFT VTAB LDA CV VTABZ JSR BASCALC ADC WND_LEFT STA BASL RTS4 RTS CMP CV BCS RTS4 DEC CV ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : VTAB (Vertical TAB) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CH ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : UP (UP) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Move screen cursor up one line UP LDA WND_TOP ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Move screen cursor left one column BS DEC CH BPL RTS3 LDA WND_WIDTH STA CH DEC L_J BEQ LF CMP #CTRL_H BNE BELL1 ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : BS (Back Space) n screen memory or process the ; control character VIDOUT CMP #0A0 BCS STORADV TAY BPL STORADV CMP #CTRL_M BEQ CR CMP #CTR BCS CR RTS3 RTS ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : VIDOUT (VIDeo OUT) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Place character i; Purpose: Store (A) to screen at (BASL,H),(CH) and then increment ; CH and goto CR if window exceeded STORADV LDY CH STA (BASL),Y ADVANCE INC CH LDA CH CMP WND_WIDTH DEY BNE BELL2 RTS2B RTS ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : STORADV (STORe and ADVance) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ e a bell sound BELL1 CMP #CTRL_G BNE RTS2B LDA #40 JSR WAIT LDY #0C0 BELL2 LDA #0C JSR WAIT LDA SPKR +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : BELL1 (BELL 1) FBD9 [MONITOR ENTRY] ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Toggle the built-in speaker to creatscreen from current cursor position to end of screen CLREOP LDY CH LDA CV CLREOP1 PHA JSR VTABZ JSR CLEOLZ LDY #0 PLA ADC #0 CMP WND_BOTTOM BCC CLREOP1 BCS VTAB ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : HOME (HOME) FC58 [MONITnpqrstuvwxyz{|}~O^ð BCC CLEOL2 RTS ; End of EMUL.ROM.2.TEXT ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Clear line from cursor position (BASL),Y CLEOLZ LDA #ASCII_BLANK CLEOL2 STA (BASL),Y INY CPY WND_WIDTH ++++++++ ; Purpose: Clear line from cursor position (BASL),(CH) CLREOL LDY CH ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : CLEOLZ (CLear End Of Line Z) FC9E [MONITOR ENTRY] JSR CLEOLZ BCS VTAB ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : CLREOL (CLeaR End Of Line) FC9C [MONITOR ENTRY] ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ BCS SCRL3 PHA JSR VTABZ SCRL2 LDA (BASL),Y STA (BAS2L),Y DEY BPL SCRL2 BMI SCRL1 SCRL3 LDY #0 SCRL1 LDA BASL STA BAS2L LDA BASH STA BAS2H LDY WND_WIDTH DEY PLA ADC #1 CMP WND_BOTTOM ++++ ; + Routine : SCROLL (SCROLL) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Scroll the window, lines (CV) thru (WND_BOTTOM) SCROLL LDA WND_TOP PHA JSR VTABZ LDA #0 STA CH LF INC CV LDA CV CMP WND_BOTTOM BCC VTABZ DEC CV ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OR ENTRY] ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Clear screen HOME LDA WND_TOP STA CV LDY #0 STY CH BEQ CLREOP1 CR RTS ; Filler so that standard entry points remain valid BRK BRK BRK BRK BRK ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; TXA BPL HEADR5 LDA #0FF BNE HEADR6 HEADR5 ROL A ; (FD02) HEADR6 TAY ; (FD03) PLA TAX ; (FCEE) BPL HEADR3 HEADR4 INX ; (FCF1) LDA 0BFE6,Y ROL A LDA A3_ADTO ; [Apple ///] BMI HEADR4 SET_AN3 LDA CLR_AN1 HEADR2 LDA SET_AN2 ; (FCDF) LDA #0F JSR WAIT LDY #80 LDA CLR_AN2 LDX #48 HEADR3 DEX HEADR INX DEX BEQ HEADR2 LDA CLR_AN3 DEX BEQ HEADR2 LDA SET_AN0 DEX BEQ HEADR2 LDA A4H NXTA1 LDA A1L CMP A2L LDA A1H SBC A2H INC A1L BNE RTS4B INC A1H RTS4B RTS ; (FCC9) SPECIAL APPLE /// CODE +++++++++++++++++++++ ; + Routine : NXTA4 (NeXT A4) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Increment the important index A4L,H by 1 NXTA4 INC A4L BNE NXTA1 INC A = 255. WAIT SEC WAIT2 PHA WAIT3 SBC #1 BNE WAIT3 PLA SBC #1 BNE WAIT2 RTS ; +++++++++++++++++++++++++++++++++++++++++++++++++; | 26 | .002101242 | | 106 | .030213282 | | 240 | .150639819 | ; | 50 | .007097574 | | 122 | .039764010 | | 255 | .169836414 | ; +-----+------------+ +-----+------------+ +-----+------------+ ; ; If A = 0, then the delay is longer than when 2 | .000051150 | | 74 | .015040146 | | 151 | .060412242 | ; | 3 | .000077748 | | 75 | .015435024 | | 195 | .099955284 | ; | 25 | .001956999 | | 105 | .029659839 | | 196 | .100969077 | + +-----+------------+ +-----+------------+ ; | A | Time (sec) | | A | Time (sec) | | A | Time (sec) | ; +-----+------------+ +-----+------------+ +-----+------------+ ; | 1 | .000029667 | | 73 | .014650383 | | 150 | .059628624 | ; | ied number of clock cycles according ; to the formula ; 2 ; cycle_delay = 2.5A + 13.5A + 13 ; ; Several sample delay times follow (with 1 cycle = 1.0123 usec): ; ; +-----+------------ ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : WAIT (WAIT) FCA8 [MONITOR ENTRY] ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Delay machine for specif+ Routine : RDKEY (ReaD KEY) FD0C [MONITOR ENTRY] ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Read single character thru KSWL,H and return the read key ; to caller in (A) RDKEY LDY CH LDA (BASL),Y PHA AND #3F ORA #40 STA (BASL),Y PLA JMP @KSWL ; +++++++++++++++++++++++++++++++++++++++++++++++++++; Purpose: Read a line of characters from keyboard without writing ; the Monitor prompt (*) NXTCHAR JSR RDCHAR CMP #CTRL_U BNE CAPTST LDA (BASL),Y CAPTST CMP #0E0 TXA BEQ GETLNZ DEX ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : NXTCHAR (NeXT CHARacter) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ A [MONITOR ENTRY] ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Write prompt character (*), then read a line of characters GETLN LDA PROMPT JSR COUT LDX #1 BCKSPC prompt character (*) to screen, ; then read a line of characters until a CR is entered GETLNZ JSR CROUT ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : GETLN (GET LiNe) FD6; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : GETLNZ (GET LiNe Z) FD67 [MONITOR ENTRY] ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Write carriage return and++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Show that current input line is canceled by displaying thru ; COUT a backslash symbol (\) CANCEL LDA #ASCII_BACKSLASH JSR COUT CPX #0F8 BCC NOTCR1 JSR BELL NOTCR1 INX BNE NXTCHAR ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : CANCEL (CANCEL input) ; ++++++++++++++++++++ LDA IN,X JSR COUT PLA STA INVFLG LDA IN,X CMP #CTRL_H BEQ BCKSPC CMP #CTRL_X BEQ CANCEL ; Purpose: Echo keyboard input thru COUT to screen from IN,X with ; inverse flag, INVFLG, set temporarily to normal ($FF) NOTCR LDA INVFLG PHA LDA #0FF STA INVFLG BEQ ESC RTS ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : NOTCR (NOT Carriage Return) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ D35 [MONITOR ENTRY] ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Read single character thru KSWL,H and return read character ; in (A) RDCHAR JSR RDKEY CMP #ASCII_ESC LDA KBD BIT KBD_STRB RTS ESC JSR RDKEY JSR ESCNEW ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : RDCHAR (ReaD CHARacter) F; the read key in (A). System random seed incremented also. KEYIN INC RNDL BNE KEYIN2 INC RNDH KEYIN2 BIT KBD BPL KEYIN STA (BASL),Y +++++++++++++++++++ ; + Routine : KEYIN (KEY IN) FD1B [MONITOR ENTRY] ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Read single character from the real keyboard and return BCC ADDINP AND #0DF ADDINP STA IN,X CMP #CTRL_M BNE NOTCR JSR CLREOL ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : CROUT (Carriage Return OUT) FD8E [MONITOR ENTRY] ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Output a carriage return character thru COUT CROUT LDA #CTRL_M BNE COUT ; BCC COUTZ AND INVFLG COUTZ STY YSAV1 PHA JSR VIDWAIT PLA LDY YSAV1 RTS ; ++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : COUT1 (Character OUT 1) FDF0 [MONITOR ENTRY] ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Output character in A-register to the video screen COUT1 CMP #ASCII_BLANK +++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Output character in A register to current output device ; given by vector in CSWL,H COUT JMP @CSWL ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #0B0 CMP #0BA BCC COUT ADC #6 ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : COUT (Character OUT) FDED [MONITOR ENTRY] ; +++++++++++++++++; + Routine : PRHEX (PRint HEX) FDE3 [MONITOR ENTRY] ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Print low nibble of A register as a hex character PRHEX AND #0F PRHEXZ ORA A LSR A LSR A LSR A JSR PRHEXZ PLA ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++ ; + Routine : PRBYTE (PRint BYTE) FDDA [MONITOR ENTRY] ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Print A-register as 2 hex nibbles PRBYTE PHA LSR LDA A2L BCC ADD EOR #0FF ADD ADC A1L PHA LDA #ASCII_EQUAL JSR COUT PLA ; +++++++++++++++++++++++++++++++++++++++++++++++++ LDA (A1L),Y JSR PRBYTE JSR NXTA1 BCC MOD8CHK RTS4C RTS XAMPM LSR A BCC XAM LSR A LSR A 2L LDA A1H STA A2H MOD8CHK LDA A1L AND #7 BNE DATAOUT XAM JSR PRA1 DATAOUT LDA #ASCII_BLANK JSR COUT +++++++++++++++ ; + Routine : XAM8 (eXAMine 8) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Print memory as hex from (A1L,H) thru (A2L,H) XAM8 LDA A1L ORA #7 STA A CR, then hex of Y,X registers, then a dash (-) PRYX2 JSR CROUT JSR PRNTYX LDY #0 LDA #ASCII_MINUS JMP COUT ; +++++++++++++++++++++++++++++++++++++++++++++++++++++++PRA1 LDY A1H LDX A1L ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : PRYX2 (PRint Y and X 2) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Print ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : PRA1 (PRint A1) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Print a CR, hex of A1L,H, and then a dash (-) ++++++++++++++++++++++++++++ ; + Routine : BL1 (BLank 1) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Monitor Command Processor entry point for CR command BL1 DEC YSAV BEQ XAM8 ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : BLANK (BLANK) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Monitor Command Processor entry point for Blank command BLANK SBC #1 BNE LIST2 RTS A1PC TXA BEQ A1PCRTS A1PCLP LDA A1L,X STA PCL,X DEX BPL A1PCLP A1PCRTS Rmble LIST JSR A1PC LDA #disasm_count LIST2 PHA JSR INSTDSP JSR PCADJ STA PCL STY PCH PLA SEC ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Monitor Command Processor routine for List command. ; List 20 instructions thru COUT starting at (PCL,H) disasm_count .EQU 20. ; # lines to disasse LDA #0A9 ; ')' JSR COUT VFYOK JSR NXTA4 BCC VERIFY RTS ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : LIST (LIST 6502 instructions) ; ++ LDA (A1L),Y JSR PRBYTE LDA #ASCII_BLANK JSR COUT LDA #0A8 ; '(' JSR COUT LDA (A4L),Y JSR PRBYTE : Monitor Command Processor routine for Verify command. ; (A1L,H) thru (A2L,H) are compared against (A4L,H) VERIFY LDA (A1L),Y CMP (A4L),Y BEQ VFYOK JSR PRA1 JSR NXTA4 BCC MOVE RTS ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : VERIFY (VERIFY memory) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Monitor Command Processor routine for Move command. ; (A1L,H) thru (A2L,H) are moved starting at (A4L,H) MOVE LDA (A1L),Y STA (A4L),Y STA A4L,X STA A5L,X DEX BPL LT2 RTS ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : MOVE (MOVE memory) ; ++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : LT (Less Than) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Monitor Command Processor routine for "<" command LT LDX #1 LT2 LDA A2L,X ++++++ ; Purpose: Monitor Command Processor, set MODE for colon, ; period, plus, or minus SETMODE LDY YSAV LDA STACK_TOP,Y SETMDZ STA MODE RTS ; ++++++++++++++++++++++++++++++++++++++++ BNE RTS5 INC A3H RTS5 RTS ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : SETMODE (SET monitor MODE) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Monitor Command Processor entry point for Store command STOR STA MODE LDA A2L STA (A3L),Y INC A3L DEX BNE SETMDZ CMP #0BA BNE XAMPM ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : STOR (STORe) TS ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : SETINV (SET INVerse) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Set character output mode to Inverse SETINV LDY #3F BNE SETIFLG ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : SETNORM (SET NORMal) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Set character output mode; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Monitor Command Processor Trace entry point. TRACE RTS NOP ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routi++++++ ; Purpose: Monitor Command Processor Display Registers entry point. REGZ JMP REGDSP ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : TRACE (TRACE) JSR A1PC JSR RESTORE JMP @PCL ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : REGZ (REGister diaplay Z) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++tine) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Monitor Command Processor Go entry point. ; Set PCL,H from A1L,H, restore all registers, and ; begin code execution starting at PCL,H. GO ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Execute the BASIC language (warm boot) BASCONT JMP BASIC2 ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : GO (GO to rou++++++++++ ; Purpose: Execute the BASIC language (cold boot) XBASIC JMP BASIC ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : BASCONT (BASic CONTinue) STA LOC1,X RTS NOP NOP ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : XBASIC (eXecute BASIC) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++DA A2L AND #0F BEQ IOPRT1 ORA #|80 LDY #0 BEQ IOPRT2 1 IOPRT1 LDA #|80 IOPRT2 STY LOC0,X ; + Routine : OUTPORT (OUTput PORT) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Set port (A) for output OUTPORT STA A2L OUTPRT LDX #CSWL LDY # IOPRT L; + Routine : SETVID (SET VIDeo) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Set port 0 (the screen) for output SETVID LDA #0 ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++ ; Purpose: Set port (A) for input INPORT STA A2L INPRT LDX #KSWL LDY # BNE IOPRT ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++ ; Purpose: Set port 0 (the keyboard) for input SETKBD LDA #0 ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : SETKBD (SET KeyBoarD) ; ++++++++++++++++++++++++++++++++++++++++++++++; Purpose: Set character output mode to (Y) SETIFLG STY INVFLG RTS ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : SETKBD (SET KeyBoarD) ; ++++++++++++++++++++++++++++++++++++++++++++++++ to Normal SETNORM LDY #0FF ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : SETIFLG (SET Inverse FLaG) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ne : STEPZ (STEP Z) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Monitor Command Processor Step entry point. STEPZ RTS NOP NOP NOP NOP NOP ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : USR (USeR) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Monitor Command Processor User (control-Y) entry poiPRERR LDA #0C5 ; 'E' JSR COUT LDA #0D2 ; 'R' JSR COUT JSR COUT ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : BELL (BELL) ++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : PRERR (PRint ERR) FF2D [MONITOR ENTRY] ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Print thru COUT "ERR" and the bell ($87) code BRK BRK BRK BRK BRK BRK BRK BRK BRK BRK BRK ; ++++++++++++++++++++++++ RTI BRK BRK BRK BRK BRK BRK BRK BRK BRK BRK BRK ; + Routine : IRQLOC (IRQLOC) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Handle IRQ interrupt IRQLOC PLA ; ??? ORA #4 PHA LDA A5H NOP NOP NOP .BYTE 022 ; ??? BRK BRK BRK BRK ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ AD RTS ; [Apple ///] NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP BNE MONZ ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : READ (READ) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Monitor Command Processor Read tape entry point. RE; + Routine : CRMON (Carriage Return for MONitor) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  ; Purpose : Monitor Command Processor CR command  CRMON JSR BL1 PLA PLA NOP NOP NOP NOP NOP NOP BRK BRK BRK ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP ; Purpose: Monitor Command Processor Write tape entry point. WRITE RTS ; [Apple ///] NOP NOP NOP NOP NOP NOP NOP nt. USR JMP USRADR ; go for it ... ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : WRITE (WRITE) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ FF3A [MONITOR ENTRY] ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Print bell code ($87) thru COUT BELL LDA #CTRL_G JMP COUT ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : RESTORE (RESTORE registers) FF3F [MONITOR ENTRY] ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Restore 6502 registers from RAM storage RESTORE LD; Push address $FExy onto stack, pass MODE to called ; routine, execute Monitor subroutine thru RTS opcode. TOSUB LDA #|80 PHA LDA SUBTBL,Y PHA ++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : TOSUB (TO SUBroutine) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Monitor Command Processor command executer. XTCHR LDA IN,Y INY EOR #0B0 CMP #0A BCC DIG ADC #88 CMP #0FA BCS DIG RTS ; ++++++++++++++++++++itor Command Processor command parser. ; Save hex digits in A2L,H, return with command (1st non-hex) ; in A-register, and set Y-register for next character GETNUM LDX #0 STX A2L STX A2H N BEQ NXTBAS BNE NXTCHR ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : GETNUM (GET NUMber) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: MonA2L ROL A2H DEX BPL NXTITM NXTBAS LDA MODE BNE NXTBS2 LDA A2H,X STA A1H,X STA A3H,X NXTBS2 INX JSR TOSUB LDY YSAV JMP NXTITM DIG LDX #3 ASL A ASL A ASL A ASL A NXTBIT ASL A ROL JSR GETLNZ JSR ZMODE NXTITM JSR GETNUM STY YSAV LDY #17 CHRSRCH DEY BMI MON CMP CHRTBL,Y BNE CHRSRCH ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Apple ][ Monitor Command Processor entry point MON CLD JSR BELL MONZ LDA #ASCII_ASTERISK STA PROMPT JSR SETVID JSR SETKBD ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : MON (MONitor) FF65 [MONITOR ENTRY] +++++++++++++++++++++++++++++++++++++++++++ ; + Routine : OLDRST (OLD ReSeT) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Old Monitor RESET handler OLDRST JSR SETNORM JSR INIT STY YREG PHP PLA STA STATUS TSX STX S_PNT CLD IORTS RTS ; ROM 'RTS' opcode position ; +++++++++++++++++++++++++++; + Routine : SAVE (SAVE registers) FF4A [MONITOR ENTRY] ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Save 6502 registers into RAM storage SAVE STA A5H SAV1 STX XREG A STATUS PHA LDA A5H RESTR1 LDX XREG LDY YREG PLP RTS ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ LDA MODE ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Routine : ZMODE (Zero MODE) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Monitor Command Processor clear mode between commands. ZMODE LDY #0 STY MODE RTS ; go for it ... ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; + Table : CHRTBL (CHaRacter TaBLe) ; +++++++++++++++++++++++++++>SAVAGERE ; (---> FA62) IRQ_VECTOR .WORD IRQ ; (---> FA40) ; End of EMUL.ROM.3.TEXT +++++++++++++++++++++++++++++++++++++++++++++++ ; + Interrupt and reset vectors (FFFA-FFFF) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ NMI_VECTOR .WORD RESET ; (---> FA62) RESET_VECTOR .WORD RESET .BYTE &0FF ; 0FC .BYTE &0FF ; 017 .BYTE &0FF ; 017 .BYTE &0FF ; 0F5 .BYTE &0FF ; 003 ; +++++++++++++++++++++++LT-1>&0FF ; 01F .BYTE &0FF ; 083 .BYTE &0FF ; 07F .BYTE &0FF ; 05D .BYTE &0FF ; 0CC .BYTE &0FF ; 0B5 C4 .BYTE &0FF ; 096 .BYTE &0FF ; 0AF .BYTE &0FF ; 017 .BYTE &0FF ; 017 .BYTE &0FF ; 02B .BYTE &0FF ; 0C9 .BYTE &0FF ; 0BE .BYTE &0FF ; 0C1 .BYTE &0FF ; 035 .BYTE &0FF ; 08C .BYTE &0FF ; 0; + Table : SUBTBL (SUBroutine TaBLe) ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Table of low bytes of Monitor subroutines with hi byte = $FE SUBTBL .BYTE &0FF ; 0B2 (FFE3) .YTE 093 ; : .BYTE 0A7 ; . .BYTE 0C6 ; ctrl-M .BYTE 099 ; blank ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; N .BYTE 002 ; I .BYTE 005 ; L .BYTE 0F0 ; W .BYTE 000 ; G .BYTE 0EB ; R .B.BYTE 0BB ; ctrl-B .BYTE 0A6 ; - .BYTE 0A4 ; + .BYTE 006 ; M (F = XOR $B0+$89) .BYTE 095 ; < .BYTE 007 .BYTE 0B2 ; ctrl-Y .BYTE 0EF ; V .BYTE 0C4 ; ctrl-K .BYTE 0B2 ; ctrl-Y .BYTE 0A9 ; ctrl-P +++++++++++++++++++++++++++++++++++++++++++ ; Purpose: Table of Monitor character commands CHRTBL .BYTE 0BC ; ctrl-C (FFCC) 0.BYTE 0B2 ; ctrl-Y .BYTE 0BE ; ctrl-E @n^dLI [] [] [] by David T. Craig [] [] [736 Edgewater, Wichita, KS 67230] [] [] [] [] October 2, 1987 [] [] [] [] Compiled using Apple /// Pascal 1.1 [] { [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][] [] [] [] FLOATING POINT SAVAGE RESIDUE BENCHMARK FOR THE APPLE /// [] [] O^ñ99&y .4:p?á < ڳ??.09צ1Apple /// Floating Point SAVAGE RESIDUE Benchmark%The Savage Benchmark is executing ... A?2That's all, Folks...<?9?á < ڳ??.0ܡ{צ'Iterations Duration (sec) Residue2---------- -------------- ------------------?        [] [] Part of source code listing from Byte, Oct. 1987, p. 277 [] [] [] "[] This program performs the Savage benchmark, an extensive [] "[] test of the computational accuracy of the floating point [] "[] system of a computer. Specifically, this benchmark tests the [] "[] transcendental functions and the binary operators of addition, [] "[] multiplication, and division. e benchmark variable } & &{ Perform the actual Savage benchmark } & &i := 0; & &REPEAT (BEGIN *i := i + 1; * *x := ATan(Exp(Ln(Sqrt(a*a)))); *a := (Sin(x) / Cos(x)) + 1.0; (END; &UNTIL (i = iter_loop);  CLOCKINFO(clk_year,clk_month,clkAGE_Algorithm ----- } $ &CLOCKINFO(clk_year,clk_month,clk_day,clk_weekday, 0clk_hour,clk_minute,clk_second,clk_msecond); & start := clk_hour; &start := start * 3600 + clk_minute * 60 + clk_second; { Start timer } a := 1.0; { Initialize th&clk_year : INTEGER; { clock information } &clk_month : INTEGER; &clk_day : INTEGER; &clk_weekday : INTEGER; &clk_hour : INTEGER; &clk_minute : INTEGER; &clk_second : INTEGER; &clk_msecond : INTEGER; BEGIN { ----- Perform_SAV : INTEGER; { Loop counter } a : t_FP_Number; { Computation variable } &x : t_FP_Number; start : INTEGER[15]; { Starting time } finish : INTEGER[15]; { Ending time } & =========================================== } PROCEDURE Perform_SAVAGE_Algorithm( iter_loop : INTEGER; VAR exec_time : INTEGER; VAR residue : t_FP_Number); VAR i -------------- ------------------'); END ELSE (BEGIN *WRITELN(iteration_count:10,' ', 2exec_duration:14,' ', 2ABS(residue_value):18:14); (END; 0 END; { ----- Show_Execution_Results ----- } { =========================== residue_value : t_FP_Number); BEGIN { ----- Show_Execution_Results ----- } $ IF show_title_line THEN BEGIN WRITELN('Iterations Duration (sec) Residue'); WRITELN('---------- === } PROCEDURE Show_Execution_Results(show_title_line : BOOLEAN; iteration_count : INTEGER; exec_duration : INTEGER; } g_time : INTEGER; { Execution time (in sec) } g_residue : t_FP_Number; { Residue value } $g_keypressed : BOOLEAN; { User keypress status } { ===================================================================ecking [///] } " USES AppleStuff, { Apple /// system functions } RealModes, { Apple /// Floating Point engines } 'Transcend; TYPE t_FP_Number = REAL; { The FP number format } $ VAR g_iteration : INTEGER; { Iteration counter "[] [] [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][] } PROGRAM Savage_Residue_FP_Benchmark; {$R-} { Turn OFF range checking [///] } "{$I-} { Turn OFF I/O chest requries a lot of time [] "[] due to the large number of tests that are performed. Since [] "[] accuracy is the key to any good floating point system, not [] "[] speed, the execution speed should not be considered important. [] "[] all numeric values to Extended. Note that Apple /// SANE does [] "[] not support transcendental functions which is not a good case. [] "[] [] "[] Note that for many systems this t [] "[] [] "[] For maximum accuracy the floating computations should be done [] "[] using the Standard Apple Numeric Environment (SANE) and setting [] _day,clk_weekday, 0clk_hour,clk_minute,clk_second,clk_msecond);  finish := clk_hour; &finish := finish * 3600 + clk_minute * 60 + clk_second; { End timer } exec_time := TRUNC(finish - start); { Determine real execution time } & residue := ((iter_loop * 1.0) + 1.0) - a; { Return the residue value } & END; { ----- Perform_SAVAGE_Algorithm ----- } { ====================================================================== } BEGIN { ----- Savage_Residue_FP_Benchmark ----\ to t D th a  e to | Ou : (n ||||READ NREADLN WRITE zWRITELN EOF: BOOLEAN v||STRING 0||TEXT :$||INTERACT*||INPUT &$PROUTPUT 8$ :KEYBOARDN$||FALSE 2TRUE H&NIL bMAXINT * BYTESTRELWORDSTREd@ CONST KPDBugFile = '.RS232'; { Apple /// RS-232 serial port [///] } TYPE :'')PBBINTEGER x |REAL neCHAR   UPDEBUGG  [] [] [] [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][] } END. { ----- Savage_Residue_FP_Benchmark ----- } { [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][] [] [] [] F I N I S Show_Execution_Results (FALSE,g_iteration*20{200},g_time,g_residue); ( (g_keypressed := KEYPRESS; END; $UNTIL (g_iteration = 50) OR g_keypressed; { Aufwiedersehen ... } WRITELN; WRITELN('That''s all, Folks...'); $ alues } { Perform the actual SAVAGE benchmarks } Show_Execution_Results(TRUE,0,0,0.0); $ $g_iteration := 0; $ $REPEAT &BEGIN (g_iteration := g_iteration + 1; ( Perform_SAVAGE_Algorithm (g_iteration*20{200},g_time,g_residue); - } " WRITELN('Apple /// Floating Point SAVAGE RESIDUE Benchmark'); WRITELN; WRITELN('The Savage Benchmark is executing ...'); WRITELN; { Make certain the FP engine code is loaded } g_residue := SIN(10.0) * 1.2345; { Don't Care v lEOLN PRED $SUCC ORD  SQR  ABS P NEW  UNITREADV| UNITWRITCONCAT LENGTH  TPDError = INTEGER; { Standard error code result } TPDProcName = STRING[ 63]; { Routine name } TPDMessage = STRING[132]; { Routine message } VAR PDBugFile : TEXT; { Debugger output file } PD1String : TPDMessage; { ت?"<--- תš6efefȡ'"gg"DŽgצ Džgee"ff"DŽf[ džffצ ]f"zjX תš>̀̀ʀʀȡ+Èƀצ ƀEDžƀʀ̀ÈƀEDŽƀƀEjت?"---> תš6efefȡ'"gg"DŽgצ Džgee"ff"DŽf[ džffצ ]f".RS232צ*Welcome to the /// Pascal RunTime DebuggernThat's all, Folks ...JتE תš>̀̀ʀʀȡ+Èƀצ ƀ PROCEDURE PD_WriteLn (message : TPDMessage); { [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][] [] [] [] I M P L E M E N T A T I O N [] [] [] [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][] } IMPLEMENTATION E |||||||||||||||||||||||||||||||||||||||||||||||||||||||||| } PROCEDURE PD_WriteLn (message : TPDMessage); { [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][] [] [] [] I M P L E M E N T A T I O | Module : PD_WriteLn | Purpose : Output a message to the Debugger with a | Input : message - Message to output | Output : (none) | Notes : (none) ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| } | Output : (none) | Notes : (none) ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| } PROCEDURE EP (procName : TPDProcName); { ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| rocName); { ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| | Module : EP [ End Procedure ] | Purpose : Trace the EXIT point for a routine | Input : procName - Name of routinere ] | Purpose : Trace the ENTRY point for a routine | Input : procName - Name of routine | Output : (none) | Notes : (none) ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| } PROCEDURE BP (procName : TPDP ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| } PROCEDURE PD_KillDebugger; { ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| | Module : BP [ Begin Procedu||||||||||| | Module : PD_KillDebugger | Purpose : Terminate the Debugger | Input : (none) | Output : (none) | Notes : This routine must be called LAST : (none) | Output : (none) | Notes : This routine must be called FIRST ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| } PROCEDURE PD_InitDebugger; { ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||A string to be used as needed } PD2String : TPDMessage; { A string to be used as needed } { ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| | Module : PD_InitDebugger | Purpose : Initialize the Debugger | Input EDžƀʀ̀ÈƀEDŽƀƀEjت?"---> תš6efefȡ'"gg"DŽgצ Džgee"ff"DŽf[ džffצ ]f"PDBUGFILRZs{8CPDBUGPRO cjt  * SC džffצ ]f"zjX תš>̀̀ʀʀȡ+Èƀצ ƀ [] be their computer's output port which is connected to [] [] an external terminal. For example, I run my Pascal [] [] programs on an Apple /// and send the debugging data [] [] thru the ///'s [] [] programmers. This unit allows a program to trace [] [] routine entry and exit points and send message strings [] [] to a file. For most programmers the output file will [] [] [] Computer..: Apple /// [] [] [] [] Purpose : Provide a simple yet useful debugging tool for Pascal [] [] Author....: David Craig (736 Edgewater, Wichita KS 67230) [] [] Date......: 1986 [] [] Language..: Apple /// Pascal 1.1 !UNIT U_PDebugger; { [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][] [] [] [] P A S C A L R U N T I M E D E B U G G E R [] [] A B O^t% FR.D2/UDEBUG.CODE Y Q C.D2/UDEBUG $ %% EDžƀʀ̀ÈƀEDŽƀƀEjت?"---> תš6efefȡ'"gg"DŽgצ Džgee"ff"DŽf[ džffצ ]f" RS-232 port to a Lisa running a [] [] terminal communications program. [] [] [] [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][] } { [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][] [] [] [] I N T E R F A C E [] [] BEGIN { ----- PD_InitDebugger ----- } { Open the Debugger's output file } REWRITE(PDBugFile,KPDBugFile); { Say something to the Debuggee } WRITELN(PDBugFile); WRITELN(PDBugFile,'Welcome to the /// Pascal RunTime Debugg } { ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| | PD_InitDebugger ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| } PROCEDURE PD_InitDebugger; N [] [] [] [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][] } IMPLEMENTATION VAR PD_BugProcLevel : INTEGER; { Debugger current routine level PROCEDURE PD_WriteLn (message : TPDMessage); { [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][] [] [] [] I M P L E M E N T A T I O | Module : PD_WriteLn | Purpose : Output a message to the Debugger with a | Input : message - Message to output | Output : (none) | Notes : (none) ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| } | Output : (none) | Notes : (none) ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| } PROCEDURE EP (procName : TPDProcName); { ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| rocName); { ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| | Module : EP [ End Procedure ] | Purpose : Trace the EXIT point for a routine | Input : procName - Name of routinere ] | Purpose : Trace the ENTRY point for a routine | Input : procName - Name of routine | Output : (none) | Notes : (none) ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| } PROCEDURE BP (procName : TPDP ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| } PROCEDURE PD_KillDebugger; { ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| | Module : BP [ Begin Procedu||||||||||| | Module : PD_KillDebugger | Purpose : Terminate the Debugger | Input : (none) | Output : (none) | Notes : This routine must be called LAST : (none) | Output : (none) | Notes : This routine must be called FIRST ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| } PROCEDURE PD_InitDebugger; { ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||A string to be used as needed } PD2String : TPDMessage; { A string to be used as needed } { ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| | Module : PD_InitDebugger | Purpose : Initialize the Debugger | Input TPDError = INTEGER; { Standard error code result } TPDProcName = STRING[ 63]; { Routine name } TPDMessage = STRING[132]; { Routine message } VAR PDBugFile : TEXT; { Debugger output file } PD1String : TPDMessage; { [] [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][] } INTERFACE CONST KPDBugFile = '.RS232'; { Apple /// RS-232 serial port [///] } TYPE er'); WRITELN(PDBugFile); { Initialize the procedure level value } PD_BugProcLevel := 0; END; { ----- PD_InitDebugger ----- } { ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| | PD_KillDebugger ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| } PROCEDURE PD_KillDebugger; BEGIN { ----- PD_KillDebugger ----- } { Say farewell to the Debuggee } WRITELN(PDBugFile); WRITELN(PDBug { [NOTE] >>>>>>>>> This routine is currently unused <<<<<<<<< [NOTE] } END. { IMPLEMENTATION } { [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][] [] [] [] ); END; { ----- EP ----- } { ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| | Apple /// Unit Initialization Routine ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| } BEGIN (PD_BugProcLevel > 0) THEN & FOR indentAmount := 1 TO PD_BugProcLevel DO *realMessage := CONCAT(realMessage,' '); realMessage := CONCAT(realMessage,'[ ',procName,' ]'); { Output the procedure message } WRITELN(PDBugFile,realMessage- EP ----- } { Setup the procedure level value for the next procedure } PD_BugProcLevel := PD_BugProcLevel - 2; { Setup the message to output } realMessage := '<--- '; { Indent output by the appropriate amount } IF ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| } PROCEDURE EP {(procName : TPDProcName)}; VAR realMessage : TPDMessage; { Output message } indentAmount : INTEGER; { Indentation amount } BEGIN { ---- PD_BugProcLevel := PD_BugProcLevel + 2; END; { ----- BP ----- } { ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| | EP realMessage := CONCAT(realMessage,' '); realMessage := CONCAT(realMessage,'[ ',procName,' ]'); { Output the procedure message } WRITELN(PDBugFile,realMessage); { Setup the procedure level value for the next procedure } ion amount } BEGIN { ----- BP ----- } { Setup the message to output } realMessage := '---> '; { Indent output by the appropriate amount } IF (PD_BugProcLevel > 0) THEN FOR indentAmount := 1 TO PD_BugProcLevel DO ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| } PROCEDURE BP {(procName : TPDProcName; procAddress : TPDProcAddress)}; VAR realMessage : TPDMessage; { Output message } indentAmount : INTEGER; { IndentatBugFile,realMessage); END; { ----- PD_WriteLn ----- } " { ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| | BP propriate amount } IF (PD_BugProcLevel > 0) THEN FOR indentAmount := 1 TO PD_BugProcLevel DO realMessage := CONCAT(' ',realMessage); realMessage := CONCAT(realMessage,message); { Output the message } WRITELN(PD realMessage : TPDMessage; { Message to output } indentAmount : INTEGER; { Message indention amount } BEGIN { ----- PD_WriteLn ----- } { Setup the message to output } realMessage := indent; { Indent output by the ap | PD_WriteLn ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| } PROCEDURE PD_WriteLn {(message : TPDMessage)}; CONST indent = ' '; { 5 spaces to indent before each message } VAR File,'That''s all, Folks ...'); WRITELN(PDBugFile); { Close up shop } CLOSE(PDBugFile,LOCK); END; { ----- PD_KillDebugger ----- } { ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| F I N I S [] [] [] [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][] } [] The table is constructed using the builtin SIN & [] [] COS functions. [] [] [] [] ---------------------------------ions Sine & Cosine using a [] [] table lookup method. By using tables the [] [] calculation speed is greatly increased when [] [] compared to the standard builtin functions. [] [] ---------------------------------------------------------------- [] [] [] [] PURPOSE : This program computes the value of the [] [] trigonometric funct : Apple /// Pascal 1.1 [] [] COMPUTER : Apple /// [] [] [] [] [] [] [] AUTHOR : David T. Craig (736 Edgewater, Wichita KS 67230) [] [] DATE : 1987 [] [] LANGUAGE S I N E & C O S I N E U N I T [] [] ------------------------------------------- [] [] [] [] Version 3.00 UNIT U_SineCosine; { [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][] [] [] [] ------------------------------------------- [] [] O^±±------------------------------- [] [] [] [] NOTES : This program has been placed into the Public Domain [] [] by the author, David T. Craig, and as such it may [] [] be used or abused in any manner as others see fit. [] [] [] [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][] } { [][][][][][][][][][][][][][][][]||||||||||||||||||||||||||||||||||||||||||||||||||||||| | ROUTINE : Init_Sine_Table | PURPOSE : Initialize the Sine table | INPUT : (none) | OUTPUT : sine_ok - Initialization OK flag (TRUE --> OK) |||||||||||||||||||||||||||||||||||||||||||||| * * PRIVATE ROUTINES * * * ********************************************************************** } { ||||||||||||||| SinCosTable : t_SineCosList; { Sine & CoSine data tables } SCTableBase : t_PtrTrigList; { Base of table } { ********************************************************************** * RRAY [0..359] OF TRIG_Number; t_PtrTrigList = ^t_TrigList; t_SineCosList = RECORD S : t_PtrTrigList; { Sine data list } C : t_PtrTrigList; { Cosine data list } END; VAR [] [] [] [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][] } IMPLEMENTATION CONST k_NoError = 0; { No error code result [///] } TYPE t_TrigList = A_CoSine(angle : INTEGER) : TRIG_Number; { [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][] [] [] [] I M P L E M E N T A T I O N | PURPOSE : Compute the Cosine of a degree angle | INPUT : angle - angle in degrees | OUTPUT : TRIG_CoSine - Value of COS(angle) | NOTE : (none) |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| } FUNCTION TRIGone) |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| } FUNCTION TRIG_Sine(angle : INTEGER) : TRIG_Number; { |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| | ROUTINE : TRIG_CoSine N); { |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| | ROUTINE : TRIG_Sine | PURPOSE : Compute the Sine of a degree angle | INPUT : angle - angle in degrees | OUTPUT : TRIG_Sine - Value of SIN(angle) | NOTE : (nnit | INPUT : (none) | OUTPUT : ok - Failure flag (TRUE --> ok, FALSE --> failure) | NOTE : This routine must be called LAST |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| } PROCEDURE TRIG_Terminate (VAR ok : BOOLEA |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| } PROCEDURE TRIG_Initialize (VAR ok : BOOLEAN); { |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| | ROUTINE : TRIG_Terminate | PURPOSE : Terminate the u|||||||||||||| | ROUTINE : TRIG_Initialize | PURPOSE : Initialize the unit | INPUT : (none) | OUTPUT : ok - Failure flag (TRUE --> ok, FALSE --> failure) | NOTE : This routine must be called FIRST ] [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][] } INTERFACE "USES REALMODES,TRANSCEND; { [///] } TYPE TRIG_Number = REAL; { Numeric data type (4 bytes) [///] } { ||||||||||||||||||||||||||||||||||||||||||||||||||||||||[][][][][][][][][][][][][][][][][][][] [] [] [] I N T E R F A C E [] [] [|||||||||||||||||||||||| } PROCEDURE Init_Sine_Table(VAR sine_ok : BOOLEAN); VAR error : INTEGER; angle : INTEGER; mr_Pi : TRIG_Number; BEGIN { ----- Init_Sine_Table ----- } NEW(SinCosTable.S); & &IF (SinCosTable.S = NIL) THEN error := k_NoError + 1 ?ELSE error := k_NoError; IF (error = k_NoError) THEN { Setup the Sine values } BEGIN mr_Pi := 4.0 * ATAN(1.0); FOR angle := 0 TO 359 DO BEGIN ; BEGIN { ----- TRIG_CoSine ----- } TRIG_CoSine := SinCosTable.C^[ABS(angle MOD 360)]; END; { ----- TRIG_CoSine ----- } END. { That's all, Folks ... } { [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][] [] --- TRIG_Sine ----- } { |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| | ROUTINE : TRIG_CoSine |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| } FUNCTION TRIG_CoSine { (angle : INTEGER) : TRIG_Number } FUNCTION TRIG_Sine { (angle : INTEGER) : TRIG_Number }; BEGIN { ----- TRIG_Sine ----- } IF (angle < 0) THEN TRIG_Sine := - SinCosTable.S^[ABS(angle MOD 360)] ELSE TRIG_Sine := SinCosTable.S^[angle MOD 360]; END; { --r = k_NoError); END; { ----- TRIG_Terminate ----- } { |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| | ROUTINE : TRIG_Sine |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| } ||||||||||||||||||||||||||||||||||||| } PROCEDURE TRIG_Terminate { (VAR ok : BOOLEAN) }; VAR error : INTEGER; BEGIN { ----- TRIG_Terminate ----- } RELEASE(SCTableBase); error := IORESULT; { Release table memory } ok := (erro(ok); IF ok THEN Init_CoSine_Table(ok); END; END; { ----- TRIG_Initialize ----- } { |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| | ROUTINE : TRIG_Terminate ||||||||||||||||||||||||||||||||| error : INTEGER; BEGIN { ----- TRIG_Initialize ----- } MARK(SCTableBase); error := IORESULT; { Mark table base } ok := (error = k_NoError); IF ok THEN { Setup the Sine & CoSine tables } BEGIN Init_Sine_Table|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| | ROUTINE : TRIG_Initialize |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| } PROCEDURE TRIG_Initialize { (VAR ok : BOOLEAN) }; VAR * * PUBLIC ROUTINES * * * ********************************************************************** } { 0)); END; END; cosine_ok := (error = k_NoError); { Return initialization result } END; { Init_CoSine_Table } { ********************************************************************** * ?ELSE error := k_NoError; IF (error = k_NoError) THEN { Setup the CoSine values } BEGIN mr_Pi := 4.0 * ATAN(1.0); FOR angle := 0 TO 359 DO BEGIN SinCosTable.C^[angle] := COS(angle * (mr_Pi/180.PROCEDURE Init_CoSine_Table(VAR cosine_ok : BOOLEAN); VAR error : INTEGER; angle : INTEGER; mr_Pi : TRIG_Number; BEGIN { Init_CoSine_Table } NEW(SinCosTable.C); & &IF (SinCosTable.C = NIL) THEN error := k_NoError + 1 ||||||||||||||||||| | ROUTINE : Init_CoSine_Table | PURPOSE : Initialize the CoSine table | INPUT : (none) | OUTPUT : cosine_ok - Initialization OK flag (TRUE --> OK) |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| } SinCosTable.S^[angle] := SIN(angle * (mr_Pi/180.0)); END; END; sine_ok := (error = k_NoError); { Return initialization result } END; { ----- Init_Sine_Table ----- } { ||||||||||||||||||||||||||||||||||||||||||||||||||| [] [] F I N I S [] [] [] [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][] } N); { |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| | ROUTINE : TRIG_Sine | PURPOSE : Compute the Sine of a degree angle | INPUT : angle - angle in degrees | OUTPUT : TRIG_Sine - Value of SIN(angle) | NOTE : (nnit | INPUT : (none) | OUTPUT : ok - Failure flag (TRUE --> ok, FALSE --> failure) | NOTE : This routine must be called LAST |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| } PROCEDURE TRIG_Terminate (VAR ok : BOOLEA |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| } PROCEDURE TRIG_Initialize (VAR ok : BOOLEAN); { |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| | ROUTINE : TRIG_Terminate | PURPOSE : Terminate the ubMAXINT *IGBYTESTRELWORDSTREd@\ greeng UT  ang OUTPIG_CoS lue  e) READ NREADLN BINTEGER x SREAL TECHAR ||BOOLEAN v||STRING 0||TEXT :$||INTERACT* INPUT &$inOUTPUT 8$ TKEYBOARDN$||FALSE 2TRUE H&NIL T : (none) | OUTPUT : ok - Failure flag (TRUE --> ok, FALSE --> failure) | NOTE : This routine must be called FIRST :'')PB "USES REALMODES,TRANSCEND; { [///] } TYPE TRIG_Number = REAL; { Numeric data type (4 bytes) [///] } { |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| | ROUTINE : TRIG_Initialize | PURPOSE : Initialize the unit | INPU  USINECOS one) |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| } FUNCTION TRIG_Sine(angle : INTEGER) : TRIG_Number; { |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| | ROUTINE : TRIG_CoSine | PURPOSE : Compute the Cosine of a degree angle | INPUT : angle - angle in degrees | OUTPUT : TRIG_CoSine - Value of COS(angle) | NOTE : (none) |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| } FUNCTION TRIG -: ASMFORMAT3.TEXT -: ASMFORMAT4.TEXT -: ASMFORMAT5.TEXT -: (ASMFORMAT : Formats assembler listing files so that all back-patches are -: correctly patched. Nice utility for the /// assembly people.) of my programs since I rarely write a program which runs -: correctly the first time. -: USINCOS : Nice Pascal unit for generating sine and cosine values. -: On Side Two: -: ASMFORMAT0.TEXT -: ASMFORMAT1.TEXT -: ASMFORMAT2.TEXThe A ][ Emulation ROM -: for the ///. -: SAVAGE : Floating point benchmark program which tests the accuracy of -: the transcendental functions. -: UDEBUG : Runtime debugger which uses an external terminal.Used by most -:  ional). We call them "David Craig Disks 1,2 and 3" since the material on these disks were all placed into the PD by ///er David Craig. All require knowledge of Pascal to operate properly. On Side One: -: EMUL.ROM : Disassembled source code listing for t WAP /// SIG PUBLIC DOMAIN LIBRARY PDS NAME: David Craig Disk #3 DISK ID#: 3PCL-15 BOOTABLE?: Nonbootable DESCRIPTION: Disks 3PCL-13, 14 and 15 are some of the nuggets we got from a donation by Joe Dobrowolski (of Apple Users Group Internat "Ú $!"Úɡhghg>hg 88| I M P L E M E N T A T I O N SCTABLEB'SINCOSTA  DHb 71Ú4 zááL@?gȡ(g4CÚ4 | "Ú $!"Úɡhghg>hg 88| I M P L E M E N T A T I O N ááL@?gȡ(g4CÚ4 zááL@?gȡ(g4CÚ4 |_CoSine(angle : INTEGER) : TRIG_Number; { [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][] [] [] [] I M P L E M E N T A T I O N [] [] [] [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][] } IMPLEMENTATION E |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| } FUNCTION TRIG_CoSine(angle : INTEGER) : TRIG_Number; { [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][] [] [] [] I M P L E M E N T A T I O N